From 603b5fed8e71a7decfc86c9ebe58d45d2752eb23 Mon Sep 17 00:00:00 2001 From: david Date: Mon, 26 May 2025 16:45:03 +0200 Subject: [PATCH] . --- modules/core/src/dto/index.ts | 3 +- modules/core/src/dto/list.dto.ts | 2 +- modules/core/src/dto/metadata.dto.ts | 16 ++++++++ modules/core/src/dto/money.dto.ts | 2 +- .../list-invoices/list-invoices.controller.ts | 9 +---- .../presenter/list-invoices.presenter.ts | 33 ++++++++++------ .../src/common/dto/invoices.response.dto.ts | 6 ++- packages/rdx-criteria/src/critera.ts | 39 +++++++++++++++++++ .../src/criteria-from-url-converter.ts | 3 +- .../src/criteria-to-sequelize-converter.ts | 3 +- packages/rdx-criteria/src/index.ts | 2 +- 11 files changed, 92 insertions(+), 26 deletions(-) create mode 100644 modules/core/src/dto/metadata.dto.ts create mode 100644 packages/rdx-criteria/src/critera.ts diff --git a/modules/core/src/dto/index.ts b/modules/core/src/dto/index.ts index ab04d103..a02fd240 100644 --- a/modules/core/src/dto/index.ts +++ b/modules/core/src/dto/index.ts @@ -1,5 +1,6 @@ -export * from "./list.dto"; export * from "./error.dto"; +export * from "./list.dto"; +export * from "./metadata.dto"; export * from "./money.dto"; export * from "./percentage.dto"; export * from "./quantity.dto"; diff --git a/modules/core/src/dto/list.dto.ts b/modules/core/src/dto/list.dto.ts index 4642eaf9..1608bdb8 100644 --- a/modules/core/src/dto/list.dto.ts +++ b/modules/core/src/dto/list.dto.ts @@ -1,6 +1,6 @@ export interface IListResponseDTO { page: number; - perpage: number; + per_page: number; total_pages: number; total_items: number; items: T[]; diff --git a/modules/core/src/dto/metadata.dto.ts b/modules/core/src/dto/metadata.dto.ts new file mode 100644 index 00000000..74974baa --- /dev/null +++ b/modules/core/src/dto/metadata.dto.ts @@ -0,0 +1,16 @@ +export interface IMetadataDTO { + entity: string; + version: string; + [key: string]: any; // <- para campos adicionales futuros + + // Futuros campos opcionales que podrĂ­an ser Ăștiles: + // source?: 'api' | 'manual' | 'imported' | string; + // related_id?: string; + // related_entity?: string; + // created_by?: string; + // created_at?: string; + // updated_by?: string; + // updated_at?: string; + // permissions?: Array<'read' | 'edit' | 'delete' | string>; + // visibility?: 'public' | 'private' | 'restricted' | string; +} diff --git a/modules/core/src/dto/money.dto.ts b/modules/core/src/dto/money.dto.ts index 45b52d80..3d3c1035 100644 --- a/modules/core/src/dto/money.dto.ts +++ b/modules/core/src/dto/money.dto.ts @@ -4,7 +4,7 @@ import Joi from "joi"; export interface IMoneyDTO { amount: number | null; scale: number; - currencycode: string; + currency_code: string; } export interface IMoneyRequestDTO extends IMoneyDTO {} diff --git a/modules/invoices/src/api/presentation/list-invoices/list-invoices.controller.ts b/modules/invoices/src/api/presentation/list-invoices/list-invoices.controller.ts index d48dc2e3..dd9d7d9d 100644 --- a/modules/invoices/src/api/presentation/list-invoices/list-invoices.controller.ts +++ b/modules/invoices/src/api/presentation/list-invoices/list-invoices.controller.ts @@ -18,14 +18,7 @@ export class ListInvoicesController extends ExpressController { return this.handleError(invoicesOrError.error); } - return this.ok( - this.presenter.toDTO( - invoicesOrError.data /*, { - page: criteria.pagination.offset, - limit: criteria.pagination.limit, - }*/ - ) - ); + return this.ok(this.presenter.toDTO(invoicesOrError.data, criteria)); } private handleError(error: Error) { diff --git a/modules/invoices/src/api/presentation/list-invoices/presenter/list-invoices.presenter.ts b/modules/invoices/src/api/presentation/list-invoices/presenter/list-invoices.presenter.ts index 7b684055..74caf81c 100644 --- a/modules/invoices/src/api/presentation/list-invoices/presenter/list-invoices.presenter.ts +++ b/modules/invoices/src/api/presentation/list-invoices/presenter/list-invoices.presenter.ts @@ -1,15 +1,23 @@ +import { IListResponseDTO } from "@erp/core"; +import { Criteria } from "@repo/rdx-criteria"; import { Collection } from "@repo/rdx-utils"; import { IListInvoicesResponseDTO } from "../../../../common/dto"; import { Invoice } from "../../../domain"; export interface IListInvoicesPresenter { - toDTO: (invoices: Collection) => IListInvoicesResponseDTO[]; + toDTO: ( + invoices: Collection, + criteria: Criteria + ) => IListResponseDTO; } export const listInvoicesPresenter: IListInvoicesPresenter = { - toDTO: (invoices: Collection): IListInvoicesResponseDTO[] => { + toDTO: ( + invoices: Collection, + criteria: Criteria + ): IListResponseDTO => { const items = invoices.map((invoice) => { - const result = { + return { id: invoice.id.toPrimitive(), invoice_status: invoice.status.toString(), @@ -18,24 +26,27 @@ export const listInvoicesPresenter: IListInvoicesPresenter = { issue_date: invoice.issueDate.toISOString(), operation_date: invoice.operationDate.toISOString(), language_code: "ES", + currency: invoice.invoiceCurrency.toString(), subtotal: invoice.calculateSubtotal().toPrimitive(), total: invoice.calculateTotal().toPrimitive(), //recipient: InvoiceParticipantPresenter(invoice.recipient), - }; - return result; + metadata: { + entity: "invoice", + }, + } as IListInvoicesResponseDTO; }); - invoices.size(); + const totalItems = invoices.total(); return { - //page, - //per_page: limit, - //total_pages: Math.ceil(invoices.total() / limit), - //total_items: totalCount, - items, + page: criteria.pageNumber, + per_page: criteria.pageSize, + total_pages: Math.ceil(totalItems / criteria.pageSize), + total_items: totalItems, + items: items, }; }, }; diff --git a/modules/invoices/src/common/dto/invoices.response.dto.ts b/modules/invoices/src/common/dto/invoices.response.dto.ts index 44a334ba..204c568a 100644 --- a/modules/invoices/src/common/dto/invoices.response.dto.ts +++ b/modules/invoices/src/common/dto/invoices.response.dto.ts @@ -1,4 +1,4 @@ -import { IMoneyDTO, IQuantityDTO } from "@erp/core"; +import { IMetadataDTO, IMoneyDTO, IQuantityDTO } from "@erp/core"; export interface IListInvoicesResponseDTO { id: string; @@ -13,6 +13,8 @@ export interface IListInvoicesResponseDTO { subtotal: IMoneyDTO; total: IMoneyDTO; + + metadata?: IMetadataDTO; } export interface IGetInvoiceResponseDTO { @@ -40,6 +42,8 @@ export interface IGetInvoiceResponseDTO { }[]; //customer: + + metadata?: IMetadataDTO; } export interface ICreateInvoiceResponseDTO { diff --git a/packages/rdx-criteria/src/critera.ts b/packages/rdx-criteria/src/critera.ts new file mode 100644 index 00000000..b6bcf563 --- /dev/null +++ b/packages/rdx-criteria/src/critera.ts @@ -0,0 +1,39 @@ +import { Criteria as BaseCriteria, Filters, FiltersPrimitives, Order } from "@codelytv/criteria"; +import { INITIAL_PAGE_INDEX, INITIAL_PAGE_SIZE } from './defaults'; + +export class Criteria extends BaseCriteria { + /** + * Creates a new Criteria instance. + * + * @param filters - The filters to apply. + * @param order - The order to apply. + * @param pageSize - The size of the page. + * @param pageNumber - The number of the page. + */ + + constructor( + public readonly filters: Filters, + public readonly order: Order, + public readonly pageSize: number, + public readonly pageNumber: number + ) { + super(filters, order, pageSize, pageNumber); + } + + static fromPrimitives( + filters: FiltersPrimitives[], + orderBy: string | null, + orderType: string | null, + pageSize: number | null, + pageNumber: number | null, +): Criteria { + + + return new Criteria( + Filters.fromPrimitives(filters), + Order.fromPrimitives(orderBy, orderType), + pageSize ?? INITIAL_PAGE_SIZE, + pageNumber ?? INITIAL_PAGE_INDEX, + ); +} +} diff --git a/packages/rdx-criteria/src/criteria-from-url-converter.ts b/packages/rdx-criteria/src/criteria-from-url-converter.ts index bab9cb3a..3521022a 100644 --- a/packages/rdx-criteria/src/criteria-from-url-converter.ts +++ b/packages/rdx-criteria/src/criteria-from-url-converter.ts @@ -1,4 +1,5 @@ -import { Criteria, FiltersPrimitives } from "@codelytv/criteria"; +import { FiltersPrimitives } from "@codelytv/criteria"; +import { Criteria } from "./critera"; import { DEFAULT_ORDER, INITIAL_PAGE_INDEX, INITIAL_PAGE_SIZE } from "./defaults"; type defaultsType = { diff --git a/packages/rdx-criteria/src/criteria-to-sequelize-converter.ts b/packages/rdx-criteria/src/criteria-to-sequelize-converter.ts index 5f50b0cc..921992c1 100644 --- a/packages/rdx-criteria/src/criteria-to-sequelize-converter.ts +++ b/packages/rdx-criteria/src/criteria-to-sequelize-converter.ts @@ -1,5 +1,6 @@ -import { Criteria, Filter } from "@codelytv/criteria"; +import { Filter } from "@codelytv/criteria"; import { FindOptions, Op, OrderItem, WhereOptions } from "sequelize"; +import { Criteria } from "./critera"; type Mappings = { [key: string]: string }; diff --git a/packages/rdx-criteria/src/index.ts b/packages/rdx-criteria/src/index.ts index b51328ae..6366eade 100644 --- a/packages/rdx-criteria/src/index.ts +++ b/packages/rdx-criteria/src/index.ts @@ -1,4 +1,4 @@ -export * from "@codelytv/criteria"; +export * from "./critera"; export * from "./criteria-from-url-converter"; export * from "./criteria-to-sequelize-converter"; export * from "./defaults";