diff --git a/.changeset/breezy-humans-rescue.md b/.changeset/breezy-humans-rescue.md new file mode 100644 index 000000000..bb5fdfdf3 --- /dev/null +++ b/.changeset/breezy-humans-rescue.md @@ -0,0 +1,9 @@ +--- +'@o2s/blocks.ticket-details': minor +'@o2s/blocks.ticket-summary': minor +'@o2s/blocks.ticket-recent': minor +'@o2s/blocks.ticket-list': minor +'@o2s/integrations.mocked': minor +--- + +feat: enhance ticket services to include authorization parameter diff --git a/.changeset/tough-aliens-throw.md b/.changeset/tough-aliens-throw.md new file mode 100644 index 000000000..59e260cff --- /dev/null +++ b/.changeset/tough-aliens-throw.md @@ -0,0 +1,12 @@ +--- +'@o2s/blocks.notification-details': minor +'@o2s/blocks.notification-summary': minor +'@o2s/blocks.notification-list': minor +'@o2s/blocks.recommended-products': minor +'@o2s/blocks.payments-history': minor +'@o2s/blocks.payments-summary': minor +'@o2s/blocks.service-details': minor +'@o2s/integrations.mocked': minor +--- + +refactor: update API harmonization services to include authorization headers diff --git a/packages/blocks/billing/invoice-list/src/api-harmonization/invoice-list.controller.ts b/packages/blocks/billing/invoice-list/src/api-harmonization/invoice-list.controller.ts index aab62e70f..9cbb240cb 100644 --- a/packages/blocks/billing/invoice-list/src/api-harmonization/invoice-list.controller.ts +++ b/packages/blocks/billing/invoice-list/src/api-harmonization/invoice-list.controller.ts @@ -24,8 +24,8 @@ export class InvoiceListController { @Get(':id/pdf') @Auth.Decorators.Permissions({ resource: 'invoices', actions: ['view'] }) - getInvoicePdf(@Param('id') id: string, @Res() res: Response): Observable { - return this.service.getInvoicePdf(id).pipe( + getInvoicePdf(@Headers() headers: AppHeaders, @Param('id') id: string, @Res() res: Response): Observable { + return this.service.getInvoicePdf(id, headers).pipe( map((pdf) => { res.setHeader('Content-Type', 'application/pdf'); res.setHeader('Content-Disposition', `attachment; filename="invoice-${id}.pdf"`); diff --git a/packages/blocks/billing/invoice-list/src/api-harmonization/invoice-list.service.ts b/packages/blocks/billing/invoice-list/src/api-harmonization/invoice-list.service.ts index 8ac134b49..945b1cd5a 100644 --- a/packages/blocks/billing/invoice-list/src/api-harmonization/invoice-list.service.ts +++ b/packages/blocks/billing/invoice-list/src/api-harmonization/invoice-list.service.ts @@ -20,18 +20,22 @@ export class InvoiceListService { ) {} getInvoiceListBlock(query: GetInvoiceListBlockQuery, headers: AppHeaders): Observable { + const authorization = headers[H.Authorization]; const cms = this.cmsService.getInvoiceListBlock({ ...query, locale: headers[H.Locale] }); return forkJoin([cms]).pipe( concatMap(([cms]) => { return this.invoiceService - .getInvoiceList({ - ...(cms.initialFilters || {}), - ...query, - limit: query.limit || cms.pagination?.limit || 1, - offset: query.offset || 0, - locale: headers[H.Locale], - }) + .getInvoiceList( + { + ...(cms.initialFilters || {}), + ...query, + limit: query.limit || cms.pagination?.limit || 1, + offset: query.offset || 0, + locale: headers[H.Locale], + }, + authorization, + ) .pipe( map((invoices) => { const result = mapInvoiceList( @@ -42,7 +46,6 @@ export class InvoiceListService { ); // Extract permissions using ACL service - const authorization = headers[H.Authorization]; if (authorization) { const permissions = this.authService.canPerformActions(authorization, 'invoices', [ 'view', @@ -66,7 +69,8 @@ export class InvoiceListService { ); } - getInvoicePdf(id: string): Observable { - return this.invoiceService.getInvoicePdf({ id }); + getInvoicePdf(id: string, headers: AppHeaders): Observable { + const authorization = headers[H.Authorization]; + return this.invoiceService.getInvoicePdf({ id }, authorization); } } diff --git a/packages/blocks/billing/payments-history/src/api-harmonization/payments-history.service.ts b/packages/blocks/billing/payments-history/src/api-harmonization/payments-history.service.ts index c22e7742e..2a1db8dbd 100644 --- a/packages/blocks/billing/payments-history/src/api-harmonization/payments-history.service.ts +++ b/packages/blocks/billing/payments-history/src/api-harmonization/payments-history.service.ts @@ -23,13 +23,13 @@ export class PaymentsHistoryService { query: GetPaymentsHistoryBlockQuery, headers: AppHeaders, ): Observable { + const authorization = headers[H.Authorization]; const cms = this.cmsService.getPaymentsHistoryBlock({ ...query, locale: headers[H.Locale] }); - const invoices = this.invoiceService.getInvoiceList(query); + const invoices = this.invoiceService.getInvoiceList(query, authorization); return forkJoin([cms, invoices]).pipe( map(([cms, invoices]) => { const result = mapPaymentsHistory(cms, invoices, headers[H.Locale]); - const authorization = headers[H.Authorization]; // Extract permissions using ACL service if (authorization) { diff --git a/packages/blocks/billing/payments-summary/src/api-harmonization/payments-summary.service.ts b/packages/blocks/billing/payments-summary/src/api-harmonization/payments-summary.service.ts index d2d632fb3..7390e6e8b 100644 --- a/packages/blocks/billing/payments-summary/src/api-harmonization/payments-summary.service.ts +++ b/packages/blocks/billing/payments-summary/src/api-harmonization/payments-summary.service.ts @@ -29,13 +29,13 @@ export class PaymentsSummaryService { query: GetPaymentsSummaryBlockQuery, headers: AppHeaders, ): Observable { + const authorization = headers[H.Authorization]; const cms = this.cmsService.getPaymentsSummaryBlock({ ...query, locale: headers[H.Locale] }); - const invoices = this.invoiceService.getInvoiceList(query); + const invoices = this.invoiceService.getInvoiceList(query, authorization); return forkJoin([invoices, cms]).pipe( map(([invoices, cms]) => { const result = mapPaymentsSummary(cms, invoices, headers[H.Locale], this.defaultCurrency); - const authorization = headers[H.Authorization]; // Extract permissions using ACL service if (authorization) { diff --git a/packages/blocks/notifications/notification-details/src/api-harmonization/notification-details.controller.ts b/packages/blocks/notifications/notification-details/src/api-harmonization/notification-details.controller.ts index aed9ca440..72e34383a 100644 --- a/packages/blocks/notifications/notification-details/src/api-harmonization/notification-details.controller.ts +++ b/packages/blocks/notifications/notification-details/src/api-harmonization/notification-details.controller.ts @@ -30,7 +30,7 @@ export class NotificationDetailsController { @Post() @Auth.Decorators.Permissions({ resource: 'notifications', actions: ['mark_read'] }) - markNotificationAs(@Body() body: MarkNotificationAsBlockBody) { - return this.service.markNotificationAs(body); + markNotificationAs(@Headers() headers: AppHeaders, @Body() body: MarkNotificationAsBlockBody) { + return this.service.markNotificationAs(body, headers); } } diff --git a/packages/blocks/notifications/notification-details/src/api-harmonization/notification-details.service.ts b/packages/blocks/notifications/notification-details/src/api-harmonization/notification-details.service.ts index 912c1b974..693c28682 100644 --- a/packages/blocks/notifications/notification-details/src/api-harmonization/notification-details.service.ts +++ b/packages/blocks/notifications/notification-details/src/api-harmonization/notification-details.service.ts @@ -28,8 +28,12 @@ export class NotificationDetailsService { query: GetNotificationDetailsBlockQuery, headers: AppHeaders, ): Observable { + const authorization = headers[H.Authorization]; const cms = this.cmsService.getNotificationDetailsBlock({ ...query, locale: headers[H.Locale] }); - const notification = this.notificationService.getNotification({ ...params, locale: headers[H.Locale] }); + const notification = this.notificationService.getNotification( + { ...params, locale: headers[H.Locale] }, + authorization, + ); return forkJoin([notification, cms]).pipe( map(([notification, cms]) => { @@ -45,7 +49,6 @@ export class NotificationDetailsService { ); // Extract permissions using ACL service - const authorization = headers[H.Authorization]; if (authorization) { const permissions = this.authService.canPerformActions(authorization, 'notifications', [ 'view', @@ -65,7 +68,8 @@ export class NotificationDetailsService { ); } - markNotificationAs(body: MarkNotificationAsBlockBody): Observable { - return this.notificationService.markAs(body); + markNotificationAs(body: MarkNotificationAsBlockBody, headers: AppHeaders): Observable { + const authorization = headers[H.Authorization]; + return this.notificationService.markAs(body, authorization); } } diff --git a/packages/blocks/notifications/notification-list/src/api-harmonization/notification-list.service.ts b/packages/blocks/notifications/notification-list/src/api-harmonization/notification-list.service.ts index 971d85e7f..0fca85ee1 100644 --- a/packages/blocks/notifications/notification-list/src/api-harmonization/notification-list.service.ts +++ b/packages/blocks/notifications/notification-list/src/api-harmonization/notification-list.service.ts @@ -29,13 +29,16 @@ export class NotificationListService { return forkJoin([cms]).pipe( concatMap(([cms]) => { return this.notificationService - .getNotificationList({ - ...(cms.initialFilters || {}), - ...query, - limit: query.limit || cms.pagination?.limit || 1, - offset: query.offset || 0, - locale: headers[H.Locale], - }) + .getNotificationList( + { + ...(cms.initialFilters || {}), + ...query, + limit: query.limit || cms.pagination?.limit || 1, + offset: query.offset || 0, + locale: headers[H.Locale], + }, + authorization, + ) .pipe( map((notifications) => { const result = mapNotificationList( diff --git a/packages/blocks/notifications/notification-summary/src/api-harmonization/notification-summary.service.ts b/packages/blocks/notifications/notification-summary/src/api-harmonization/notification-summary.service.ts index 4de547ed7..8d0fb960f 100644 --- a/packages/blocks/notifications/notification-summary/src/api-harmonization/notification-summary.service.ts +++ b/packages/blocks/notifications/notification-summary/src/api-harmonization/notification-summary.service.ts @@ -23,17 +23,20 @@ export class NotificationSummaryService { query: GetNotificationSummaryBlockQuery, headers: AppHeaders, ): Observable { + const authorization = headers[H.Authorization]; const cms = this.cmsService.getNotificationSummaryBlock({ ...query, locale: headers[H.Locale] }); - const notifications = this.notificationService.getNotificationList({ - limit: 1000, - offset: 0, - locale: headers[H.Locale], - }); + const notifications = this.notificationService.getNotificationList( + { + limit: 1000, + offset: 0, + locale: headers[H.Locale], + }, + authorization, + ); return forkJoin([notifications, cms]).pipe( map(([notifications, cms]) => { const result = mapNotificationSummary(cms, notifications, headers[H.Locale]); - const authorization = headers[H.Authorization]; // Extract permissions using ACL service if (authorization) { diff --git a/packages/blocks/products/recommended-products/src/api-harmonization/recommended-products.service.ts b/packages/blocks/products/recommended-products/src/api-harmonization/recommended-products.service.ts index 08bb2b58f..397a9dcf5 100644 --- a/packages/blocks/products/recommended-products/src/api-harmonization/recommended-products.service.ts +++ b/packages/blocks/products/recommended-products/src/api-harmonization/recommended-products.service.ts @@ -21,6 +21,7 @@ export class RecommendedProductsService { query: GetRecommendedProductsBlockQuery, headers: AppHeaders, ): Observable { + const authorization = headers[H.Authorization]; const locale = headers[H.Locale] || 'en'; const cmsBlock$ = this.cmsService.getRecommendedProductsBlock({ id: query.id, @@ -30,12 +31,15 @@ export class RecommendedProductsService { return cmsBlock$.pipe( switchMap((cmsBlock) => { return this.productsService - .getProductList({ - basePath: cmsBlock.basePath || '', - offset: 0, - limit: 7, // Fetch 7 to have 6 after excluding current product - locale, - }) + .getProductList( + { + basePath: cmsBlock.basePath || '', + offset: 0, + limit: 7, // Fetch 7 to have 6 after excluding current product + locale, + }, + authorization, + ) .pipe( map((products) => { // Filter out excluded product and products without images diff --git a/packages/blocks/services/service-details/src/api-harmonization/service-details.service.ts b/packages/blocks/services/service-details/src/api-harmonization/service-details.service.ts index 2e63ae0ea..56151a174 100644 --- a/packages/blocks/services/service-details/src/api-harmonization/service-details.service.ts +++ b/packages/blocks/services/service-details/src/api-harmonization/service-details.service.ts @@ -24,15 +24,15 @@ export class ServiceDetailsService { query: GetServiceDetailsBlockQuery, headers: AppHeaders, ): Observable { + const authorization = headers[H.Authorization]; const cms = this.cmsService.getServiceDetailsBlock({ ...query, locale: headers[H.Locale] }); - const service = this.resourceService.getService({ ...params, locale: headers[H.Locale] }); + const service = this.resourceService.getService({ ...params, locale: headers[H.Locale] }, authorization); return forkJoin([cms, service]).pipe( map(([cms, service]) => { const result = mapServiceDetails(cms, service, headers[H.Locale], headers[H.ClientTimezone] || ''); // Extract permissions using ACL service - const authorization = headers[H.Authorization]; if (authorization) { const permissions = this.authService.canPerformActions(authorization, 'services', ['view']); diff --git a/packages/blocks/support/ticket-details/src/api-harmonization/ticket-details.service.ts b/packages/blocks/support/ticket-details/src/api-harmonization/ticket-details.service.ts index a9435ac7e..80bed1c7d 100644 --- a/packages/blocks/support/ticket-details/src/api-harmonization/ticket-details.service.ts +++ b/packages/blocks/support/ticket-details/src/api-harmonization/ticket-details.service.ts @@ -24,8 +24,9 @@ export class TicketDetailsService { query: GetTicketDetailsBlockQuery, headers: AppHeaders, ): Observable { + const authorization = headers[H.Authorization]; const cms = this.cmsService.getTicketDetailsBlock({ ...query, locale: headers[H.Locale] }); - const ticket = this.ticketService.getTicket({ ...params, locale: headers[H.Locale] }); + const ticket = this.ticketService.getTicket({ ...params, locale: headers[H.Locale] }, authorization); return forkJoin([ticket, cms]).pipe( map(([ticket, cms]) => { @@ -36,7 +37,6 @@ export class TicketDetailsService { const result = mapTicketDetails(ticket, cms, headers[H.Locale], headers[H.ClientTimezone] || ''); // Extract permissions using ACL service - const authorization = headers[H.Authorization]; if (authorization) { const permissions = this.authService.canPerformActions(authorization, 'tickets', [ 'view', diff --git a/packages/blocks/support/ticket-list/src/api-harmonization/ticket-list.service.ts b/packages/blocks/support/ticket-list/src/api-harmonization/ticket-list.service.ts index 7b40b3f44..6df813f1c 100644 --- a/packages/blocks/support/ticket-list/src/api-harmonization/ticket-list.service.ts +++ b/packages/blocks/support/ticket-list/src/api-harmonization/ticket-list.service.ts @@ -26,13 +26,16 @@ export class TicketListService { return forkJoin([cms]).pipe( concatMap(([cms]) => { return this.ticketService - .getTicketList({ - ...(cms.initialFilters || {}), - ...query, - limit: query.limit || cms.pagination?.limit || 1, - offset: query.offset || 0, - locale: headers[H.Locale], - }) + .getTicketList( + { + ...(cms.initialFilters || {}), + ...query, + limit: query.limit || cms.pagination?.limit || 1, + offset: query.offset || 0, + locale: headers[H.Locale], + }, + authorization, + ) .pipe( map((tickets) => { const result = mapTicketList( diff --git a/packages/blocks/support/ticket-recent/src/api-harmonization/ticket-recent.service.ts b/packages/blocks/support/ticket-recent/src/api-harmonization/ticket-recent.service.ts index e6a1612bd..6e8096c19 100644 --- a/packages/blocks/support/ticket-recent/src/api-harmonization/ticket-recent.service.ts +++ b/packages/blocks/support/ticket-recent/src/api-harmonization/ticket-recent.service.ts @@ -26,7 +26,7 @@ export class TicketRecentService { return forkJoin([cms]).pipe( concatMap(([cms]) => { return this.ticketsService - .getTicketList({ ...query, limit: cms.limit, locale: headers[H.Locale] }) + .getTicketList({ ...query, limit: cms.limit, locale: headers[H.Locale] }, authorization) .pipe( map((tickets) => { const result = mapTicketRecent( diff --git a/packages/blocks/support/ticket-summary/src/api-harmonization/ticket-summary.service.ts b/packages/blocks/support/ticket-summary/src/api-harmonization/ticket-summary.service.ts index 51c734658..5ace31b24 100644 --- a/packages/blocks/support/ticket-summary/src/api-harmonization/ticket-summary.service.ts +++ b/packages/blocks/support/ticket-summary/src/api-harmonization/ticket-summary.service.ts @@ -20,17 +20,20 @@ export class TicketSummaryService { ) {} getTicketSummaryBlock(query: GetTicketSummaryBlockQuery, headers: AppHeaders): Observable { + const authorization = headers[H.Authorization]; const cms = this.cmsService.getTicketSummaryBlock({ ...query, locale: headers[H.Locale] }); - const tickets = this.ticketService.getTicketList({ - limit: 1000, - offset: 0, - locale: headers[H.Locale], - }); + const tickets = this.ticketService.getTicketList( + { + limit: 1000, + offset: 0, + locale: headers[H.Locale], + }, + authorization, + ); return forkJoin([tickets, cms]).pipe( map(([tickets, cms]) => { const result = mapTicketSummary(cms, tickets, headers[H.Locale]); - const authorization = headers[H.Authorization]; // Extract permissions using ACL service if (authorization) { diff --git a/packages/integrations/mocked/src/modules/invoices/invoices.service.ts b/packages/integrations/mocked/src/modules/invoices/invoices.service.ts index 32f4c4ea9..d0660c6b0 100644 --- a/packages/integrations/mocked/src/modules/invoices/invoices.service.ts +++ b/packages/integrations/mocked/src/modules/invoices/invoices.service.ts @@ -14,15 +14,18 @@ export class InvoicesService extends Invoices.Service { super(); } - getInvoiceList(query: Invoices.Request.GetInvoiceListQuery): Observable { + getInvoiceList( + query: Invoices.Request.GetInvoiceListQuery, + _authorization?: string, + ): Observable { return of(mapInvoices(query)).pipe(responseDelay()); } - getInvoice(params: Invoices.Request.GetInvoiceParams): Observable { + getInvoice(params: Invoices.Request.GetInvoiceParams, _authorization?: string): Observable { return of(mapInvoice(params.id)).pipe(responseDelay()); } - getInvoicePdf(_params: Invoices.Request.GetInvoiceParams): Observable { + getInvoicePdf(_params: Invoices.Request.GetInvoiceParams, _authorization?: string): Observable { const pdfPath = join(__dirname, 'resources', 'invoice-sample.pdf'); const pdf = readFileSync(pdfPath); return of(pdf).pipe(responseDelay()); diff --git a/packages/integrations/mocked/src/modules/notifications/notifications.service.ts b/packages/integrations/mocked/src/modules/notifications/notifications.service.ts index 77b27eeee..00fc95131 100644 --- a/packages/integrations/mocked/src/modules/notifications/notifications.service.ts +++ b/packages/integrations/mocked/src/modules/notifications/notifications.service.ts @@ -15,17 +15,19 @@ export class NotificationsService extends Notifications.Service { getNotification( params: Notifications.Request.GetNotificationParams, + _authorization?: string, ): Observable { return of(mapNotification(params.id, params.locale)).pipe(responseDelay()); } getNotificationList( options: Notifications.Request.GetNotificationListQuery, + _authorization?: string, ): Observable { return of(mapNotifications(options)).pipe(responseDelay()); } - markAs(_request: Notifications.Request.MarkNotificationAsRequest): Observable { + markAs(_request: Notifications.Request.MarkNotificationAsRequest, _authorization?: string): Observable { throw new NotImplementedException('The method is not implemented'); } } diff --git a/packages/integrations/mocked/src/modules/resources/resources.service.ts b/packages/integrations/mocked/src/modules/resources/resources.service.ts index 9d2f91c2d..91894f252 100644 --- a/packages/integrations/mocked/src/modules/resources/resources.service.ts +++ b/packages/integrations/mocked/src/modules/resources/resources.service.ts @@ -19,11 +19,14 @@ export class ResourcesService extends Resources.Service { super(); } - purchaseOrActivateService(_params: Resources.Request.GetServiceParams): Observable { + purchaseOrActivateService(_params: Resources.Request.GetServiceParams, _authorization?: string): Observable { throw new Error('Method not implemented.'); } - purchaseOrActivateResource(_params: Resources.Request.GetResourceParams): Observable { + purchaseOrActivateResource( + _params: Resources.Request.GetResourceParams, + _authorization?: string, + ): Observable { throw new Error('Method not implemented'); } @@ -34,7 +37,10 @@ export class ResourcesService extends Resources.Service { return of(mapServices(query, authorization)).pipe(responseDelay()); } - getService(params: Resources.Request.GetServiceParams): Observable { + getService( + params: Resources.Request.GetServiceParams, + _authorization?: string, + ): Observable { return of(mapService(params.id)).pipe(responseDelay()); } @@ -45,7 +51,7 @@ export class ResourcesService extends Resources.Service { return of(mapAssets(query, authorization)).pipe(responseDelay()); } - getAsset(params: Resources.Request.GetAssetParams): Observable { + getAsset(params: Resources.Request.GetAssetParams, _authorization?: string): Observable { return of(mapAsset(params.id)).pipe(responseDelay()); } diff --git a/packages/integrations/mocked/src/modules/tickets/tickets.service.ts b/packages/integrations/mocked/src/modules/tickets/tickets.service.ts index 5ccea748d..76d95b8ad 100644 --- a/packages/integrations/mocked/src/modules/tickets/tickets.service.ts +++ b/packages/integrations/mocked/src/modules/tickets/tickets.service.ts @@ -12,11 +12,11 @@ export class TicketService extends Tickets.Service { super(); } - getTicket(options: Tickets.Request.GetTicketParams) { + getTicket(options: Tickets.Request.GetTicketParams, _authorization?: string) { return of(mapTicket(options.id, options.locale)).pipe(responseDelay()); } - getTicketList(options: Tickets.Request.GetTicketListQuery) { + getTicketList(options: Tickets.Request.GetTicketListQuery, _authorization?: string) { return of(mapTickets(options)).pipe(responseDelay()); }