diff --git a/modules/core/src/api/application/presenters/index.ts b/modules/core/src/api/application/presenters/index.ts index 83e6546d..334a04cc 100644 --- a/modules/core/src/api/application/presenters/index.ts +++ b/modules/core/src/api/application/presenters/index.ts @@ -1,2 +1,3 @@ export * from "./presenter-registry"; export * from "./presenter-registry.interface"; +export * from "./presenter.interface"; diff --git a/modules/core/src/api/application/presenters/presenter-registry.interface.ts b/modules/core/src/api/application/presenters/presenter-registry.interface.ts index 57d27263..6f54c703 100644 --- a/modules/core/src/api/application/presenters/presenter-registry.interface.ts +++ b/modules/core/src/api/application/presenters/presenter-registry.interface.ts @@ -4,9 +4,8 @@ import { IPresenter } from "./presenter.interface"; * 🔑 Claves de proyección comunes para seleccionar presenters */ export type PresenterKey = { - resource: string; // "customer-invoice" - projection: string; //"detail" | "summary" | "created" | "status" | "export"; - format: string; //"json" | "pdf" | "csv" | "xml"; + projection: "FULL" | "LIST" | "REPORT" | (string & {}); + format?: "JSON" | "PDF" | "CSV" | (string & {}); version?: number; // 1 | 2 locale?: string; // es | en | fr }; @@ -53,5 +52,9 @@ export interface IPresenterRegistry { registerPresenter( key: PresenterKey, presenter: IPresenter - ): void; + ): this; + + registerPresenters( + presenters: Array<{ key: PresenterKey; presenter: IPresenter }> + ): this; } diff --git a/modules/core/src/api/application/presenters/presenter-registry.ts b/modules/core/src/api/application/presenters/presenter-registry.ts index 155e2f6a..e867cb63 100644 --- a/modules/core/src/api/application/presenters/presenter-registry.ts +++ b/modules/core/src/api/application/presenters/presenter-registry.ts @@ -5,8 +5,23 @@ import { IPresenter } from "./presenter.interface"; export class InMemoryPresenterRegistry implements IPresenterRegistry { private registry: Map> = new Map(); + private _normalizeKey(key: PresenterKey): PresenterKey { + return { + ...key, + format: key.format ?? "JSON", // 👈 valor por defecto + }; + } + + private _registerPresenter( + key: PresenterKey, + presenter: IPresenter + ): void { + const exactKey = this._buildKey(this._normalizeKey(key)); + this.registry.set(exactKey, presenter); + } + getPresenter(key: PresenterKey): IPresenter { - const exactKey = this._buildKey(key); + const exactKey = this._buildKey(this._normalizeKey(key)); // 1) Intentar clave exacta if (this.registry.has(exactKey)) { @@ -43,20 +58,28 @@ export class InMemoryPresenterRegistry implements IPresenterRegistry { registerPresenter( key: PresenterKey, presenter: IPresenter - ): void { - const exactKey = this._buildKey(key); - this.registry.set(exactKey, presenter); + ): this { + this._registerPresenter(key, presenter); + return this; + } + /** + * ✅ Registro en lote de presentadores. + */ + registerPresenters( + presenters: Array<{ key: PresenterKey; presenter: IPresenter }> + ): this { + presenters.forEach(({ key, presenter }) => this._registerPresenter(key, presenter)); + return this; } /** * 🔹 Construye la clave única para el registro. */ private _buildKey(key: PresenterKey): string { - const { resource, projection, format, version, locale } = key; + const { projection, format, version, locale } = key; return [ - resource.toLowerCase(), projection.toLowerCase(), - format.toLowerCase(), + format!.toLowerCase(), version ?? "latest", locale ?? "default", ].join("::"); diff --git a/modules/core/src/api/application/presenters/presenter.interface.ts b/modules/core/src/api/application/presenters/presenter.interface.ts index 3703cbdd..0713058e 100644 --- a/modules/core/src/api/application/presenters/presenter.interface.ts +++ b/modules/core/src/api/application/presenters/presenter.interface.ts @@ -1,32 +1,6 @@ export type DTO = T; export type BinaryOutput = Buffer; // Puedes ampliar a Readable si usas streams -interface ISyncPresenter { - toOutput(source: TSource): TOutput; +export interface IPresenter { + toOutput(source: TSource): TOutput | Promise; } - -interface IAsyncPresenter { - toOutput(source: TSource): Promise; -} - -/** - * Proyección SINCRÓNICA de colecciones. - * Útil para listados paginados, exportaciones ligeras, etc. - */ -/*export interface ISyncBulkPresenter { - toOutput(source: TSource): TOutput; -}*/ - -/** - * Proyección ASÍNCRONA de colecciones. - * Útil para generar varios PDFs/CSVs. - */ -/*export interface IAsyncBulkPresenter { - toOutput(source: TSource): Promise; -}*/ - -export type IPresenter = - | ISyncPresenter - | IAsyncPresenter; -//| ISyncBulkPresenter -//| IAsyncBulkPresenter; diff --git a/modules/core/src/api/infrastructure/mappers/mapper-registry.interface.ts b/modules/core/src/api/infrastructure/mappers/mapper-registry.interface.ts index c588de78..b4491030 100644 --- a/modules/core/src/api/infrastructure/mappers/mapper-registry.interface.ts +++ b/modules/core/src/api/infrastructure/mappers/mapper-registry.interface.ts @@ -2,7 +2,7 @@ * 🔑 Claves de proyección comunes para seleccionar mappers en lectura. * Puedes extender con otras cadenas según tus necesidades ("SUMMARY", "EXPORT", etc.). */ -export type MapperProjectionKey = "FULL" | "LIST" | "REPORTS" | (string & {}); +export type MapperProjectionKey = "FULL" | "LIST" | "REPORT" | (string & {}); /** * 🏗️ Registro/Fábrica de mappers (Strategy/Factory) diff --git a/modules/customer-invoices/src/api/application/create-customer-invoice/assembler/index.ts b/modules/customer-invoices/src/api/application/create-customer-invoice/assembler/index.ts deleted file mode 100644 index 330393fe..00000000 --- a/modules/customer-invoices/src/api/application/create-customer-invoice/assembler/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./create-customer-invoices.assembler"; diff --git a/modules/customer-invoices/src/api/application/create-customer-invoice/index.ts b/modules/customer-invoices/src/api/application/create-customer-invoice/index.ts index 29bbecc9..ec56b240 100644 --- a/modules/customer-invoices/src/api/application/create-customer-invoice/index.ts +++ b/modules/customer-invoices/src/api/application/create-customer-invoice/index.ts @@ -1,2 +1,2 @@ -export * from "./assembler"; +export * from "./presenter"; export * from "./create-customer-invoice.use-case"; diff --git a/modules/customer-invoices/src/api/application/create-customer-invoice/assembler/create-customer-invoice-items.assembler.ts b/modules/customer-invoices/src/api/application/create-customer-invoice/presenter/create-customer-invoice-items.presenter.ts similarity index 96% rename from modules/customer-invoices/src/api/application/create-customer-invoice/assembler/create-customer-invoice-items.assembler.ts rename to modules/customer-invoices/src/api/application/create-customer-invoice/presenter/create-customer-invoice-items.presenter.ts index 980ac9d5..30fdb652 100644 --- a/modules/customer-invoices/src/api/application/create-customer-invoice/assembler/create-customer-invoice-items.assembler.ts +++ b/modules/customer-invoices/src/api/application/create-customer-invoice/presenter/create-customer-invoice-items.presenter.ts @@ -4,7 +4,7 @@ import { CustomerInvoice } from "../../../domain"; type CreateCustomerInvoiceItemsByInvoiceIdResponseDTO = CreateCustomerInvoiceResponseDTO["items"]; -export class CreateCustomerInvoiceItemsAssembler { +export class CreateCustomerInvoiceItemsPresenter { toDTO(invoice: CustomerInvoice): CreateCustomerInvoiceItemsByInvoiceIdResponseDTO { const { items } = invoice; return items.map((item, index) => ({ diff --git a/modules/customer-invoices/src/api/application/create-customer-invoice/assembler/create-customer-invoices.assembler.ts b/modules/customer-invoices/src/api/application/create-customer-invoice/presenter/create-customer-invoices.presenter.ts similarity index 84% rename from modules/customer-invoices/src/api/application/create-customer-invoice/assembler/create-customer-invoices.assembler.ts rename to modules/customer-invoices/src/api/application/create-customer-invoice/presenter/create-customer-invoices.presenter.ts index 380fba18..ff878368 100644 --- a/modules/customer-invoices/src/api/application/create-customer-invoice/assembler/create-customer-invoices.assembler.ts +++ b/modules/customer-invoices/src/api/application/create-customer-invoice/presenter/create-customer-invoices.presenter.ts @@ -1,17 +1,17 @@ import { UpdateCustomerInvoiceByIdResponseDTO } from "@erp/customer-invoices/common/dto"; import { toEmptyString } from "@repo/rdx-ddd"; import { CustomerInvoice } from "../../../domain"; -import { CreateCustomerInvoiceItemsAssembler } from "./create-customer-invoice-items.assembler"; +import { CreateCustomerInvoiceItemsPresenter } from "./create-customer-invoice-items.presenter"; -export class CreateCustomerInvoiceAssembler { - private _itemsAssembler!: CreateCustomerInvoiceItemsAssembler; +export class CreateCustomerInvoicePresenter { + private _itemsPresenter!: CreateCustomerInvoiceItemsPresenter; constructor() { - this._itemsAssembler = new CreateCustomerInvoiceItemsAssembler(); + this._itemsPresenter = new CreateCustomerInvoiceItemsPresenter(); } public toDTO(invoice: CustomerInvoice): UpdateCustomerInvoiceByIdResponseDTO { - const items = this._itemsAssembler.toDTO(invoice); + const items = this._itemsPresenter.toDTO(invoice); return { id: invoice.id.toPrimitive(), diff --git a/modules/customer-invoices/src/api/application/create-customer-invoice/presenter/index.ts b/modules/customer-invoices/src/api/application/create-customer-invoice/presenter/index.ts new file mode 100644 index 00000000..2ff37706 --- /dev/null +++ b/modules/customer-invoices/src/api/application/create-customer-invoice/presenter/index.ts @@ -0,0 +1 @@ +export * from "./create-customer-invoices.presenter"; diff --git a/modules/customer-invoices/src/api/application/get-customer-invoice/assembler/index.ts b/modules/customer-invoices/src/api/application/get-customer-invoice/assembler/index.ts deleted file mode 100644 index 346d890f..00000000 --- a/modules/customer-invoices/src/api/application/get-customer-invoice/assembler/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./get-invoice.assembler"; diff --git a/modules/customer-invoices/src/api/application/get-customer-invoice/index.ts b/modules/customer-invoices/src/api/application/get-customer-invoice/index.ts index c8eebea6..c9051f91 100644 --- a/modules/customer-invoices/src/api/application/get-customer-invoice/index.ts +++ b/modules/customer-invoices/src/api/application/get-customer-invoice/index.ts @@ -1,2 +1,2 @@ -export * from "./assembler"; +export * from "./presenter"; export * from "./get-customer-invoice.use-case"; diff --git a/modules/customer-invoices/src/api/application/get-customer-invoice/assembler/InvoiceItem.presenter.ts.bak b/modules/customer-invoices/src/api/application/get-customer-invoice/presenter/InvoiceItem.presenter.ts.bak similarity index 92% rename from modules/customer-invoices/src/api/application/get-customer-invoice/assembler/InvoiceItem.presenter.ts.bak rename to modules/customer-invoices/src/api/application/get-customer-invoice/presenter/InvoiceItem.presenter.ts.bak index a208bc97..2ee2211c 100644 --- a/modules/customer-invoices/src/api/application/get-customer-invoice/assembler/InvoiceItem.presenter.ts.bak +++ b/modules/customer-invoices/src/api/application/get-customer-invoice/presenter/InvoiceItem.presenter.ts.bak @@ -2,7 +2,7 @@ import { CustomerInvoiceItem } from "#/server/domain"; import { IInvoicingContext } from "#/server/intrastructure"; import { Collection } from "@rdx/core"; -export const customerInvoiceItemAssembler = (items: Collection, context: IInvoicingContext) => +export const customerInvoiceItemPresenter = (items: Collection, context: IInvoicingContext) => items.totalCount > 0 ? items.items.map((item: CustomerInvoiceItem) => ({ description: item.description.toString(), diff --git a/modules/customer-invoices/src/api/application/get-customer-invoice/assembler/InvoiceParticipant.presenter.ts.bak b/modules/customer-invoices/src/api/application/get-customer-invoice/presenter/InvoiceParticipant.presenter.ts.bak similarity index 71% rename from modules/customer-invoices/src/api/application/get-customer-invoice/assembler/InvoiceParticipant.presenter.ts.bak rename to modules/customer-invoices/src/api/application/get-customer-invoice/presenter/InvoiceParticipant.presenter.ts.bak index ba67e564..bc6cdebe 100644 --- a/modules/customer-invoices/src/api/application/get-customer-invoice/assembler/InvoiceParticipant.presenter.ts.bak +++ b/modules/customer-invoices/src/api/application/get-customer-invoice/presenter/InvoiceParticipant.presenter.ts.bak @@ -1,9 +1,9 @@ import { ICustomerInvoiceParticipant } from "@/contexts/invoicing/domain"; import { IInvoicingContext } from "@/contexts/invoicing/intrastructure/InvoicingContext"; import { ICreateCustomerInvoice_Participant_Response_DTO } from "@shared/contexts"; -import { CustomerInvoiceParticipantAddressAssembler } from "./CustomerInvoiceParticipantAddress.assembler"; +import { CustomerInvoiceParticipantAddressPresenter } from "./CustomerInvoiceParticipantAddress.presenter"; -export const CustomerInvoiceParticipantAssembler = async ( +export const CustomerInvoiceParticipantPresenter = async ( participant: ICustomerInvoiceParticipant, context: IInvoicingContext, ): Promise => { @@ -14,11 +14,11 @@ export const CustomerInvoiceParticipantAssembler = async ( last_name: participant.lastName.toString(), company_name: participant.companyName.toString(), - billing_address: await CustomerInvoiceParticipantAddressAssembler( + billing_address: await CustomerInvoiceParticipantAddressPresenter( participant.billingAddress!, context, ), - shipping_address: await CustomerInvoiceParticipantAddressAssembler( + shipping_address: await CustomerInvoiceParticipantAddressPresenter( participant.shippingAddress!, context, ), diff --git a/modules/customer-invoices/src/api/application/get-customer-invoice/assembler/InvoiceParticipantAddress.presenter.ts.bak b/modules/customer-invoices/src/api/application/get-customer-invoice/presenter/InvoiceParticipantAddress.presenter.ts.bak similarity index 92% rename from modules/customer-invoices/src/api/application/get-customer-invoice/assembler/InvoiceParticipantAddress.presenter.ts.bak rename to modules/customer-invoices/src/api/application/get-customer-invoice/presenter/InvoiceParticipantAddress.presenter.ts.bak index ac630261..b006790b 100644 --- a/modules/customer-invoices/src/api/application/get-customer-invoice/assembler/InvoiceParticipantAddress.presenter.ts.bak +++ b/modules/customer-invoices/src/api/application/get-customer-invoice/presenter/InvoiceParticipantAddress.presenter.ts.bak @@ -2,7 +2,7 @@ import { CustomerInvoiceParticipantAddress } from "@/contexts/invoicing/domain"; import { IInvoicingContext } from "@/contexts/invoicing/intrastructure/InvoicingContext"; import { ICreateCustomerInvoice_AddressParticipant_Response_DTO } from "@shared/contexts"; -export const CustomerInvoiceParticipantAddressAssembler = async ( +export const CustomerInvoiceParticipantAddressPresenter = async ( address: CustomerInvoiceParticipantAddress, context: IInvoicingContext, ): Promise => { diff --git a/modules/customer-invoices/src/api/application/get-customer-invoice/assembler/get-invoice-items.assembler.ts b/modules/customer-invoices/src/api/application/get-customer-invoice/presenter/get-invoice-items.presenter.ts similarity index 97% rename from modules/customer-invoices/src/api/application/get-customer-invoice/assembler/get-invoice-items.assembler.ts rename to modules/customer-invoices/src/api/application/get-customer-invoice/presenter/get-invoice-items.presenter.ts index d4c3bd93..36a65e9d 100644 --- a/modules/customer-invoices/src/api/application/get-customer-invoice/assembler/get-invoice-items.assembler.ts +++ b/modules/customer-invoices/src/api/application/get-customer-invoice/presenter/get-invoice-items.presenter.ts @@ -4,7 +4,7 @@ import { CustomerInvoice } from "../../../domain"; type GetCustomerInvoiceItemsByInvoiceIdResponseDTO = GetCustomerInvoiceByIdResponseDTO["items"]; -export class GetCustomerInvoiceItemsAssembler { +export class GetCustomerInvoiceItemsPresenter { toDTO(invoice: CustomerInvoice): GetCustomerInvoiceItemsByInvoiceIdResponseDTO { const { items } = invoice; diff --git a/modules/customer-invoices/src/api/application/get-customer-invoice/assembler/get-invoice.assembler.ts b/modules/customer-invoices/src/api/application/get-customer-invoice/presenter/get-invoice.presenter.ts similarity index 85% rename from modules/customer-invoices/src/api/application/get-customer-invoice/assembler/get-invoice.assembler.ts rename to modules/customer-invoices/src/api/application/get-customer-invoice/presenter/get-invoice.presenter.ts index 0428f84d..3ba1293c 100644 --- a/modules/customer-invoices/src/api/application/get-customer-invoice/assembler/get-invoice.assembler.ts +++ b/modules/customer-invoices/src/api/application/get-customer-invoice/presenter/get-invoice.presenter.ts @@ -1,17 +1,17 @@ import { UpdateCustomerInvoiceByIdResponseDTO } from "@erp/customer-invoices/common/dto"; import { toEmptyString } from "@repo/rdx-ddd"; import { CustomerInvoice } from "../../../domain"; -import { GetCustomerInvoiceItemsAssembler } from "./get-invoice-items.assembler"; +import { GetCustomerInvoiceItemsPresenter } from "./get-invoice-items.presenter"; -export class GetCustomerInvoiceAssembler { - private _itemsAssembler!: GetCustomerInvoiceItemsAssembler; +export class GetCustomerInvoicePresenter { + private _itemsPresenter!: GetCustomerInvoiceItemsPresenter; constructor() { - this._itemsAssembler = new GetCustomerInvoiceItemsAssembler(); + this._itemsPresenter = new GetCustomerInvoiceItemsPresenter(); } public toDTO(invoice: CustomerInvoice): UpdateCustomerInvoiceByIdResponseDTO { - const items = this._itemsAssembler.toDTO(invoice); + const items = this._itemsPresenter.toDTO(invoice); return { id: invoice.id.toString(), diff --git a/modules/customer-invoices/src/api/application/get-customer-invoice/presenter/index.ts b/modules/customer-invoices/src/api/application/get-customer-invoice/presenter/index.ts new file mode 100644 index 00000000..60624c19 --- /dev/null +++ b/modules/customer-invoices/src/api/application/get-customer-invoice/presenter/index.ts @@ -0,0 +1 @@ +export * from "./get-invoice.presenter"; diff --git a/modules/customer-invoices/src/api/application/list-customer-invoices/assembler/index.ts b/modules/customer-invoices/src/api/application/list-customer-invoices/assembler/index.ts deleted file mode 100644 index cb1b7b0b..00000000 --- a/modules/customer-invoices/src/api/application/list-customer-invoices/assembler/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./list-customer-invoices.assembler"; diff --git a/modules/customer-invoices/src/api/application/list-customer-invoices/index.ts b/modules/customer-invoices/src/api/application/list-customer-invoices/index.ts index abe60774..d290b557 100644 --- a/modules/customer-invoices/src/api/application/list-customer-invoices/index.ts +++ b/modules/customer-invoices/src/api/application/list-customer-invoices/index.ts @@ -1,2 +1,2 @@ -export * from "./assembler"; +export * from "./presenter"; export * from "./list-customer-invoices.use-case"; diff --git a/modules/customer-invoices/src/api/application/list-customer-invoices/presenter/index.ts b/modules/customer-invoices/src/api/application/list-customer-invoices/presenter/index.ts new file mode 100644 index 00000000..3db39470 --- /dev/null +++ b/modules/customer-invoices/src/api/application/list-customer-invoices/presenter/index.ts @@ -0,0 +1 @@ +export * from "./list-customer-invoices.presenter"; diff --git a/modules/customer-invoices/src/api/application/list-customer-invoices/assembler/list-customer-invoices.assembler.ts b/modules/customer-invoices/src/api/application/list-customer-invoices/presenter/list-customer-invoices.presenter.ts similarity index 88% rename from modules/customer-invoices/src/api/application/list-customer-invoices/assembler/list-customer-invoices.assembler.ts rename to modules/customer-invoices/src/api/application/list-customer-invoices/presenter/list-customer-invoices.presenter.ts index b708e07f..a6a94b5d 100644 --- a/modules/customer-invoices/src/api/application/list-customer-invoices/assembler/list-customer-invoices.assembler.ts +++ b/modules/customer-invoices/src/api/application/list-customer-invoices/presenter/list-customer-invoices.presenter.ts @@ -1,14 +1,17 @@ +import { IPresenter } from "@erp/core/api"; import { CustomerInvoiceListDTO } from "@erp/customer-invoices/api/infrastructure"; import { Criteria } from "@repo/rdx-criteria/server"; import { toEmptyString } from "@repo/rdx-ddd"; import { ArrayElement, Collection } from "@repo/rdx-utils"; import { CustomerInvoiceListResponseDTO } from "../../../../common/dto"; -export class ListCustomerInvoicesAssembler { - toDTO( - customerInvoices: Collection, - criteria: Criteria - ): CustomerInvoiceListResponseDTO { +export class ListCustomerInvoicesPresenter implements IPresenter { + toOutput(params: { + customerInvoices: Collection; + criteria: Criteria; + }): CustomerInvoiceListResponseDTO { + const { customerInvoices, criteria } = params; + const invoices = customerInvoices.map((invoice) => { const recipientDTO = invoice.recipient.toObjectString(); diff --git a/modules/customer-invoices/src/api/application/update-customer-invoice/assembler/index.ts b/modules/customer-invoices/src/api/application/update-customer-invoice/assembler/index.ts deleted file mode 100644 index 50071c2b..00000000 --- a/modules/customer-invoices/src/api/application/update-customer-invoice/assembler/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./update-invoice.assembler"; diff --git a/modules/customer-invoices/src/api/application/update-customer-invoice/index.ts b/modules/customer-invoices/src/api/application/update-customer-invoice/index.ts index 588c5eda..17c138c9 100644 --- a/modules/customer-invoices/src/api/application/update-customer-invoice/index.ts +++ b/modules/customer-invoices/src/api/application/update-customer-invoice/index.ts @@ -1,2 +1,2 @@ -export * from "./assembler"; +export * from "./presenter"; export * from "./update-customer-invoice.use-case"; diff --git a/modules/customer-invoices/src/api/application/update-customer-invoice/presenter/index.ts b/modules/customer-invoices/src/api/application/update-customer-invoice/presenter/index.ts new file mode 100644 index 00000000..74e5dbdb --- /dev/null +++ b/modules/customer-invoices/src/api/application/update-customer-invoice/presenter/index.ts @@ -0,0 +1 @@ +export * from "./update-invoice.presenter"; diff --git a/modules/customer-invoices/src/api/application/update-customer-invoice/assembler/update-invoice-items.assembler.ts b/modules/customer-invoices/src/api/application/update-customer-invoice/presenter/update-invoice-items.presenter.ts similarity index 96% rename from modules/customer-invoices/src/api/application/update-customer-invoice/assembler/update-invoice-items.assembler.ts rename to modules/customer-invoices/src/api/application/update-customer-invoice/presenter/update-invoice-items.presenter.ts index 39685934..6c58e592 100644 --- a/modules/customer-invoices/src/api/application/update-customer-invoice/assembler/update-invoice-items.assembler.ts +++ b/modules/customer-invoices/src/api/application/update-customer-invoice/presenter/update-invoice-items.presenter.ts @@ -5,7 +5,7 @@ import { CustomerInvoice } from "../../../domain"; type UpdateCustomerInvoiceItemsByInvoiceIdResponseDTO = UpdateCustomerInvoiceByIdResponseDTO["items"]; -export class UpdateCustomerInvoiceItemsAssembler { +export class UpdateCustomerInvoiceItemsPresenter { toDTO(invoice: CustomerInvoice): UpdateCustomerInvoiceItemsByInvoiceIdResponseDTO { const { items } = invoice; return items.map((item, index) => ({ diff --git a/modules/customer-invoices/src/api/application/update-customer-invoice/assembler/update-invoice.assembler.ts b/modules/customer-invoices/src/api/application/update-customer-invoice/presenter/update-invoice.presenter.ts similarity index 85% rename from modules/customer-invoices/src/api/application/update-customer-invoice/assembler/update-invoice.assembler.ts rename to modules/customer-invoices/src/api/application/update-customer-invoice/presenter/update-invoice.presenter.ts index 7b1e4d5e..79573da4 100644 --- a/modules/customer-invoices/src/api/application/update-customer-invoice/assembler/update-invoice.assembler.ts +++ b/modules/customer-invoices/src/api/application/update-customer-invoice/presenter/update-invoice.presenter.ts @@ -1,17 +1,17 @@ import { toEmptyString } from "@repo/rdx-ddd"; import { UpdateCustomerInvoiceByIdResponseDTO } from "../../../../common/dto"; import { CustomerInvoice } from "../../../domain"; -import { UpdateCustomerInvoiceItemsAssembler } from "./update-invoice-items.assembler"; +import { UpdateCustomerInvoiceItemsPresenter } from "./update-invoice-items.presenter"; -export class UpdateCustomerInvoiceAssembler { - private _itemsAssembler!: UpdateCustomerInvoiceItemsAssembler; +export class UpdateCustomerInvoicePresenter { + private _itemsPresenter!: UpdateCustomerInvoiceItemsPresenter; constructor() { - this._itemsAssembler = new UpdateCustomerInvoiceItemsAssembler(); + this._itemsPresenter = new UpdateCustomerInvoiceItemsPresenter(); } public toDTO(invoice: CustomerInvoice): UpdateCustomerInvoiceByIdResponseDTO { - const items = this._itemsAssembler.toDTO(invoice); + const items = this._itemsPresenter.toDTO(invoice); return { id: invoice.id.toPrimitive(), @@ -82,10 +82,10 @@ export class UpdateCustomerInvoiceAssembler { })) : [],*/ - //sender: {}, //await CustomerInvoiceParticipantAssembler(customerInvoice.senderId, context), + //sender: {}, //await CustomerInvoiceParticipantPresenter(customerInvoice.senderId, context), - /*recipient: await CustomerInvoiceParticipantAssembler(customerInvoice.recipient, context), - items: customerInvoiceItemAssembler(customerInvoice.items, context), + /*recipient: await CustomerInvoiceParticipantPresenter(customerInvoice.recipient, context), + items: customerInvoiceItemPresenter(customerInvoice.items, context), payment_term: { payment_type: "", diff --git a/modules/customer-invoices/src/api/infrastructure/dependencies.ts b/modules/customer-invoices/src/api/infrastructure/dependencies.ts index 804249db..48855129 100644 --- a/modules/customer-invoices/src/api/infrastructure/dependencies.ts +++ b/modules/customer-invoices/src/api/infrastructure/dependencies.ts @@ -6,15 +6,12 @@ import { SequelizeTransactionManager, } from "@erp/core/api"; import { - CreateCustomerInvoiceAssembler, CreateCustomerInvoiceUseCase, DeleteCustomerInvoiceUseCase, - GetCustomerInvoiceAssembler, GetCustomerInvoiceUseCase, - ListCustomerInvoicesAssembler, + ListCustomerInvoicesPresenter, ListCustomerInvoicesUseCase, ReportCustomerInvoiceUseCase, - UpdateCustomerInvoiceAssembler, UpdateCustomerInvoiceUseCase, } from "../application"; import { CustomerInvoiceService } from "../domain"; @@ -24,17 +21,12 @@ import { CustomerInvoiceRepository } from "./sequelize"; type InvoiceDeps = { transactionManager: SequelizeTransactionManager; mapperRegistry: IMapperRegistry; + presenterRegistry: IPresenterRegistry; repo: CustomerInvoiceRepository; service: CustomerInvoiceService; catalogs: { taxes: JsonTaxCatalogProvider; }; - presenters: { - list: ListCustomerInvoicesAssembler; - get: GetCustomerInvoiceAssembler; - create: CreateCustomerInvoiceAssembler; - update: UpdateCustomerInvoiceAssembler; - }; build: { list: () => ListCustomerInvoicesUseCase; get: () => GetCustomerInvoiceUseCase; @@ -50,7 +42,6 @@ let _mapperRegistry: IMapperRegistry | null = null; let _repo: CustomerInvoiceRepository | null = null; let _service: CustomerInvoiceService | null = null; -const _presenters: InvoiceDeps["presenters"] | null = null; let _catalogs: InvoiceDeps["catalogs"] | null = null; export function getInvoiceDependencies(params: ModuleParams): InvoiceDeps { @@ -73,43 +64,56 @@ export function getInvoiceDependencies(params: ModuleParams): InvoiceDeps { if (!_presenterRegistry) { _presenterRegistry = new InMemoryPresenterRegistry(); - _presenterRegistry.registerPresenter(key, mapper); - /*_presenters = { - list: new ListCustomerInvoicesAssembler(), // transforma domain → ListDTO - get: new GetCustomerInvoiceAssembler(), // transforma domain → DetailDTO - create: new CreateCustomerInvoiceAssembler(), // transforma domain → CreatedDTO - update: new UpdateCustomerInvoiceAssembler(), // transforma domain -> UpdateDTO - };*/ + _presenterRegistry.registerPresenter( + { + projection: "LIST", + }, + new ListCustomerInvoicesPresenter() + ); } return { transactionManager, repo: _repo, mapperRegistry: _mapperRegistry, + presenterRegistry: _presenterRegistry, service: _service, - presenters: _presenters, catalogs: _catalogs, + build: { list: () => - new ListCustomerInvoicesUseCase(_service!, transactionManager!, _presenters!.list), - get: () => new GetCustomerInvoiceUseCase(_service!, transactionManager!, _presenters!.get), + new ListCustomerInvoicesUseCase( + _service!, + transactionManager!, + _presenterRegistry?.getPresenter({ projection: "LIST" }) + ), + get: () => + new GetCustomerInvoiceUseCase( + _service!, + transactionManager!, + _presenterRegistry?.getPresenter({ projection: "FULL" }) + ), create: () => new CreateCustomerInvoiceUseCase( _service!, transactionManager!, - _presenters!.create, + _presenterRegistry?.getPresenter({ projection: "FULL" }), _catalogs!.taxes ), update: () => new UpdateCustomerInvoiceUseCase( _service!, transactionManager!, - _presenters!.update, + _presenterRegistry?.getPresenter({ projection: "FULL" }), _catalogs!.taxes ), delete: () => new DeleteCustomerInvoiceUseCase(_service!, transactionManager!), report: () => - new ReportCustomerInvoiceUseCase(_service!, transactionManager!, _presenters!.get), + new ReportCustomerInvoiceUseCase( + _service!, + transactionManager!, + _presenterRegistry?.getPresenter({ projection: "REPORT" }) + ), }, }; } diff --git a/modules/customers/src/api/application/create-customer/assembler/index.ts b/modules/customers/src/api/application/create-customer/assembler/index.ts deleted file mode 100644 index b384226f..00000000 --- a/modules/customers/src/api/application/create-customer/assembler/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./create-customers.assembler"; diff --git a/modules/customers/src/api/application/create-customer/index.ts b/modules/customers/src/api/application/create-customer/index.ts index 045226f6..d31522a4 100644 --- a/modules/customers/src/api/application/create-customer/index.ts +++ b/modules/customers/src/api/application/create-customer/index.ts @@ -1,2 +1,2 @@ -export * from "./assembler"; +export * from "./presenter"; export * from "./create-customer.use-case"; diff --git a/modules/customers/src/api/application/create-customer/assembler/create-customers.assembler.ts b/modules/customers/src/api/application/create-customer/presenter/create-customers.presenter.ts similarity index 97% rename from modules/customers/src/api/application/create-customer/assembler/create-customers.assembler.ts rename to modules/customers/src/api/application/create-customer/presenter/create-customers.presenter.ts index a883eac4..b719588e 100644 --- a/modules/customers/src/api/application/create-customer/assembler/create-customers.assembler.ts +++ b/modules/customers/src/api/application/create-customer/presenter/create-customers.presenter.ts @@ -2,7 +2,7 @@ import { toEmptyString } from "@repo/rdx-ddd"; import { CustomerCreationResponseDTO } from "../../../../common"; import { Customer } from "../../../domain"; -export class CreateCustomersAssembler { +export class CreateCustomersPresenter { public toDTO(customer: Customer): CustomerCreationResponseDTO { const address = customer.address.toPrimitive(); diff --git a/modules/customers/src/api/application/create-customer/presenter/index.ts b/modules/customers/src/api/application/create-customer/presenter/index.ts new file mode 100644 index 00000000..e63b640f --- /dev/null +++ b/modules/customers/src/api/application/create-customer/presenter/index.ts @@ -0,0 +1 @@ +export * from "./create-customers.presenter"; diff --git a/modules/customers/src/api/application/get-customer/assembler/index.ts b/modules/customers/src/api/application/get-customer/assembler/index.ts deleted file mode 100644 index 91baddfe..00000000 --- a/modules/customers/src/api/application/get-customer/assembler/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./get-customer.assembler"; diff --git a/modules/customers/src/api/application/get-customer/index.ts b/modules/customers/src/api/application/get-customer/index.ts index 86a0415b..41efed3f 100644 --- a/modules/customers/src/api/application/get-customer/index.ts +++ b/modules/customers/src/api/application/get-customer/index.ts @@ -1,2 +1,2 @@ -export * from "./assembler"; +export * from "./presenter"; export * from "./get-customer.use-case"; diff --git a/modules/customers/src/api/application/get-customer/assembler/InvoiceItem.presenter.ts.bak b/modules/customers/src/api/application/get-customer/presenter/InvoiceItem.presenter.ts.bak similarity index 91% rename from modules/customers/src/api/application/get-customer/assembler/InvoiceItem.presenter.ts.bak rename to modules/customers/src/api/application/get-customer/presenter/InvoiceItem.presenter.ts.bak index 34672cad..3a6e2c6e 100644 --- a/modules/customers/src/api/application/get-customer/assembler/InvoiceItem.presenter.ts.bak +++ b/modules/customers/src/api/application/get-customer/presenter/InvoiceItem.presenter.ts.bak @@ -2,7 +2,7 @@ import { CustomerItem } from "#/server/domain"; import { IInvoicingContext } from "#/server/intrastructure"; import { Collection } from "@rdx/core"; -export const customerItemAssembler = (items: Collection, context: IInvoicingContext) => +export const customerItemPresenter = (items: Collection, context: IInvoicingContext) => items.totalCount > 0 ? items.items.map((item: CustomerItem) => ({ description: item.description.toString(), diff --git a/modules/customers/src/api/application/get-customer/assembler/InvoiceParticipant.presenter.ts.bak b/modules/customers/src/api/application/get-customer/presenter/InvoiceParticipant.presenter.ts.bak similarity index 72% rename from modules/customers/src/api/application/get-customer/assembler/InvoiceParticipant.presenter.ts.bak rename to modules/customers/src/api/application/get-customer/presenter/InvoiceParticipant.presenter.ts.bak index 25772cf5..d10d3001 100644 --- a/modules/customers/src/api/application/get-customer/assembler/InvoiceParticipant.presenter.ts.bak +++ b/modules/customers/src/api/application/get-customer/presenter/InvoiceParticipant.presenter.ts.bak @@ -1,9 +1,9 @@ import { ICustomerParticipant } from "@/contexts/invoicing/domain"; import { IInvoicingContext } from "@/contexts/invoicing/intrastructure/InvoicingContext"; import { ICreateCustomer_Participant_Response_DTO } from "@shared/contexts"; -import { CustomerParticipantAddressAssembler } from "./CustomerParticipantAddress.assembler"; +import { CustomerParticipantAddressPresenter } from "./CustomerParticipantAddress.presenter"; -export const CustomerParticipantAssembler = async ( +export const CustomerParticipantPresenter = async ( participant: ICustomerParticipant, context: IInvoicingContext, ): Promise => { @@ -14,11 +14,11 @@ export const CustomerParticipantAssembler = async ( last_name: participant.lastName.toString(), company_name: participant.companyName.toString(), - billing_address: await CustomerParticipantAddressAssembler( + billing_address: await CustomerParticipantAddressPresenter( participant.billingAddress!, context, ), - shipping_address: await CustomerParticipantAddressAssembler( + shipping_address: await CustomerParticipantAddressPresenter( participant.shippingAddress!, context, ), diff --git a/modules/customers/src/api/application/get-customer/assembler/InvoiceParticipantAddress.presenter.ts.bak b/modules/customers/src/api/application/get-customer/presenter/InvoiceParticipantAddress.presenter.ts.bak similarity index 92% rename from modules/customers/src/api/application/get-customer/assembler/InvoiceParticipantAddress.presenter.ts.bak rename to modules/customers/src/api/application/get-customer/presenter/InvoiceParticipantAddress.presenter.ts.bak index 1575a366..6266fda0 100644 --- a/modules/customers/src/api/application/get-customer/assembler/InvoiceParticipantAddress.presenter.ts.bak +++ b/modules/customers/src/api/application/get-customer/presenter/InvoiceParticipantAddress.presenter.ts.bak @@ -2,7 +2,7 @@ import { CustomerParticipantAddress } from "@/contexts/invoicing/domain"; import { IInvoicingContext } from "@/contexts/invoicing/intrastructure/InvoicingContext"; import { ICreateCustomer_AddressParticipant_Response_DTO } from "@shared/contexts"; -export const CustomerParticipantAddressAssembler = async ( +export const CustomerParticipantAddressPresenter = async ( address: CustomerParticipantAddress, context: IInvoicingContext, ): Promise => { diff --git a/modules/customers/src/api/application/get-customer/assembler/get-customer.assembler.ts b/modules/customers/src/api/application/get-customer/presenter/get-customer.presenter.ts similarity index 98% rename from modules/customers/src/api/application/get-customer/assembler/get-customer.assembler.ts rename to modules/customers/src/api/application/get-customer/presenter/get-customer.presenter.ts index 89f10ce1..ae8523d4 100644 --- a/modules/customers/src/api/application/get-customer/assembler/get-customer.assembler.ts +++ b/modules/customers/src/api/application/get-customer/presenter/get-customer.presenter.ts @@ -2,7 +2,7 @@ import { toEmptyString } from "@repo/rdx-ddd"; import { GetCustomerByIdResponseDTO } from "../../../../common/dto"; import { Customer } from "../../../domain"; -export class GetCustomerAssembler { +export class GetCustomerPresenter { toDTO(customer: Customer): GetCustomerByIdResponseDTO { const address = customer.address.toPrimitive(); diff --git a/modules/customers/src/api/application/get-customer/presenter/index.ts b/modules/customers/src/api/application/get-customer/presenter/index.ts new file mode 100644 index 00000000..f713440d --- /dev/null +++ b/modules/customers/src/api/application/get-customer/presenter/index.ts @@ -0,0 +1 @@ +export * from "./get-customer.presenter"; diff --git a/modules/customers/src/api/application/list-customers/assembler/index.ts b/modules/customers/src/api/application/list-customers/assembler/index.ts deleted file mode 100644 index 63121daa..00000000 --- a/modules/customers/src/api/application/list-customers/assembler/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./list-customers.assembler"; diff --git a/modules/customers/src/api/application/list-customers/index.ts b/modules/customers/src/api/application/list-customers/index.ts index 498e9b23..7c451c94 100644 --- a/modules/customers/src/api/application/list-customers/index.ts +++ b/modules/customers/src/api/application/list-customers/index.ts @@ -1,2 +1,2 @@ -export * from "./assembler"; +export * from "./presenter"; export * from "./list-customers.use-case"; diff --git a/modules/customers/src/api/application/list-customers/presenter/index.ts b/modules/customers/src/api/application/list-customers/presenter/index.ts new file mode 100644 index 00000000..10b03959 --- /dev/null +++ b/modules/customers/src/api/application/list-customers/presenter/index.ts @@ -0,0 +1 @@ +export * from "./list-customers.presenter"; diff --git a/modules/customers/src/api/application/list-customers/assembler/list-customers.assembler.ts b/modules/customers/src/api/application/list-customers/presenter/list-customers.presenter.ts similarity index 98% rename from modules/customers/src/api/application/list-customers/assembler/list-customers.assembler.ts rename to modules/customers/src/api/application/list-customers/presenter/list-customers.presenter.ts index fe9bf5b1..17d92f6f 100644 --- a/modules/customers/src/api/application/list-customers/assembler/list-customers.assembler.ts +++ b/modules/customers/src/api/application/list-customers/presenter/list-customers.presenter.ts @@ -4,7 +4,7 @@ import { Collection } from "@repo/rdx-utils"; import { CustomerListResponsetDTO } from "../../../../common/dto"; import { Customer } from "../../../domain"; -export class ListCustomersAssembler { +export class ListCustomersPresenter { toDTO(customers: Collection, criteria: Criteria): CustomerListResponsetDTO { const items: CustomerListResponsetDTO["items"] = customers.map((customer) => { const address = customer.address.toPrimitive(); diff --git a/modules/customers/src/api/application/update-customer/assembler/index.ts b/modules/customers/src/api/application/update-customer/assembler/index.ts deleted file mode 100644 index a659dbae..00000000 --- a/modules/customers/src/api/application/update-customer/assembler/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./update-customer.assembler"; diff --git a/modules/customers/src/api/application/update-customer/index.ts b/modules/customers/src/api/application/update-customer/index.ts index e236da9c..afa93ec4 100644 --- a/modules/customers/src/api/application/update-customer/index.ts +++ b/modules/customers/src/api/application/update-customer/index.ts @@ -1,2 +1,2 @@ -export * from "./assembler"; +export * from "./presenter"; export * from "./update-customer.use-case"; diff --git a/modules/customers/src/api/application/update-customer/presenter/index.ts b/modules/customers/src/api/application/update-customer/presenter/index.ts new file mode 100644 index 00000000..7ac3153a --- /dev/null +++ b/modules/customers/src/api/application/update-customer/presenter/index.ts @@ -0,0 +1 @@ +export * from "./update-customer.presenter"; diff --git a/modules/customers/src/api/application/update-customer/assembler/update-customer.assembler.ts b/modules/customers/src/api/application/update-customer/presenter/update-customer.presenter.ts similarity index 98% rename from modules/customers/src/api/application/update-customer/assembler/update-customer.assembler.ts rename to modules/customers/src/api/application/update-customer/presenter/update-customer.presenter.ts index 21156994..f72b74d3 100644 --- a/modules/customers/src/api/application/update-customer/assembler/update-customer.assembler.ts +++ b/modules/customers/src/api/application/update-customer/presenter/update-customer.presenter.ts @@ -2,7 +2,7 @@ import { toEmptyString } from "@repo/rdx-ddd"; import { UpdateCustomerByIdResponseDTO } from "../../../../common/dto"; import { Customer } from "../../../domain"; -export class UpdateCustomerAssembler { +export class UpdateCustomerPresenter { toDTO(customer: Customer): UpdateCustomerByIdResponseDTO { const address = customer.address.toPrimitive(); diff --git a/modules/customers/src/api/infrastructure/dependencies.ts b/modules/customers/src/api/infrastructure/dependencies.ts index 77fa309a..154d0c96 100644 --- a/modules/customers/src/api/infrastructure/dependencies.ts +++ b/modules/customers/src/api/infrastructure/dependencies.ts @@ -1,15 +1,17 @@ -import type { ModuleParams } from "@erp/core/api"; -import { SequelizeTransactionManager } from "@erp/core/api"; +import type { IMapperRegistry, IPresenterRegistry, ModuleParams } from "@erp/core/api"; +import { + InMemoryMapperRegistry, + InMemoryPresenterRegistry, + SequelizeTransactionManager, +} from "@erp/core/api"; import { CreateCustomerUseCase, - CreateCustomersAssembler, DeleteCustomerUseCase, GetCustomerAssembler, GetCustomerUseCase, ListCustomersAssembler, ListCustomersUseCase, - UpdateCustomerAssembler, UpdateCustomerUseCase, } from "../application"; import { CustomerService } from "../domain"; @@ -18,15 +20,10 @@ import { CustomerRepository } from "./sequelize"; type CustomerDeps = { transactionManager: SequelizeTransactionManager; + mapperRegistry: IMapperRegistry; + presenterRegistry: IPresenterRegistry; repo: CustomerRepository; - mapper: CustomerMapper; service: CustomerService; - assemblers: { - list: ListCustomersAssembler; - get: GetCustomerAssembler; - create: CreateCustomersAssembler; - update: UpdateCustomerAssembler; - }; build: { list: () => ListCustomersUseCase; get: () => GetCustomerUseCase; @@ -34,39 +31,56 @@ type CustomerDeps = { update: () => UpdateCustomerUseCase; delete: () => DeleteCustomerUseCase; }; - presenters: { - // list: (res: Response) => ListPresenter; - }; }; +let _presenterRegistry: IPresenterRegistry | null = null; +let _mapperRegistry: IMapperRegistry | null = null; + let _repo: CustomerRepository | null = null; -let _mapper: CustomerMapper | null = null; let _service: CustomerService | null = null; -let _assemblers: CustomerDeps["assemblers"] | null = null; export function getCustomerDependencies(params: ModuleParams): CustomerDeps { const { database } = params; const transactionManager = new SequelizeTransactionManager(database); - if (!_mapper) _mapper = new CustomerMapper(); - if (!_repo) _repo = new CustomerRepository(_mapper); + if (!_mapperRegistry) { + _mapperRegistry = new InMemoryMapperRegistry(); + _mapperRegistry.registerDomainMapper("FULL", new CustomerMapper()); + } + + if (!_repo) _repo = new CustomerRepository({ mapperRegistry: _mapperRegistry }); if (!_service) _service = new CustomerService(_repo); - if (!_assemblers) { + if (!_presenterRegistry) { + _presenterRegistry = new InMemoryPresenterRegistry(); + + _presenterRegistry.registerPresenters([ + { + key: { projection: "FULL" }, + presenter: new ListCustomersAssembler(), + }, + { + key: { projection: "LIST" }, + presenter: new GetCustomerAssembler(), + }, + ]); + + /*if (!_assemblers) { _assemblers = { list: new ListCustomersAssembler(), // transforma domain → ListDTO get: new GetCustomerAssembler(), // transforma domain → DetailDTO create: new CreateCustomersAssembler(), // transforma domain → CreatedDTO update: new UpdateCustomerAssembler(), // transforma domain -> UpdateDTO - }; + };*/ } return { transactionManager, repo: _repo, - mapper: _mapper, + mapperRegistry: _mapperRegistry, + presenterRegistry: _presenterRegistry, service: _service, - assemblers: _assemblers, + build: { list: () => new ListCustomersUseCase(_service!, transactionManager!, _assemblers!.list), get: () => new GetCustomerUseCase(_service!, transactionManager!, _assemblers!.get), @@ -74,9 +88,5 @@ export function getCustomerDependencies(params: ModuleParams): CustomerDeps { update: () => new UpdateCustomerUseCase(_service!, transactionManager!, _assemblers!.update), delete: () => new DeleteCustomerUseCase(_service!, transactionManager!), }, - presenters: { - //list: (res: Response) => createListPresenter(res), - //json: (res: Response, status: number = 200) => createJsonPresenter(res, status), - }, }; }