diff --git a/src/app/models/entiry/agenda/eventList.ts b/src/app/models/entiry/agenda/eventList.ts index 3d51afd89..50e72c6d6 100644 --- a/src/app/models/entiry/agenda/eventList.ts +++ b/src/app/models/entiry/agenda/eventList.ts @@ -4,7 +4,7 @@ import { z } from 'zod'; const eventListSchema = z.array(z.object({ HasAttachments: z.boolean(), IsAllDayEvent: z.boolean(), - EventId: z.string(), + EventId: z.any(), Subject: z.string(), Location: z.string().nullable(), CalendarId: z.string(), @@ -16,7 +16,8 @@ const eventListSchema = z.array(z.object({ OptionalAttendees: z.string().nullable(), HumanDate: z.string(), TimeZone: z.string(), - IsPrivate: z.boolean() + IsPrivate: z.boolean(), + createdAt: z.string() })); export type EventList = z.infer diff --git a/src/app/models/search-document.ts b/src/app/models/search-document.ts index 9efbc437d..0d7c4e76a 100644 --- a/src/app/models/search-document.ts +++ b/src/app/models/search-document.ts @@ -2,9 +2,7 @@ export class SearchList { ApplicationType: number | string; Assunto: string; Data: string; - DocTypeDesc: string; - EntidadeOrganicaId: number; - EntidadeOrganicaNome: string; + DocTypeDesc?: 'Acções' | 'Publicações'; Id: string; appName?: string; ApplicationName: string; diff --git a/src/app/pages/search/search.page.html b/src/app/pages/search/search.page.html index fa18aa703..3d477eceb 100644 --- a/src/app/pages/search/search.page.html +++ b/src/app/pages/search/search.page.html @@ -303,18 +303,22 @@ - Correspondencia - AccoesPresidenciais - ArquivoDespachoElect + Correspondencia + AccoesPresidenciais + ArquivoDespachoElect
- {{ searchDocument.entity }} + {{ searchDocument.entity || searchDocument.EntidadeOrganicaNome }} {{ formateIsoDate(searchDocument.dateEntry || searchDocument.Data) }}
-
Ver
+
+ +
@@ -323,7 +327,7 @@ -
+
{{pageNumber + "/" + totalPage}}
diff --git a/src/app/pages/search/search.page.ts b/src/app/pages/search/search.page.ts index fa2cf30b5..505ea4a0f 100644 --- a/src/app/pages/search/search.page.ts +++ b/src/app/pages/search/search.page.ts @@ -20,6 +20,9 @@ import { momentG } from 'src/plugin/momentG'; import { Cy } from 'cypress/enum' import { AgendaDataRepositoryService } from 'src/app/services/Repositorys/Agenda/agenda-data-repository.service'; import { SessionStore } from 'src/app/store/session.service'; +import { TracingType, XTracerAsync } from 'src/app/services/monitoring/opentelemetry/tracer'; +import { isHttpError } from 'src/app/services/http.service'; +import { ToastService } from 'src/app/services/toast.service'; const CUSTOM_DATE_FORMATS: NgxMatDateFormats = { parse: { @@ -114,7 +117,9 @@ export class SearchPage implements OnInit { public ThemeService: ThemeService, private router: Router, private httpErrorhandle: HttpErrorHandle, - private agendaDataRepository: AgendaDataRepositoryService) { + private agendaDataRepository: AgendaDataRepositoryService, + private toastService: ToastService, + ) { this.ordinance = "recent"; this.currentPath = window.location.pathname; @@ -168,7 +173,7 @@ export class SearchPage implements OnInit { console.log('doc item',item) const ApplicationType = item.applicationId.toString() - const Id = item.docId + const Id = item.docId if (ApplicationType == '8') { @@ -363,7 +368,8 @@ export class SearchPage implements OnInit { /** * @description Basic search */ - basicSearch() { + @XTracerAsync({name:'search/basicSearch', bugPrint: true}) + async basicSearch(tracing?: TracingType) { let searchDocumentDate let searchDocumentDateEnd; @@ -386,70 +392,81 @@ export class SearchPage implements OnInit { if (this.searchSubject.trim() == "" && searchDocumentDate == null && searchDocumentDateEnd == null && this.searchSenderId == null && this.searchOrganicEntiryCode == null && this.searchDocTypeId == null) { - this.searchResult = "Campo de pesquisa esta vazio, entre com assunto que deseja pesquisa"; + this.searchResult = "Campo de pesquisa está vazio, entre com assunto que deseja pesquisa"; console.log('enter text'); } else { - /* this.showLoader = true; - this.agendaDataRepository.getDocumentAttachments(361, SessionStore.user.UserId, this.searchSubject, this.pageNumber, this.pageSize).subscribe((values) => { - this.totalPage = values.data.total / this.pageSize; - this.totalPage = Math.round(this.totalPage) - console.log(values.data.result) - this.searchDocuments = this.sortArrayISODate(values.data.result); + + const searchEvents = await this.agendaDataRepository.searchEvent({value: this.searchSubject.trim() }, tracing) + if(searchEvents.isOk()) { + + this.showDocuments = true; + this.searchDocuments = searchEvents.value + + this.searchDocuments = this.sortArrayISODate(this.searchDocuments); this.reorderList(this.ordinance); - // hide show document if (this.searchDocuments.length >= 1) { this.showDocuments = true; } else { + this.searchResult = "Registo não encontrado" this.showDocuments = false } - this.showLoader = false; this.loadWordCloud(); - }, error => { - this.showLoader = false; - // this.searchResult = "Registo não encontrado" - this.httpErrorhandle.httpStatusHandle(error) - // console.log(error) - }) - return */ - this.showLoader = true; - this.search.basicSearch(this.searchSubject, searchDocumentDate, searchDocumentDateEnd, this.searchSenderId - , this.searchOrganicEntiryCode, this.searchDocTypeId, '0').subscribe(res => { - console.log(res) + tracing.setAttribute('outcome', 'success'); + } else { - if (!res.Categories.length) { - this.searchResult = "Não encontramos o que procura"; - } + this.loadWordCloud(); + this.showDocuments = true; - res.Categories.forEach(e => { - e['Active'] = false; - }); + if(!isHttpError(searchEvents.error)) { + this.toastService._badRequest('Pedimos desculpa mas não foi possível executar a acção. Por favor, contacte o apoio técnico.') - // bind respose - this.searchCategories = res.Categories; + } else if (isHttpError(searchEvents.error)) { + this.httpErrorhandle.httpStatusHandle(searchEvents.error) + } - this.searchDocuments = this.sortArrayISODate(res.Documents); + tracing.setAttribute('outcome', 'failed'); + console.log('create event error: ', searchEvents.error) + } - this.reorderList(this.ordinance); + // this.showLoader = true; + // this.search.basicSearch(this.searchSubject, searchDocumentDate, searchDocumentDateEnd, this.searchSenderId + // , this.searchOrganicEntiryCode, this.searchDocTypeId, '0').subscribe(res => { + // console.log(res) - // hide show document - if (this.searchDocuments.length >= 1) { - this.showDocuments = true; - } else { - this.showDocuments = false - } + // if (!res.Categories.length) { + // this.searchResult = "Não encontramos o que procura"; + // } - this.showLoader = false; - this.loadWordCloud(); + // res.Categories.forEach(e => { + // e['Active'] = false; + // }); - }, error => { - this.showLoader = false; - // this.searchResult = "Registo não encontrado" - this.httpErrorhandle.httpStatusHandle(error) - // console.log(error) - }); + // // bind respose + // this.searchCategories = res.Categories; + + // this.searchDocuments = this.sortArrayISODate(res.Documents); + + // this.reorderList(this.ordinance); + + // // hide show document + // if (this.searchDocuments.length >= 1) { + // this.showDocuments = true; + // } else { + // this.showDocuments = false + // } + + // this.showLoader = false; + // this.loadWordCloud(); + + // }, error => { + // this.showLoader = false; + // // this.searchResult = "Registo não encontrado" + // this.httpErrorhandle.httpStatusHandle(error) + // // console.log(error) + // }); } } else if (this.type == "AccoesPresidenciais & ArquivoDespachoElect" && this.eventAgenda == true) { @@ -1073,9 +1090,9 @@ export class SearchPage implements OnInit { async viewDetail(searchDocument: SearchList) { - const ApplicationType = searchDocument.ApplicationType.toString() + const ApplicationType = searchDocument?.ApplicationType?.toString() const Id = searchDocument.Id - const CalendarId = searchDocument.ApplicationName.split(':')[1] + const CalendarId = searchDocument?.ApplicationName?.split(':')[1] const DocTypeDesc = searchDocument.DocTypeDesc if (this.select == false) { 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 a2ed0fe1b..8475a61e8 100644 --- a/src/app/services/Repositorys/Agenda/agenda-data-repository.service.ts +++ b/src/app/services/Repositorys/Agenda/agenda-data-repository.service.ts @@ -15,7 +15,6 @@ import { EEventFilterStatus } from './model/enums'; import { isHttpError } from '../../http.service'; import { TracingType } from '../../monitoring/opentelemetry/tracer'; import { APINODReturn } from '../../decorator/api-validate-schema.decorator'; -import { EventListDataOutputDTOSchema } from './model/eventListDTOOutput'; import { EventToApproveDataOutputDTOSchema } from './model/eventToApproveListOutputDTO'; import { EventOutputDTOSchema } from './model/eventDTOOutput'; import { SharedCalendarListDetectChanges } from './async/change/shareCalendarChangeDetector'; @@ -23,6 +22,8 @@ import { SharedCalendarListItemOutputDTO } from './model/sharedCalendarOutputDTO import { EventInputDTOSchema } from './agendaDataModels'; import { EventUpdateInputDTOSchema } from './model/eventUpdateInputDtO'; import { AttachInputDTOSchema } from './model/addAttachmentDTOInput'; +import { EventListDataOutputDTOSchema } from './model/eventListDTOOutput'; +import { EventSearchMapper } from './mapper/EventSearchMapper'; @Injectable({ providedIn: 'root' @@ -107,6 +108,14 @@ export class AgendaDataRepositoryService { } + async searchEvent(queryParameters: {value}, tracing?: TracingType) { + const result = await this.agendaDataService.searchEvent(queryParameters) + return result.map( response => { + APINODReturn(EventListDataOutputDTOSchema, response, 'get/Events', tracing) + return EventSearchMapper.toDomain(response, "calendarOwnerName", "userId") + }) + } + async EventList({ userId, startDate, endDate, status = EEventFilterStatus.Approved, category = null, type = null, calendarOwnerName = '' }, tracing?: TracingType) { try { diff --git a/src/app/services/Repositorys/Agenda/agenda-data.service.ts b/src/app/services/Repositorys/Agenda/agenda-data.service.ts index b56cd21db..ccc444f9c 100644 --- a/src/app/services/Repositorys/Agenda/agenda-data.service.ts +++ b/src/app/services/Repositorys/Agenda/agenda-data.service.ts @@ -7,9 +7,9 @@ import { SharedCalendarListOutputDTO, SharedCalendarListOutputDTOSchema } from ' import { HttpService } from '../../http.service'; import { APIReturn } from '../../decorator/api-validate-schema.decorator'; import { TracingType } from '../../monitoring/opentelemetry/tracer'; -import { EventListOutputDTO, EventListOutputDTOSchema } from './model/eventListDTOOutput'; import { EventOutputDTO } from './model/eventDTOOutput'; import { AttendeesRemoveInputDTO } from './model/attendeeRemoveInputDTO'; +import { EventListOutputDTO } from './model/eventListDTOOutput'; @Injectable({ providedIn: 'root' @@ -74,6 +74,10 @@ export class AgendaDataService { return this.http.get(`${this.baseUrl}/Events`, { params }); } + searchEvent(queryParameter: {value}) { + return this.httpService.get(`${this.baseUrl}/Events`, queryParameter); + } + getEvent(id: string): Observable { return this.http.get(`${this.baseUrl}/Events/${id}`); } diff --git a/src/app/services/Repositorys/Agenda/mapper/EventListMapper.ts b/src/app/services/Repositorys/Agenda/mapper/EventListMapper.ts index f20c9411a..f067261e3 100644 --- a/src/app/services/Repositorys/Agenda/mapper/EventListMapper.ts +++ b/src/app/services/Repositorys/Agenda/mapper/EventListMapper.ts @@ -1,7 +1,7 @@ import { EventList } from "src/app/models/entiry/agenda/eventList" -import { EventListOutputDTO } from "../model/eventListDTOOutput" import { EEventCategory, EEventOwnerType, EEventStatus, EEventType } from "../model/enums"; import { XTracer } from "src/app/services/monitoring/opentelemetry/tracer"; +import { EventListOutputDTO } from "../model/eventListDTOOutput"; function getTextInsideParentheses(inputString): string { var startIndex = inputString.indexOf('('); @@ -60,16 +60,17 @@ export class ListEventMapper { "EventId": e.id, "Subject": e.subject, "Location": e.location, - "CalendarId": userId, + "CalendarId": (e.owner.wxUserId) as any, "CalendarName": category, "StartDate": new Date(e.startDate) + '', "EndDate": new Date(e.endDate)+ '', - "Schedule": calendarOwnerName, + "Schedule": (e.owner.wxFullName) as any, "RequiredAttendees": null as any, "OptionalAttendees": null as any, "HumanDate": "2 semanas atrás" as any, "TimeZone": getTextInsideParentheses(new Date(e.startDate)+ ''), - "IsPrivate": false as any + "IsPrivate": false as any, + "createdAt": e.createdAt } }) } diff --git a/src/app/services/Repositorys/Agenda/mapper/EventSearchMapper.ts b/src/app/services/Repositorys/Agenda/mapper/EventSearchMapper.ts new file mode 100644 index 000000000..0727df4a8 --- /dev/null +++ b/src/app/services/Repositorys/Agenda/mapper/EventSearchMapper.ts @@ -0,0 +1,37 @@ +import { SearchList } from "src/app/models/search-document"; +import { EventListOutputDTO } from "../model/eventListDTOOutput"; + +function getTextInsideParentheses(inputString): string { + var startIndex = inputString.indexOf('('); + var endIndex = inputString.indexOf(')'); + if (startIndex !== -1 && endIndex !== -1) { + return inputString.substring(startIndex + 1, endIndex); + } else { + return null; + } +} + +export class EventSearchMapper { + // @XTracer({name:'ListEventMapper/toDomain', log: false, bugPrint: false}) + static toDomain(dto: EventListOutputDTO, calendarOwnerName: string, userId: string): SearchList[] { + + return dto.data.map((e) => { + + return { + Id: e.id as any, + subject: e.subject, + dateEntry: e.createdAt as any, + Data: e.createdAt as any, + entity: (e.owner.wxFullName), + ApplicationType: 0 as any, + Assunto: e.subject, + appName: "string", + ApplicationName: "", + docId: e.id as any, + applicationId: 0 as any + } + }) + } + + static toDTO() {} +} diff --git a/src/app/services/Repositorys/Agenda/mapper/eventToApproveListMapper.ts b/src/app/services/Repositorys/Agenda/mapper/eventToApproveListMapper.ts index 78516aeec..221d08473 100644 --- a/src/app/services/Repositorys/Agenda/mapper/eventToApproveListMapper.ts +++ b/src/app/services/Repositorys/Agenda/mapper/eventToApproveListMapper.ts @@ -1,5 +1,3 @@ -import { EventList } from "src/app/models/entiry/agenda/eventList" -import { EventListOutputDTO } from "../model/eventListDTOOutput" import { EventToApproveListOutputDTO } from "../model/eventToApproveListOutputDTO"; import { EventToApproveList } from "src/app/models/entiry/agenda/eventToApproveList"; import { EEventCategory, EEventOwnerType, EEventStatus } from "../model/enums"; diff --git a/src/app/services/Repositorys/Agenda/model/eventListDTOOutput.ts b/src/app/services/Repositorys/Agenda/model/eventListDTOOutput.ts index 5a425ba23..db6ebce66 100644 --- a/src/app/services/Repositorys/Agenda/model/eventListDTOOutput.ts +++ b/src/app/services/Repositorys/Agenda/model/eventListDTOOutput.ts @@ -1,5 +1,5 @@ import { z } from 'zod'; -import { EEventCategory, EEventOwnerType, EEventStatus, EEventType } from './enums'; +import { EEventCategory, EEventOwnerType, EEventStatus, EEventType } from '../model/enums'; const OwnerSchema = z.object({ @@ -29,6 +29,7 @@ export const EventListOutputDTOSchema = z.object({ 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 + createdAt: z.string().datetime({ offset: true }), }) export const EventListDataOutputDTOSchema = z.object({ diff --git a/src/app/services/Repositorys/Agenda/model/eventSearchOutputDTO.ts b/src/app/services/Repositorys/Agenda/model/eventSearchOutputDTO.ts new file mode 100644 index 000000000..d7ebe9184 --- /dev/null +++ b/src/app/services/Repositorys/Agenda/model/eventSearchOutputDTO.ts @@ -0,0 +1,12 @@ +import { z } from 'zod'; +import { EEventOwnerType } from './enums'; + +export const EventSearchOutputDTOSchema = z.object({ + Id: z.string(), + subject: z.string(), + dateEntry: z.string(), + Data: z.string(), + entity: z.string().optional() +}).nullable(); + +export type EventSearchOutput = z.infer; diff --git a/src/app/services/http.service.ts b/src/app/services/http.service.ts index d97cb3a1f..0ae0b7175 100644 --- a/src/app/services/http.service.ts +++ b/src/app/services/http.service.ts @@ -1,7 +1,7 @@ import { HttpClient, HttpErrorResponse, HttpResponse } from '@angular/common/http'; import { Injectable } from '@angular/core'; import { ok, err, Result } from 'neverthrow'; - +import { HttpParams } from '@angular/common/http'; @Injectable({ providedIn: 'root' }) @@ -19,9 +19,23 @@ export class HttpService { } } - async get(url: string): Promise> { + async get(url: string, httpParamsObj = {} ): Promise> { try { - const result = await this.http.get(url).toPromise() + + let httpParams = new HttpParams(); + + // Convert params object to HttpParams + if (httpParamsObj) { + Object.keys(httpParamsObj).forEach(key => { + httpParams = httpParams.set(key, httpParamsObj[key]); + }) + } + + let opts = { + params : httpParams + } + const result = await this.http.get(url, opts).toPromise() + return ok (result as T) } catch (e) { return err(e as HttpErrorResponse) diff --git a/version/git-version.ts b/version/git-version.ts index a3d18be96..651741ac3 100644 --- a/version/git-version.ts +++ b/version/git-version.ts @@ -1,11 +1,11 @@ export let versionData = { - "shortSHA": "fbaf0afcf", - "SHA": "fbaf0afcf137adaf815d2013e6c1d6f87561cf95", + "shortSHA": "02891dbb9", + "SHA": "02891dbb9a9d1123f7cd0ca2414fd6014599aec1", "branch": "feature/agenda-api-peter", "lastCommitAuthor": "'Peter Maquiran'", - "lastCommitTime": "'Tue Jun 25 12:11:44 2024 +0100'", - "lastCommitMessage": "ITOTEAM-523 A app não redireciona as notificações", - "lastCommitNumber": "5842", - "changeStatus": "On branch feature/agenda-api-peter\nYour branch is ahead of 'origin/feature/agenda-api-peter' by 5 commits.\n (use \"git push\" to publish your local commits)\n\nChanges to be committed:\n (use \"git restore --staged ...\" to unstage)\n\tmodified: gabinete-digital-fo.code-workspace\n\tmodified: package-lock.json\n\tmodified: package.json\n\tmodified: src/app/home/home.page.ts\n\tmodified: src/app/pages/agenda/agenda.page.html\n\tmodified: src/app/pages/search/search.page.html\n\tmodified: src/app/pages/search/search.page.scss\n\tmodified: src/app/services/agenda/list-box.service.ts\n\tnew file: src/app/services/logger/log4js/logging.service.ts\n\tmodified: src/app/services/monitoring/capture-log/capture-log.service.ts\n\tmodified: src/app/services/monitoring/capture-log/worker.worker.ts\n\tmodified: src/app/services/monitoring/opentelemetry/matrix.ts\n\tmodified: src/app/services/monitoring/opentelemetry/tracer.ts\n\tmodified: src/app/shared/agenda/edit-event/edit-event.page.ts\n\tmodified: src/app/shared/agenda/view-event/view-event.page.html\n\tmodified: src/app/shared/agenda/view-event/view-event.page.ts\n\tmodified: src/app/store/calendar.service.ts", + "lastCommitTime": "'Wed Jun 26 10:11:02 2024 +0100'", + "lastCommitMessage": "ITOTEAM-530 Inform the user how many days are left until the end of the wind for each selected day", + "lastCommitNumber": "5843", + "changeStatus": "On branch feature/agenda-api-peter\nYour branch is ahead of 'origin/feature/agenda-api-peter' 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: src/app/models/entiry/agenda/eventList.ts\n\tmodified: src/app/models/search-document.ts\n\tmodified: src/app/pages/search/search.page.html\n\tmodified: src/app/pages/search/search.page.ts\n\tmodified: src/app/services/Repositorys/Agenda/agenda-data-repository.service.ts\n\tmodified: src/app/services/Repositorys/Agenda/agenda-data.service.ts\n\tmodified: src/app/services/Repositorys/Agenda/mapper/EventListMapper.ts\n\tnew file: src/app/services/Repositorys/Agenda/mapper/EventSearchMapper.ts\n\tmodified: src/app/services/Repositorys/Agenda/mapper/eventToApproveListMapper.ts\n\tmodified: src/app/services/Repositorys/Agenda/model/eventListDTOOutput.ts\n\tnew file: src/app/services/Repositorys/Agenda/model/eventSearchOutputDTO.ts\n\tmodified: src/app/services/http.service.ts\n\tmodified: version/git-version.ts", "changeAuthor": "peter.maquiran" } \ No newline at end of file