diff --git a/src/app/core/chat/mapper/messageMapper.ts b/src/app/core/chat/mapper/messageMapper.ts index cf4b6a948..bbada5963 100644 --- a/src/app/core/chat/mapper/messageMapper.ts +++ b/src/app/core/chat/mapper/messageMapper.ts @@ -19,16 +19,7 @@ export class MessageMapper { roomId: entity.roomId, senderId: entity.sender.wxUserId, requestId: entity.requestId || requestId, - attachment: entity.attachments.map((e)=>({ - fileType:e.fileType, - source: e.source, - file: e.file, - fileName: e.fileName, - applicationId: e.applicationId || 0, - docId: Number(e.docId) || 0, - mimeType: e.mimeType, - description: e.description - })) || [], + attachment: entity.attachments.map((e)=>(e.id)) || [], deviceId: getInstanceId() } } diff --git a/src/app/core/chat/repository/message/message-remote-repository.ts b/src/app/core/chat/repository/message/message-remote-repository.ts index 0e06c7ca3..a4c6b68ce 100644 --- a/src/app/core/chat/repository/message/message-remote-repository.ts +++ b/src/app/core/chat/repository/message/message-remote-repository.ts @@ -1,5 +1,8 @@ import { DataSourceReturn } from "src/app/services/Repositorys/type"; import { IMessageGetAllByRoomIdOutPut } from "../../usecase/message/message-get-all-by-room-Id"; +import { MessageAttachmentInput } from "../../usecase/message/message-attachment-upload-use-case.service"; +import { Result } from "neverthrow"; +import { HttpErrorResponse } from "@angular/common/http"; export interface IGetMessagesFromRoomParams { roomId: string @@ -8,4 +11,5 @@ export interface IGetMessagesFromRoomParams { export abstract class IMessageRemoteRepository { abstract getMessagesFromRoom(input: IGetMessagesFromRoomParams): DataSourceReturn + abstract messageAttachmentUpload(input: MessageAttachmentInput): Promise> } diff --git a/src/app/core/chat/repository/message/message-socket-repository.ts b/src/app/core/chat/repository/message/message-socket-repository.ts index 99d42bb9a..9dfd8c04a 100644 --- a/src/app/core/chat/repository/message/message-socket-repository.ts +++ b/src/app/core/chat/repository/message/message-socket-repository.ts @@ -12,8 +12,8 @@ import { SocketMessage } from "src/app/infra/socket/signalR/signalR"; export abstract class IMessageSocketRepository { abstract connect(): Promise> - abstract sendGroupMessage(data: MessageInputDTO): Promise> - abstract sendDirectMessage(data: MessageInputDTO): Promise> + abstract sendGroupMessage(data: MessageInputDTO): Promise> + abstract sendDirectMessage(data: MessageInputDTO): Promise> // abstract sendDeliverAt(): Promise> abstract sendReadAt(data: MessageMarkAsReadInput): Promise> diff --git a/src/app/core/chat/usecase/message/message-attachment-upload-use-case.service.ts b/src/app/core/chat/usecase/message/message-attachment-upload-use-case.service.ts new file mode 100644 index 000000000..ee867f159 --- /dev/null +++ b/src/app/core/chat/usecase/message/message-attachment-upload-use-case.service.ts @@ -0,0 +1,33 @@ +import { Injectable } from '@angular/core'; +import { base64Schema } from 'src/app/utils/zod'; +import { z } from 'zod'; +import { MessageAttachmentFileType, MessageAttachmentSource } from '../../entity/message'; + + + +export const MessageAttachmentDTOSchema = z.object({ + fileType: z.nativeEnum(MessageAttachmentFileType), + source: z.nativeEnum(MessageAttachmentSource), + file: base64Schema.optional(), + fileName: z.string().optional(), + applicationId: z.number(), + docId: z.number(), + mimeType: z.string().nullable().optional(), + description: z.string().optional(), + senderId: z.number().optional(), +}); +export type MessageAttachmentInput = z.infer + + +@Injectable({ + providedIn: 'root' +}) +export class MessageAttachmentUploadUseCaseService { + + constructor() { } + + execute(input: MessageAttachmentInput) { + + + } +} diff --git a/src/app/core/chat/usecase/message/message-create-use-case.service copy.ts b/src/app/core/chat/usecase/message/message-create-use-case.service copy.ts deleted file mode 100644 index b6a4a29d5..000000000 --- a/src/app/core/chat/usecase/message/message-create-use-case.service copy.ts +++ /dev/null @@ -1,235 +0,0 @@ -import { Injectable } from '@angular/core'; -import { IMessage, MessageAttachmentSource, MessageEntity, MessageEntitySchema, } from '../../entity/message'; -import { z } from 'zod'; -import { v4 as uuidv4 } from 'uuid'; -import { createBlobFromBase64, createDataURL } from 'src/app/utils/ToBase64'; -import { zodSafeValidation } from 'src/app/utils/zodValidation'; -import { Logger } from 'src/app/services/logger/main/service'; -import { err, Result } from 'neverthrow'; -import { MessageMapper } from '../../mapper/messageMapper'; -import { RoomType } from "src/app/core/chat/entity/group"; -import { TracingType, XTracerAsync } from 'src/app/services/monitoring/opentelemetry/tracer'; -import { MessageTable } from 'src/app/infra/database/dexie/instance/chat/schema/message'; -import { MessageAttachmentFileType, MessageOutPutDataDTO } from 'src/app/core/chat/repository/dto/messageOutputDTO'; -import { IMessageLocalRepository } from 'src/app/core/chat/repository/message/message-local-repository'; -import { IMessageSocketRepository } from 'src/app/core/chat/repository/message/message-socket-repository'; -import { IMemberLocalRepository } from 'src/app/core/chat/repository/member/member-local-repository'; -import { IAttachmentLocalRepository } from 'src/app/core/chat/repository/typing/typing-local-repository'; -import { base64Schema } from 'src/app/utils/zod'; - - -export const MessageInputDTOSchema = z.object({ - roomId: z.string().uuid().optional(), - receiverId: z.number().optional(), - senderId: z.number(), - message: z.string().nullable().optional(), - messageType: z.number(), - canEdit: z.boolean(), - oneShot: z.boolean(), - requireUnlock: z.boolean(), - requestId: z.string(), - attachment: z.object({ - fileType: z.nativeEnum(MessageAttachmentFileType), - source: z.nativeEnum(MessageAttachmentSource), - file: base64Schema.optional(), - fileName: z.string().optional(), - applicationId: z.number().optional(), - docId: z.number().optional(), - mimeType: z.string().nullable().optional(), - description: z.string().optional() - }).optional() -}); -export type MessageInputDTO = z.infer - - - -export const MessageCreatePutDataDTOSchema = z.object({ - id: z.string(), - roomId: z.string(), - sender: z.object({ - wxUserId: z.number(), - wxFullName: z.string(), - wxeMail: z.string(), - userPhoto: z.string().optional() - }), - message: z.string().nullable().optional(), - messageType: z.number(), - sentAt: z.string(), - canEdit: z.boolean(), - oneShot: z.boolean(), - requireUnlock: z.boolean(), - requestId: z.string().optional().nullable(), - reactions: z.object({ - id: z.string(), - reactedAt: z.string(), - reaction: z.string(), - sender: z.object({}), - }).array(), - info: z.array(z.object({ - memberId: z.number(), - readAt: z.string().nullable(), - deliverAt: z.string().nullable() - })), - attachments: z.array(z.object({ - fileType: z.nativeEnum(MessageAttachmentFileType), - source: z.nativeEnum(MessageAttachmentSource), - file: z.string().optional(), - fileName: z.string().optional(), - applicationId: z.number().optional(), - docId: z.number().optional(), - id: z.string().optional() - })) -}); - -export type MessageCreateOutPutDataDTO = z.infer - -@Injectable({ - providedIn: 'root' -}) -export class MessageCreateUseCaseService { - - constructor( - private AttachmentLocalRepositoryService: IAttachmentLocalRepository, - private messageLocalDataSourceService: IMessageLocalRepository, - private messageSocketRepositoryService: IMessageSocketRepository, - private MemberListLocalRepository: IMemberLocalRepository - ) { } - - - @XTracerAsync({name:'MessageCreateUseCaseService', module:'chat', bugPrint: true, waitNThrow: 5000}) - async execute(message: IMessage, messageEnum: RoomType, tracing?: TracingType) { - - const validation = zodSafeValidation(MessageEntitySchema, message) - - if(validation.isOk()) { - message.sendAttemp++; - - message.requestId = uuidv4(); - message.sending = true; - - const createMessageLocally = this.messageLocalDataSourceService.insert(message) - - createMessageLocally.then(async (value) => { - if(value.isOk()) { - - const localId = value.value - message.$id = localId - - if(message.hasAttachment) { - - for (const attachment of message.attachments) { - - if(attachment.source != MessageAttachmentSource.Webtrix) { - - this.AttachmentLocalRepositoryService.insert({ - $messageId: localId, - file: createBlobFromBase64(attachment.file, attachment.mimeType), - fileType: attachment.fileType, - source: attachment.source, - fileName: attachment.fileName, - applicationId: attachment.applicationId, - docId: attachment.docId, - mimeType: attachment.mimeType, - base64: createDataURL(attachment.file, attachment.mimeType) - }).then((e) => { - if(e.isErr()) { - Logger.error('failed to create attachment locally on send message', { - error: e.error, - data: createDataURL(attachment.file, attachment.mimeType).slice(0, 100) +'...' - }) - } - - }) - - attachment.safeFile = createDataURL(attachment.file, attachment.mimeType) - } - } - - } - - - } else { - Logger.error('failed to insert locally', { - error: value.error.message - }) - } - - }).catch((error) => { - Logger.error('failed to insert catch', { - //error: createMessageLocally.error.message - }) - }) - - - let sendMessageResult: Result - - if(messageEnum == RoomType.Group) { - const DTO = MessageMapper.fromDomain(message, message.requestId) - message.sending = true - sendMessageResult = await this.messageSocketRepositoryService.sendGroupMessage(DTO) - } else { - const DTO = MessageMapper.fromDomain(message, message.requestId) - delete DTO.roomId - message.sending = true - sendMessageResult = await this.messageSocketRepositoryService.sendDirectMessage(DTO) - } - - // return this sendMessageResult - - if(sendMessageResult.isOk()) { - - message.id = sendMessageResult.value.id - - console.log('sendMessageResult', sendMessageResult.value.id) - - if(sendMessageResult.value.sender == undefined || sendMessageResult.value.sender == null) { - - delete sendMessageResult.value.sender - } - - let clone: MessageTable = { - ...sendMessageResult.value, - id: sendMessageResult.value.id, - $id : message.$id - } - - createMessageLocally.then(() => { - this.messageLocalDataSourceService.update(message.$id, {...clone, sending: false, roomId: clone.roomId}).then((data)=> { - if(data.isOk()) { - - } else { - tracing.hasError('failed to update send message') - console.log(sendMessageResult) - console.log(data.error) - } - }) - }) - - return sendMessageResult - } else { - Logger.error('failed to send message to the server', { - error: sendMessageResult.error - }) - await this.messageLocalDataSourceService.update(message.$id, {sending: false, $id: message.$id}) - return err('no connection') - } - - - } else { - - if(validation.error.formErrors.fieldErrors.attachments) { - Logger.error('failed to send message doe to invalid attachment', { - zodErrorList: validation.error.errors, - data: message.attachments - }) - } else { - Logger.error('failed to send message, validation failed', { - zodErrorList: validation.error.errors, - data: message - }) - } - - } - - } -} diff --git a/src/app/core/chat/usecase/message/message-create-use-case.service.ts b/src/app/core/chat/usecase/message/message-create-use-case.service.ts index 13a3a6abd..9d1292e4c 100644 --- a/src/app/core/chat/usecase/message/message-create-use-case.service.ts +++ b/src/app/core/chat/usecase/message/message-create-use-case.service.ts @@ -15,7 +15,8 @@ import { IMessageLocalRepository } from 'src/app/core/chat/repository/message/me import { IMessageSocketRepository } from 'src/app/core/chat/repository/message/message-socket-repository'; import { IMemberLocalRepository } from 'src/app/core/chat/repository/member/member-local-repository'; import { IAttachmentLocalRepository } from 'src/app/core/chat/repository/typing/typing-local-repository'; -import { base64Schema } from 'src/app/utils/zod'; +import { IMessageRemoteRepository } from '../../repository/message/message-remote-repository'; +import { SessionStore } from 'src/app/store/session.service'; export const MessageInputDTOSchema = z.object({ @@ -28,16 +29,7 @@ export const MessageInputDTOSchema = z.object({ oneShot: z.boolean(), requireUnlock: z.boolean(), requestId: z.string(), - attachment: z.object({ - fileType: z.nativeEnum(MessageAttachmentFileType), - source: z.nativeEnum(MessageAttachmentSource), - file: base64Schema.optional(), - fileName: z.string().optional(), - applicationId: z.number().optional(), - docId: z.number().optional(), - mimeType: z.string().nullable().optional(), - description: z.string().optional() - }).array(), + attachment: z.string().array(), deviceId: z.string().optional() }); export type MessageInputDTO = z.infer @@ -71,15 +63,7 @@ export const MessageCreatePutDataDTOSchema = z.object({ readAt: z.string().nullable(), deliverAt: z.string().nullable() })), - attachments: z.array(z.object({ - fileType: z.nativeEnum(MessageAttachmentFileType), - source: z.nativeEnum(MessageAttachmentSource), - file: z.string().optional(), - fileName: z.string().optional(), - applicationId: z.number().optional(), - docId: z.number().optional(), - id: z.string().optional() - })) + attachments: z.array(z.string()) }); export type MessageCreateOutPutDataDTO = z.infer @@ -93,7 +77,8 @@ export class MessageCreateUseCaseService { private AttachmentLocalRepositoryService: IAttachmentLocalRepository, private messageLocalDataSourceService: IMessageLocalRepository, private messageSocketRepositoryService: IMessageSocketRepository, - private MemberListLocalRepository: IMemberLocalRepository + private MemberListLocalRepository: IMemberLocalRepository, + private MessageRemoteRepository: IMessageRemoteRepository ) { } @@ -105,53 +90,73 @@ export class MessageCreateUseCaseService { if(validation.isOk()) { message.sendAttemp++; - const createMessageLocally = this.messageLocalDataSourceService.insert(message) + const createMessageLocally = await this.messageLocalDataSourceService.insert(message) - createMessageLocally.then((value) => { - if(value.isOk()) { + if(createMessageLocally.isOk()) { - message.$id = value.value + message.$id = createMessageLocally.value - if(message.hasAttachment) { + if(message.hasAttachment) { - for (const attachment of message.attachments) { + for (const attachment of message.attachments) { + const isWebtrix = attachment.source === MessageAttachmentSource.Webtrix; - if(attachment.source != MessageAttachmentSource.Webtrix) { - - this.AttachmentLocalRepositoryService.insert({ - $messageId: value.value, - file: createBlobFromBase64(attachment.file, attachment.mimeType), - fileType: attachment.fileType, - source: attachment.source, - fileName: attachment.fileName, - applicationId: attachment.applicationId, - docId: attachment.docId, - mimeType: attachment.mimeType, - base64: createDataURL(attachment.file, attachment.mimeType) - }).then((e) => { - if(e.isErr()) { - Logger.error('failed to create attachment locally on send message', { - error: e.error, - data: createDataURL(attachment.file, attachment.mimeType).slice(0, 100) +'...' - }) - } - - }) - - attachment.safeFile = createDataURL(attachment.file, attachment.mimeType) - } + await this.AttachmentLocalRepositoryService.insert({ + $messageId: createMessageLocally.value, + file: isWebtrix ? null : createBlobFromBase64(attachment.file || '', attachment.mimeType), + fileType: attachment.fileType, + source: attachment.source, + fileName: attachment.fileName, + applicationId: attachment.applicationId, + docId: attachment.docId, + mimeType: attachment.mimeType, + base64: isWebtrix ? null : createDataURL(attachment.file || '', attachment.mimeType), + id: null, + }).then((e) => { + if(e.isErr()) { + Logger.error('failed to create attachment locally on send message', { + error: e.error, + data: !isWebtrix ? createDataURL(attachment.file, attachment.mimeType).slice(0, 100) +'...' : undefined + }) } - + }) + if(!isWebtrix) { + attachment.safeFile = createDataURL(attachment.file, attachment.mimeType) } - - } else { - Logger.error('failed to insert locally', { - error: value.error.message - }) } - }); + var attachments = await this.AttachmentLocalRepositoryService.find({ + $messageId: createMessageLocally.value, + }); + + if(attachments.isOk()) { + var i = 0; + for (const att of attachments.value) { + + const isWebtrix = att.source === MessageAttachmentSource.Webtrix; + var a = await this.MessageRemoteRepository.messageAttachmentUpload({ + fileType: att.fileType, + source: att.source, + file: isWebtrix ? null : att.base64.replace(/^data:[a-zA-Z]+\/[a-zA-Z]+;base64,/, ''), + fileName: att.fileName, + applicationId: att.applicationId || 0, + docId: att.docId || 0, + mimeType: att.mimeType, + description: att.description || "something", + senderId: SessionStore.user.UserId, + }); + + if(a.isOk()) { + att.id = a.value as string; + message.attachments[i].id = a.value as string; + await this.AttachmentLocalRepositoryService.update(att.$id, att) + } else { + return err('failed to upload attachment') + } + } + } + } //==================== message.sending = true @@ -172,7 +177,6 @@ export class MessageCreateUseCaseService { tracing.setAttribute("duration", `Execution time: ${duration}ms`); - // return this sendMessageResult if(sendMessageResult.isOk()) { @@ -185,24 +189,23 @@ export class MessageCreateUseCaseService { delete sendMessageResult.value.sender } - createMessageLocally.then((value) => { - console.log('sendMessageResult', (sendMessageResult as any).value) - let clone: MessageTable = { - ...(sendMessageResult as any).value, - id: (sendMessageResult as any).value.id, - $id : message.$id - } - console.log('set update') - this.messageLocalDataSourceService.update(message.$id, {...clone, sending: false, roomId: clone.roomId}).then((data)=> { - if(data.isOk()) { - } else { - tracing.hasError('failed to update send message') - console.log(sendMessageResult) - console.log(data.error) - } - }) - }); + console.log('sendMessageResult', (sendMessageResult as any).value) + let clone: MessageTable = { + ...(sendMessageResult as any).value, + id: (sendMessageResult as any).value.id, + $id : message.$id + } + + this.messageLocalDataSourceService.update(message.$id, {...clone, sending: false, roomId: clone.roomId}).then((data)=> { + if(data.isOk()) { + + } else { + tracing.hasError('failed to update send message') + console.log(sendMessageResult) + console.log(data.error) + } + }) return sendMessageResult @@ -213,21 +216,8 @@ export class MessageCreateUseCaseService { await this.messageLocalDataSourceService.update(message.$id, {sending: false, $id: message.$id}) return err('no connection') } - } else { - - if(validation.error.formErrors.fieldErrors.attachments) { - Logger.error('failed to send message doe to invalid attachment', { - zodErrorList: validation.error.errors, - data: message.attachments - }) - } else { - Logger.error('failed to send message, validation failed', { - zodErrorList: validation.error.errors, - data: message - }) - } - } + } } } diff --git a/src/app/core/chat/usecase/message/messages-send-offline-use-case.service.ts b/src/app/core/chat/usecase/message/messages-send-offline-use-case.service.ts index 0a4156bcc..eacbab169 100644 --- a/src/app/core/chat/usecase/message/messages-send-offline-use-case.service.ts +++ b/src/app/core/chat/usecase/message/messages-send-offline-use-case.service.ts @@ -6,16 +6,18 @@ import { v4 as uuidv4 } from 'uuid' import { AttachmentLocalDataSource } from '../../../../module/chat/data/repository/attachment/attachment-local-repository.service'; import { RoomLocalRepository } from '../../../../module/chat/data/repository/room/room-local-repository.service'; import { MemberListLocalRepository } from 'src/app/module/chat/data/repository/member/member-list-local-repository.service' -import { Result } from 'neverthrow'; +import { err, Result } from 'neverthrow'; import { RoomType } from 'src/app/core/chat/entity/group'; import { MessageTable } from 'src/app/infra/database/dexie/instance/chat/schema/message'; -import { MessageOutPutDataDTO } from 'src/app/core/chat/repository/dto/messageOutputDTO'; +import { MessageAttachmentSource, MessageOutPutDataDTO } from 'src/app/core/chat/repository/dto/messageOutputDTO'; import { IDBoolean } from 'src/app/infra/database/dexie/type'; import { IMemberLocalRepository } from '../../repository/member/member-local-repository'; import { IMessageLocalRepository } from '../../repository/message/message-local-repository'; import { IMessageSocketRepository } from '../../repository/message/message-socket-repository'; import { IRoomLocalRepository } from '../../repository/room/room-local-repository'; import { IAttachmentLocalRepository } from '../../repository/typing/typing-local-repository'; +import { IMessageRemoteRepository } from '../../repository/message/message-remote-repository'; +import { SessionStore } from 'src/app/store/session.service'; @Injectable({ providedIn: 'root' @@ -29,6 +31,8 @@ export class SendLocalMessagesUseCaseService { private roomLocalDataSourceService: IRoomLocalRepository, private MemberListLocalRepository: IMemberLocalRepository, private messageSocketRepositoryService: IMessageSocketRepository, + private MessageRemoteRepository: IMessageRemoteRepository, + private AttachmentLocalRepositoryService: IAttachmentLocalRepository, ) { } async execute() { @@ -53,17 +57,49 @@ export class SendLocalMessagesUseCaseService { if(attachments.isOk()) { - message.attachments = attachments.value.map(e => ({ - fileType: e.fileType, - source: e.source, - fileName: e.fileName, - applicationId: e.applicationId, - docId: e.docId, - id: e.id, - mimeType: e.mimeType, - description: e.description, - file: e.base64.split(',')[1] - })) + message.attachments = attachments.value.map(e => { + const base64 = typeof e.base64 === "string" + ? e.base64.replace(/^data:[a-zA-Z]+\/[a-zA-Z]+;base64,/, "") + : ""; + + return { + fileType: e.fileType, + source: e.source, + fileName: e.fileName, + applicationId: e.applicationId, + docId: e.docId, + id: e.id, + mimeType: e.mimeType, + description: e.description, + file: base64 + }; + }); + + + var i = 0; + for (const att of attachments.value) { + + const isWebtrix = att.source === MessageAttachmentSource.Webtrix; + var a = await this.MessageRemoteRepository.messageAttachmentUpload({ + fileType: att.fileType, + source: att.source, + file: isWebtrix ? null : att.base64.replace(/^data:[a-zA-Z]+\/[a-zA-Z]+;base64,/, ''), + fileName: att.fileName, + applicationId: att.applicationId || 0, + docId: att.docId || 0, + mimeType: att.mimeType, + description: att.description || "something", + senderId: SessionStore.user.UserId, + }); + + if(a.isOk()) { + att.id = a.value as string; + message.attachments[i].id = a.value as string; + await this.AttachmentLocalRepositoryService.update(att.$id, att) + } else { + return err('failed to upload attachment') + } + } await this.messageLocalDataSourceService.update(message.$id, { sending: true }) diff --git a/src/app/core/chat/usecase/socket/socket-message-create-use-case.service.ts b/src/app/core/chat/usecase/socket/socket-message-create-use-case.service.ts index 1ed4f4d7c..3dcc7095b 100644 --- a/src/app/core/chat/usecase/socket/socket-message-create-use-case.service.ts +++ b/src/app/core/chat/usecase/socket/socket-message-create-use-case.service.ts @@ -7,7 +7,6 @@ import { z } from 'zod'; const SocketMessageCreateOutputSchema = MessageEntitySchema.pick({ id: true, - attachments: true, canEdit: true, editedAt: true, info: true, diff --git a/src/app/core/chat/usecase/socket/socket-message-delete-use-case.service.ts b/src/app/core/chat/usecase/socket/socket-message-delete-use-case.service.ts index f2d805836..7ad6e1353 100644 --- a/src/app/core/chat/usecase/socket/socket-message-delete-use-case.service.ts +++ b/src/app/core/chat/usecase/socket/socket-message-delete-use-case.service.ts @@ -7,7 +7,6 @@ import { IMessageLocalRepository } from '../../repository/message/message-local- const SocketMessageDeleteOutputSchema = MessageEntitySchema.pick({ id: true, - attachments: true, canEdit: true, editedAt: true, info: true, diff --git a/src/app/core/chat/usecase/socket/socket-message-update-use-case.service.ts b/src/app/core/chat/usecase/socket/socket-message-update-use-case.service.ts index 201cb3909..236152081 100644 --- a/src/app/core/chat/usecase/socket/socket-message-update-use-case.service.ts +++ b/src/app/core/chat/usecase/socket/socket-message-update-use-case.service.ts @@ -11,7 +11,6 @@ import { IMessageLocalRepository } from '../../repository/message/message-local- const SocketMessageUpdateOutputSchema = MessageEntitySchema.pick({ id: true, - attachments: true, canEdit: true, editedAt: true, info: true, diff --git a/src/app/core/user/repository/user-remote-repository.ts b/src/app/core/user/repository/user-remote-repository.ts index 9702edd65..51670b552 100644 --- a/src/app/core/user/repository/user-remote-repository.ts +++ b/src/app/core/user/repository/user-remote-repository.ts @@ -1,8 +1,8 @@ import { HttpErrorResponse } from "@angular/common/http"; import { Result } from "neverthrow"; import { HttpResult } from "src/app/infra/http/type"; -import { UserLoginInput } from "../use-case/user-login-use-case.service"; import { z } from "zod"; +import { UserPhotoUploadInput } from "../use-case/user-photo-upload.service"; const UserRepositoryLoginParams = z.object({ Auth: z.string(), @@ -55,4 +55,5 @@ export abstract class IUserRemoteRepository { abstract login(input: IUserRepositoryLoginParams): Promise, HttpErrorResponse>> abstract logout(): Promise, HttpErrorResponse>> abstract refreshToken(input:UserRefreshTokenInputDTO): Promise, HttpErrorResponse>> + abstract uploadPhoto(input: UserPhotoUploadInput): Promise, HttpErrorResponse>> } diff --git a/src/app/core/user/use-case/user-get-by-id.service.ts b/src/app/core/user/use-case/user-get-by-id.service.ts index 98e3b8f2c..b7f630c71 100644 --- a/src/app/core/user/use-case/user-get-by-id.service.ts +++ b/src/app/core/user/use-case/user-get-by-id.service.ts @@ -1,4 +1,7 @@ import { Injectable } from '@angular/core'; +import { UserLocalRepositoryService } from 'src/app/module/user/data/datasource/user-local-repository.service'; +import { UserRemoteRepositoryService } from 'src/app/module/user/data/datasource/user-remote-repository.service'; +import { TracingType } from 'src/app/services/monitoring/opentelemetry/tracer'; import { z, ZodError, ZodSchema } from 'zod'; const UserGetByIdInputSchema = z.object({ @@ -35,5 +38,21 @@ export type UserGetByIdOutput = z.infer }) export class UserGetByIdService { - constructor() { } + constructor( + private remote: UserRemoteRepositoryService, + private local: UserLocalRepositoryService + ) { } + + async execute(guid: string , tracing?: TracingType) { + const result = await this.remote.getUserProfilePhoto(guid, tracing) + + if(result.isOk()) { + this.local.addProfilePicture({base64: result.value.data.data.userPhoto}) + } else { + tracing?.setAttribute("picture.upload", "false") + tracing?.hasError("cant upload picture") + } + + return result + } } diff --git a/src/app/core/user/use-case/user-photo-upload.service.ts b/src/app/core/user/use-case/user-photo-upload.service.ts new file mode 100644 index 000000000..ec233444d --- /dev/null +++ b/src/app/core/user/use-case/user-photo-upload.service.ts @@ -0,0 +1,47 @@ +import { Injectable } from '@angular/core'; +import { z } from 'zod'; +import { IUserRemoteRepository } from '../repository/user-remote-repository'; +import { TracingType, XTracerAsync } from 'src/app/services/monitoring/opentelemetry/tracer'; +import { UserLocalRepositoryService } from 'src/app/module/user/data/datasource/user-local-repository.service'; + +// Schema for photo validation +export const UserPhotoUploadInputSchema = z.object({ + photo: z.string().regex(/^data:image\/[a-zA-Z]+;base64,/, { + message: 'Photo must start with data:image/...;base64,', + }), +}); + +export type UserPhotoUploadInput = z.infer; + +@Injectable({ + providedIn: 'root' +}) +export class UserPhotoUploadUseCase { + constructor( + private remote: IUserRemoteRepository, + private local: UserLocalRepositoryService + ) {} + + @XTracerAsync({ name: 'UserLoginUseCaseService', module: 'user', bugPrint: true }) + async execute(input: unknown, tracing?: TracingType) { + // ✅ Validate input with Zod + const parsed = UserPhotoUploadInputSchema.safeParse(input); + if (!parsed.success) { + tracing?.setAttribute("picture.upload", "false"); + tracing?.hasError("invalid input: " + JSON.stringify(parsed.error.format())); + } + + const validInput = parsed.data; + + const result = await this.remote.uploadPhoto(validInput); + + if (result.isOk()) { + this.local.addProfilePicture({ base64: validInput.photo }); + } else { + tracing?.setAttribute("picture.upload", "false"); + tracing?.hasError("cant upload picture"); + } + + return result; + } +} diff --git a/src/app/infra/database/dexie/instance/chat/schema/attachment.ts b/src/app/infra/database/dexie/instance/chat/schema/attachment.ts index f8e698704..2db705dcb 100644 --- a/src/app/infra/database/dexie/instance/chat/schema/attachment.ts +++ b/src/app/infra/database/dexie/instance/chat/schema/attachment.ts @@ -7,7 +7,7 @@ export const AttachmentTableSchema = z.object({ $id: z.number().optional(), // local id $messageId: z.string(), attachmentId: z.string().optional(), - file: z.instanceof(Blob).optional(), + file: z.instanceof(Blob).nullable().optional(), base64: zodDataUrlSchema.nullable().optional(), // fileType: z.nativeEnum(MessageAttachmentFileType).optional(), @@ -16,7 +16,7 @@ export const AttachmentTableSchema = z.object({ applicationId: z.number().optional(), docId: z.number().optional(), mimeType: z.string().nullable().optional(), - id: z.string().uuid().optional(), + id: z.string().uuid().nullable().optional(), description: z.string().optional() }) diff --git a/src/app/infra/file-picker/web/file-picker-web.service.ts b/src/app/infra/file-picker/web/file-picker-web.service.ts index c045883cf..b0df3855a 100644 --- a/src/app/infra/file-picker/web/file-picker-web.service.ts +++ b/src/app/infra/file-picker/web/file-picker-web.service.ts @@ -27,4 +27,19 @@ export class FilePickerWebService { }) } + + getAnyFileFromDevice(): Promise> { + let input = document.createElement('input'); + input.type = 'file'; + + input.click(); + + return new Promise((resolve, reject)=>{ + input.onchange = async () => { + const file = Array.from(input.files) + resolve(ok(file[0] as File)); + }; + }) + } + } diff --git a/src/app/modals/profile/edit-profile/edit-profile.page.ts b/src/app/modals/profile/edit-profile/edit-profile.page.ts index 1715fc433..030e6dfc5 100644 --- a/src/app/modals/profile/edit-profile/edit-profile.page.ts +++ b/src/app/modals/profile/edit-profile/edit-profile.page.ts @@ -16,6 +16,7 @@ import { UserRepositoryService } from 'src/app/module/user/data/user-repository. import { isHttpError } from 'src/app/services/http.service'; import { UserProfilePicture } from 'src/app/module/user/data/datasource/user-local-repository.service'; import { Observable } from 'rxjs'; +import { UserPhotoUploadUseCase } from 'src/app/core/user/use-case/user-photo-upload.service'; @Component({ selector: 'app-edit-profile', @@ -43,8 +44,8 @@ export class EditProfilePage implements OnInit { private CameraService: CameraService, private toastService: ToastService, private httpErrorHandle: HttpErrorHandle, - private UserRepositoryService: UserRepositoryService - + private UserRepositoryService: UserRepositoryService, + private UserPhotoUploadUseCase: UserPhotoUploadUseCase ) { this.profilePictureSubject = this.UserRepositoryService.getProfilePictureLive() as any } @@ -178,33 +179,29 @@ export class EditProfilePage implements OnInit { if(capturedImage.isOk()) { this.capturedImage = capturedImage.value; - var object = { - "ImageBase64": this.capturedImage - } - tracing.addEvent('serialize image') + console.log(this.capturedImage); - const guid = await this.UserRepositoryService.addUserProfilePhoto(object) + var guid = await this.UserPhotoUploadUseCase.execute({photo: 'data:image/jpeg;base64,' +this.capturedImage}, tracing) if(guid.isOk()) { - tracing.addEvent('upload image') - const base = await this.UserRepositoryService.getUserProfilePhoto(guid.value, tracing) + // const base = await this.UserRepositoryService.getUserProfilePhoto(guid.value, tracing) - if(base.isOk()) { - tracing.addEvent('download image') - this.profilePicture = 'data:image/jpeg;base64,' + base.value; + // if(base.isOk()) { + // tracing.addEvent('download image') + // this.profilePicture = 'data:image/jpeg;base64,' + base.value; - tracing.setAttribute("picture.save", "true") + // tracing.setAttribute("picture.save", "true") - } else { - if(!isHttpError(base.error)) { - this.toastService._badRequest('Pedimos desculpa mas não foi possível executar a acção. Por favor, contacte o apoio técnico.') - } else { - this.httpErrorHandle.httpStatusHandle(base.error) - } - } + // } else { + // if(!isHttpError(base.error)) { + // this.toastService._badRequest('Pedimos desculpa mas não foi possível executar a acção. Por favor, contacte o apoio técnico.') + // } else { + // this.httpErrorHandle.httpStatusHandle(base.error) + // } + // } } else { if(!isHttpError(guid.error)) { diff --git a/src/app/module/chat/data/repository/attachment/attachment-remote-repository.service.ts b/src/app/module/chat/data/repository/attachment/attachment-remote-repository.service.ts index 300e03731..9c7d7a4bb 100644 --- a/src/app/module/chat/data/repository/attachment/attachment-remote-repository.service.ts +++ b/src/app/module/chat/data/repository/attachment/attachment-remote-repository.service.ts @@ -8,7 +8,7 @@ import { environment } from 'src/environments/environment'; providedIn: 'root' }) export class AttachmentRemoteDataSourceService implements IAttachmentRemoteRepository { - private baseUrl = `${environment.apiURLStage.slice(0, -1)}`; // Your base URL + private baseUrl = `${environment.apiURLStage}chat`; // Your base URL constructor( private httpService: HttpService, diff --git a/src/app/module/chat/data/repository/message/message-live-signalr-data-source.service.ts b/src/app/module/chat/data/repository/message/message-live-signalr-data-source.service.ts index c3019402c..3a787b39a 100644 --- a/src/app/module/chat/data/repository/message/message-live-signalr-data-source.service.ts +++ b/src/app/module/chat/data/repository/message/message-live-signalr-data-source.service.ts @@ -46,7 +46,7 @@ export class MessageSocketRepositoryService implements IMessageSocketRepository data['requestId'] = uuidv4(); } - const result = await this.socket.sendData({ + const result = await this.socket.sendData({ method: 'sendMessage', data: data, }) diff --git a/src/app/module/chat/data/repository/message/message-remote-data-source.service.ts b/src/app/module/chat/data/repository/message/message-remote-data-source.service.ts index a5753e3cb..ff22f1492 100644 --- a/src/app/module/chat/data/repository/message/message-remote-data-source.service.ts +++ b/src/app/module/chat/data/repository/message/message-remote-data-source.service.ts @@ -9,11 +9,12 @@ import { HttpErrorResponse } from '@angular/common/http'; import { Result } from 'neverthrow'; import { HttpResult } from 'src/app/infra/http/type'; import { environment } from 'src/environments/environment'; +import { MessageAttachmentInput } from 'src/app/core/chat/usecase/message/message-attachment-upload-use-case.service'; @Injectable({ providedIn: 'root' }) -export class MessageRemoteDataSourceService implements IMessageRemoteRepository { +export class MessageRemoteDataSourceService { private baseUrl = `${environment.apiURLStage}Chat`; // Your base URL @@ -23,6 +24,13 @@ export class MessageRemoteDataSourceService implements IMessageRemoteRepository private http: HttpAdapter ) {} + async messageAttachmentUpload(input: MessageAttachmentInput) { + var a = await this.http.post(`${this.baseUrl}/attachment`, input) + return a.map((e) => { + return e.data.data["attachmentId"] as String + }) + } + // @APIReturn(MessageOutPutDTOSchema, 'get/Messages') async getMessagesFromRoom(input: IGetMessagesFromRoomParams): DataSourceReturn { diff --git a/src/app/module/user/data/datasource/user-remote-repository.service.ts b/src/app/module/user/data/datasource/user-remote-repository.service.ts index 1687100e2..3bee18358 100644 --- a/src/app/module/user/data/datasource/user-remote-repository.service.ts +++ b/src/app/module/user/data/datasource/user-remote-repository.service.ts @@ -2,17 +2,20 @@ import { Injectable } from '@angular/core'; import { HttpService } from 'src/app/services/http.service'; import { environment } from 'src/environments/environment'; import { IProfilePictureInputDTO } from '../dto/profilePictureInputDTO'; -import { HttpHeaders } from '@angular/common/http'; +import { HttpErrorResponse, HttpHeaders } from '@angular/common/http'; import { TracingType } from 'src/app/services/monitoring/opentelemetry/tracer'; import { HttpAdapter } from 'src/app/infra/http/adapter'; -import { IUserRepositoryLoginParams, UserRefreshTokenInputDTO } from 'src/app/core/user/repository/user-remote-repository'; +import { IUserRemoteRepository, IUserRepositoryLoginParams, UserLoginOutputResponse, UserRefreshTokenInputDTO } from 'src/app/core/user/repository/user-remote-repository'; import { UserLoginOutput } from 'src/app/core/user/use-case/user-login-use-case.service'; import { SessionStore } from 'src/app/store/session.service'; import { UserGetByIdOutput } from 'src/app/core/user/use-case/user-get-by-id.service'; +import { Result } from 'neverthrow'; +import { UserPhotoUploadInput } from 'src/app/core/user/use-case/user-photo-upload.service'; +import { HttpResult } from 'src/app/infra/http/type'; @Injectable({ providedIn: 'root' }) -export class UserRemoteRepositoryService { +export class UserRemoteRepositoryService implements IUserRemoteRepository{ private baseUrl = `${environment.apiURLStage.slice(0, -1)}`; // Your base URL @@ -21,12 +24,14 @@ export class UserRemoteRepositoryService { private http: HttpAdapter, ) { } + async uploadPhoto(input: UserPhotoUploadInput): Promise, HttpErrorResponse>> { + return await this.http.post(`${this.baseUrl}/Users/${SessionStore.user.UserId}/photo`, input) + } - // @APIReturn(MessageOutPutDTOSchema, 'get/Messages') - async login(input: IUserRepositoryLoginParams) { - - return await this.http.post(`${this.baseUrl}/Users/login`, input) - } + // @APIReturn(MessageOutPutDTOSchema, 'get/Messages') + async login(input: IUserRepositoryLoginParams) { + return await this.http.post(`${this.baseUrl}/Users/login`, input) + } // @APIReturn(MessageOutPutDTOSchema, 'get/Messages') async logout() { @@ -43,17 +48,4 @@ export class UserRemoteRepositoryService { return await this.http.get(`${this.baseUrl}/Users/${SessionStore.user.UserId}`, {}) } - addUserProfilePhoto(data: IProfilePictureInputDTO) { - const geturl = environment.apiURL + 'UserAuthentication/AddPhoto'; - - let http = new HttpHeaders(); - - http = http.set('content-type', "application/json"); - http = http.set('accept', "application/json"); - let options = { - headers: http - }; - - return this.httpService.post(`${geturl}`, data, options); - } } diff --git a/src/app/module/user/data/user-repository.service.ts b/src/app/module/user/data/user-repository.service.ts index 48666b5f9..ba55f999f 100644 --- a/src/app/module/user/data/user-repository.service.ts +++ b/src/app/module/user/data/user-repository.service.ts @@ -27,20 +27,6 @@ export class UserRepositoryService { return result } - async addUserProfilePhoto(data: IProfilePictureInputDTO, tracing?: TracingType) { - const result = await this.remote.addUserProfilePhoto(data) - - - if(result.isOk()) { - this.local.addProfilePicture({base64: 'data:image/jpeg;base64,' + data.ImageBase64}) - } else { - tracing?.setAttribute("picture.upload", "false") - tracing?.hasError("cant upload picture") - } - - return result - } - getProfilePictureLive() { return this.local.getLiveProfilePicture() } diff --git a/src/app/ui/chat/component/edit-group/edit-group.page.ts b/src/app/ui/chat/component/edit-group/edit-group.page.ts index 1ef9ef850..5441af60d 100644 --- a/src/app/ui/chat/component/edit-group/edit-group.page.ts +++ b/src/app/ui/chat/component/edit-group/edit-group.page.ts @@ -9,6 +9,7 @@ import { ToastService } from 'src/app/services/toast.service'; import { ZodError } from 'zod'; import { ChatServiceService } from 'src/app/module/chat/domain/chat-service.service'; +import { IRoomLocalRepository } from 'src/app/core/chat/repository/room/room-local-repository'; @Component({ @@ -37,6 +38,7 @@ export class EditGroupPage implements OnInit { private httpErrorHandle: HttpErrorHandle, private toastService: ToastService, private chatServiceService: ChatServiceService, + private RoomLocalDataSourceService: IRoomLocalRepository, ) {} ngOnInit() { @@ -44,17 +46,13 @@ export class EditGroupPage implements OnInit { this.getRoomInfo(); } - getRoomInfo(){ - // this.chatService.getRoomInfo(this.roomId).subscribe(room=>{ - // this.room = room['room']; + async getRoomInfo() { + const room = await this.RoomLocalDataSourceService.findOne({id:this.roomId}) - // try { - // this.groupName = this.room.name.split('-').join(' '); - // } catch (error) { - // this.groupName = this.room.name; - // } - - // }); + if(room.isOk()) { + console.log(room.value); + this.groupName = room.value.roomName; + } } close() { diff --git a/src/app/ui/chat/component/messages/messages.page.ts b/src/app/ui/chat/component/messages/messages.page.ts index 8d7ddfd3a..0c3cfbb95 100644 --- a/src/app/ui/chat/component/messages/messages.page.ts +++ b/src/app/ui/chat/component/messages/messages.page.ts @@ -876,7 +876,7 @@ export class MessagesPage implements OnInit, OnChanges, AfterViewInit, OnDestroy this.messages1[this.room.$id].push(message) let sendMessage = this.chatServiceService.sendMessage(message, this.roomType) - this.messageResult(sendMessage) + //this.messageResult(sendMessage) setTimeout(() => { this.scrollToBottomClicked() @@ -911,7 +911,7 @@ export class MessagesPage implements OnInit, OnChanges, AfterViewInit, OnDestroy this.scrollToBottomClicked() }, 100) let sendMessage = this.chatServiceService.sendMessage(message, this.roomType) - this.messageResult(sendMessage) + //this.messageResult(sendMessage) } @@ -1096,7 +1096,7 @@ export class MessagesPage implements OnInit, OnChanges, AfterViewInit, OnDestroy this.scrollToBottomClicked() }, 100) let sendMessage = this.chatServiceService.sendMessage(message, this.roomType) - this.messageResult(sendMessage) + //this.messageResult(sendMessage) } @@ -1154,7 +1154,7 @@ export class MessagesPage implements OnInit, OnChanges, AfterViewInit, OnDestroy this.scrollToBottomClicked() }, 100) let sendMessage = this.chatServiceService.sendMessage(message, this.roomType) - this.messageResult(sendMessage) + //this.messageResult(sendMessage) this.textField = '' } @@ -1242,7 +1242,7 @@ export class MessagesPage implements OnInit, OnChanges, AfterViewInit, OnDestroy this.scrollToBottomClicked() }, 100) let sendMessage = this.chatServiceService.sendMessage(message, this.roomType) - this.messageResult(sendMessage) + //this.messageResult(sendMessage) } } @@ -1266,7 +1266,7 @@ export class MessagesPage implements OnInit, OnChanges, AfterViewInit, OnDestroy const fileExtension = await allowedDocExtension(file.value.type) - if(fileExtension.isOk()) { + //if(fileExtension.isOk()) { console.log('FILE rigth?', file) @@ -1297,12 +1297,12 @@ export class MessagesPage implements OnInit, OnChanges, AfterViewInit, OnDestroy this.scrollToBottomClicked() }, 100) let sendMessage = this.chatServiceService.sendMessage(message, this.roomType) - this.messageResult(sendMessage) + //this.messageResult(sendMessage) } - } else { - this.toastService._badRequest("Ficheiro inválido") - } + //} else { + //this.toastService._badRequest("Ficheiro inválido") + //} } } diff --git a/src/app/ui/chat/modal/edit-group/edit-group.page.ts b/src/app/ui/chat/modal/edit-group/edit-group.page.ts index 33de5791c..69ef9261d 100644 --- a/src/app/ui/chat/modal/edit-group/edit-group.page.ts +++ b/src/app/ui/chat/modal/edit-group/edit-group.page.ts @@ -1,6 +1,8 @@ import { HttpErrorResponse, HttpResponse } from '@angular/common/http'; import { Component, OnInit } from '@angular/core'; import { ModalController, NavParams, PickerController } from '@ionic/angular'; +import { IMessageLocalRepository } from 'src/app/core/chat/repository/message/message-local-repository'; +import { IRoomLocalRepository } from 'src/app/core/chat/repository/room/room-local-repository'; import { ChatServiceService } from 'src/app/module/chat/domain/chat-service.service'; import { HttpErrorHandle } from 'src/app/services/http-error-handle.service'; import { ThemeService } from 'src/app/services/theme.service' @@ -18,7 +20,6 @@ export class EditGroupPage implements OnInit { showDuration: boolean; selectedDuration = ['','','']; groupName:string; - room:any; roomId:string; constructor( @@ -29,6 +30,7 @@ export class EditGroupPage implements OnInit { private httpErrorHandle: HttpErrorHandle, private toastService: ToastService, private chatServiceService: ChatServiceService, + private RoomLocalDataSourceService: IRoomLocalRepository, ) { this.roomId = this.navParams.get('roomId'); } @@ -38,8 +40,13 @@ export class EditGroupPage implements OnInit { this.getRoomInfo(); } - getRoomInfo(){ + async getRoomInfo() { + const room = await this.RoomLocalDataSourceService.findOne({id:this.roomId}) + if(room.isOk()) { + console.log(room.value); + this.groupName = room.value.roomName; + } } close(){ diff --git a/src/app/ui/chat/modal/messages/messages.page.ts b/src/app/ui/chat/modal/messages/messages.page.ts index 0fc749fbe..2b30f32f1 100644 --- a/src/app/ui/chat/modal/messages/messages.page.ts +++ b/src/app/ui/chat/modal/messages/messages.page.ts @@ -562,6 +562,7 @@ export class MessagesPage implements OnInit, AfterViewInit, OnDestroy { cssClass: 'modal modal-desktop', componentProps: { roomId: this.RoomStore.room.id, + currentName: this.RoomStore.room.roomName }, }); await modal.present(); @@ -781,7 +782,7 @@ export class MessagesPage implements OnInit, AfterViewInit, OnDestroy { } - const file = await this.FilePickerWebService.getFileFromDevice(types) + const file = await this.FilePickerWebService.getAnyFileFromDevice(); if(file.isOk()) { diff --git a/src/app/ui/chat/store/roomStore.ts b/src/app/ui/chat/store/roomStore.ts index 6658f8275..3b1d43713 100644 --- a/src/app/ui/chat/store/roomStore.ts +++ b/src/app/ui/chat/store/roomStore.ts @@ -492,7 +492,7 @@ export class RoomStore { this.messages1[this.room.$id].push(message) let sendMessage = this.chatServiceService.sendMessage(message, this.room.roomType) - this.messageResult(sendMessage) + //this.messageResult(sendMessage) } } diff --git a/src/app/ui/shared/components/header/header.page copy.html b/src/app/ui/shared/components/header/header.page copy.html deleted file mode 100644 index 129a481a5..000000000 --- a/src/app/ui/shared/components/header/header.page copy.html +++ /dev/null @@ -1,212 +0,0 @@ -
-
- -
- - - - - -
- -
- {{ PublicationHolderService.count }}% - - X -
- - -
- - -
- - -
-
- {{notificationCount}}
-
-
-
- -
-
- - - - -
- -
- - - - - Início -
- -
- - - - Agenda -
- -
- - - - Gabinete -
- -
- - - Acções -
- -
- - - Chat -
-
- -
- -
- {{ PublicationHolderService.count }}% - - X -
- -
-
- - - -
- - -
- -
- -
- - -
- -
- -
- {{notificationCount}}
-
- -
-
-
- -
- -
-
-
diff --git a/src/environments/environment.prod.ts b/src/environments/environment.prod.ts index a9d2c2e92..22e0d30e8 100644 --- a/src/environments/environment.prod.ts +++ b/src/environments/environment.prod.ts @@ -1,6 +1,7 @@ import { Environment } from './../app/models/envarioment' +import { DevDev } from './suport/dev'; import { environment as oaprProd } from './suport/oapr' // import { environment as doneITProd } from './suport/doneIt' -export const environment: Environment = oaprProd; +export const environment: Environment = DevDev; diff --git a/version/git-version.ts b/version/git-version.ts index cb455cab4..a6eecebbe 100644 --- a/version/git-version.ts +++ b/version/git-version.ts @@ -1,11 +1,11 @@ export let versionData = { - "shortSHA": "d1e5387d1", - "SHA": "d1e5387d1176ad2cf3ddb95aa8b7b319053df214", + "shortSHA": "0d10ee98f", + "SHA": "0d10ee98fa97d9bc5ea61918a942e18669e1691a", "branch": "developer", "lastCommitAuthor": "'peter.maquiran'", - "lastCommitTime": "'Fri Sep 5 11:42:36 2025 +0100'", - "lastCommitMessage": "update image", - "lastCommitNumber": "6145", - "changeStatus": "On branch developer\nYour branch is ahead of 'origin/developer' by 2 commits.\n (use \"git push\" to publish your local commits)\n\nChanges to be committed:\n (use \"git restore --staged ...\" to unstage)\n\tmodified: src/app/app.module.ts\n\tmodified: src/app/core/user/use-case/user-refresh-token.service.ts\n\tnew file: src/app/ui/shared/components/header/header.page copy.html\n\tmodified: src/app/ui/shared/components/header/header.page.html\n\tmodified: src/app/ui/shared/components/header/header.page.scss", + "lastCommitTime": "'Fri Sep 5 12:00:01 2025 +0100'", + "lastCommitMessage": "fix profile picture", + "lastCommitNumber": "6146", + "changeStatus": "On branch developer\nYour branch is ahead of 'origin/developer' by 3 commits.\n (use \"git push\" to publish your local commits)\n\nChanges to be committed:\n (use \"git restore --staged ...\" to unstage)\n\tmodified: src/app/core/chat/mapper/messageMapper.ts\n\tmodified: src/app/core/chat/repository/message/message-remote-repository.ts\n\tmodified: src/app/core/chat/repository/message/message-socket-repository.ts\n\tnew file: src/app/core/chat/usecase/message/message-attachment-upload-use-case.service.ts\n\tdeleted: src/app/core/chat/usecase/message/message-create-use-case.service copy.ts\n\tmodified: src/app/core/chat/usecase/message/message-create-use-case.service.ts\n\tmodified: src/app/core/chat/usecase/message/messages-send-offline-use-case.service.ts\n\tmodified: src/app/core/chat/usecase/socket/socket-message-create-use-case.service.ts\n\tmodified: src/app/core/chat/usecase/socket/socket-message-delete-use-case.service.ts\n\tmodified: src/app/core/chat/usecase/socket/socket-message-update-use-case.service.ts\n\tmodified: src/app/core/user/repository/user-remote-repository.ts\n\tmodified: src/app/core/user/use-case/user-get-by-id.service.ts\n\tnew file: src/app/core/user/use-case/user-photo-upload.service.ts\n\tmodified: src/app/infra/database/dexie/instance/chat/schema/attachment.ts\n\tmodified: src/app/infra/file-picker/web/file-picker-web.service.ts\n\tmodified: src/app/modals/profile/edit-profile/edit-profile.page.ts\n\tmodified: src/app/module/chat/data/repository/attachment/attachment-remote-repository.service.ts\n\tmodified: src/app/module/chat/data/repository/message/message-live-signalr-data-source.service.ts\n\tmodified: src/app/module/chat/data/repository/message/message-remote-data-source.service.ts\n\tmodified: src/app/module/user/data/datasource/user-remote-repository.service.ts\n\tmodified: src/app/module/user/data/user-repository.service.ts\n\tmodified: src/app/ui/chat/component/edit-group/edit-group.page.ts\n\tmodified: src/app/ui/chat/component/messages/messages.page.ts\n\tmodified: src/app/ui/chat/modal/edit-group/edit-group.page.ts\n\tmodified: src/app/ui/chat/modal/messages/messages.page.ts\n\tmodified: src/app/ui/chat/store/roomStore.ts\n\tdeleted: src/app/ui/shared/components/header/header.page copy.html\n\tmodified: src/environments/environment.prod.ts\n\tmodified: version/git-version.ts\n\tmodified: web.config", "changeAuthor": "peter.maquiran" } \ No newline at end of file diff --git a/web.config b/web.config index 27402b4c3..5dbfdb84d 100644 --- a/web.config +++ b/web.config @@ -1,17 +1,12 @@ - + + + + + - - - - - - - - - @@ -24,33 +19,23 @@ + - + - - + - + - + - - - -