ITOTEAM-523 A app não redireciona as notificações

This commit is contained in:
Peter Maquiran
2024-06-25 12:11:44 +01:00
parent 76ff62d428
commit fbaf0afcf1
14 changed files with 231 additions and 186 deletions
+1 -1
View File
@@ -187,7 +187,7 @@ export class HomePage implements OnInit {
if ("serviceWorker" in navigator) {
navigator.serviceWorker.onmessage = (event) => {
console.log('Mensagem recebida do Service Worker:', event.data.data);
console.log('Mensagem recebida do Service Worker:', event.data);
let object = {
notification: event.data
}
+4 -28
View File
@@ -2,32 +2,8 @@ import { Injectable } from '@angular/core';
import { HTTP_INTERCEPTORS, HttpEvent, HttpHandler, HttpInterceptor, HttpRequest, HttpResponse } from '@angular/common/http';
import { Observable } from 'rxjs';
import { tap } from 'rxjs/operators';
import { metrics } from '@opentelemetry/api';
import { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-http';
import { MeterProvider, PeriodicExportingMetricReader } from '@opentelemetry/sdk-metrics';
import { meter, RequestCounter } from '../services/monitoring/opentelemetry/matrix';
// Initialize OpenTelemetry metrics
const meterProvider = new MeterProvider();
metrics.setGlobalMeterProvider(meterProvider);
if (window.location.protocol !== 'https:') {
const metricReader = new PeriodicExportingMetricReader({
exporter: new OTLPMetricExporter({
url: 'http://5-180-182-151.cloud-xip.com:4318/v1/metrics',
// headers: {
// 'Authorization': 'Basic ' + btoa('tabteste@006:tabteste@006'),
// }
}),
exportIntervalMillis: 3000,
});
meterProvider.addMetricReader(metricReader);
}
const meter = meterProvider.getMeter('example-exporter-collector');
const requestCounter = meter.createCounter('post_requests', {
description: 'Example of a Counter',
});
@Injectable()
export class MetricsInterceptor implements HttpInterceptor {
@@ -37,7 +13,7 @@ export class MetricsInterceptor implements HttpInterceptor {
if (event instanceof HttpResponse) {
// Capture the status code and check protocol
if (req.method !== 'GET' && !req.urlWithParams.includes('metrics')) {
console.log('response', event.body)
const path = req.urlWithParams;
const url = new URL(path);
@@ -45,7 +21,7 @@ export class MetricsInterceptor implements HttpInterceptor {
let attributes = { path: url.pathname, method: req.method };
const statusCode = event.status;
const extendedAttributes = { ...attributes, status: statusCode };
requestCounter.add(1, extendedAttributes);
RequestCounter.add(1, extendedAttributes);
}
}
}
@@ -58,4 +34,4 @@ export const metricsInterceptor = {
provide: HTTP_INTERCEPTORS,
useClass: MetricsInterceptor,
multi: true
};
};
+56 -26
View File
@@ -1,7 +1,6 @@
import { Component, OnInit, NgZone } from '@angular/core';
import { NavigationExtras, Router } from '@angular/router';
import { AnimationController, ModalController, Platform } from '@ionic/angular';
import { LoginUserRespose } from 'src/app/models/user.model';
import { AuthService } from 'src/app/services/auth.service';
import { EditProfilePage } from './edit-profile/edit-profile.page';
import { StorageService } from '../../services/storage.service';
@@ -13,7 +12,9 @@ import { environment } from 'src/environments/environment';
import { ProcessesService } from 'src/app/services/processes.service';
import { EventsService } from 'src/app/services/events.service';
import { NotificationHolderService } from 'src/app/store/notification-holder.service';
import { TracingType, XTracer } from 'src/app/services/monitoring/opentelemetry/tracer';
import { TracingType, XTracerAsync } from 'src/app/services/monitoring/opentelemetry/tracer';
import { AgendaDataRepositoryService } from 'src/app/services/Repositorys/Agenda/agenda-data-repository.service';
import { ToastService } from 'src/app/services/toast.service';
@Component({
selector: 'app-profile',
@@ -58,7 +59,9 @@ export class ProfilePage implements OnInit {
private eventsService: EventsService,
private storageService: StorageService,
public NotificationHolderService: NotificationHolderService,
private authservice: AuthService
private authservice: AuthService,
private agendaDataRepository: AgendaDataRepositoryService,
private toastService: ToastService,
) {
window['e'] = () => {
@@ -212,41 +215,68 @@ export class ProfilePage implements OnInit {
return time;
}
@XTracer({name:'profile/notificationClick', bugPrint: true, module:'notification'})
notificatinsRoutes (index, Service, Object, IdObject, FolderId, i, tracing?: TracingType) {
@XTracerAsync({name:'profile/notificationClick', bugPrint: true, module:'notification'})
async notificatinsRoutes (index, Service, Object, IdObject, FolderId, i, tracing?: TracingType) {
console.log(index, i)
try {
if (Service === "agenda") {
this.isloading = true
if (Service === "agenda" && IdObject.length > 10) {
this.eventsService.getEvent(IdObject).subscribe((task) => {
if (Service === "agenda") {
this.zone.run(() => this.router.navigate(['/home/agenda', IdObject, 'agenda']));
this.deleteNotification(index);
this.isloading = false
let res = await this.agendaDataRepository.getEventById(IdObject, tracing)
}, (error) => {
this.NotificationHolderService.notificationList[i].read = true;
this.isloading = false
})
}
if(IdObject) {
if (Service === "agenda" && Object === "event-list") {
if(res.isOk()) {
this.zone.run(() => this.router.navigate(['/home/agenda', IdObject, 'agenda']));
this.deleteNotification(index);
tracing.setAttribute('outcome', 'success')
} else {
tracing.setAttribute('outcome', 'success')
tracing.setAttribute('data.exist', 'false')
this.NotificationHolderService.notificationList[i].read = true;
console.log('error', res.error)
}
} else {
tracing.setAttribute('data.IdObject', 'false')
this.toastService._badRequest('Pedimos desculpa mas não foi possível executar a acção. Por favor, contacte o apoio técnico. #01')
}
this.isloading = false
} else if (Service === "agenda" && Object === "event-list") {
this.isloading = true
this.processesService.GetTask(IdObject).subscribe((task) => {
console.log('evento exist')
this.zone.run(() => this.router.navigate(['/home/agenda/event-list/approve-event', IdObject, 'agenda']));
this.deleteNotification(index);
this.isloading = false
}, (error) => {
console.log('evento não existe')
this.NotificationHolderService.notificationList[i].read = true;
this.isloading = false
})
if(IdObject) {
let res = await this.agendaDataRepository.getEventById(IdObject, tracing)
if(res.isOk()) {
console.log('evento exist')
tracing.setAttribute('outcome', 'success')
this.zone.run(() => this.router.navigate(['/home/agenda/event-list/approve-event', IdObject, 'agenda']));
this.deleteNotification(index);
this.isloading = false
} else {
tracing.setAttribute('outcome', 'success')
console.log('evento não existe')
tracing.setAttribute('data.exist', 'false')
this.NotificationHolderService.notificationList[i].read = true;
this.isloading = false
}
} else {
tracing.setAttribute('data.IdObject', 'false')
this.toastService._badRequest('Pedimos desculpa mas não foi possível executar a acção. Por favor, contacte o apoio técnico. #01')
}
this.isloading = false
} else {
tracing.setAttribute('notification.route', 'false')
tracing.setAttribute('outcome', 'failed')
tracing.setAttribute('parameters', JSON.stringify({Service, Object, IdObject, FolderId}))
}
} else if (Service === "gabinete-digital") {
@@ -92,6 +92,55 @@ export class ViewDocumentPage implements OnInit {
}
// @XTracerAsync({name:'view-document/LoadViewer', bugPrint: true, daley: 4000})
// async LoadViewer(tracing?: TracingType) {
// this.processes.GetViewer(this.docId, this.applicationId).subscribe(async(res)=> {
// const link: string = res.replace('//pdfjs/web/', '/pdfjs/web/')
// this.trustedUrl = this.sanitazer.bypassSecurityTrustResourceUrl(link);
// // const iframe = document.getElementById("iframe")
// // const handleLoad = () => {
// // this.loader = false
// // };
// // iframe.addEventListener('load', handleLoad, true)
// if(res == "") {
// const alert = await this.alertController.create({
// cssClass: 'my-custom-class',
// //header: 'Apagar evento!',
// message: 'Sem imagem',
// buttons: [
// {
// text: 'Sim',
// handler: () => {
// this.close();
// }
// }
// ]
// });
// }
// tracing.setAttribute('outcome', 'success')
// }, (error)=>{
// if(isHttpError(error)) {
// tracing?.setAttribute('status.code', error.status.toString())
// if (error.status == 400) {
// tracing?.bugFlag()
// tracing?.setAttribute('outcome', 'failed')
// }
// }
// tracing.setAttribute('outcome', 'failed')
// this.close();
// });
// }
close() {
this.modalController.dismiss();
}
@@ -72,8 +72,8 @@ export const EventInputDTOSchema = z.object({
subject: z.string().min(1),
body: z.string().min(1),
location: z.string().nullable().optional(),
startDate: z.string().datetime(),
endDate: z.string().datetime(),
startDate: z.string(),
endDate: z.string(),
type: EEventTypeDTO,
category: EEventCategoryDTO,
attendees: z.array(AttendeeInputDTOSchema).nullable().optional(),
+47 -51
View File
@@ -131,73 +131,69 @@ export class ListBoxService {
cloneSelectedDate.setMinutes(0)
cloneSelectedDate.setSeconds(0)
if (diffDays <= 150 ) {
if (diffDays >= 1) {
if (diffDays >= 1) {
const StartEvent = this.transForm(event, {startMany: true, endMany: false, middle: false})
const StartEvent = this.transForm(event, {startMany: true, endMany: false, middle: false})
if(this.CanPush(event, selectedDate) && (new Date(event.start)).getTime() >= cloneSelectedDate.getTime()) {
days[day].push(StartEvent); this.push(StartEvent, year)
if(this.CanPush(event, selectedDate) && (new Date(event.start)).getTime() >= cloneSelectedDate.getTime()) {
days[day].push(StartEvent); this.push(StartEvent, year)
}
let i = 1;
//create event between date
while (startDate.getFullYear() != endDate.getFullYear() ||
startDate.getMonth() != endDate.getMonth() ||
startDate.getDate() != endDate.getDate()) {
const newDate = startDate.setDate(startDate.getDate()+ i)
let otherDays = this.dateService.getDay(newDate)
const cloneEvent = {...event}
cloneEvent['other'] = true
cloneEvent.start = new Date(startDate)
if(!days.hasOwnProperty(otherDays)) {
days[otherDays] = []
}
let i = 1;
if (!(startDate.getFullYear() != endDate.getFullYear() ||
startDate.getMonth() != endDate.getMonth() ||
startDate.getDate() != endDate.getDate())) {
// last push
const EndEvent = this.transForm(cloneEvent, {startMany: false, endMany: true, middle: false})
if(this.CanPush(cloneEvent, selectedDate) && cloneEvent.start.getTime() >= cloneSelectedDate.getTime()) {
days[otherDays].push(EndEvent) ; this.push(EndEvent, year)
}
//create event between date
while (startDate.getFullYear() != endDate.getFullYear() ||
startDate.getMonth() != endDate.getMonth() ||
startDate.getDate() != endDate.getDate()) {
} else {
const newDate = startDate.setDate(startDate.getDate()+ i)
let otherDays = this.dateService.getDay(newDate)
const cloneEvent = {...event}
cloneEvent['other'] = true
cloneEvent.start = new Date(startDate)
if(!days.hasOwnProperty(otherDays)) {
days[otherDays] = []
}
if (!(startDate.getFullYear() != endDate.getFullYear() ||
startDate.getMonth() != endDate.getMonth() ||
startDate.getDate() != endDate.getDate())) {
// last push
const EndEvent = this.transForm(cloneEvent, {startMany: false, endMany: true, middle: false})
if(this.CanPush(cloneEvent, selectedDate) && cloneEvent.start.getTime() >= cloneSelectedDate.getTime()) {
days[otherDays].push(EndEvent) ; this.push(EndEvent, year)
}
} else {
const EndEvent = this.transForm(cloneEvent, {startMany: false,endMany: true, middle: true})
if(this.CanPush(cloneEvent, selectedDate) && cloneEvent.start.getTime() >= cloneSelectedDate.getTime()) {
const EndEvent = this.transForm(cloneEvent, {startMany: false,endMany: true, middle: true})
if(this.CanPush(cloneEvent, selectedDate) && cloneEvent.start.getTime() >= cloneSelectedDate.getTime()) {
days[otherDays].push(EndEvent) ; this.push(EndEvent, year)
} else {
if( cloneEvent.start.getFullYear() == cloneSelectedDate.getFullYear() && cloneEvent.start.getDate() == cloneSelectedDate.getDate() && cloneEvent.start.getMonth() == cloneSelectedDate.getMonth()) {
// console.log("00_00")
days[otherDays].push(EndEvent) ; this.push(EndEvent, year)
} else {
if( cloneEvent.start.getFullYear() == cloneSelectedDate.getFullYear() && cloneEvent.start.getDate() == cloneSelectedDate.getDate() && cloneEvent.start.getMonth() == cloneSelectedDate.getMonth()) {
// console.log("00_00")
days[otherDays].push(EndEvent) ; this.push(EndEvent, year)
} else {
// console.log('0000000000000000000000000',cloneEvent.start.getTime(), cloneSelectedDate.getTime())
// console.log('0000000000000000000000000',cloneEvent.start, cloneSelectedDate)
}
// console.log('0000000000000000000000000',cloneEvent.start.getTime(), cloneSelectedDate.getTime())
// console.log('0000000000000000000000000',cloneEvent.start, cloneSelectedDate)
}
}
}
}
days[otherDays] = days[otherDays].reverse()
days[otherDays] = days[otherDays].reverse()
}
}
} else {
} else {
if(this.CanPush(event, selectedDate)) { days[day].push(event) ; this.push(event, year) }
}
if(this.CanPush(event, selectedDate)) { days[day].push(event) ; this.push(event, year) }
}
} else {
if(this.CanPush(event, selectedDate)) { days[day].push(event) ; this.push(event, year) }
}
} else {
if(this.CanPush(event, selectedDate) && diffDays != 2) { days[day].push(event) ; this.push(event, year) }
}
@@ -1,67 +1,31 @@
const { DiagConsoleLogger, DiagLogLevel, diag, metrics } = require('@opentelemetry/api');
const { OTLPMetricExporter } = require('@opentelemetry/exporter-metrics-otlp-http');
const { MeterProvider, PeriodicExportingMetricReader } = require('@opentelemetry/sdk-metrics');
import { metrics } from '@opentelemetry/api';
import { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-http';
import { MeterProvider, PeriodicExportingMetricReader } from '@opentelemetry/sdk-metrics';
import { environment } from 'src/environments/environment';
// Optional and only needed to see the internal diagnostic logging (during development)
// diag.setLogger(new DiagConsoleLogger(), DiagLogLevel.DEBUG);
// Initialize OpenTelemetry metrics
const meterProvider = new MeterProvider();
metrics.setGlobalMeterProvider(meterProvider);
let interval;
let meter;
if (window.location.protocol !== 'https:' && environment.presidential == false) {
const metricReader = new PeriodicExportingMetricReader({
exporter: new OTLPMetricExporter({
url: 'http://5-180-182-151.cloud-xip.com:4318/v1/metrics',
// headers: {
// 'Authorization': 'Basic ' + btoa('tabteste@006:tabteste@006'),
// }
}),
exportIntervalMillis: 3000,
});
// function stopMetrics() {
// console.log('STOPPING METRICS');
// clearInterval(interval);
// metrics.getMeterProvider().shutdown()
// .then(() => metrics.disable());
// }
meterProvider.addMetricReader(metricReader);
}
// function startMetrics() {
// console.log('STARTING METRICS');
export const meter = meterProvider.getMeter('example-exporter-collector');
export const RequestCounter = meter.createCounter('post_requests', {
description: 'Example of a Counter',
});
// const meterProvider = new MeterProvider();
// metrics.setGlobalMeterProvider(meterProvider);
// meterProvider.addMetricReader(new PeriodicExportingMetricReader({
// exporter: new OTLPMetricExporter({
// //url: 'http://localhost:8019/collector/v1/metrics',
// // url: 'http://localhost:4318/v1/metrics',
// url: 'http://5-180-182-151.cloud-xip.com:4318/v1/metrics', // Custom port 85
// //url: 'https://5-180-182-151.cloud-xip.com:85/collector/v1/metrics', // Custom port 85
// // headers: {
// // 'Authorization': 'Basic ' + btoa('tabteste@006:tabteste@006'),
// // }
// }),
// exportIntervalMillis: 2000
// }));
// meter = meterProvider.getMeter('example-exporter-collector')
// const requestCounter = meter.createCounter('requests', {
// description: 'Example of a Counter',
// });
// const upDownCounter = meter.createUpDownCounter('test_up_down_counter', {
// description: 'Example of a UpDownCounter',
// });
// const attributes = { environment: 'staging' };
// interval = setInterval(() => {
// requestCounter.add(1, attributes);
// requestCounter.add(1, {environment: 'testing'});
// requestCounter.add(1, {environment: 'ok'});
// upDownCounter.add(Math.random() > 0.5 ? 1 : -1, attributes);
// }, 1000);
// }
// const addClickEvents = () => {
// // const startBtn = document.getElementById('startBtn');
// // const stopBtn = document.getElementById('stopBtn');
// // startBtn.addEventListener('click', startMetrics);
// // stopBtn.addEventListener('click', stopMetrics);
// // startMetrics()
// };
// // addClickEvents();
export const UseCaseCounter = meter.createCounter('use_case', {
description: 'use case counter',
});
@@ -5,6 +5,8 @@ import { OpentelemetryAgendaProvider, OpentelemetryInterceptorProvider, Opentele
import { Device, DeviceInfo } from '@capacitor/device';
import { SessionStore } from 'src/app/store/session.service';
import { environment } from 'src/environments/environment';
import { UseCaseCounter } from './matrix';
// import { context, propagation } from '@opentelemetry/api';
const tracerInstance = OpentelemetryAgendaProvider.getTracer('example-tracer-hole', '111', {})
const tracerNotificationInstance = OpentelemetryNotificationProvider.getTracer('example-tracer-hole', '111', {})
@@ -58,10 +60,16 @@ const createTracingInstance = ({bugPrint, name, module, autoFinish}): TracingTyp
data.tags[key] = value;
span.setAttribute(key, value);
},
getAttribute: (key: string) => {
return data.tags[key]
},
finish: () => {
span.end();
if(environment.presidential == false) {
span.end();
UseCaseCounter.add(1, {user: SessionStore?.user?.FullName, outcome:data.tags['outcome'], usecase: name})
}
if(bugPrint && hasBug) {
if(bugPrint && data.tags['outcome'] == 'failed') {
console.error(name, data)
}
},
@@ -92,12 +100,13 @@ export function XTracerAsync({ name, bugPrint, module = null, autoFinish = true,
tracing.setAttribute('commit.date', environment.version.lastCommitTime)
tracing.setAttribute('commit.branch', environment.version.branch)
args.push(tracing)
try {
const result = await originalMethod.apply(this, args);
if(autoFinish) {
if(autoFinish ) {
setTimeout(tracing.finish , daley)
}
@@ -167,6 +176,7 @@ export type TracingType = {
//logEvent: (name: string, attributesOrStartTime?: AttributeValue | TimeInput) => void;
addEvent: (context: string, message?: any, obj?: any) => void;
setAttribute: (key: string, value: string) => void;
getAttribute: (key: string) => string;
LocalLogEvent: (name: string, attributesOrStartTime: any, obj?:any) => void;
finish: () => void;
bugFlag:() => void;
@@ -143,7 +143,7 @@ export class NotificationsService {
);
} else {
navigator.serviceWorker.onmessage = (event) => {
console.log('Mensagem recebida do Service Worker:', event.data.data);
console.log('Mensagem recebida do Service Worker:', event.data);
let object = {
notification: event.data
}
+1 -1
View File
@@ -288,7 +288,7 @@ export class NotificationsService {
try {
navigator.serviceWorker.onmessage = (event) => {
console.log('Mensagem recebida do Service Worker:', event.data.data);
console.log('Mensagem recebida do Service Worker:', event.data);
let object = {
notification: event.data
}
+19 -2
View File
@@ -57,6 +57,23 @@ export class ToastService {
}
removeBeforeHash(text) {
const hashIndex = text.indexOf('#');
if (hashIndex !== -1) {
return text.substring(hashIndex);
}
return text;
}
getEverythingBeforeHash(text) {
const hashIndex = text.indexOf('#');
if (hashIndex !== -1) {
return text.substring(0, hashIndex).trim();
}
return text;
}
async _badRequest(message?: string, callback?) {
let notification = document.createElement('div')
@@ -73,9 +90,9 @@ export class ToastService {
`
notification.style.animationName = 'notification-top'
console.error(this.removeBeforeHash(message))
document.body.append(notification)
notification.querySelector('.text').innerHTML = message || 'Processo não efetuado'
notification.querySelector('.text').innerHTML = this.getEverythingBeforeHash(message) || 'Processo não efetuado'
setTimeout(()=>{
if (callback) {
callback()
@@ -78,6 +78,8 @@ export class ViewEventPage implements OnInit {
this.loadedEvent = new Event();
this.eventBody = { BodyType : "1", Text : ""};
this.loadedEvent.Body = this.eventBody;
console.log()
}
ngOnInit() {
@@ -128,7 +130,7 @@ export class ViewEventPage implements OnInit {
setTimeZone() {
this.TimeZoneString = this.loadedEvent.TimeZone
}
@XTracerAsync({name:'ViewEventPage/loadEvent', bugPrint: true})
@XTracerAsync({name:'desktop/event-details', bugPrint: true})
async loadEvent(tracing?: TracingType) {
let res = await this.agendaDataRepository.getEventById(this.eventId, tracing)
@@ -139,6 +141,7 @@ export class ViewEventPage implements OnInit {
/* let changeDate = this.dateService.fixDate(res.value as any) as any */
this.loadedEvent = res.value as any;
console.log('this.loadedEvent', this.loadedEvent)
this.setTimeZone()
} else {
+2 -2
View File
@@ -94,7 +94,7 @@ export class NotificationHolderService {
FolderId: element.FolderId || element.data.folderId,
IdObject: element.IdObject || element.data.idObject,
Location: element.Location,
Object: element.Object || element.data.service,
Object: element.Object || element.data.object,
Role: element.Role,
Service: element.Service || element.data.service,
Status: element.Status,
@@ -144,7 +144,7 @@ export class NotificationHolderService {
title: element.title,
Service: element.data.Service || element.data.service,
Object: element.data.Object || element.data.object,
IdObject: element.data.IdObject || element.data.odObject,
IdObject: element.data.IdObject || element.data.idObject,
FolderId: element.data.FolderId || element.data.folderId,
body: element.body,
dateInit: this.getFormatedTime(element.data.dateInit),