From 430adf394db277fcf0d092bd9cd08d25397270c2 Mon Sep 17 00:00:00 2001 From: "peter.maquiran" Date: Thu, 4 Sep 2025 15:40:45 +0100 Subject: [PATCH] fix chage duplicate message --- src/app/app.module.ts | 5 +- src/app/core/chat/entity/group.ts | 2 +- src/app/core/chat/entity/message.ts | 5 +- src/app/core/chat/mapper/messageMapper.ts | 5 +- .../chat/repository/dto/messageOutputDTO.ts | 3 +- .../repository/room/room-socket-repository.ts | 2 +- .../listen-message-by-roomId.service.ts | 8 ++- .../message/listen-send-message.service.ts | 7 +- .../message-create-use-case.service copy.ts | 3 +- .../message-create-use-case.service.ts | 7 +- ...-all-message-as-read-by-room-id.service.ts | 3 +- .../messages-send-offline-use-case.service.ts | 3 - .../room/room-bold-sync-use-case.service.ts | 6 +- .../room/room-create-use-case.service.ts | 2 +- .../room/room-get-by-id-use-case.service.ts | 2 +- .../room/room-get-list-use-case.service.ts | 2 +- .../room-update-by-id-use-case.service.ts | 2 +- .../dexie/instance/chat/schema/members.ts | 2 +- .../dexie/instance/chat/schema/room.ts | 2 +- .../interceptors/token.interceptors.ts | 6 +- .../infra/socket/signalR/signal-r.service.ts | 3 +- .../edit-profile/edit-profile.page.html | 4 +- src/app/models/envarioment.ts | 3 +- .../data/data-source/agenda-data.service.ts | 3 +- .../attachment-remote-repository.service.ts | 3 +- .../member-list-remote-repository.service.ts | 3 +- .../member-socket-repository.service.ts | 4 +- ...essage-live-signalr-data-source.service.ts | 16 +++-- .../message-remote-data-source.service.ts | 3 +- .../room/room-remote-repository.service.ts | 3 +- .../user-typing-live-data-source.service.ts | 4 +- .../chat/domain/chat-service.service.ts | 14 +--- .../service/room-last-message.service.ts | 4 +- .../datasource/remote-notification.service.ts | 3 +- .../user-remote-repository.service.ts | 4 +- .../contacts-data-source.service.ts | 3 +- src/app/services/aesencrypt.service.ts | 1 + src/app/services/logger/main/service.ts | 55 ++++++--------- .../monitoring/opentelemetry/logging.ts | 55 +++++++++++++-- .../monitoring/opentelemetry/opentelemetry.ts | 30 ++++---- .../monitoring/opentelemetry/tracer.ts | 23 +++---- .../component/edit-group/edit-group.page.ts | 5 ++ .../chat/component/messages/messages.page.ts | 4 +- .../chat/modal/edit-group/edit-group.page.ts | 6 ++ src/app/ui/chat/store/roomStore.ts | 6 +- .../shared/components/header/header.page.html | 3 + .../shared/components/header/header.page.ts | 5 +- src/environments/environment.prod.ts | 3 +- src/environments/environment.ts | 1 - src/environments/suport/dev.ts | 68 +------------------ src/environments/suport/doneIt.ts | 67 ------------------ src/environments/suport/oapr.ts | 12 +--- version/git-version.ts | 16 ++--- workspace.code-workspace | 22 ------ 54 files changed, 206 insertions(+), 330 deletions(-) delete mode 100644 src/environments/suport/doneIt.ts delete mode 100644 workspace.code-workspace diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 6d89de9da..40c68cc90 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -132,15 +132,14 @@ registerLocaleData(localePt, 'pt'); }) openTelemetryLogging.send({ - type: 'graylog', + level: 'info', + message: event.exception.values[0].value, payload: { - message: event.exception.values[0].value, object: { sentry: true, error: event } }, - spanContext: null }) } // Return event to send it to Sentry diff --git a/src/app/core/chat/entity/group.ts b/src/app/core/chat/entity/group.ts index fc55b72b5..2660bd815 100644 --- a/src/app/core/chat/entity/group.ts +++ b/src/app/core/chat/entity/group.ts @@ -27,7 +27,7 @@ const MemberSchema = z.object({ export const RoomEntitySchema = z.object({ $id: z.string(), id: z.string().uuid().optional(), - roomName: z.string(), + roomName: z.string().nullable(), createdBy: z.object({ wxUserId: z.number(), wxFullName: z.string(), diff --git a/src/app/core/chat/entity/message.ts b/src/app/core/chat/entity/message.ts index 235839a51..109746198 100644 --- a/src/app/core/chat/entity/message.ts +++ b/src/app/core/chat/entity/message.ts @@ -49,7 +49,7 @@ export const MessageEntitySchema = z.object({ wxUserId: z.number(), wxFullName: z.string(), wxeMail: z.string(), - userPhoto: z.string().nullable(), + userPhoto: z.string().nullable().optional(), }).nullable(), reactions: z.object({ id: z.string(), @@ -67,7 +67,8 @@ export const MessageEntitySchema = z.object({ origin: z.enum(['history', 'local', 'incoming']).optional(), requestId: z.string().nullable().optional(), sendAttemp: z.number().optional(), - hasAttachment: z.boolean().optional() + hasAttachment: z.boolean().optional(), + deviceId: z.string().nullable().optional() }) export type IMessage = z.infer; diff --git a/src/app/core/chat/mapper/messageMapper.ts b/src/app/core/chat/mapper/messageMapper.ts index 6cbb5daa0..cf4b6a948 100644 --- a/src/app/core/chat/mapper/messageMapper.ts +++ b/src/app/core/chat/mapper/messageMapper.ts @@ -1,6 +1,7 @@ import { MessageEntity, IMessage } from "../entity/message"; import { MessageOutPutDataDTO } from "src/app/core/chat/repository/dto/messageOutputDTO"; import { MessageInputDTO } from "../usecase/message/message-create-use-case.service"; +import { getInstanceId } from "src/app/module/chat/domain/chat-service.service"; export class MessageMapper { static toDomain(DTO: MessageOutPutDataDTO) : MessageEntity { @@ -27,8 +28,8 @@ export class MessageMapper { docId: Number(e.docId) || 0, mimeType: e.mimeType, description: e.description - }))[0] || {} - + })) || [], + deviceId: getInstanceId() } } } diff --git a/src/app/core/chat/repository/dto/messageOutputDTO.ts b/src/app/core/chat/repository/dto/messageOutputDTO.ts index abaff3972..f36cd0a82 100644 --- a/src/app/core/chat/repository/dto/messageOutputDTO.ts +++ b/src/app/core/chat/repository/dto/messageOutputDTO.ts @@ -47,7 +47,8 @@ export const MessageOutPutDataDTOSchema = z.object({ applicationId: z.number().optional(), docId: z.number().optional(), id: z.string().optional() - })) + })), + deviceId: z.string().nullable().optional() }); export type MessageOutPutDataDTO = z.infer diff --git a/src/app/core/chat/repository/room/room-socket-repository.ts b/src/app/core/chat/repository/room/room-socket-repository.ts index 9e08e9591..e59694bc4 100644 --- a/src/app/core/chat/repository/room/room-socket-repository.ts +++ b/src/app/core/chat/repository/room/room-socket-repository.ts @@ -8,7 +8,7 @@ import { z } from "zod"; const SocketRoomUpdateOutPutSchema = z.object({ id: z.string().uuid(), - roomName: z.string().min(1), + roomName: z.string().nullable(), createdBy: z.string().nullable(), // Allowing null for createdBy createdAt: z.string().datetime(), expirationDate: z.string().nullable().optional(), // Allowing null and making it optional diff --git a/src/app/core/chat/usecase/message/listen-message-by-roomId.service.ts b/src/app/core/chat/usecase/message/listen-message-by-roomId.service.ts index 241935024..5e60893bc 100644 --- a/src/app/core/chat/usecase/message/listen-message-by-roomId.service.ts +++ b/src/app/core/chat/usecase/message/listen-message-by-roomId.service.ts @@ -3,7 +3,7 @@ import { filter, map } from 'rxjs/operators'; import { z } from 'zod'; import { IMessageSocketRepository } from 'src/app/core/chat/repository/message/message-socket-repository'; import { MessageEntity } from '../../entity/message'; -import { InstanceId } from 'src/app/module/chat/domain/chat-service.service'; +import { getInstanceId } from 'src/app/module/chat/domain/chat-service.service'; export const ListenMessageByRoomIdNewInputDTOSchema = z.object({ @@ -25,8 +25,10 @@ export class ListenMessageByRoomIdNewUseCase { return this.MessageSocketRepositoryService.listenToMessages().pipe( map(message => message.data), - filter((message) => !message?.requestId?.startsWith(InstanceId) && message?.roomId == data.roomId), - map(message => Object.assign(new MessageEntity(), message)) + filter((message) => message.deviceId != getInstanceId()), + map(message => { + return Object.assign(new MessageEntity(), message) + }) ) } diff --git a/src/app/core/chat/usecase/message/listen-send-message.service.ts b/src/app/core/chat/usecase/message/listen-send-message.service.ts index 9ba8ac6e1..f70cc1788 100644 --- a/src/app/core/chat/usecase/message/listen-send-message.service.ts +++ b/src/app/core/chat/usecase/message/listen-send-message.service.ts @@ -1,9 +1,9 @@ import { Injectable } from '@angular/core'; import { MessageSocketRepositoryService } from 'src/app/module/chat/data/repository/message/message-live-signalr-data-source.service' -import { InstanceId } from '../../../../module/chat/domain/chat-service.service'; import { filter, map } from 'rxjs/operators'; import { z } from 'zod'; import { IMessageSocketRepository } from '../../repository/message/message-socket-repository'; +import { getInstanceId } from 'src/app/module/chat/domain/chat-service.service'; export const ListenSendMessageInputDTOSchema = z.object({ roomId: z.string(), @@ -25,10 +25,7 @@ export class ListenSendMessageUseCase { return this.MessageSocketRepositoryService.listenToMessages().pipe( map(message => message.data), - filter((message) => { - - return message?.requestId?.startsWith(InstanceId) && message?.roomId == roomId - }), + filter((message) => message.deviceId != getInstanceId()), map(message => message) ) 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 index aa9552a52..b6a4a29d5 100644 --- 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 @@ -2,7 +2,6 @@ import { Injectable } from '@angular/core'; import { IMessage, MessageAttachmentSource, MessageEntity, MessageEntitySchema, } from '../../entity/message'; import { z } from 'zod'; import { v4 as uuidv4 } from 'uuid'; -import { InstanceId } from '../../../../module/chat/domain/chat-service.service'; import { createBlobFromBase64, createDataURL } from 'src/app/utils/ToBase64'; import { zodSafeValidation } from 'src/app/utils/zodValidation'; import { Logger } from 'src/app/services/logger/main/service'; @@ -105,7 +104,7 @@ export class MessageCreateUseCaseService { if(validation.isOk()) { message.sendAttemp++; - message.requestId = InstanceId +'@'+ uuidv4(); + message.requestId = uuidv4(); message.sending = true; const createMessageLocally = this.messageLocalDataSourceService.insert(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 66780feb5..13a3a6abd 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 @@ -2,7 +2,6 @@ import { Injectable } from '@angular/core'; import { IMessage, MessageAttachmentSource, MessageEntity, MessageEntitySchema, } from '../../entity/message'; import { z } from 'zod'; import { v4 as uuidv4 } from 'uuid'; -import { InstanceId } from '../../../../module/chat/domain/chat-service.service'; import { createBlobFromBase64, createDataURL } from 'src/app/utils/ToBase64'; import { zodSafeValidation } from 'src/app/utils/zodValidation'; import { Logger } from 'src/app/services/logger/main/service'; @@ -38,7 +37,8 @@ export const MessageInputDTOSchema = z.object({ docId: z.number().optional(), mimeType: z.string().nullable().optional(), description: z.string().optional() - }).optional() + }).array(), + deviceId: z.string().optional() }); export type MessageInputDTO = z.infer @@ -105,14 +105,11 @@ export class MessageCreateUseCaseService { if(validation.isOk()) { message.sendAttemp++; - message.requestId = InstanceId +'@'+ uuidv4(); - const createMessageLocally = this.messageLocalDataSourceService.insert(message) createMessageLocally.then((value) => { if(value.isOk()) { - console.log("set image") message.$id = value.value if(message.hasAttachment) { diff --git a/src/app/core/chat/usecase/message/message-mark-all-message-as-read-by-room-id.service.ts b/src/app/core/chat/usecase/message/message-mark-all-message-as-read-by-room-id.service.ts index c3cf6728b..417256582 100644 --- a/src/app/core/chat/usecase/message/message-mark-all-message-as-read-by-room-id.service.ts +++ b/src/app/core/chat/usecase/message/message-mark-all-message-as-read-by-room-id.service.ts @@ -5,6 +5,7 @@ import { MessageSocketRepositoryService } from 'src/app/module/chat/data/reposit import { SessionStore } from 'src/app/store/session.service'; import { IMessageLocalRepository } from '../../repository/message/message-local-repository'; import { IMessageSocketRepository } from '../../repository/message/message-socket-repository'; +import { v4 as uuidv4 } from 'uuid'; const MessageMarkAllMessageAsReadByRoomIdInputSchema = z.object({ roomId: z.string(), @@ -36,7 +37,7 @@ export class MessageMarkAllMessageAsReadByRoomIdService { memberId: SessionStore.user.UserId, messageId: message.id, roomId: input.roomId, - requestId: 'uuid' + requestId: uuidv4() }); } } 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 6e05e03b9..0a4156bcc 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 @@ -1,7 +1,6 @@ import { Injectable } from '@angular/core'; import { MessageLocalDataSourceService } from '../../../../module/chat/data/repository/message/message-local-data-source.service'; import { MessageSocketRepositoryService } from '../../../../module/chat/data/repository/message/message-live-signalr-data-source.service'; -import { InstanceId } from '../../../../module/chat/domain/chat-service.service'; import { MessageMapper } from '../../mapper/messageMapper'; import { v4 as uuidv4 } from 'uuid' import { AttachmentLocalDataSource } from '../../../../module/chat/data/repository/attachment/attachment-local-repository.service'; @@ -65,8 +64,6 @@ export class SendLocalMessagesUseCaseService { description: e.description, file: e.base64.split(',')[1] })) - console.log('to upload', messages) - const requestId = InstanceId +'@'+ uuidv4(); await this.messageLocalDataSourceService.update(message.$id, { sending: true }) diff --git a/src/app/core/chat/usecase/room/room-bold-sync-use-case.service.ts b/src/app/core/chat/usecase/room/room-bold-sync-use-case.service.ts index f7e3b6b8d..4cc7e7c81 100644 --- a/src/app/core/chat/usecase/room/room-bold-sync-use-case.service.ts +++ b/src/app/core/chat/usecase/room/room-bold-sync-use-case.service.ts @@ -4,11 +4,11 @@ import { IMessageSocketRepository } from 'src/app/core/chat/repository/message/m import { MessageEntity } from 'src/app/core/chat/entity/message'; import { IBoldLocalRepository } from 'src/app/core/chat/repository/bold/bold-local-repository'; import { IMessageLocalRepository } from 'src/app/core/chat/repository/message/message-local-repository'; -import { InstanceId } from '../../../../module/chat/domain/chat-service.service'; import { HttpAdapter } from 'src/app/infra/http/adapter'; import { TracingType, XTracerAsync } from 'src/app/services/monitoring/opentelemetry/tracer'; import { IRoomLocalRepository } from 'src/app/core/chat/repository/room/room-local-repository'; import { IMessageGetAllByRoomIdOutPut } from 'src/app/core/chat/usecase/message/message-get-all-by-room-Id'; +import { getInstanceId } from 'src/app/module/chat/domain/chat-service.service'; @Injectable({ @@ -37,7 +37,7 @@ export class RoomBoldSyncUseCaseService { private listenToIncomingMessage() { return this.MessageSocketRepositoryService.listenToMessages().pipe( map(message => message.data), - filter((message) => !message?.requestId?.startsWith(InstanceId)), + filter((message) => message.deviceId != getInstanceId()), map(message => Object.assign(new MessageEntity(), message)), filter((message) => !message.meSender()) ).subscribe(async (message) => { @@ -59,7 +59,7 @@ export class RoomBoldSyncUseCaseService { */ private listenToUpdateMessages() { return this.MessageSocketRepositoryService.listenToUpdateMessages().pipe( - filter((message) => !message?.requestId?.startsWith(InstanceId)), + filter((message) => message.deviceId != getInstanceId()), map(message => Object.assign(new MessageEntity(), message)) ).subscribe(async (message) => { diff --git a/src/app/core/chat/usecase/room/room-create-use-case.service.ts b/src/app/core/chat/usecase/room/room-create-use-case.service.ts index 7094bcc03..b71c71771 100644 --- a/src/app/core/chat/usecase/room/room-create-use-case.service.ts +++ b/src/app/core/chat/usecase/room/room-create-use-case.service.ts @@ -21,7 +21,7 @@ export const RoomOutPutDTOSchema = z.object({ message: z.string(), data: z.object({ id: z.string(), - roomName: z.string(), + roomName: z.string().nullable(), createdBy: z.any().nullable(), createdAt: z.string(), expirationDate: z.string().nullable(), diff --git a/src/app/core/chat/usecase/room/room-get-by-id-use-case.service.ts b/src/app/core/chat/usecase/room/room-get-by-id-use-case.service.ts index 576edf355..31b5b1540 100644 --- a/src/app/core/chat/usecase/room/room-get-by-id-use-case.service.ts +++ b/src/app/core/chat/usecase/room/room-get-by-id-use-case.service.ts @@ -30,7 +30,7 @@ export const RoomByIdOutputDTOSchema = z.object({ message: z.string(), data: z.object({ id: z.string(), - roomName: z.string(), + roomName: z.string().nullable(), createdBy: UserSchema, createdAt: z.string(), expirationDate: z.string().nullable(), diff --git a/src/app/core/chat/usecase/room/room-get-list-use-case.service.ts b/src/app/core/chat/usecase/room/room-get-list-use-case.service.ts index 2a8c15b0c..546fd1ede 100644 --- a/src/app/core/chat/usecase/room/room-get-list-use-case.service.ts +++ b/src/app/core/chat/usecase/room/room-get-list-use-case.service.ts @@ -21,7 +21,7 @@ const CreatedBySchema = z.object({ const roomListItemSchema = z.object({ id: z.string(), - roomName: z.string(), + roomName: z.string().nullable(), createdBy: CreatedBySchema, createdAt: z.string(), expirationDate: z.string().nullable(), // api check diff --git a/src/app/core/chat/usecase/room/room-update-by-id-use-case.service.ts b/src/app/core/chat/usecase/room/room-update-by-id-use-case.service.ts index 552c86a9e..ca045f0b8 100644 --- a/src/app/core/chat/usecase/room/room-update-by-id-use-case.service.ts +++ b/src/app/core/chat/usecase/room/room-update-by-id-use-case.service.ts @@ -31,7 +31,7 @@ export const RoomUpdateOutputDTOSchema = z.object({ message: z.string(), data: z.object({ id: z.string(), - roomName: z.string(), + roomName: z.string().nullable(), createdBy: UserSchema, createdAt: z.string(), expirationDate: z.string().nullable(), diff --git a/src/app/infra/database/dexie/instance/chat/schema/members.ts b/src/app/infra/database/dexie/instance/chat/schema/members.ts index 5c9f4cb14..91e60ee3a 100644 --- a/src/app/infra/database/dexie/instance/chat/schema/members.ts +++ b/src/app/infra/database/dexie/instance/chat/schema/members.ts @@ -8,7 +8,7 @@ export const MemberTableSchema = z.object({ wxUserId: z.number(), wxFullName: z.string(), wxeMail: z.string(), - userPhoto: z.string().nullable(), + userPhoto: z.string().nullable().optional(), joinAt: z.string(), status: z.string().optional(), // useless isAdmin: z.boolean() diff --git a/src/app/infra/database/dexie/instance/chat/schema/room.ts b/src/app/infra/database/dexie/instance/chat/schema/room.ts index a40a08635..28ecf10ce 100644 --- a/src/app/infra/database/dexie/instance/chat/schema/room.ts +++ b/src/app/infra/database/dexie/instance/chat/schema/room.ts @@ -7,7 +7,7 @@ import { IDBoolean } from "../../../type"; export const RoomTableSchema = z.object({ $id: z.string().optional(), id: z.string().optional(), - roomName: z.string(), + roomName: z.string().nullable(), createdBy: z.object({ wxUserId: z.number(), wxFullName: z.string(), diff --git a/src/app/infra/monitoring/interceptors/token.interceptors.ts b/src/app/infra/monitoring/interceptors/token.interceptors.ts index 4c91bc67e..4113ec1b8 100644 --- a/src/app/infra/monitoring/interceptors/token.interceptors.ts +++ b/src/app/infra/monitoring/interceptors/token.interceptors.ts @@ -26,7 +26,7 @@ export class TokenInterceptor implements HttpInterceptor { null ); - private excludedDomains = [ 'Login', environment.apiChatUrl, 'http://localhost:8019']; // Add the domains you want to exclude + private excludedDomains = [ 'Login', 'http://localhost:8019']; // Add the domains you want to exclude constructor( private http: HttpClient, @@ -58,7 +58,7 @@ export class TokenInterceptor implements HttpInterceptor { } else if (error instanceof HttpErrorResponse && error.status === 401) { return this.handle401Error(request, next); - } else if (error.url.includes('https://gdapi-dev.dyndns.info/stage/api/v2') && error.status === 0){ + } else if (error.url.includes(`${environment.apiURL.slice(0, -1)}`) && error.status === 0){ return this.handle401Error(request, next); } else { return throwError(error); @@ -119,7 +119,7 @@ export class TokenInterceptor implements HttpInterceptor { } return this.http - .post('https://gdapi-dev.dyndns.info/stage/api/v2/Users/RefreshToken', { + .post(`${environment.apiURL}Users/RefreshToken`, { authorization: SessionStore.user.Authorization, refreshToken: SessionStore.user.RefreshToken, channelId diff --git a/src/app/infra/socket/signalR/signal-r.service.ts b/src/app/infra/socket/signalR/signal-r.service.ts index 341ebeb67..829336538 100644 --- a/src/app/infra/socket/signalR/signal-r.service.ts +++ b/src/app/infra/socket/signalR/signal-r.service.ts @@ -7,6 +7,7 @@ import { switchMap } from 'rxjs/operators'; import { err, Result } from 'neverthrow'; import { HubConnection } from '@microsoft/signalr'; import { ISignalRInput, ISignalROutput } from '../type'; +import { environment } from 'src/environments/environment'; const { App } = Plugins; @@ -53,7 +54,7 @@ export class SignalRService { async establishConnection(): Promise> { // const connection = new SignalRConnection({url:'https://41e3-41-63-166-54.ngrok-free.app/api/v2/chathub'}) - const connection = new SignalRConnection({url:'https://gdapi-dev.dyndns.info/stage/api/v2/chathub'}) + const connection = new SignalRConnection({url:`${environment.apiURLStage}chathub`}) const attempConnection = await connection.establishConnection() if(attempConnection.isOk()) { diff --git a/src/app/modals/profile/edit-profile/edit-profile.page.html b/src/app/modals/profile/edit-profile/edit-profile.page.html index 8987f351c..98700c2aa 100644 --- a/src/app/modals/profile/edit-profile/edit-profile.page.html +++ b/src/app/modals/profile/edit-profile/edit-profile.page.html @@ -125,7 +125,7 @@ -
+
diff --git a/src/app/models/envarioment.ts b/src/app/models/envarioment.ts index 74618ad3b..e7cdd8bc0 100644 --- a/src/app/models/envarioment.ts +++ b/src/app/models/envarioment.ts @@ -1,8 +1,7 @@ export interface Environment { id: string; apiURL: string; - apiChatUrl: string; - apiWsChatUrl: string; + apiURLStage: String apiPCURL: string; logoLabel: string; production: boolean; diff --git a/src/app/module/agenda/data/data-source/agenda-data.service.ts b/src/app/module/agenda/data/data-source/agenda-data.service.ts index 657e9bc78..e4cf3ef89 100644 --- a/src/app/module/agenda/data/data-source/agenda-data.service.ts +++ b/src/app/module/agenda/data/data-source/agenda-data.service.ts @@ -11,13 +11,14 @@ import { HttpService } from 'src/app/services/http.service'; import { TracingType } from 'src/app/services/monitoring/opentelemetry/tracer'; import { IGetDraftListByProcessIdOutput, IGetDraftListByProcessIdSchema } from '../../domain/usecase/getDraft-list-by-process-id.service'; import { IDraftSaveByIdInput } from '../../domain/usecase/draft-save-by-id-use-case.service'; +import { environment } from 'src/environments/environment'; @Injectable({ providedIn: 'root' }) export class AgendaDataService { - private baseUrl = 'https://gdapi-dev.dyndns.info/stage/api/v2'; // Your base URL + private baseUrl = `${environment.apiURLStage.slice(0, -1)}`; // Your base URL constructor( private http: HttpClient, 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 44eb36d2e..300e03731 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 @@ -3,11 +3,12 @@ import { IAttachmentRemoteRepository } from 'src/app/core/chat/repository/attach import { HttpService } from 'src/app/services/http.service'; import { DataSourceReturn } from 'src/app/services/Repositorys/type'; import { HttpAdapter } from 'src/app/infra/http/adapter' +import { environment } from 'src/environments/environment'; @Injectable({ providedIn: 'root' }) export class AttachmentRemoteDataSourceService implements IAttachmentRemoteRepository { - private baseUrl = 'https://gdapi-dev.dyndns.info/stage/api/v2/Chat'; // Your base URL + private baseUrl = `${environment.apiURLStage.slice(0, -1)}`; // Your base URL constructor( private httpService: HttpService, diff --git a/src/app/module/chat/data/repository/member/member-list-remote-repository.service.ts b/src/app/module/chat/data/repository/member/member-list-remote-repository.service.ts index b86150048..6edb94545 100644 --- a/src/app/module/chat/data/repository/member/member-list-remote-repository.service.ts +++ b/src/app/module/chat/data/repository/member/member-list-remote-repository.service.ts @@ -7,12 +7,13 @@ import { IMemberRemoteRepository } from 'src/app/core/chat/repository/member/mem import { UserRemoveListInputDTOSchema, UserRemoveListInputDTO } from '../../../../../core/chat/usecase/room/room-leave-by-id-use-case.service'; import { AddMemberToRoomInputDTOSchema, AddMemberToRoomInputDTO } from 'src/app/core/chat/usecase/member/member-add-use-case.service'; import { MemberSetAdminDTO } from 'src/app/core/chat/usecase/member/member-admin-use-case.service'; +import { environment } from 'src/environments/environment'; @Injectable({ providedIn: 'root' }) export class MemberListRemoteRepository implements IMemberRemoteRepository { - private baseUrl = 'https://gdapi-dev.dyndns.info/stage/api/v2/Chat'; // Your base URL + private baseUrl = `${environment.apiURLStage.slice(0, -1)}/Chat`; // Your base URL constructor(private httpService: HttpService) { } diff --git a/src/app/module/chat/data/repository/member/member-socket-repository.service.ts b/src/app/module/chat/data/repository/member/member-socket-repository.service.ts index 3d5231865..a7c1c6133 100644 --- a/src/app/module/chat/data/repository/member/member-socket-repository.service.ts +++ b/src/app/module/chat/data/repository/member/member-socket-repository.service.ts @@ -1,7 +1,6 @@ import { Injectable } from '@angular/core'; import { SignalRService } from 'src/app/infra/socket/signalR/signal-r.service'; import { IMemberSocketRepository } from 'src/app/core/chat/repository/member/member-socket-repository'; -import { InstanceId } from '../../../domain/chat-service.service'; import { v4 as uuidv4 } from 'uuid' import { filter, map, tap } from 'rxjs/operators'; import { SocketMessage } from 'src/app/infra/socket/signalR/signalR'; @@ -19,11 +18,12 @@ export class MemberSocketRepositoryService implements IMemberSocketRepository { } async removeMember(data: RemoveRoomMemberInput) { + const id = uuidv4(); const result = await this.socket.sendData({ method: 'RemoveRoomMember', data: { ...data, - requestId: InstanceId +'@'+ uuidv4() + requestId: id }, }) 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 5897df911..c3019402c 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 @@ -1,6 +1,5 @@ import { Injectable } from '@angular/core'; import { v4 as uuidv4 } from 'uuid' -import { InstanceId } from '../../../domain/chat-service.service'; import { MessageUpdateInput } from '../../../../../core/chat/usecase/message/message-update-by-id-use-case.service'; import { MessageReactionInput } from '../../../../../core/chat/usecase/message/message-reaction-by-id-use-case.service'; import { SignalRService } from 'src/app/infra/socket/signalR/signal-r.service'; @@ -43,7 +42,8 @@ export class MessageSocketRepositoryService implements IMessageSocketRepository async sendGroupMessage(data: MessageInputDTO) { if(!data.requestId) { - data.requestId = InstanceId +'@'+ uuidv4(); + //data['requestId'] = InstanceId +'@'+ uuidv4(); + data['requestId'] = uuidv4(); } const result = await this.socket.sendData({ @@ -62,7 +62,8 @@ export class MessageSocketRepositoryService implements IMessageSocketRepository async sendDirectMessage(data: MessageInputDTO) { if(!data.requestId) { - data.requestId = InstanceId +'@'+ uuidv4(); + //data['requestId'] = InstanceId +'@'+ uuidv4(); + data['requestId'] = uuidv4(); } const result = await this.socket.sendData({ method: 'SendDirectMessage', @@ -140,7 +141,8 @@ export class MessageSocketRepositoryService implements IMessageSocketRepository reactToMessageSocket(data: MessageReactionInput) { - data['requestId'] = InstanceId +'@'+ uuidv4(); + //data['requestId'] = InstanceId +'@'+ uuidv4(); + data['requestId'] = uuidv4(); return this.socket.sendData({ method: 'ReactMessage', @@ -149,7 +151,8 @@ export class MessageSocketRepositoryService implements IMessageSocketRepository } updateMessage(input: MessageUpdateInput) { - input['requestId'] = InstanceId +'@'+ uuidv4(); + //data['requestId'] = InstanceId +'@'+ uuidv4(); + input['requestId'] = uuidv4(); this.socket.sendData({ method: 'EditMessage', @@ -160,7 +163,8 @@ export class MessageSocketRepositoryService implements IMessageSocketRepository sendMessageDelete(data: MessageDeleteInputDTO) { - data['requestId'] = InstanceId +'@'+ uuidv4(); + //data['requestId'] = InstanceId +'@'+ uuidv4(); + data['requestId'] = uuidv4(); const result = this.socket.sendData({ method: 'DeleteMessage', 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 715c0caa7..a5753e3cb 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 @@ -8,13 +8,14 @@ import { IGetMessagesFromRoomParams, IMessageRemoteRepository } from 'src/app/co import { HttpErrorResponse } from '@angular/common/http'; import { Result } from 'neverthrow'; import { HttpResult } from 'src/app/infra/http/type'; +import { environment } from 'src/environments/environment'; @Injectable({ providedIn: 'root' }) export class MessageRemoteDataSourceService implements IMessageRemoteRepository { - private baseUrl = 'https://gdapi-dev.dyndns.info/stage/api/v2/Chat'; // Your base URL + private baseUrl = `${environment.apiURLStage}Chat`; // Your base URL constructor( private httpService: HttpService, diff --git a/src/app/module/chat/data/repository/room/room-remote-repository.service.ts b/src/app/module/chat/data/repository/room/room-remote-repository.service.ts index 59ab936f6..329d6ab27 100644 --- a/src/app/module/chat/data/repository/room/room-remote-repository.service.ts +++ b/src/app/module/chat/data/repository/room/room-remote-repository.service.ts @@ -13,6 +13,7 @@ import { RoomListItemOutPutDTO, RoomListItemSchema, RoomListOutPutDTO } from '.. import { z } from 'zod'; import { HttpAdapter } from 'src/app/infra/http/adapter'; import { AddMemberToRoomInputDTO } from 'src/app/core/chat/usecase/member/member-add-use-case.service'; +import { environment } from 'src/environments/environment'; const RoomByIdInputDTOSchema = z.string() type RoomByIdInputDTO = z.infer @@ -23,7 +24,7 @@ type RoomByIdInputDTO = z.infer }) export class RoomRemoteDataSourceService implements IRoomRemoteRepository { - private baseUrl = 'https://gdapi-dev.dyndns.info/stage/api/v2/Chat'; // Your base URL + private baseUrl = `${environment.apiURLStage}chat`; // Your base URL constructor( private httpService: HttpService, diff --git a/src/app/module/chat/data/repository/typing/user-typing-live-data-source.service.ts b/src/app/module/chat/data/repository/typing/user-typing-live-data-source.service.ts index 04eec867a..83701a2cd 100644 --- a/src/app/module/chat/data/repository/typing/user-typing-live-data-source.service.ts +++ b/src/app/module/chat/data/repository/typing/user-typing-live-data-source.service.ts @@ -5,7 +5,6 @@ import { filter, map } from 'rxjs/operators'; import { SocketMessage } from 'src/app/infra/socket/signalR/signalR'; import { ITypingRemoteRepository } from 'src/app/core/chat/repository/typing/typing-remote-repository'; import { z } from "zod" -import { InstanceId } from '../../../domain/chat-service.service'; import { v4 as uuidv4 } from 'uuid' export const UserTypingDTOSchema = z.object({ @@ -28,13 +27,14 @@ export class UserTypingRemoteRepositoryService implements ITypingRemoteRepositor ) { } sendTyping(roomId: string) { + const id = uuidv4(); return this.socket.sendData({ method: 'Typing', data: { roomId, UserName:SessionStore.user.FullName, userId:SessionStore.user.UserId, - requestId: InstanceId +'@'+ uuidv4(), + requestId: id, }, }) } diff --git a/src/app/module/chat/domain/chat-service.service.ts b/src/app/module/chat/domain/chat-service.service.ts index dcbe116d0..9699fa27e 100644 --- a/src/app/module/chat/domain/chat-service.service.ts +++ b/src/app/module/chat/domain/chat-service.service.ts @@ -52,7 +52,6 @@ import { IMessageLocalGetByIdServiceInput, MessageLocalGetByIdService } from 'sr import { ContactListService } from 'src/app/core/chat/usecase/contact/contact-list.service'; import { IRoomGetLocalByIdServiceInput, RoomGetLocalByIdService } from '../../../core/chat/usecase/room/room-getlocal-by-id.service'; - export const getInstanceId = (): string => { const storageKey = 'instanceId'; // Key for localStorage let instanceId = localStorage.getItem(storageKey); @@ -66,8 +65,6 @@ export const getInstanceId = (): string => { return instanceId; }; -export const InstanceId = getInstanceId(); - @Injectable({ providedIn: 'root' }) @@ -129,9 +126,7 @@ export class ChatServiceService { }) this.MessageSocketRepositoryService.listenToUpdateMessages().pipe( - filter((message) => { - return !message?.requestId?.startsWith(InstanceId) - }) + filter((message) => message.deviceId != getInstanceId()) ).subscribe(async (message) => { if(message?.id) { this.SocketMessageUpdateUseCaseService.execute(message) @@ -140,12 +135,7 @@ export class ChatServiceService { this.MessageSocketRepositoryService.listenToMessages().pipe( map(message => message.data), - filter((message) => { - if(!message?.requestId?.startsWith(InstanceId) == false) { - // console.log('exclude my message---') - } - return !message?.requestId?.startsWith(InstanceId) - }) + filter((message) => message.deviceId != getInstanceId()) ).subscribe(async (message) => { if(message?.id) { this.SocketMessageCreateUseCaseService.execute(message) diff --git a/src/app/module/chat/domain/service/room-last-message.service.ts b/src/app/module/chat/domain/service/room-last-message.service.ts index 9b20e9cb8..4fc4d7def 100644 --- a/src/app/module/chat/domain/service/room-last-message.service.ts +++ b/src/app/module/chat/domain/service/room-last-message.service.ts @@ -2,7 +2,7 @@ import { Injectable } from '@angular/core'; import { filter, map } from 'rxjs/operators'; import { MessageEntity } from 'src/app/core/chat/entity/message'; import { IMessageSocketRepository } from 'src/app/core/chat/repository/message/message-socket-repository'; -import { InstanceId } from '../chat-service.service'; +import { getInstanceId } from '../chat-service.service'; import { IRoomLocalRepository } from 'src/app/core/chat/repository/room/room-local-repository'; @Injectable({ @@ -20,7 +20,7 @@ export class RoomLastMessageService { listenToIncomingMessage() { return this.MessageSocketRepositoryService.listenToMessages().pipe( map(message => message.data), - filter((message) => !message?.requestId?.startsWith(InstanceId)), + filter((message) => message.deviceId != getInstanceId()), map(message => Object.assign(new MessageEntity(), message)) ).subscribe(async (message) => { this.roomLocalRepository.update(message.roomId, { diff --git a/src/app/module/notification/data/datasource/remote-notification.service.ts b/src/app/module/notification/data/datasource/remote-notification.service.ts index 71e165be6..91daba2e5 100644 --- a/src/app/module/notification/data/datasource/remote-notification.service.ts +++ b/src/app/module/notification/data/datasource/remote-notification.service.ts @@ -3,13 +3,14 @@ import { HttpService } from 'src/app/services/http.service'; import { NotificationInputDTO } from '../dto/NotificationInputDTO'; import { NotificationOutputDTO, NotificationOutputDTOSchema } from '../dto/NotificationOutputDTO'; import { APIReturn } from 'src/app/services/decorator/api-validate-schema.decorator'; +import { environment } from 'src/environments/environment'; @Injectable({ providedIn: 'root' }) export class RemoteNotificationService { - private baseUrl = 'https://gdapi-dev.dyndns.info/stage/api/v2'; + private baseUrl = `${environment.apiURLStage.slice(0, -1)}`; constructor( private httpService: HttpService 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 29898be9e..1c34b4929 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 @@ -13,8 +13,8 @@ import { SessionStore } from 'src/app/store/session.service'; }) export class UserRemoteRepositoryService { - private baseUrl = 'https://gdapi-dev.dyndns.info/stage/api/v2'; // Your base URL - + private baseUrl = `${environment.apiURLStage.slice(0, -1)}`; // Your base URL + constructor( private httpService: HttpService, private http: HttpAdapter, diff --git a/src/app/services/Repositorys/contacts/data-source/contacts-data-source.service.ts b/src/app/services/Repositorys/contacts/data-source/contacts-data-source.service.ts index d48fdb46c..cbd818d5f 100644 --- a/src/app/services/Repositorys/contacts/data-source/contacts-data-source.service.ts +++ b/src/app/services/Repositorys/contacts/data-source/contacts-data-source.service.ts @@ -2,6 +2,7 @@ import { Injectable } from '@angular/core'; import { APIReturn } from 'src/app/services/decorator/api-validate-schema.decorator'; import { HttpService } from 'src/app/services/http.service'; import { ContactCombinedOutputDTO, EventListDataOutputDTOSchema } from '../DTO/contactsCombined'; +import { environment } from 'src/environments/environment'; export interface UserContacts { wxUserId: number; @@ -26,7 +27,7 @@ export interface UserList { }) export class ContactsDataSourceService { - private baseUrl = 'https://gdapi-dev.dyndns.info/stage/api/v2'; // Your base URL + private baseUrl = `${environment.apiURLStage.slice(0, -1)}`; // Your base URL constructor(private httpService: HttpService) {} diff --git a/src/app/services/aesencrypt.service.ts b/src/app/services/aesencrypt.service.ts index ee98d34c7..ecb3e11de 100644 --- a/src/app/services/aesencrypt.service.ts +++ b/src/app/services/aesencrypt.service.ts @@ -1,5 +1,6 @@ import { Injectable } from '@angular/core'; import CryptoJS from 'crypto-js'; +import { Logger } from './logger/main/service'; @Injectable({ providedIn: 'root' diff --git a/src/app/services/logger/main/service.ts b/src/app/services/logger/main/service.ts index 8cf14216b..709557ffe 100644 --- a/src/app/services/logger/main/service.ts +++ b/src/app/services/logger/main/service.ts @@ -39,23 +39,20 @@ export class Logger { ); - if(environment.apiURL != 'https://gdqas-api.oapr.gov.ao/api/') { + //if(environment.apiURL != 'https://gdqas-api.oapr.gov.ao/api/') { openTelemetryLogging.send({ - type: 'graylog', - spanContext: null, + level: 'info', + message, payload: { - message: message, object: { ...obj, - spanId: null, - name, user: SessionStore?.user?.FullName, device_name: device?.name || device?.model, commit_date: environment.version.lastCommitTime, } } }) - } + //} } static debug(message: string, obj = {}): void { @@ -65,23 +62,20 @@ export class Logger { Object.assign(obj, {createdAt: getCurrentTime(), message }) ); - if(environment.apiURL != 'https://gdqas-api.oapr.gov.ao/api/') { + //if(environment.apiURL != 'https://gdqas-api.oapr.gov.ao/api/') { openTelemetryLogging.send({ - type: 'graylog', - spanContext: null, + level: 'debug', + message, payload: { - message: message, object: { ...obj, - spanId: null, - name, user: SessionStore?.user?.FullName, device_name: device?.name || device?.model, commit_date: environment.version.lastCommitTime, } } }) - } + //} } static info(message: string, obj = {}): void { @@ -94,23 +88,20 @@ export class Logger { '\n', ); - if(environment.apiURL != 'https://gdqas-api.oapr.gov.ao/api/') { + //if(environment.apiURL != 'https://gdqas-api.oapr.gov.ao/api/') { openTelemetryLogging.send({ - type: 'graylog', - spanContext: null, + level: 'info', + message, payload: { - message: message, object: { ...obj, - spanId: null, - name, user: SessionStore?.user?.FullName, device_name: device?.name || device?.model, commit_date: environment.version.lastCommitTime, } } }) - } + //} } static warn(message: string, obj = {}): void { @@ -123,23 +114,20 @@ export class Logger { '\n', ); - if(environment.apiURL != 'https://gdqas-api.oapr.gov.ao/api/') { + //if(environment.apiURL != 'https://gdqas-api.oapr.gov.ao/api/') { openTelemetryLogging.send({ - type: 'graylog', - spanContext: null, + level: 'warn', + message, payload: { - message: message, object: { ...obj, - spanId: null, - name, user: SessionStore?.user?.FullName, device_name: device?.name || device?.model, commit_date: environment.version.lastCommitTime, } } }) - } + //} } static error(message?: string, obj = {}): void { @@ -153,23 +141,20 @@ export class Logger { '\n', ); - if(environment.apiURL != 'https://gdqas-api.oapr.gov.ao/api/') { + //if(environment.apiURL != 'https://gdqas-api.oapr.gov.ao/api/') { openTelemetryLogging.send({ - type: 'graylog', - spanContext: null, + level: 'error', + message, payload: { - message: message, object: { ...obj, - spanId: null, - name, user: SessionStore?.user?.FullName, device_name: device?.name || device?.model, commit_date: environment.version.lastCommitTime, } } }) - } + //} } fatal(error?: any, message?: string, context?: string): void {} diff --git a/src/app/services/monitoring/opentelemetry/logging.ts b/src/app/services/monitoring/opentelemetry/logging.ts index aa9dfdce0..d71965b98 100644 --- a/src/app/services/monitoring/opentelemetry/logging.ts +++ b/src/app/services/monitoring/opentelemetry/logging.ts @@ -3,6 +3,7 @@ import { v4 as uuidv4 } from 'uuid'; import { WebSocketGraylogService } from "../socket/socket"; import { Span } from "@opentelemetry/sdk-trace-web"; import { environment } from "src/environments/environment"; +import { getInstanceId } from "src/app/module/chat/domain/chat-service.service"; export class OpenTelemetryLogging { @@ -17,13 +18,53 @@ export class OpenTelemetryLogging { } - send(data: Object & { type: string; payload: any, spanContext:any }): void { - // this.socket.send({ - // type: data.type, - // payload: data.payload, - // requestId: uuidv4(), - // spanContext: data.spanContext - // }); + async send({ + level, + message, + payload + }: { + level: string, + message: string, + payload: Record, + }): Promise { + const nanoTimestamp = (Date.now() * 1_000_000).toString(); + + const logMessage = { + message, + details: { ...payload }, + }; + + const logData = { + streams: [ + { + stream: { + level, + k2: "true", + app: "angular-app", + instanceId: getInstanceId(), + }, + values: [[nanoTimestamp, JSON.stringify(logMessage)]], // ✅ FIXED + }, + ], + }; + + try { + const response = await fetch("https://logs.petermaquiran.xyz/loki/api/v1/push", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify(logData), + }); + + if (response.status !== 204) { + // Optional: handle failed log delivery + console.warn(`Failed to send log: ${response.status}`); + } + } catch (error) { + // Optional: handle fetch error + console.error("Log sending error:", error); + } } } diff --git a/src/app/services/monitoring/opentelemetry/opentelemetry.ts b/src/app/services/monitoring/opentelemetry/opentelemetry.ts index a0460ab28..c99a2a938 100644 --- a/src/app/services/monitoring/opentelemetry/opentelemetry.ts +++ b/src/app/services/monitoring/opentelemetry/opentelemetry.ts @@ -16,21 +16,25 @@ function createProvider(serviceName) { }); // provider.addSpanProcessor(new SimpleSpanProcessor(new ConsoleSpanExporter())); - // provider.addSpanProcessor(new SimpleSpanProcessor(new ZipkinExporter({ - // //url: 'https://5-180-182-151.cloud-xip.com:85/zipkin-endpoint/api/v2/spans', - // url: 'https://185-229-224-75.cloud-xip.com:85/zipkin-endpoint/api/v2/spans', - // serviceName: serviceName, - // getExportRequestHeaders: () => { - // return { - // 'Authorization': 'Basic ' + btoa('tabteste@006:tabteste@006'), - // }; - // } - // }))); - - provider.addSpanProcessor(new SimpleSpanProcessor(new OTLPTraceExporter({ - url: 'https://185-229-224-75.cloud-xip.com:85/collector2/v1/traces', + provider.addSpanProcessor(new SimpleSpanProcessor(new ZipkinExporter({ + //url: 'https://5-180-182-151.cloud-xip.com:85/zipkin-endpoint/api/v2/spans', + //url: 'https://dev-obs01.doneit.co.ao/api/v2/spans', + url: 'https://tracing.petermaquiran.xyz/api/v2/spans', + serviceName: serviceName, + getExportRequestHeaders: () => { + return { + 'Authorization': `Basic ${btoa('doneit:Tabteste@006')}`, + }; + }, + headers: { + 'Authorization': `Basic ${btoa('doneit:Tabteste@006')}`, + } }))); + // provider.addSpanProcessor(new SimpleSpanProcessor(new OTLPTraceExporter({ + // url: 'https://ip-2-56-212-253-123420.vps.hosted-by-mvps.net:85/collector/v1/traces', + // }))); + provider.register(); return provider; } diff --git a/src/app/services/monitoring/opentelemetry/tracer.ts b/src/app/services/monitoring/opentelemetry/tracer.ts index 8e608915f..cea77c58f 100644 --- a/src/app/services/monitoring/opentelemetry/tracer.ts +++ b/src/app/services/monitoring/opentelemetry/tracer.ts @@ -111,25 +111,18 @@ const createTracingInstance = ({bugPrint, name, module, autoFinish, waitNThrow = const _tracer = OpentelemetryLogging.getTracer('logging') const spanContext = _tracer.startSpan(name) - dataObject = convertAttributesToString(dataObject) - - if(environment.apiURL != 'https://gdqas-api.oapr.gov.ao/api/') { + //if(environment.apiURL != 'https://gdqas-api.oapr.gov.ao/api/') { openTelemetryLogging.send({ - type: 'graylog', - spanContext, + level: 'info', + message, payload: { - message: message, - object: { ...dataObject, - spanId, - name, - user: SessionStore?.user?.FullName, - device_name: device?.name || device?.model, - commit_date: environment.version.lastCommitTime, - } + // user: SessionStore?.user?.FullName, + // device_name: device?.name || device?.model, + // commit_date: environment.version.lastCommitTime, } }) - } + //} data.logs.push(dataObject) @@ -146,7 +139,7 @@ const createTracingInstance = ({bugPrint, name, module, autoFinish, waitNThrow = if(environment.apiURL != 'https://gdqas-api.oapr.gov.ao/api/') { span.setAttribute('error.list', data.errors.join(',')) - // span.end(); + span.end(); UseCaseCounter.add(1, {user: SessionStore?.user?.FullName, outcome:data.tags['outcome'] || data.status?.code , usecase: name}) } 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 349afb53d..1ef9ef850 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 @@ -65,6 +65,11 @@ export class EditGroupPage implements OnInit { async changeGroupName() { + if(this.groupName == "" || this.groupName == null) { + this.toastService._badRequest("O nome do grupo não pode estar vazio."); + return; + } + this.showLoader = true const result = await this.chatServiceService.updateRoomById({ roomId: this.roomId, diff --git a/src/app/ui/chat/component/messages/messages.page.ts b/src/app/ui/chat/component/messages/messages.page.ts index f93650169..8d7ddfd3a 100644 --- a/src/app/ui/chat/component/messages/messages.page.ts +++ b/src/app/ui/chat/component/messages/messages.page.ts @@ -49,6 +49,8 @@ import { whatsappDate } from 'src/app/ui/shared/utils/whatappdate'; import { IDBoolean } from 'src/app/infra/database/dexie/type'; import { Result } from 'neverthrow'; import { MessageOutPutDataDTO } from 'src/app/core/chat/repository/dto/messageOutputDTO'; +import { v4 as uuidv4 } from 'uuid'; + @Component({ selector: 'app-messages', templateUrl: './messages.page.html', @@ -450,7 +452,7 @@ export class MessagesPage implements OnInit, OnChanges, AfterViewInit, OnDestroy this.chatServiceService.sendReadAt({ memberId: SessionStore.user.UserId, messageId: message.id, - requestId: '', + requestId: uuidv4(), roomId: this.room.id }) } else { 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 dd01f648c..33de5791c 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 @@ -47,6 +47,12 @@ export class EditGroupPage implements OnInit { } async changeGroupName() { + + if(this.groupName == "" || this.groupName == null) { + this.toastService._badRequest("O nome do grupo não pode estar vazio."); + return; + } + this.showLoader = true const result = await this.chatServiceService.updateRoomById({ roomId: this.roomId, diff --git a/src/app/ui/chat/store/roomStore.ts b/src/app/ui/chat/store/roomStore.ts index eb4512018..6658f8275 100644 --- a/src/app/ui/chat/store/roomStore.ts +++ b/src/app/ui/chat/store/roomStore.ts @@ -20,7 +20,7 @@ import { UserTypingLocalRepository } from 'src/app/module/chat/data/repository/t import { Result } from 'neverthrow'; import { MessageOutPutDataDTO } from 'src/app/core/chat/repository/dto/messageOutputDTO'; import { UserTypingRemoteRepositoryService } from 'src/app/module/chat/data/repository/typing/user-typing-live-data-source.service'; - +import { v4 as uuidv4 } from 'uuid'; @Injectable({ providedIn: 'root' }) @@ -227,7 +227,7 @@ export class RoomStore { this.chatServiceService.sendReadAt({ memberId: SessionStore.user.UserId, messageId: message.id, - requestId: '', + requestId: uuidv4(), roomId: this.room.id }) @@ -351,7 +351,7 @@ export class RoomStore { this.chatServiceService.sendReadAt({ memberId: SessionStore.user.UserId, messageId: message.id, - requestId: '', + requestId: uuidv4(), roomId: this.room.id }) } else { diff --git a/src/app/ui/shared/components/header/header.page.html b/src/app/ui/shared/components/header/header.page.html index fe888b2a4..e9d096038 100644 --- a/src/app/ui/shared/components/header/header.page.html +++ b/src/app/ui/shared/components/header/header.page.html @@ -241,6 +241,9 @@ class="icon" src='assets/images/theme/gov/icons-profile.svg'> + +
diff --git a/src/app/ui/shared/components/header/header.page.ts b/src/app/ui/shared/components/header/header.page.ts index 7c6d093eb..1ca59e76b 100644 --- a/src/app/ui/shared/components/header/header.page.ts +++ b/src/app/ui/shared/components/header/header.page.ts @@ -85,6 +85,9 @@ export class HeaderPage implements OnInit { this.profilePictureSubject = this.UserRepositoryService.getProfilePictureLive() as any this.notificationCount$ = this.notificationRepositoryService.getNotificationLiveCount() + this.UserRepositoryService.getProfilePictureLive().subscribe((e) => { + console.log(`nice job ${e}`); + }); this.loggeduser = SessionStore.user; router.events.subscribe((val) => { this.hideSearch(); @@ -134,7 +137,7 @@ export class HeaderPage implements OnInit { async getProfilpicture(tracing?: TracingType) { if (this.SessionStore.user.UserPhoto) { - + const base = await this.UserRepositoryService.getUserProfilePhoto(this.SessionStore.user.UserPhoto, tracing) if(base.isOk()) { diff --git a/src/environments/environment.prod.ts b/src/environments/environment.prod.ts index 43c1647f5..a9d2c2e92 100644 --- a/src/environments/environment.prod.ts +++ b/src/environments/environment.prod.ts @@ -1,7 +1,6 @@ import { Environment } from './../app/models/envarioment' import { environment as oaprProd } from './suport/oapr' // import { environment as doneITProd } from './suport/doneIt' -import { DevDev } from './suport/dev' -export const environment: Environment = DevDev; +export const environment: Environment = oaprProd; diff --git a/src/environments/environment.ts b/src/environments/environment.ts index 983359e87..9e4e84e5b 100644 --- a/src/environments/environment.ts +++ b/src/environments/environment.ts @@ -1,6 +1,5 @@ import { Environment } from './../app/models/envarioment' import { environment as oaprDev } from './suport/oapr' -import { doneITDev } from './suport/doneIt' import { DevDev } from './suport/dev' diff --git a/src/environments/suport/dev.ts b/src/environments/suport/dev.ts index 2ecb4ef5b..3ae6cefc5 100644 --- a/src/environments/suport/dev.ts +++ b/src/environments/suport/dev.ts @@ -1,58 +1,11 @@ import { versionData } from '../../../version/git-version' import { Environment } from './../../app/models/envarioment' -// export const environment: Environment = { -// id:'3', -// apiURL: 'http://gpr-dev-01:83/jwt/api/', -// /* apiURL: 'https://gdapi-dev-0.dyndns.info/jwt/api/', */ -// apiChatUrl: 'https://gdchat-dev.dyndns.info/api/v1/', -// apiWsChatUrl: 'wss://gdchat-dev.dyndns.info/websocket', -// apiPCURL: 'http://gpr-dev-01:86/api/', -// /* apiPCURL: 'https://gdcmapi-dev.dyndns.info/api/', */ -// logoLabel: 'Presidente da República', -// despachoLabel: 'Presidenciais', -// despachoLabel2: 'Despachos Presidênciais', -// production: false, -// domain: 'gabinetedigital.local', -// defaultuser: 'paulo.pinto@gabinetedigital.local', -// defaultuserpwd: 'tabteste@006', -// chatOffline: true, -// presidential: true, -// version: versionData, -// agendaPR: 'Agenda do PR', -// agendaVP: 'Agenda do MD', -// PR: 'PR', -// VP: '', -// dispatchPR: 'Despachos Presidênciais', -// sentryUrl: 'https://9920cc36f1d740b987426ee8d80cf588@o4504340905525248.ingest.sentry.io/4504340946419712', -// storageProduction: true, -// rejectUnauthorized: "true", -// fileHub: 'https://gdcmapi-dev.dyndns.info/FileHub' -// /* production: true, -// domain: 'gabinetedigital.local', -// defaultuser: '', -// defaultuserpwd: '', -// chatOffline: true, -// presidential: false, -// version: versionData, -// sentryUrl: 'https://9920cc36f1d740b987426ee8d80cf588@o4504340905525248.ingest.sentry.io/4504340946419712', -// logoLabel: 'doneIT', -// despachoLabel: 'do Titular', -// despachoLabel2: 'Despachos do Titular', -// agendaPR: 'Agenda do Titular', -// agendaVP: 'Agenda do (MD)', -// PR: 'Titular', -// VP: '', -// dispatchPR: 'Despachos Titular', -// storageProduction: true */ -// }; - export const DevDev: Environment = { id:'3', + apiURLStage: 'https://gdapi-dev.dyndns.info/stage/api/v2/', apiURL: 'https://gdapi-dev.dyndns.info/jwt/api/', - apiChatUrl: 'https://gdchat-dev.dyndns.info/api/v1/', - apiWsChatUrl: 'wss://gdchat-dev.dyndns.info/websocket', apiPCURL: 'https://gdcmapi-dev.dyndns.info/api/', logoLabel: 'Presidente da República', despachoLabel: 'Presidenciais', @@ -71,23 +24,6 @@ export const DevDev: Environment = { dispatchPR: 'Despachos Presidênciais', sentryUrl: 'https://9920cc36f1d740b987426ee8d80cf588@o4504340905525248.ingest.sentry.io/4504340946419712', storageProduction: false, - rejectUnauthorized: "true" - /* production: true, - domain: 'gabinetedigital.local', - defaultuser: 'paulo.pinto@gabinetedigital.local', - defaultuserpwd: 'tabteste@006', - chatOffline: true, - presidential: false, - version: versionData, - sentryUrl: 'https://9920cc36f1d740b987426ee8d80cf588@o4504340905525248.ingest.sentry.io/4504340946419712', - logoLabel: 'doneIT', - despachoLabel: 'do Titular', - despachoLabel2: 'Despachos do Titular', - agendaPR: 'Agenda do Titular', - agendaVP: 'Agenda do (MD)', - PR: 'Titular', - VP: '', - dispatchPR: 'Despachos Titular', - storageProduction: false, */, + rejectUnauthorized: "true", fileHub: 'https://gdcmapi-dev.dyndns.info/FileHub' }; diff --git a/src/environments/suport/doneIt.ts b/src/environments/suport/doneIt.ts deleted file mode 100644 index 18754d009..000000000 --- a/src/environments/suport/doneIt.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { versionData } from '../../../version/git-version'; -import { Environment } from './../../app/models/envarioment'; - -export const environment: Environment = { - id:'1', - apiURL: 'http://gpr-dev-01:83/jwt/api/', - /* apiURL: 'https://gdapi-dev-0.dyndns.info/jwt/api/', */ - apiChatUrl: 'https://gdchat-dev.dyndns.info/api/v1/', - apiWsChatUrl: 'wss://gdchat-dev.dyndns.info/websocket', - apiPCURL: 'http://gpr-dev-01:86/api/', - /* apiPCURL: 'https://gdcmapi-dev.dyndns.info/api/', */ -/* apiURL: 'https://API.DONEIT.CO.AO/api/', - apiChatUrl: 'https://CHAT.DONEIT.CO.AO/api/v1/', - apiWsChatUrl: 'wss://CHAT.DONEIT.CO.AO/websocket', - apiPCURL: 'http://192.168.0.21:9099/api/', */ - production: true, - domain: 'gabinetedigital.local', - defaultuser: '', - defaultuserpwd: '', - chatOffline: true, - presidential: false, - version: versionData, - sentryUrl: 'https://9920cc36f1d740b987426ee8d80cf588@o4504340905525248.ingest.sentry.io/4504340946419712', - logoLabel: 'doneIT', - despachoLabel: 'do Titular', - despachoLabel2: 'Despachos do Titular', - agendaPR: 'Agenda do Titular', - agendaVP: 'Agenda do (MD)', - PR: 'Titular', - VP: '', - dispatchPR: 'Despachos Titular', - storageProduction: true, - rejectUnauthorized: "true", - fileHub: 'https://gdcmapi-dev.dyndns.info/FileHub' -}; - -export const doneITDev: Environment = { - id:'1', - apiURL: 'http://gpr-dev-01:83/jwt/api/', - /* apiURL: 'https://gdapi-dev-0.dyndns.info/jwt/api/', */ - apiChatUrl: 'https://gdchat-dev.dyndns.info/api/v1/', - apiWsChatUrl: 'wss://gdchat-dev.dyndns.info/websocket', - apiPCURL: 'http://gpr-dev-01:86/api/', -/* apiURL: 'https://API.DONEIT.CO.AO/api/', - apiChatUrl: 'https://CHAT.DONEIT.CO.AO/api/v1/', - apiWsChatUrl: 'wss://CHAT.DONEIT.CO.AO/websocket', - apiPCURL: 'http://192.168.0.21:9099/api/', */ - production: true, - domain: 'gabinetedigital.local', - defaultuser: '', - defaultuserpwd: '', - chatOffline: true, - presidential: false, - version: versionData, - sentryUrl: 'https://9920cc36f1d740b987426ee8d80cf588@o4504340905525248.ingest.sentry.io/4504340946419712', - logoLabel: 'doneIT', - despachoLabel: 'do Titular', - despachoLabel2: 'Despachos do Titular', - agendaPR: 'Agenda do Titular', - agendaVP: 'Agenda do (MD)', - PR: 'Titular', - VP: '', - dispatchPR: 'Despachos Titular', - storageProduction: false, - rejectUnauthorized: "true", - fileHub: 'https://gdcmapi-dev.dyndns.info/FileHub' -}; diff --git a/src/environments/suport/oapr.ts b/src/environments/suport/oapr.ts index 5fe0d541c..b3c9917d6 100644 --- a/src/environments/suport/oapr.ts +++ b/src/environments/suport/oapr.ts @@ -4,12 +4,8 @@ import { Environment } from './../../app/models/envarioment' export const environment: Environment = { id: '0', - /* apiURL: 'http://gpr-dev-01:83/jwt/api/', */ + apiURLStage: 'https://gdqas-api.oapr.gov.ao/stage/api/v2/', apiURL: 'https://gdqas-api.oapr.gov.ao/api/', - /* apiChatUrl: 'http://192.168.0.29:3000/api/v1/', */ - apiChatUrl: 'https://gdqas-chat.oapr.gov.ao/api/v1/', - apiWsChatUrl: 'wss://gdqas-chat.oapr.gov.ao/websocket', - /* apiPCURL: 'http://gpr-dev-01:86/api/', */ apiPCURL: 'https://gdqas-cmapi.oapr.gov.ao/api/', logoLabel: 'Presidente da República', despachoLabel: 'Presidenciais', @@ -34,12 +30,8 @@ export const environment: Environment = { export const oaprDev: Environment = { id: '0', - /* apiURL: 'http://gpr-dev-01:83/jwt/api/', */ + apiURLStage: 'https://gdqas-api.oapr.gov.ao/stage/api/v2/', apiURL: 'https://gdqas-api.oapr.gov.ao/api/', - /* apiChatUrl: 'http://192.168.0.29:3000/api/v1/', */ - apiChatUrl: 'https://gdqas-chat.oapr.gov.ao/api/v1/', - apiWsChatUrl: 'wss://gdqas-chat.oapr.gov.ao/websocket', - /* apiPCURL: 'http://gpr-dev-01:86/api/', */ apiPCURL: 'https://gdqas-cmapi.oapr.gov.ao/api/', logoLabel: 'Presidente da República', despachoLabel: 'Presidencial', diff --git a/version/git-version.ts b/version/git-version.ts index eafe497b1..8ccc30ff4 100644 --- a/version/git-version.ts +++ b/version/git-version.ts @@ -1,11 +1,11 @@ export let versionData = { - "shortSHA": "470b1e7f0", - "SHA": "470b1e7f0e0e7a4ae7155d7b88c322e770e21f26", - "branch": "feature/login-v2", - "lastCommitAuthor": "'peter.maquiran'", - "lastCommitTime": "'Tue Jun 3 09:42:08 2025 +0100'", - "lastCommitMessage": "fix", - "lastCommitNumber": "6141", - "changeStatus": "On branch feature/login-v2\nYour branch is ahead of 'origin/feature/login-v2' by 6 commits.\n (use \"git push\" to publish your local commits)\n\nChanges to be committed:\n (use \"git restore --staged ...\" to unstage)\n\tmodified: version/git-version.ts", + "shortSHA": "cfc7330e7", + "SHA": "cfc7330e729bb815925e687ffa74c20fe4431eb3", + "branch": "developer", + "lastCommitAuthor": "'Peter Maquiran'", + "lastCommitTime": "'Tue Jun 3 08:46:54 2025 +0000'", + "lastCommitMessage": "Merged in feature/login-v2 (pull request #36)\n\nFeature/login v2", + "lastCommitNumber": "6143", + "changeStatus": "On branch developer\nYour branch is up to date with 'origin/developer'.\n\nChanges to be committed:\n (use \"git restore --staged ...\" to unstage)\n\tmodified: src/app/app.module.ts\n\tmodified: src/app/core/chat/entity/group.ts\n\tmodified: src/app/core/chat/entity/message.ts\n\tmodified: src/app/core/chat/mapper/messageMapper.ts\n\tmodified: src/app/core/chat/repository/dto/messageOutputDTO.ts\n\tmodified: src/app/core/chat/repository/room/room-socket-repository.ts\n\tmodified: src/app/core/chat/usecase/message/listen-message-by-roomId.service.ts\n\tmodified: src/app/core/chat/usecase/message/listen-send-message.service.ts\n\tmodified: 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/message-mark-all-message-as-read-by-room-id.service.ts\n\tmodified: src/app/core/chat/usecase/message/messages-send-offline-use-case.service.ts\n\tmodified: src/app/core/chat/usecase/room/room-bold-sync-use-case.service.ts\n\tmodified: src/app/core/chat/usecase/room/room-create-use-case.service.ts\n\tmodified: src/app/core/chat/usecase/room/room-get-by-id-use-case.service.ts\n\tmodified: src/app/core/chat/usecase/room/room-get-list-use-case.service.ts\n\tmodified: src/app/core/chat/usecase/room/room-update-by-id-use-case.service.ts\n\tmodified: src/app/infra/database/dexie/instance/chat/schema/members.ts\n\tmodified: src/app/infra/database/dexie/instance/chat/schema/room.ts\n\tmodified: src/app/infra/monitoring/interceptors/token.interceptors.ts\n\tmodified: src/app/infra/socket/signalR/signal-r.service.ts\n\tmodified: src/app/modals/profile/edit-profile/edit-profile.page.html\n\tmodified: src/app/models/envarioment.ts\n\tmodified: src/app/module/agenda/data/data-source/agenda-data.service.ts\n\tmodified: src/app/module/chat/data/repository/attachment/attachment-remote-repository.service.ts\n\tmodified: src/app/module/chat/data/repository/member/member-list-remote-repository.service.ts\n\tmodified: src/app/module/chat/data/repository/member/member-socket-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/chat/data/repository/room/room-remote-repository.service.ts\n\tmodified: src/app/module/chat/data/repository/typing/user-typing-live-data-source.service.ts\n\tmodified: src/app/module/chat/domain/chat-service.service.ts\n\tmodified: src/app/module/chat/domain/service/room-last-message.service.ts\n\tmodified: src/app/module/notification/data/datasource/remote-notification.service.ts\n\tmodified: src/app/module/user/data/datasource/user-remote-repository.service.ts\n\tmodified: src/app/services/Repositorys/contacts/data-source/contacts-data-source.service.ts\n\tmodified: src/app/services/aesencrypt.service.ts\n\tmodified: src/app/services/logger/main/service.ts\n\tmodified: src/app/services/monitoring/opentelemetry/logging.ts\n\tmodified: src/app/services/monitoring/opentelemetry/opentelemetry.ts\n\tmodified: src/app/services/monitoring/opentelemetry/tracer.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/store/roomStore.ts\n\tmodified: src/app/ui/shared/components/header/header.page.html\n\tmodified: src/app/ui/shared/components/header/header.page.ts\n\tmodified: src/environments/environment.prod.ts\n\tmodified: src/environments/environment.ts\n\tmodified: src/environments/suport/dev.ts\n\tdeleted: src/environments/suport/doneIt.ts\n\tmodified: src/environments/suport/oapr.ts\n\tdeleted: workspace.code-workspace", "changeAuthor": "peter.maquiran" } \ No newline at end of file diff --git a/workspace.code-workspace b/workspace.code-workspace deleted file mode 100644 index 658c0899e..000000000 --- a/workspace.code-workspace +++ /dev/null @@ -1,22 +0,0 @@ -{ - "folders": [ - { - "path": "." - }, - { - "path": "../sentry" - }, - { - "path": "../sentium" - }, - { - "path": "../GDoc" - } - ], - "settings": { - "cSpell.words": [ - "Chatmessage" - ], - "nuxt.isNuxtApp": false - } -}