From 2665bf3f96099baf7f87d5af21fd303563b6d210 Mon Sep 17 00:00:00 2001 From: Peter Maquiran Date: Mon, 17 Jun 2024 12:00:07 +0100 Subject: [PATCH 1/6] integrate list event with opentelemetry --- src/app/pages/agenda/agenda.page.ts | 2 - .../Agenda/agenda-data-repository.service.ts | 19 +++++---- .../Repositorys/Agenda/agenda-data.service.ts | 7 +++- .../Agenda/mapper/EventListMapper.ts | 2 +- .../Agenda/mapper/eventToApproveListMapper.ts | 8 +--- .../Agenda/model/eventListDTOOutput.ts | 27 +++++++++--- .../model/eventToApproveListOutputDTO.ts | 11 ++++- .../api-validate-schema.decorator.ts | 42 +++++++++++++++---- .../agenda/event-list/event-list.page.html | 6 ++- 9 files changed, 89 insertions(+), 35 deletions(-) diff --git a/src/app/pages/agenda/agenda.page.ts b/src/app/pages/agenda/agenda.page.ts index 874a1769b..45eecf355 100644 --- a/src/app/pages/agenda/agenda.page.ts +++ b/src/app/pages/agenda/agenda.page.ts @@ -700,8 +700,6 @@ export class AgendaPage implements OnInit { } catch (error) {} - console.log('selectedCalendarIds', selectedCalendarIds) - let load = 0; for (const selectedCalendar of selectedCalendarIds) { diff --git a/src/app/services/Repositorys/Agenda/agenda-data-repository.service.ts b/src/app/services/Repositorys/Agenda/agenda-data-repository.service.ts index bc9fef857..ca2506e37 100644 --- a/src/app/services/Repositorys/Agenda/agenda-data-repository.service.ts +++ b/src/app/services/Repositorys/Agenda/agenda-data-repository.service.ts @@ -14,6 +14,9 @@ import { AgendaLocalDataSourceService } from './agenda-local-data-source.service import { EEventFilterStatus } from './model/enums'; import { isHttpError } from '../../http.service'; import { TracingType } from '../../monitoring/opentelemetry/tracer'; +import { APINODReturn, APIReturn } from '../../decorator/api-validate-schema.decorator'; +import { EventListDataOutputDTOSchema, EventListOutputDTOSchema } from './model/eventListDTOOutput'; +import { EventToApproveDataOutputDTOSchema } from './model/eventToApproveListOutputDTO'; @Injectable({ providedIn: 'root' @@ -75,7 +78,8 @@ export class AgendaDataRepositoryService { try { const result = await this.agendaDataService.getEvents(userId, startDate, endDate, status, category, type).pipe( map((response) => { - return ListEventMapper.toDomain(response.data, calendarOwnerName, userId) + APINODReturn(EventListDataOutputDTOSchema, response, 'get/Events', tracing) + return ListEventMapper.toDomain(response, calendarOwnerName, userId) } )).toPromise() return ok(result) @@ -83,8 +87,8 @@ export class AgendaDataRepositoryService { if(isHttpError(e)) { tracing?.setAttribute('status.code', e.status.toString()) } else { - console.error(e) - tracing?.setAttribute('map.error', JSON.stringify(e.error)) + tracing?.setAttribute('map.error', 'true') + tracing?.setAttribute('map.error.context', JSON.stringify(e)) } return err(e as HttpErrorResponse) } @@ -93,9 +97,10 @@ export class AgendaDataRepositoryService { async eventToApproveList({ userId, startDate = null, endDate = null, status = EEventFilterStatus.Pending, category = null, type = null, calendarOwnerName = '' }, tracing?: TracingType) { try { - const result = await this.agendaDataService.getEvents(userId, startDate = null, endDate = null, status, category = null, type = null).pipe( + const result = await this.agendaDataService.getEvents(userId, startDate = null, endDate = null, status, category = null, type = null, tracing).pipe( map((response) => { - return EventListToApproveMapper.toDomain(response.data, calendarOwnerName, userId) + APINODReturn(EventToApproveDataOutputDTOSchema, response, 'get/ApproveList', tracing) + return EventListToApproveMapper.toDomain(response, calendarOwnerName, userId) } )).toPromise() @@ -104,8 +109,8 @@ export class AgendaDataRepositoryService { if(isHttpError(e)) { tracing?.setAttribute('status.code', e.status.toString()) } else { - console.error(e) - tracing?.setAttribute('map.error', JSON.stringify(e.error)) + tracing?.setAttribute('map.error', 'true') + tracing?.setAttribute('map.error.context', JSON.stringify(e)) } return err(e as HttpErrorResponse) } diff --git a/src/app/services/Repositorys/Agenda/agenda-data.service.ts b/src/app/services/Repositorys/Agenda/agenda-data.service.ts index e56dddde4..ea135b268 100644 --- a/src/app/services/Repositorys/Agenda/agenda-data.service.ts +++ b/src/app/services/Repositorys/Agenda/agenda-data.service.ts @@ -6,6 +6,8 @@ import { SessionStore } from 'src/app/store/session.service'; import { SharedCalendarListOutputDTO, SharedCalendarListOutputDTOSchema } from './model/sharedCalendarOutputDTO'; import { HttpService } from '../../http.service'; import { APIReturn } from '../../decorator/api-validate-schema.decorator'; +import { TracingType } from '../../monitoring/opentelemetry/tracer'; +import { EventListOutputDTOSchema } from './model/eventListDTOOutput'; @Injectable({ providedIn: 'root' @@ -45,7 +47,8 @@ export class AgendaDataService { return this.http.post(`${this.baseUrl}/Events`, eventData); } - getEvents(userId: number, startDate: string, endDate: string, status: number, category: string, type: string): Observable { + // @APIReturn(EventListOutputDTOSchema, 'get/Events') + getEvents(userId: number, startDate: string, endDate: string, status: number, category: string, type: string, tracing?: TracingType): Observable { let params = new HttpParams() .set('UserId', userId) @@ -131,7 +134,7 @@ export class AgendaDataService { } - @APIReturn(SharedCalendarListOutputDTOSchema) + // @APIReturn(SharedCalendarListOutputDTOSchema, 'Users/${SessionStore.user.UserId}/ShareCalendar') async getSharedCalendar() { return await this.httpService.get(`${this.baseUrl}/Users/${SessionStore.user.UserId}/ShareCalendar`); } diff --git a/src/app/services/Repositorys/Agenda/mapper/EventListMapper.ts b/src/app/services/Repositorys/Agenda/mapper/EventListMapper.ts index 5e8edb0d6..f20c9411a 100644 --- a/src/app/services/Repositorys/Agenda/mapper/EventListMapper.ts +++ b/src/app/services/Repositorys/Agenda/mapper/EventListMapper.ts @@ -17,7 +17,7 @@ export class ListEventMapper { // @XTracer({name:'ListEventMapper/toDomain', log: false, bugPrint: false}) static toDomain(dto: EventListOutputDTO, calendarOwnerName: string, userId: string): EventList { - return dto.map((e) => { + return dto.data.map((e) => { let category; if(e.category == EEventCategory.Oficial) { diff --git a/src/app/services/Repositorys/Agenda/mapper/eventToApproveListMapper.ts b/src/app/services/Repositorys/Agenda/mapper/eventToApproveListMapper.ts index 7ec409acd..78516aeec 100644 --- a/src/app/services/Repositorys/Agenda/mapper/eventToApproveListMapper.ts +++ b/src/app/services/Repositorys/Agenda/mapper/eventToApproveListMapper.ts @@ -19,7 +19,7 @@ export class EventListToApproveMapper { static toDomain(dtoList: EventToApproveListOutputDTO, calendarOwnerName: string, userId: string): EventToApproveList { - return dtoList.map((dto) => { + return dtoList.data.map((dto) => { let category; if(dto.category == EEventCategory.Oficial) { @@ -27,7 +27,7 @@ export class EventListToApproveMapper { } else { category = 'Pessoal' } - + let color; let workflowDisplayName; @@ -112,7 +112,3 @@ export class EventListToApproveMapper { // "InstanceId": "AAMkADVhOGY3ZDQzLTg4ZGEtNDYxMC1iMzc5LTJkMDgwNjMxOWFlZQBGAAAAAABEDW9nKs69TKQcVqQURj8YBwBR2HR2eO7pSpNdD9cc70l+AAAAAAFKAABR2HR2eO7pSpNdD9cc70l+AACK2Od9AAA=", // "originator": "dlima@gabinetedigital.local" // } - - - - diff --git a/src/app/services/Repositorys/Agenda/model/eventListDTOOutput.ts b/src/app/services/Repositorys/Agenda/model/eventListDTOOutput.ts index 54778b587..d8e15335b 100644 --- a/src/app/services/Repositorys/Agenda/model/eventListDTOOutput.ts +++ b/src/app/services/Repositorys/Agenda/model/eventListDTOOutput.ts @@ -1,25 +1,40 @@ import { z } from 'zod'; import { EEventCategory, EEventOwnerType, EEventStatus, EEventType } from './enums'; -const EventSchema = z.array(z.object({ + +const OwnerSchema = z.object({ + wxUserId: z.number(), + wxFullName: z.string(), + wxeMail: z.string(), + userPhoto: z.string(), +}); + + +export const EventListOutputDTOSchema = z.object({ id: z.string(), - owner: z.string().nullable(), + owner: OwnerSchema, ownerType: z.nativeEnum(EEventOwnerType),// ['MD','PR', 'Other'] // Assuming "MD" is the only valid option based on provided data subject: z.string(), body: z.string(), - location: z.string(), + location: z.string().nullable(), startDate: z.string().datetime({ offset: true }), endDate: z.string().datetime({ offset: true }), type: z.nativeEnum(EEventType), // ['Meeting', 'Travel'] = [1,2 ] // category: z.enum(['Oficial', 'Pessoal']), // Assuming "Oficial" is the only valid option based on provided data category: z.nativeEnum(EEventCategory), isRecurring: z.boolean(), - eventRecurrence: z.null(), + eventRecurrence: z.any().nullable(), hasAttachments: z.boolean(), isPrivate: z.boolean(), isAllDayEvent: z.boolean(), // status: z.enum(['Approved']), // Assuming "Approved" is the only valid option based on provided data status: z.nativeEnum(EEventStatus), // Assuming "Approved" is the only valid option based on provided data -})) +}) -export type EventListOutputDTO = z.infer; +export const EventListDataOutputDTOSchema = z.object({ + success: z.boolean(), + message: z.string(), + data: z.array(EventListOutputDTOSchema), +}).nullable(); + +export type EventListOutputDTO = z.infer; diff --git a/src/app/services/Repositorys/Agenda/model/eventToApproveListOutputDTO.ts b/src/app/services/Repositorys/Agenda/model/eventToApproveListOutputDTO.ts index 0bd991fe1..b5d3c4556 100644 --- a/src/app/services/Repositorys/Agenda/model/eventToApproveListOutputDTO.ts +++ b/src/app/services/Repositorys/Agenda/model/eventToApproveListOutputDTO.ts @@ -7,7 +7,7 @@ const EventToApproveList = z.array(z.object({ ownerType: z.nativeEnum(EEventOwnerType), subject: z.string(), body: z.string(), - location: z.string(), + location: z.string().nullable(), startDate: z.string().datetime(), endDate: z.string().datetime(), type: z.nativeEnum(EEventType), @@ -20,4 +20,11 @@ const EventToApproveList = z.array(z.object({ status: z.nativeEnum(EEventStatus) })) -export type EventToApproveListOutputDTO = z.infer; +export const EventToApproveDataOutputDTOSchema = z.object({ + success: z.boolean(), + message: z.string(), + data: EventToApproveList, +}).nullable(); + + +export type EventToApproveListOutputDTO = z.infer; diff --git a/src/app/services/decorator/api-validate-schema.decorator.ts b/src/app/services/decorator/api-validate-schema.decorator.ts index ecc1f468e..73aa318b1 100644 --- a/src/app/services/decorator/api-validate-schema.decorator.ts +++ b/src/app/services/decorator/api-validate-schema.decorator.ts @@ -2,8 +2,9 @@ import { HttpErrorResponse } from '@angular/common/http'; import { Result, err } from 'neverthrow'; import { z, ZodError } from 'zod'; import * as Sentry from '@sentry/capacitor'; +import { TracingType } from '../monitoring/opentelemetry/tracer'; -export function APIReturn(schema: z.ZodTypeAny) { +export function APIReturn(schema: z.ZodTypeAny, path: string) { return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) { const originalMethod = descriptor.value; @@ -19,13 +20,8 @@ export function APIReturn(schema: z.ZodTypeAny) { if (error instanceof ZodError) { // If validation fails, throw an error with the details // - console.log('unexpected data structure') + console.error('unexpected data structure', path) // Capture the Zod validation error with additional context - Sentry.withScope((scope) => { - scope.setTag('APIReturn', 'user'); - scope.setContext('data', { data: result.value }); - Sentry.captureException(error); - }); console.error('Validation failed:', error.errors); } else { console.log('failed to setup the connection successful') @@ -34,7 +30,7 @@ export function APIReturn(schema: z.ZodTypeAny) { } } } else { - console.log() + // console.log() // result.error. } @@ -43,3 +39,33 @@ export function APIReturn(schema: z.ZodTypeAny) { return descriptor; } } + + +export function APINODReturn(schema: z.ZodTypeAny, data , path: string, tracing?: TracingType) { + + try { + // Validate the result using the provided schema + schema.parse(data); + + } catch (error) { + if (error instanceof ZodError) { + // If validation fails, throw an error with the details + // + console.error('unexpected data structure', path) + // Capture the Zod validation error with additional context + console.error('Validation failed:', error.errors); + + tracing?.setAttribute('APIReturn.error', 'true') + + let i = 0; + for(const schema of error.errors) { + tracing?.setAttribute('map.error.schema-'+i, JSON.stringify(schema)) + } + + } else { + // Throw any other unexpected errors + throw error; + } + } + +} diff --git a/src/app/shared/agenda/event-list/event-list.page.html b/src/app/shared/agenda/event-list/event-list.page.html index fb742836e..41fd02055 100644 --- a/src/app/shared/agenda/event-list/event-list.page.html +++ b/src/app/shared/agenda/event-list/event-list.page.html @@ -52,10 +52,14 @@ (click)="openApproveModal(event.serialNumber, event)" >
-
+

{{event.workflowInstanceDataFields.StartDate | date: 'HH:mm'}}

{{event.workflowInstanceDataFields.EndDate | date: 'HH:mm'}}

+
+

Todo

+

o dia

+

{{event.workflowInstanceDataFields.Subject}}

{{event.workflowInstanceDataFields.StartDate | date: 'd/M/yy' }} - {{ event.workflowInstanceDataFields.EndDate | date: 'dd/M/yy'}} | {{event.workflowInstanceDataFields.Location}}

From 596bd09f93d891260e5c221ceba6c4ee5e1770d9 Mon Sep 17 00:00:00 2001 From: Peter Maquiran Date: Mon, 17 Jun 2024 12:04:08 +0100 Subject: [PATCH 2/6] add console log --- src/app/pages/agenda/agenda.page.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/app/pages/agenda/agenda.page.ts b/src/app/pages/agenda/agenda.page.ts index 45eecf355..051438953 100644 --- a/src/app/pages/agenda/agenda.page.ts +++ b/src/app/pages/agenda/agenda.page.ts @@ -746,6 +746,7 @@ export class AgendaPage implements OnInit { if(!isHttpError(response.error)) { this.toastService._badRequest('Pedimos desculpa mas não foi possível executar a acção. Por favor, contacte o apoio técnico. #1') + console.log(response.error) } tracing.setAttribute('outcome', 'failed') From 58eee3ff930b209f0b29551cbed9af08ea501006 Mon Sep 17 00:00:00 2001 From: Peter Maquiran Date: Mon, 17 Jun 2024 14:38:31 +0100 Subject: [PATCH 3/6] change open telemetry endpoint --- .../monitoring/opentelemetry/opentelemetry.ts | 2 +- .../events-to-approve.page.ts | 49 ++++++++++--------- 2 files changed, 28 insertions(+), 23 deletions(-) diff --git a/src/app/services/monitoring/opentelemetry/opentelemetry.ts b/src/app/services/monitoring/opentelemetry/opentelemetry.ts index 0b96a98cc..74bda8d1d 100644 --- a/src/app/services/monitoring/opentelemetry/opentelemetry.ts +++ b/src/app/services/monitoring/opentelemetry/opentelemetry.ts @@ -13,7 +13,7 @@ function createProvider(serviceName) { provider.addSpanProcessor(new SimpleSpanProcessor(new ConsoleSpanExporter())); provider.addSpanProcessor(new SimpleSpanProcessor(new ZipkinExporter({ - url: 'https://5.180.182.151/zipkin-endpoint/api/v2/spans', + url: 'http://5.180.182.151:9411/api/v2/spans', serviceName: serviceName, // Uncomment and customize the following if needed // getExportRequestHeaders: () => { diff --git a/src/app/shared/gabinete-digital/events-to-approve/events-to-approve.page.ts b/src/app/shared/gabinete-digital/events-to-approve/events-to-approve.page.ts index cd4c86a07..7db4aa4cf 100644 --- a/src/app/shared/gabinete-digital/events-to-approve/events-to-approve.page.ts +++ b/src/app/shared/gabinete-digital/events-to-approve/events-to-approve.page.ts @@ -216,31 +216,36 @@ export class EventsToApprovePage implements OnInit { userId = this.selectedUserCalendar } - let allEvents = await this.AgendaDataRepositoryService.eventToApproveList({ - userId, - status: EEventFilterStatus.Pending - }, tracing) - if(allEvents.isOk()) { - tracing.setAttribute('outcome', 'success') + if(userId) { + let allEvents = await this.AgendaDataRepositoryService.eventToApproveList({ + userId, + status: EEventFilterStatus.Pending + }, tracing) + if(allEvents.isOk()) { + tracing.setAttribute('outcome', 'success') - if(allEvents.value.length >= 1) { - this.eventsList = this.sortService.sortArrayByDate(allEvents.value).reverse(); - this.eventoaprovacaostore.save(segment, this.eventsList) - } else { - this.eventoaprovacaostore.save(segment, []) + if(allEvents.value.length >= 1) { + this.eventsList = this.sortService.sortArrayByDate(allEvents.value).reverse(); + this.eventoaprovacaostore.save(segment, this.eventsList) + } else { + this.eventoaprovacaostore.save(segment, []) + } + + this.showLoader = false; + } else { + + tracing.setAttribute('outcome', 'failed') + tracing.bugFlag() + + if(!isHttpError(allEvents.error)) { + this.toastService._badRequest('Pedimos desculpa mas não foi possível executar a acção. Por favor, contacte o apoio técnico. #4') + } + this.showLoader = false; } - - this.showLoader = false; - } else { - - tracing.setAttribute('outcome', 'failed') - tracing.bugFlag() - - if(!isHttpError(allEvents.error)) { - this.toastService._badRequest('Pedimos desculpa mas não foi possível executar a acção. Por favor, contacte o apoio técnico. #4') - } - this.showLoader = false; + } else { + console.warn('calling to early Events-to-approve/LoadToApproveEvents') } + } getFromDB() {} From 157ecdd10bdcfa95acba1ebb971788a583e4ba91 Mon Sep 17 00:00:00 2001 From: Peter Maquiran Date: Mon, 17 Jun 2024 17:04:42 +0100 Subject: [PATCH 4/6] add log for endpoints --- .../approve-event/approve-event.page.ts | 23 ++++++-- .../Agenda/agenda-data-repository.service.ts | 12 ++++- .../Agenda/mapper/EventDetailsMapper.ts | 6 ++- .../mapper/EventToApproveDetailsMapper.ts | 6 ++- .../Agenda/model/eventDTOOutput.ts | 52 +++++++++++-------- .../model/eventToApproveListOutputDTO.ts | 15 ++++-- .../capture-log/capture-log.service.ts | 4 ++ .../events-to-approve.page.ts | 8 +-- src/web.config | 37 +++++++++++++ version/git-version.ts | 2 +- 10 files changed, 123 insertions(+), 42 deletions(-) create mode 100644 src/web.config diff --git a/src/app/pages/gabinete-digital/event-list/approve-event/approve-event.page.ts b/src/app/pages/gabinete-digital/event-list/approve-event/approve-event.page.ts index dae7bef2f..368f9fb0f 100644 --- a/src/app/pages/gabinete-digital/event-list/approve-event/approve-event.page.ts +++ b/src/app/pages/gabinete-digital/event-list/approve-event/approve-event.page.ts @@ -17,6 +17,8 @@ import { HttpErrorHandle } from 'src/app/services/http-error-handle.service'; import { TaskService } from 'src/app/services/task.service'; import { AttachmentsService } from 'src/app/services/attachments.service'; import { AgendaDataRepositoryService } from 'src/app/services/Repositorys/Agenda/agenda-data-repository.service'; +import { TracingType, XTracerAsync } from 'src/app/services/monitoring/opentelemetry/tracer'; +import { isHttpError } from 'src/app/services/http.service'; @Component({ selector: 'app-approve-event', @@ -95,19 +97,30 @@ export class ApproveEventPage implements OnInit { } - async getTask() { + @XTracerAsync({name:'ApproveEventPage/getTask', log: false, bugPrint: true}) + async getTask(tracing?: TracingType) { - const res = await this.AgendaDataRepositoryService.getEventToApproveById(this.serialNumber) - console.log(res) + const res = await this.AgendaDataRepositoryService.getEventToApproveById(this.serialNumber, tracing) if (res.isOk()) { this.loadedEvent = res.value; this.today = new Date(res.value.workflowInstanceDataFields.StartDate); + // this.customDate = this.days[this.today.getDay()] + ", " + this.today.getDate() + " de " + (this.months[this.today.getMonth()]); this.loadedAttachments = res.value.Attachments - } else { - console.log(res.error.status) + tracing.setAttribute('outcome', 'success') + } else if(isHttpError(res.error)) { + + tracing.setAttribute('outcome', 'failed') + tracing.bugFlag() + this.httpErrorHandle.httpStatusHandle(res.error) + } else if(!isHttpError(res.error)) { + + tracing.setAttribute('outcome', 'failed') + tracing.bugFlag() + + this.toastService._badRequest('Pedimos desculpa mas não foi possível executar a acção. Por favor, contacte o apoio técnico. #12') } } diff --git a/src/app/services/Repositorys/Agenda/agenda-data-repository.service.ts b/src/app/services/Repositorys/Agenda/agenda-data-repository.service.ts index ca2506e37..642ad374d 100644 --- a/src/app/services/Repositorys/Agenda/agenda-data-repository.service.ts +++ b/src/app/services/Repositorys/Agenda/agenda-data-repository.service.ts @@ -17,6 +17,7 @@ import { TracingType } from '../../monitoring/opentelemetry/tracer'; import { APINODReturn, APIReturn } from '../../decorator/api-validate-schema.decorator'; import { EventListDataOutputDTOSchema, EventListOutputDTOSchema } from './model/eventListDTOOutput'; import { EventToApproveDataOutputDTOSchema } from './model/eventToApproveListOutputDTO'; +import { EventOutputDTOSchema } from './model/eventDTOOutput'; @Injectable({ providedIn: 'root' @@ -58,16 +59,23 @@ export class AgendaDataRepositoryService { } } - async getEventToApproveById(id: string) { + async getEventToApproveById(id: string, tracing?: TracingType) { try { const result = await this.agendaDataService.getEvent(id).pipe( map((response) => { - return EventToApproveDetailsMapper.toDomain(response.data) + APINODReturn(EventOutputDTOSchema, response, 'get/Events/${id}', tracing) + return EventToApproveDetailsMapper.toDomain(response) }) ).toPromise() return ok(result) } catch (e) { + if(isHttpError(e)) { + tracing?.setAttribute('status.code', e.status.toString()) + } else { + tracing?.setAttribute('map.error', 'true') + tracing?.setAttribute('map.error.context', JSON.stringify(e)) + } return err(e as HttpErrorResponse) } diff --git a/src/app/services/Repositorys/Agenda/mapper/EventDetailsMapper.ts b/src/app/services/Repositorys/Agenda/mapper/EventDetailsMapper.ts index fd1edacf7..5080b35d5 100644 --- a/src/app/services/Repositorys/Agenda/mapper/EventDetailsMapper.ts +++ b/src/app/services/Repositorys/Agenda/mapper/EventDetailsMapper.ts @@ -14,7 +14,9 @@ function getTextInsideParentheses(inputString) { export class EventMapper { constructor() {} - static toDomain(dto: EventOutputDTO) { + static toDomain(_dto: EventOutputDTO) { + + const dto = _dto.data; let category; if(dto.category == EEventCategory.Oficial) { @@ -74,7 +76,7 @@ export class EventMapper { IsRequired: FEAttendeeType(e.attendeeType) == 'Required', UserType: "GD", // "IsPR": false, - attendeeType: FEAttendeeType(e.attendeeType) + attendeeType: FEAttendeeType(e.attendeeType) // "RoleDescription": null, // "RoleId": 0 })), diff --git a/src/app/services/Repositorys/Agenda/mapper/EventToApproveDetailsMapper.ts b/src/app/services/Repositorys/Agenda/mapper/EventToApproveDetailsMapper.ts index 91a7eb2f0..cd1679b4c 100644 --- a/src/app/services/Repositorys/Agenda/mapper/EventToApproveDetailsMapper.ts +++ b/src/app/services/Repositorys/Agenda/mapper/EventToApproveDetailsMapper.ts @@ -16,7 +16,9 @@ function getTextInsideParentheses(inputString) { export class EventToApproveDetailsMapper { constructor() {} - static toDomain(dto: EventOutputDTO): EventToApproveDetails { + static toDomain(_dto: EventOutputDTO): EventToApproveDetails { + + let dto = _dto.data let category; if(dto.category == EEventCategory.Oficial) { @@ -36,7 +38,7 @@ export class EventToApproveDetailsMapper { } else if(dto.ownerType == EEventOwnerType.Others) { ownerType = 'Other' } - + let activityInstanceName; let taskStatus; diff --git a/src/app/services/Repositorys/Agenda/model/eventDTOOutput.ts b/src/app/services/Repositorys/Agenda/model/eventDTOOutput.ts index faf4addff..02e46cabd 100644 --- a/src/app/services/Repositorys/Agenda/model/eventDTOOutput.ts +++ b/src/app/services/Repositorys/Agenda/model/eventDTOOutput.ts @@ -1,4 +1,5 @@ import { z } from 'zod'; +import { EAttendeeType, EEventCategory, EEventOwnerType, EEventStatus, EEventType } from './enums'; export const AttachmentInputDTOSchema = z.object({ id: z.string().nullable(), @@ -7,7 +8,7 @@ export const AttachmentInputDTOSchema = z.object({ description: z.string().nullable(), applicationId: z.number().int(), }).strict(); -const EAttendeeTypeDTO = z.enum(["Required", "Acknowledgment", "Optional"]); +const EAttendeeTypeDTO = z.nativeEnum(EAttendeeType); const CommentSchema = z.object({ @@ -18,7 +19,7 @@ const CommentSchema = z.object({ const AttendeeSchema = z.object({ id: z.string(), name: z.string(), - attendeeType: z.enum(["Required", "Acknowledgment", "Optional"]), // ["Required", "Acknowledgment", "Optional"] = [1,2,3] + attendeeType: z.nativeEnum(EAttendeeType), // ["Required", "Acknowledgment", "Optional"] = [1,2,3] emailAddress: z.string(), wxUserId: z.number(), }); @@ -47,27 +48,32 @@ const EventRecurrenceSchema = z.object({ until: z.string() }); + export const EventOutputDTOSchema = z.object({ - id: z.string(), - owner: OwnerSchema, - ownerType: z.number(), // ["PR", "MD", "Other"] = [1,2,3], - subject: z.string(), - body: z.string(), - location: z.string(), - startDate: z.string(), - endDate: z.string(), - type: z.string(), - category: z.number(), // ['Oficial', 'Pessoal'] = [1, 2] - attendees: z.array(AttendeeSchema), - isRecurring: z.boolean(), - eventRecurrence: EventRecurrenceSchema, - hasAttachments: z.boolean(), - attachments: z.array(AttachmentInputDTOSchema), - comments: z.array(CommentSchema), - isPrivate: z.boolean(), - isAllDayEvent: z.boolean(), - organizer: OrganizerSchema, - status: z.number(), // ['Pending', 'Revision', 'Approved', 'Declined', 'Communicated', 'ToCommunicate'] = [1, 2, 3, 4, 5, 6] -}); + success: z.boolean(), + message: z.string(), + data: z.object({ + id: z.string(), + owner: OwnerSchema, + ownerType: z.nativeEnum(EEventOwnerType), // ["PR", "MD", "Other"] = [1,2,3], + subject: z.string(), + body: z.string(), + location: z.string(), + startDate: z.string(), + endDate: z.string(), + type: z.nativeEnum(EEventType), + category: z.nativeEnum(EEventCategory), // ['Oficial', 'Pessoal'] = [1, 2] + attendees: z.array(AttendeeSchema), + isRecurring: z.boolean(), + eventRecurrence: EventRecurrenceSchema, + hasAttachments: z.boolean(), + attachments: z.array(AttachmentInputDTOSchema), + comments: z.array(CommentSchema), + isPrivate: z.boolean(), + isAllDayEvent: z.boolean(), + organizer: OrganizerSchema, + status: z.nativeEnum(EEventStatus), // ['Pending', 'Revision', 'Approved', 'Declined', 'Communicated', 'ToCommunicate'] = [1, 2, 3, 4, 5, 6] + }), +}).nullable(); export type EventOutputDTO = z.infer diff --git a/src/app/services/Repositorys/Agenda/model/eventToApproveListOutputDTO.ts b/src/app/services/Repositorys/Agenda/model/eventToApproveListOutputDTO.ts index b5d3c4556..881876d5b 100644 --- a/src/app/services/Repositorys/Agenda/model/eventToApproveListOutputDTO.ts +++ b/src/app/services/Repositorys/Agenda/model/eventToApproveListOutputDTO.ts @@ -1,15 +1,24 @@ import { z } from "zod"; import { EEventOwnerType, EEventType, EEventCategory, EEventStatus } from "./enums"; +const OwnerSchema = z.object({ + wxUserId: z.number(), + wxFullName: z.string(), + wxeMail: z.string(), + userPhoto: z.string(), +}); + + + const EventToApproveList = z.array(z.object({ id: z.string().uuid(), - owner: z.string().nullable(), + owner: OwnerSchema, ownerType: z.nativeEnum(EEventOwnerType), subject: z.string(), body: z.string(), location: z.string().nullable(), - startDate: z.string().datetime(), - endDate: z.string().datetime(), + startDate: z.string().datetime({ offset: true }), + endDate: z.string().datetime({ offset: true }), type: z.nativeEnum(EEventType), category: z.nativeEnum(EEventCategory), isRecurring: z.boolean(), diff --git a/src/app/services/monitoring/capture-log/capture-log.service.ts b/src/app/services/monitoring/capture-log/capture-log.service.ts index 8577f2f4e..41360a00f 100644 --- a/src/app/services/monitoring/capture-log/capture-log.service.ts +++ b/src/app/services/monitoring/capture-log/capture-log.service.ts @@ -27,6 +27,10 @@ export class CaptureLogService { } + setToken() { + + } + interceptLogs() { (() => { const originalConsoleLog = console.log; diff --git a/src/app/shared/gabinete-digital/events-to-approve/events-to-approve.page.ts b/src/app/shared/gabinete-digital/events-to-approve/events-to-approve.page.ts index 7db4aa4cf..f3f13586a 100644 --- a/src/app/shared/gabinete-digital/events-to-approve/events-to-approve.page.ts +++ b/src/app/shared/gabinete-digital/events-to-approve/events-to-approve.page.ts @@ -169,8 +169,6 @@ export class EventsToApprovePage implements OnInit { this.list = this.TaskService.reorderList(this.ordinance, list) } - console.log(this.list) - } @@ -217,6 +215,7 @@ export class EventsToApprovePage implements OnInit { } if(userId) { + let allEvents = await this.AgendaDataRepositoryService.eventToApproveList({ userId, status: EEventFilterStatus.Pending @@ -231,7 +230,6 @@ export class EventsToApprovePage implements OnInit { this.eventoaprovacaostore.save(segment, []) } - this.showLoader = false; } else { tracing.setAttribute('outcome', 'failed') @@ -240,12 +238,14 @@ export class EventsToApprovePage implements OnInit { if(!isHttpError(allEvents.error)) { this.toastService._badRequest('Pedimos desculpa mas não foi possível executar a acção. Por favor, contacte o apoio técnico. #4') } - this.showLoader = false; + } } else { + tracing.setAttribute('calling', 'early') console.warn('calling to early Events-to-approve/LoadToApproveEvents') } + this.showLoader = false; } getFromDB() {} diff --git a/src/web.config b/src/web.config new file mode 100644 index 000000000..d86f474c1 --- /dev/null +++ b/src/web.config @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/version/git-version.ts b/version/git-version.ts index 3d8a5926c..8c1bb6e22 100644 --- a/version/git-version.ts +++ b/version/git-version.ts @@ -1,5 +1,5 @@ export let versionData = { - "shortSHA": "680f573P46", + "shortSHA": "680f573P466", "SHA": "680f57313f4d97d944e96c6e3457b7f1a9f379f0", "branch": "notification-header/feature", "lastCommitAuthor": "'Peter Maquiran'", From 62c6afbe5bce19b9368d571eb4783f0ffef9f64c Mon Sep 17 00:00:00 2001 From: Peter Maquiran Date: Tue, 18 Jun 2024 09:14:22 +0100 Subject: [PATCH 5/6] add monitoring --- src/app/modals/view-event/view-event.page.ts | 74 ++++--------------- .../entiry/agenda/eventToApproveDetails.ts | 8 ++ src/app/pages/agenda/agenda.page.ts | 2 +- .../agenda/view-event/view-event.page.html | 2 +- .../agenda/view-event/view-event.page.ts | 66 +++++++++++------ src/app/pages/events/events.page.ts | 4 +- .../approve-event/approve-event.page.ts | 12 ++- .../event-list/event-list.page.ts | 2 +- .../Agenda/agenda-data-repository.service.ts | 25 ++++++- .../Repositorys/Agenda/agenda-data.service.ts | 7 +- .../Agenda/mapper/EventDetailsMapper.ts | 2 + .../mapper/EventToApproveDetailsMapper.ts | 6 ++ src/app/services/auth.service.ts | 2 +- src/app/services/events.service.ts | 2 +- .../monitoring/opentelemetry/tracer.ts | 21 +++++- src/app/services/task.service.ts | 2 +- .../approve-event/approve-event.page.ts | 29 ++++++-- .../agenda/event-list/event-list.page.ts | 2 +- .../agenda/view-event/view-event.page.ts | 36 +++++++-- 19 files changed, 190 insertions(+), 114 deletions(-) diff --git a/src/app/modals/view-event/view-event.page.ts b/src/app/modals/view-event/view-event.page.ts index b553018ba..44007bdcd 100644 --- a/src/app/modals/view-event/view-event.page.ts +++ b/src/app/modals/view-event/view-event.page.ts @@ -17,6 +17,8 @@ import { RouteService } from 'src/app/services/route.service'; import { SessionStore } from 'src/app/store/session.service'; import { HttpErrorHandle } from 'src/app/services/http-error-handle.service'; import { AgendaDataRepositoryService } from 'src/app/services/Repositorys/Agenda/agenda-data-repository.service'; +import { TracingType, XTracerAsync } from 'src/app/services/monitoring/opentelemetry/tracer'; +import { isHttpError } from 'src/app/services/http.service'; @Component({ selector: 'app-view-event', @@ -119,76 +121,32 @@ export class ViewEventPage implements OnInit { ev.target.complete(); } - async loadEvent() { + @XTracerAsync({name:'ViewEventPage/loadEvent', log: false, bugPrint: true}) + async loadEvent(tracing?: TracingType) { const loader = this.toastService.loading(); - if(this.sesseionStora.user.Profile == 'MDGPR' || this.sesseionStora.user.Profile == 'PR') { - this.eventsService.getEvent(this.eventId).subscribe(res => { - this.loadedEvent = res; - // this.addEventToDb(res); - - loader.remove() - }, (error) => { - - - if (error.status === 0) { - // this.getFromDb(); - } else { - this.toastService.badRequest('Este evento já não existe na sua agenda') - loader.remove() - this.modalController.dismiss('Eevent not Foud'); - this.RouteService.goBack(); - } - loader.remove() - }); - } else { - - if(this.CalendarId) { - - this.eventsService.genericGetEvent(this.eventId, this.CalendarId).subscribe(res => { - this.loadedEvent = res; - // this.addEventToDb(res); - - loader.remove() - }, (error) => { - - if (error.status === 0) { - // this.getFromDb(); - } else { - this.toastService.badRequest('Este evento já não existe na sua agenda') - loader.remove() - this.modalController.dismiss('Eevent not Foud'); - this.RouteService.goBack(); - } - loader.remove() - }); - } else { - - } - - } - - let res = await this.agendaDataRepository.getEventById(this.eventId) if(res.isOk()) { + tracing.setAttribute('outcome', 'success') this.loadedEvent = res.value as any; - // this.addEventToDb(res); - loader.remove() } else { - if (res.error.status === 0) { - // this.getFromDb(); - } else { - this.toastService.badRequest('Este evento já não existe na sua agenda') - loader.remove() - this.modalController.dismiss('Eevent not Foud'); - this.RouteService.goBack(); + tracing.setAttribute('eventId', this.eventId) + tracing.setAttribute('outcome', 'failed') + tracing.bugFlag() + + if(!isHttpError(res.error)) { + this.toastService._badRequest('Pedimos desculpa mas não foi possível executar a acção. Por favor, contacte o apoio técnico. #13') + } else if (isHttpError(res.error)) { + } - loader.remove() + this.modalController.dismiss('Eevent not Foud'); + this.RouteService.goBack(); } + loader.remove() } diff --git a/src/app/models/entiry/agenda/eventToApproveDetails.ts b/src/app/models/entiry/agenda/eventToApproveDetails.ts index f4bf3c15f..af8685184 100644 --- a/src/app/models/entiry/agenda/eventToApproveDetails.ts +++ b/src/app/models/entiry/agenda/eventToApproveDetails.ts @@ -155,8 +155,16 @@ const Attachments = z.object({ FileSize: z.number().optional(), }); +const OwnerSchema = z.object({ + wxUserId: z.number(), + wxFullName: z.string(), + wxeMail: z.string(), + userPhoto: z.string(), +}); + const EventToApproveDetails = z.object({ + owner: OwnerSchema, serialNumber: z.string(), taskStatus: z.string().nullable(), originator: OriginatorSchema, diff --git a/src/app/pages/agenda/agenda.page.ts b/src/app/pages/agenda/agenda.page.ts index 051438953..da3e9a66b 100644 --- a/src/app/pages/agenda/agenda.page.ts +++ b/src/app/pages/agenda/agenda.page.ts @@ -711,7 +711,7 @@ export class AgendaPage implements OnInit { calendarOwnerName: selectedCalendar.wxFullName, endDate: endTime.toISOString(), startDate: startTime.toISOString(), - status: EEventFilterStatus.Approved + status: EEventFilterStatus.AllToCommunicate }, tracing) if(response.isOk()) { diff --git a/src/app/pages/agenda/view-event/view-event.page.html b/src/app/pages/agenda/view-event/view-event.page.html index 5e254426a..174ee753f 100644 --- a/src/app/pages/agenda/view-event/view-event.page.html +++ b/src/app/pages/agenda/view-event/view-event.page.html @@ -96,7 +96,7 @@

{{attach.SourceName || attach.subject || attach.sourceName || 'Sem título'}} - + {{attach.Stakeholders}}

diff --git a/src/app/pages/agenda/view-event/view-event.page.ts b/src/app/pages/agenda/view-event/view-event.page.ts index b08278d2d..aee88781e 100644 --- a/src/app/pages/agenda/view-event/view-event.page.ts +++ b/src/app/pages/agenda/view-event/view-event.page.ts @@ -20,6 +20,8 @@ import { HttpErrorHandle } from 'src/app/services/http-error-handle.service' import { AttachmentsService } from 'src/app/services/attachments.service'; import { DateService } from 'src/app/services/date.service'; import { AgendaDataRepositoryService } from 'src/app/services/Repositorys/Agenda/agenda-data-repository.service'; +import { TracingType, XTracerAsync } from 'src/app/services/monitoring/opentelemetry/tracer'; +import { isHttpError } from 'src/app/services/http.service'; @Component({ selector: 'app-view-event', @@ -189,33 +191,51 @@ export class ViewEventPage implements OnInit { this.TimeZoneString = this.loadedEvent.TimeZone } - async loadEvent() { + @XTracerAsync({name:'ViewEventPage/loadEvent', log: false, bugPrint: true}) + async loadEvent(tracing?: TracingType) { const loader = this.toastService.loading(); - let res = await this.agendaDataRepository.getEventById(this.eventId) + let res = await this.agendaDataRepository.getEventById(this.eventId, tracing) if (res.isOk()) { + tracing.setAttribute('outcome', 'success') console.log('Loaded Event', res.value) loader.remove() /* let changeDate = this.dateService.fixDate(res.value as any) as any */ this.loadedEvent = res.value as any; this.setTimeZone() } else { - this.httpErrorHandle.httpStatusHandle(res.error) - loader.remove() - this.toastService.badRequest('Este evento já não existe na sua agenda') + + tracing.setAttribute('eventId', this.eventId) + if(!isHttpError(res.error)) { + this.toastService._badRequest('Pedimos desculpa mas não foi possível executar a acção. Por favor, contacte o apoio técnico. #13') + console.log(res.error) + } else if (isHttpError(res.error)) { + if(res.error.status == 404) { + this.toastService._badRequest('Este evento já não existe') + } else { + this.httpErrorHandle.httpStatusHandle(res.error) + } + } + + + tracing.setAttribute('outcome', 'failed') + tracing.bugFlag() + + // this.toastService.badRequest('Este evento já não existe na sua agenda') this.RouteService.goBack(); } + loader.remove() } /* loadEvent1() { - - + + if(this.sesseionStora.user.Profile == 'MDGPR' || this.sesseionStora.user.Profile == 'PR') { this.eventsService.getEvent(this.eventId).subscribe(res => { - + res = this.dateService.fixDate(res as any) this.loadedEvent = res; this.setTimeZone() @@ -223,22 +243,22 @@ export class ViewEventPage implements OnInit { }, (error) => { }); } else { - - + + if(this.CalendarId) { this.eventsService.genericGetEvent(this.eventId, this.CalendarId).subscribe(res => { - + res = this.dateService.fixDate(res as any) this.loadedEvent = res; this.setTimeZone() - + }, (error) => { - + }); } - + } - + } */ deleteYesOrNo() { @@ -264,7 +284,7 @@ export class ViewEventPage implements OnInit { } else { this.deleteEvent(false); } - + } }, { @@ -299,7 +319,7 @@ export class ViewEventPage implements OnInit { res.present(); }); } - + } deleteEvent(deleteAll) { @@ -337,7 +357,7 @@ export class ViewEventPage implements OnInit { header: 'Evento removido', buttons: ['OK'] }); - + setTimeout(() => { alert.dismiss(); }, 1500); @@ -347,16 +367,16 @@ export class ViewEventPage implements OnInit { () => { loader.remove(); }); - + } else { - + this.eventsService.genericDeleteEvent(this.loadedEvent.EventId, 0, this.loadedEvent.CalendarName, this.loadedEvent.CalendarId).subscribe(async () => { const alert = await this.alertController.create({ cssClass: 'my-custom-class', header: 'Evento removido', buttons: ['OK'] }); - + setTimeout(() => { alert.dismiss(); }, 1500); @@ -368,8 +388,8 @@ export class ViewEventPage implements OnInit { () => { loader.remove(); }); - - + + } */ } diff --git a/src/app/pages/events/events.page.ts b/src/app/pages/events/events.page.ts index 23c07f86e..52d27d211 100644 --- a/src/app/pages/events/events.page.ts +++ b/src/app/pages/events/events.page.ts @@ -16,6 +16,7 @@ import { ChangeProfileService } from 'src/app/services/change-profile.service'; import { SessionStore } from 'src/app/store/session.service'; import { TaskService } from 'src/app/services/task.service'; import { AgendaDataRepositoryService } from 'src/app/services/Repositorys/Agenda/agenda-data-repository.service'; +import { EEventFilterStatus } from 'src/app/services/Repositorys/Agenda/model/enums'; @Component({ selector: 'app-events', @@ -237,7 +238,8 @@ export class EventsPage implements OnInit { userId: SessionStore.user.UserId, calendarOwnerName: SessionStore.user.FullName, startDate: date.toISOString(), - endDate: new Date(end).toISOString() + endDate: new Date(end).toISOString(), + status: EEventFilterStatus.AllToCommunicate }) if(response.isOk()) { diff --git a/src/app/pages/gabinete-digital/event-list/approve-event/approve-event.page.ts b/src/app/pages/gabinete-digital/event-list/approve-event/approve-event.page.ts index 368f9fb0f..eecea2c7d 100644 --- a/src/app/pages/gabinete-digital/event-list/approve-event/approve-event.page.ts +++ b/src/app/pages/gabinete-digital/event-list/approve-event/approve-event.page.ts @@ -19,6 +19,7 @@ import { AttachmentsService } from 'src/app/services/attachments.service'; import { AgendaDataRepositoryService } from 'src/app/services/Repositorys/Agenda/agenda-data-repository.service'; import { TracingType, XTracerAsync } from 'src/app/services/monitoring/opentelemetry/tracer'; import { isHttpError } from 'src/app/services/http.service'; +import { EventsService } from 'src/app/services/events.service'; @Component({ selector: 'app-approve-event', @@ -61,7 +62,8 @@ export class ApproveEventPage implements OnInit { private httpErrorHandle: HttpErrorHandle, public TaskService: TaskService, private attachmentsService: AttachmentsService, - public AgendaDataRepositoryService: AgendaDataRepositoryService + public AgendaDataRepositoryService: AgendaDataRepositoryService, + public EventsService: EventsService ) { this.activatedRoute.paramMap.subscribe(params => { // @@ -111,6 +113,14 @@ export class ApproveEventPage implements OnInit { tracing.setAttribute('outcome', 'success') } else if(isHttpError(res.error)) { + tracing.setAttribute('eventId', this.serialNumber) + + if(res.error.status == 404) { + this.toastService._badRequest('Este evento já não existe') + } else { + this.httpErrorHandle.httpStatusHandle(res.error) + } + tracing.setAttribute('outcome', 'failed') tracing.bugFlag() diff --git a/src/app/pages/gabinete-digital/event-list/event-list.page.ts b/src/app/pages/gabinete-digital/event-list/event-list.page.ts index caa96757b..d014ee800 100644 --- a/src/app/pages/gabinete-digital/event-list/event-list.page.ts +++ b/src/app/pages/gabinete-digital/event-list/event-list.page.ts @@ -243,7 +243,7 @@ export class EventListPage implements OnInit { let allEvents = await this.AgendaDataRepositoryService.eventToApproveList({ userId, status: EEventFilterStatus.Pending - }) + }, tracing) if(allEvents.isOk()) { tracing.setAttribute('outcome', 'success') diff --git a/src/app/services/Repositorys/Agenda/agenda-data-repository.service.ts b/src/app/services/Repositorys/Agenda/agenda-data-repository.service.ts index 642ad374d..5cfadae93 100644 --- a/src/app/services/Repositorys/Agenda/agenda-data-repository.service.ts +++ b/src/app/services/Repositorys/Agenda/agenda-data-repository.service.ts @@ -44,17 +44,28 @@ export class AgendaDataRepositoryService { return this.agendaLocalDataSourceService.createCalendar(currentUserCalendar) } - async getEventById(id: string) { + async getEventById(id: string, tracing?: TracingType) { try { const result = await this.agendaDataService.getEvent(id).pipe( map((response) => { - console.log('Response', response.data) - console.log('Output', EventMapper.toDomain(response.data)) - return EventMapper.toDomain(response.data) + EventMapper.toDomain(response) + return EventMapper.toDomain(response) }) ).toPromise() return ok(result) } catch (e) { + if(isHttpError(e)) { + tracing?.setAttribute('status.code', e.status.toString()) + if (e.status == 400) { + tracing.bugFlag() + tracing.setAttribute('outcome', 'failed') + } + } else { + tracing.bugFlag() + tracing.setAttribute('outcome', 'failed') + tracing?.setAttribute('map.error', 'true') + tracing?.setAttribute('map.error.context', JSON.stringify(e)) + } return err(e as HttpErrorResponse) } } @@ -72,7 +83,13 @@ export class AgendaDataRepositoryService { } catch (e) { if(isHttpError(e)) { tracing?.setAttribute('status.code', e.status.toString()) + if (e.status == 400) { + tracing.bugFlag() + tracing.setAttribute('outcome', 'failed') + } } else { + tracing.bugFlag() + tracing.setAttribute('outcome', 'failed') tracing?.setAttribute('map.error', 'true') tracing?.setAttribute('map.error.context', JSON.stringify(e)) } diff --git a/src/app/services/Repositorys/Agenda/agenda-data.service.ts b/src/app/services/Repositorys/Agenda/agenda-data.service.ts index ea135b268..cfe3674b5 100644 --- a/src/app/services/Repositorys/Agenda/agenda-data.service.ts +++ b/src/app/services/Repositorys/Agenda/agenda-data.service.ts @@ -7,7 +7,8 @@ import { SharedCalendarListOutputDTO, SharedCalendarListOutputDTOSchema } from ' import { HttpService } from '../../http.service'; import { APIReturn } from '../../decorator/api-validate-schema.decorator'; import { TracingType } from '../../monitoring/opentelemetry/tracer'; -import { EventListOutputDTOSchema } from './model/eventListDTOOutput'; +import { EventListOutputDTO, EventListOutputDTOSchema } from './model/eventListDTOOutput'; +import { EventOutputDTO } from './model/eventDTOOutput'; @Injectable({ providedIn: 'root' @@ -48,7 +49,7 @@ export class AgendaDataService { } // @APIReturn(EventListOutputDTOSchema, 'get/Events') - getEvents(userId: number, startDate: string, endDate: string, status: number, category: string, type: string, tracing?: TracingType): Observable { + getEvents(userId: number, startDate: string, endDate: string, status: number, category: string, type: string, tracing?: TracingType): Observable { let params = new HttpParams() .set('UserId', userId) @@ -72,7 +73,7 @@ export class AgendaDataService { return this.http.get(`${this.baseUrl}/Events`, { params }); } - getEvent(id: string): Observable { + getEvent(id: string): Observable { return this.http.get(`${this.baseUrl}/Events/${id}`); } diff --git a/src/app/services/Repositorys/Agenda/mapper/EventDetailsMapper.ts b/src/app/services/Repositorys/Agenda/mapper/EventDetailsMapper.ts index 5080b35d5..af0712093 100644 --- a/src/app/services/Repositorys/Agenda/mapper/EventDetailsMapper.ts +++ b/src/app/services/Repositorys/Agenda/mapper/EventDetailsMapper.ts @@ -53,7 +53,9 @@ export class EventMapper { } } + return { + "owner": dto.owner, "HasAttachments": dto.hasAttachments, "EventComunicationId": 1682, "EventId": dto.id, diff --git a/src/app/services/Repositorys/Agenda/mapper/EventToApproveDetailsMapper.ts b/src/app/services/Repositorys/Agenda/mapper/EventToApproveDetailsMapper.ts index cd1679b4c..2334fa0b4 100644 --- a/src/app/services/Repositorys/Agenda/mapper/EventToApproveDetailsMapper.ts +++ b/src/app/services/Repositorys/Agenda/mapper/EventToApproveDetailsMapper.ts @@ -28,6 +28,11 @@ export class EventToApproveDetailsMapper { } let color; + if(dto.ownerType == EEventOwnerType.PR) { + color = 'PR' + } else { + color = 'MDGPR' + } // if(dto.ownerType != 'PR') { let ownerType; @@ -74,6 +79,7 @@ export class EventToApproveDetailsMapper { return { + "owner": dto.owner, "serialNumber": dto.id, "taskStatus": taskStatus, "originator": { diff --git a/src/app/services/auth.service.ts b/src/app/services/auth.service.ts index 04657ed71..a9357580d 100644 --- a/src/app/services/auth.service.ts +++ b/src/app/services/auth.service.ts @@ -186,7 +186,7 @@ export class AuthService { this.RochetChatConnectorService.logout(); this.RochetChatConnectorService.connect(); this.RochetChatConnectorService.login().then((message: any) => { - console.log('Chat login', message) + // console.log('Chat login', message) SessionStore.user.RochetChatUserId = message.result.id SessionStore.save() diff --git a/src/app/services/events.service.ts b/src/app/services/events.service.ts index afb01d3da..f54fea5f7 100644 --- a/src/app/services/events.service.ts +++ b/src/app/services/events.service.ts @@ -420,7 +420,7 @@ export class EventsService { isMyEvent(event: any) { const data: any = event - return data.Organizer.Id == SessionStore.user.UserId + return data.owner.wxUserId == SessionStore.user.UserId } diff --git a/src/app/services/monitoring/opentelemetry/tracer.ts b/src/app/services/monitoring/opentelemetry/tracer.ts index c11dae081..19dcca15d 100644 --- a/src/app/services/monitoring/opentelemetry/tracer.ts +++ b/src/app/services/monitoring/opentelemetry/tracer.ts @@ -4,6 +4,7 @@ import { Tracer, Span } from '@opentelemetry/sdk-trace-base'; import { OpentelemetryAgendaProvider } from './opentelemetry'; import { Device, DeviceInfo } from '@capacitor/device'; + const tracerInstance = OpentelemetryAgendaProvider.getTracer('example-tracer-hole', '111', { }) @@ -81,12 +82,18 @@ export function XTracerAsync({ name, log, bugPrint }: any, p0?: any) { try { const result = await originalMethod.apply(this, args); - tracing.finish() + if(!window.location.origin.includes('https')) { + tracing.finish() + } + return result } catch (e) { - tracing.finish() + + if(!window.location.origin.includes('https')) { + tracing.finish() + } console.error(e); return false } @@ -162,12 +169,18 @@ export function XTracer({name, log, bugPrint}: any) { try { const result = originalMethod.apply(this, args); - tracing.finish() + + if(!window.location.origin.includes('https')) { + tracing.finish() + } return result } catch (e) { - tracing.finish() + + if(!window.location.origin.includes('https')) { + tracing.finish() + } console.error(e); return false } diff --git a/src/app/services/task.service.ts b/src/app/services/task.service.ts index a3441e5e1..2c457c5f4 100644 --- a/src/app/services/task.service.ts +++ b/src/app/services/task.service.ts @@ -334,7 +334,7 @@ export class TaskService { let allEvents = await this.AgendaDataRepositoryService.eventToApproveList({ userId, status: EEventFilterStatus.Pending - }) + }, tracing) if(allEvents.isOk()) { tracing.setAttribute('outcome', 'success') diff --git a/src/app/shared/agenda/approve-event/approve-event.page.ts b/src/app/shared/agenda/approve-event/approve-event.page.ts index cb3282a1d..5b5133111 100644 --- a/src/app/shared/agenda/approve-event/approve-event.page.ts +++ b/src/app/shared/agenda/approve-event/approve-event.page.ts @@ -13,6 +13,9 @@ import { HttpErrorHandle } from 'src/app/services/http-error-handle.service'; import { TaskService } from 'src/app/services/task.service' import { AgendaDataRepositoryService } from 'src/app/services/Repositorys/Agenda/agenda-data-repository.service'; import { EventToApproveDetails } from 'src/app/models/entiry/agenda/eventToApproveDetails'; +import { EventsService } from 'src/app/services/events.service'; +import { isHttpError } from 'src/app/services/http.service'; +import { TracingType, XTracerAsync } from 'src/app/services/monitoring/opentelemetry/tracer'; @Component({ selector: 'app-approve-event', @@ -53,7 +56,9 @@ export class ApproveEventPage implements OnInit { public ThemeService: ThemeService, private httpErroHandle: HttpErrorHandle, public TaskService: TaskService, - private agendaDataRepository: AgendaDataRepositoryService + private agendaDataRepository: AgendaDataRepositoryService, + public EventsService: EventsService, + private httpErrorHandle: HttpErrorHandle, ) { // Event to approve list @@ -77,19 +82,33 @@ export class ApproveEventPage implements OnInit { this.modalController.dismiss(); } - async getTask() { + @XTracerAsync({name:'ApproveEventPage/getTask', log: false, bugPrint: true}) + async getTask(tracing?: TracingType) { - const res = await this.agendaDataRepository.getEventToApproveById(this.serialNumber) + const res = await this.agendaDataRepository.getEventToApproveById(this.serialNumber, tracing) if (res.isOk()) { this.loadedEvent = res.value; - console.log('attachment', res.value) this.loadedAttachments = this.loadedEvent.Attachments this.today = new Date(res.value.workflowInstanceDataFields.StartDate); // this.customDate = this.days[this.today.getDay()] + ", " + this.today.getDate() + " de " + (this.months[this.today.getMonth()]); + tracing.setAttribute('outcome', 'success') } else { - console.log(res.error.status) + tracing.setAttribute('eventId', this.serialNumber) + + if(!isHttpError(res.error)) { + this.toastService._badRequest('Pedimos desculpa mas não foi possível executar a acção. Por favor, contacte o apoio técnico. #133') + console.log(res.error) + } else if (isHttpError(res.error)) { + + if(res.error.status == 404) { + this.toastService._badRequest('Este evento já não existe') + } else { + this.httpErrorHandle.httpStatusHandle(res.error) + } + + } } } diff --git a/src/app/shared/agenda/event-list/event-list.page.ts b/src/app/shared/agenda/event-list/event-list.page.ts index 5beb394ab..ae52b4a7e 100644 --- a/src/app/shared/agenda/event-list/event-list.page.ts +++ b/src/app/shared/agenda/event-list/event-list.page.ts @@ -146,7 +146,7 @@ export class EventListPage implements OnInit { let allEvents = await this.AgendaDataRepositoryService.eventToApproveList({ userId, status: EEventFilterStatus.Pending - }) + }, tracing) if(allEvents.isOk()) { tracing.setAttribute('outcome', 'success') diff --git a/src/app/shared/agenda/view-event/view-event.page.ts b/src/app/shared/agenda/view-event/view-event.page.ts index eb0fe89cf..dc0d867a9 100644 --- a/src/app/shared/agenda/view-event/view-event.page.ts +++ b/src/app/shared/agenda/view-event/view-event.page.ts @@ -20,6 +20,8 @@ import { EventController } from 'src/app/controller/event' import { DateService } from 'src/app/services/date.service'; import { AgendaDataRepositoryService } from 'src/app/services/Repositorys/Agenda/agenda-data-repository.service'; import { SearchList_v2 } from 'src/app/models/search-document'; +import { TracingType, XTracerAsync } from 'src/app/services/monitoring/opentelemetry/tracer'; +import { isHttpError } from 'src/app/services/http.service'; @Component({ selector: 'app-view-event', @@ -68,7 +70,7 @@ export class ViewEventPage implements OnInit { private httpErrorHandle: HttpErrorHandle, private router: Router, private dateService: DateService, - private agendaDataRepository: AgendaDataRepositoryService + private agendaDataRepository: AgendaDataRepositoryService, ) { this.isEventEdited = false; this.loadedEvent = new Event(); @@ -124,29 +126,47 @@ export class ViewEventPage implements OnInit { setTimeZone() { this.TimeZoneString = this.loadedEvent.TimeZone } - async loadEvent() { + @XTracerAsync({name:'AgendaPage/loadEvent', log: false, bugPrint: true}) + async loadEvent(tracing?: TracingType) { - let res = await this.agendaDataRepository.getEventById(this.eventId) + let res = await this.agendaDataRepository.getEventById(this.eventId, tracing) if(res.isOk()) { - console.log('Loaded Event', res.value) - console.log('newAttahcmentList', res.value.Attachments) + tracing.setAttribute('outcome', 'success') /* let changeDate = this.dateService.fixDate(res.value as any) as any */ this.loadedEvent = res.value as any; this.setTimeZone() } else { + + tracing.setAttribute('eventId', this.eventId) + if(!isHttpError(res.error)) { + this.toastService._badRequest('Pedimos desculpa mas não foi possível executar a acção. Por favor, contacte o apoio técnico. #133') + console.log(res.error) + } else if (isHttpError(res.error)) { + + if(res.error.status == 404) { + this.toastService._badRequest('Este evento já não existe') + } else { + this.httpErrorHandle.httpStatusHandle(res.error) + } + + } + + tracing.setAttribute('outcome', 'failed') + tracing.bugFlag() + this.viewEventDetailDismiss.emit({ type: 'close' }) - console.log(res.error) + } } deleteYesOrNo() { - if (this.loadedEvent.IsRecurring) { + if (this.loadedEvent.IsRecurring) { this.alertController.create({ header: 'Eliminar evento?', message: 'Este evento tem recorrência, deseja eliminar a Sequência de eventos?', @@ -200,7 +220,7 @@ export class ViewEventPage implements OnInit { res.present(); }); } - + } deleteEvent_v2(deleteAll) { From 869d403f4ed9c746fe2de1082b888bdceb79a695 Mon Sep 17 00:00:00 2001 From: Peter Maquiran Date: Tue, 18 Jun 2024 09:27:25 +0100 Subject: [PATCH 6/6] add logs --- src/app/modals/view-event/view-event.page.ts | 2 +- .../Agenda/agenda-data-repository.service.ts | 14 +++++++------- .../shared/agenda/view-event/view-event.page.ts | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/app/modals/view-event/view-event.page.ts b/src/app/modals/view-event/view-event.page.ts index 44007bdcd..ec9f8643f 100644 --- a/src/app/modals/view-event/view-event.page.ts +++ b/src/app/modals/view-event/view-event.page.ts @@ -126,7 +126,7 @@ export class ViewEventPage implements OnInit { const loader = this.toastService.loading(); - let res = await this.agendaDataRepository.getEventById(this.eventId) + let res = await this.agendaDataRepository.getEventById(this.eventId, tracing) if(res.isOk()) { tracing.setAttribute('outcome', 'success') diff --git a/src/app/services/Repositorys/Agenda/agenda-data-repository.service.ts b/src/app/services/Repositorys/Agenda/agenda-data-repository.service.ts index 5cfadae93..22222419b 100644 --- a/src/app/services/Repositorys/Agenda/agenda-data-repository.service.ts +++ b/src/app/services/Repositorys/Agenda/agenda-data-repository.service.ts @@ -57,11 +57,11 @@ export class AgendaDataRepositoryService { if(isHttpError(e)) { tracing?.setAttribute('status.code', e.status.toString()) if (e.status == 400) { - tracing.bugFlag() - tracing.setAttribute('outcome', 'failed') + tracing?.bugFlag() + tracing?.setAttribute('outcome', 'failed') } } else { - tracing.bugFlag() + tracing?.bugFlag() tracing.setAttribute('outcome', 'failed') tracing?.setAttribute('map.error', 'true') tracing?.setAttribute('map.error.context', JSON.stringify(e)) @@ -84,12 +84,12 @@ export class AgendaDataRepositoryService { if(isHttpError(e)) { tracing?.setAttribute('status.code', e.status.toString()) if (e.status == 400) { - tracing.bugFlag() - tracing.setAttribute('outcome', 'failed') + tracing?.bugFlag() + tracing?.setAttribute('outcome', 'failed') } } else { - tracing.bugFlag() - tracing.setAttribute('outcome', 'failed') + tracing?.bugFlag() + tracing?.setAttribute('outcome', 'failed') tracing?.setAttribute('map.error', 'true') tracing?.setAttribute('map.error.context', JSON.stringify(e)) } diff --git a/src/app/shared/agenda/view-event/view-event.page.ts b/src/app/shared/agenda/view-event/view-event.page.ts index dc0d867a9..b8d150411 100644 --- a/src/app/shared/agenda/view-event/view-event.page.ts +++ b/src/app/shared/agenda/view-event/view-event.page.ts @@ -126,7 +126,7 @@ export class ViewEventPage implements OnInit { setTimeZone() { this.TimeZoneString = this.loadedEvent.TimeZone } - @XTracerAsync({name:'AgendaPage/loadEvent', log: false, bugPrint: true}) + @XTracerAsync({name:'ViewEventPage/loadEvent', log: false, bugPrint: true}) async loadEvent(tracing?: TracingType) { let res = await this.agendaDataRepository.getEventById(this.eventId, tracing)