From 72dc1b517492b751c1e12d48434112e100bfe050 Mon Sep 17 00:00:00 2001 From: Gabriel Castro Date: Wed, 5 Feb 2025 18:47:29 -0300 Subject: [PATCH] :recycle: refactor: change product nomenclature to segment (UI, core, etc) --- STRUCTURE.md | 6 +- locales/compiled/en.json | 4 +- locales/extracted/en.json | 40 +++++----- locales/extracted/pt.json | 42 +++++----- .../ledgers/[id]/accounts/accounts-sheet.tsx | 30 ++++---- .../[id]/accounts/accounts-tab-content.tsx | 2 +- .../ledgers/[id]/ledger-details-view.tsx | 20 ++--- .../[id]/portfolios/portfolios-sheet.tsx | 2 +- .../segments-sheet.tsx} | 56 +++++++------- .../segments-tab-content.tsx} | 60 +++++++-------- .../[segmentId]}/route.ts | 62 +++++++-------- .../{products => segments}/route.ts | 38 +++++----- src/client/{products.ts => segments.ts} | 42 +++++----- src/components/sidebar/index.tsx | 6 +- .../sidebar/primitive/sidebar.stories.tsx | 2 +- src/components/ui/autosize-textarea/index.tsx | 2 +- .../application/decorators/log-operation.ts | 2 +- src/core/application/dto/account-dto.ts | 6 +- .../dto/{product-dto.ts => segment-dto.ts} | 6 +- .../application/mappers/account-mapper.ts | 4 +- src/core/application/mappers/ledger-mapper.ts | 4 +- .../application/mappers/product-mapper.ts | 41 ---------- .../application/mappers/segment-mapper.ts | 41 ++++++++++ .../product/create-product-use-case.ts | 45 ----------- .../product/fetch-all-products-use-case.ts | 40 ---------- .../product/fetch-product-by-id-use-case.ts | 34 --------- .../product/update-product-use-case.ts | 42 ---------- .../segment/create-segment-use-case.ts | 45 +++++++++++ .../delete-segment-use-case.ts} | 18 ++--- .../segment/fetch-all-segments-use-case.ts | 40 ++++++++++ .../segment/fetch-segment-by-id-use-case.ts | 34 +++++++++ .../segment/update-segment-use-case.ts | 42 ++++++++++ src/core/domain/entities/account-entity.ts | 2 +- .../{product-entity.ts => segment-entity.ts} | 2 +- .../portfolios/create-portfolio-repository.ts | 2 +- .../products/create-product-repository.ts | 9 --- .../delete-product-repository.test.ts | 39 ---------- .../fetch-product-by-id-repository.test.ts | 60 --------------- .../fetch-product-by-id-repository.ts | 9 --- .../update-product-repository.test.ts | 76 ------------------- .../products/update-product-repository.ts | 10 --- .../create-segment-repository.test.ts} | 38 +++++----- .../segments/create-segment-repository.ts | 9 +++ .../delete-segment-repository.test.ts | 39 ++++++++++ .../delete-segment-repository.ts} | 4 +- .../fetch-all-segments-repository.test.ts} | 38 +++++----- .../fetch-all-segments-repository.ts} | 6 +- .../fetch-segment-by-id-repository.test.ts | 60 +++++++++++++++ .../fetch-segment-by-id-repository.ts | 9 +++ .../update-segment-repository.test.ts | 76 +++++++++++++++++++ .../segments/update-segment-repository.ts | 10 +++ .../container-registry/container-registry.ts | 4 +- .../use-cases/product-module.ts | 32 -------- .../use-cases/segment-module.ts | 32 ++++++++ .../midaz/module/midaz-module.ts | 4 +- .../midaz/module/product-module.ts | 37 --------- .../midaz/module/segment-module.ts | 37 +++++++++ .../midaz-create-segment-repository.test.ts} | 36 ++++----- .../midaz-create-segment-repository.ts} | 17 +++-- .../midaz-delete-segment-repository.test.ts} | 24 +++--- .../midaz-delete-segment-repository.ts} | 8 +- ...daz-fetch-all-segments-repository.test.ts} | 24 +++--- .../midaz-fetch-all-segments-repository.ts} | 14 ++-- ...az-fetch-segment-by-id-repository.test.ts} | 30 ++++---- .../midaz-fetch-segment-by-id-repository.ts} | 16 ++-- .../midaz-update-segment-repository.test.ts} | 42 +++++----- .../midaz-update-segment-repository.ts} | 18 ++--- .../utils/midaz-error-handler.ts | 4 +- src/schema/account.ts | 4 +- src/schema/{product.ts => segment.ts} | 2 +- src/types/accounts-type.ts | 2 +- 71 files changed, 872 insertions(+), 871 deletions(-) rename src/app/(routes)/ledgers/[id]/{products/products-sheet.tsx => segments/segments-sheet.tsx} (77%) rename src/app/(routes)/ledgers/[id]/{products/products-tab-content.tsx => segments/segments-tab-content.tsx} (82%) rename src/app/api/organizations/[id]/ledgers/[ledgerId]/{products/[productId] => segments/[segmentId]}/route.ts (55%) rename src/app/api/organizations/[id]/ledgers/[ledgerId]/{products => segments}/route.ts (62%) rename src/client/{products.ts => segments.ts} (67%) rename src/core/application/dto/{product-dto.ts => segment-dto.ts} (77%) delete mode 100644 src/core/application/mappers/product-mapper.ts create mode 100644 src/core/application/mappers/segment-mapper.ts delete mode 100644 src/core/application/use-cases/product/create-product-use-case.ts delete mode 100644 src/core/application/use-cases/product/fetch-all-products-use-case.ts delete mode 100644 src/core/application/use-cases/product/fetch-product-by-id-use-case.ts delete mode 100644 src/core/application/use-cases/product/update-product-use-case.ts create mode 100644 src/core/application/use-cases/segment/create-segment-use-case.ts rename src/core/application/use-cases/{product/delete-product-use-case.ts => segment/delete-segment-use-case.ts} (50%) create mode 100644 src/core/application/use-cases/segment/fetch-all-segments-use-case.ts create mode 100644 src/core/application/use-cases/segment/fetch-segment-by-id-use-case.ts create mode 100644 src/core/application/use-cases/segment/update-segment-use-case.ts rename src/core/domain/entities/{product-entity.ts => segment-entity.ts} (88%) delete mode 100644 src/core/domain/repositories/products/create-product-repository.ts delete mode 100644 src/core/domain/repositories/products/delete-product-repository.test.ts delete mode 100644 src/core/domain/repositories/products/fetch-product-by-id-repository.test.ts delete mode 100644 src/core/domain/repositories/products/fetch-product-by-id-repository.ts delete mode 100644 src/core/domain/repositories/products/update-product-repository.test.ts delete mode 100644 src/core/domain/repositories/products/update-product-repository.ts rename src/core/domain/repositories/{products/create-product-repository.test.ts => segments/create-segment-repository.test.ts} (51%) create mode 100644 src/core/domain/repositories/segments/create-segment-repository.ts create mode 100644 src/core/domain/repositories/segments/delete-segment-repository.test.ts rename src/core/domain/repositories/{products/delete-product-repository.ts => segments/delete-segment-repository.ts} (57%) rename src/core/domain/repositories/{products/fetch-all-products-repository.test.ts => segments/fetch-all-segments-repository.test.ts} (55%) rename src/core/domain/repositories/{products/fetch-all-products-repository.ts => segments/fetch-all-segments-repository.ts} (52%) create mode 100644 src/core/domain/repositories/segments/fetch-segment-by-id-repository.test.ts create mode 100644 src/core/domain/repositories/segments/fetch-segment-by-id-repository.ts create mode 100644 src/core/domain/repositories/segments/update-segment-repository.test.ts create mode 100644 src/core/domain/repositories/segments/update-segment-repository.ts delete mode 100644 src/core/infrastructure/container-registry/use-cases/product-module.ts create mode 100644 src/core/infrastructure/container-registry/use-cases/segment-module.ts delete mode 100644 src/core/infrastructure/midaz/module/product-module.ts create mode 100644 src/core/infrastructure/midaz/module/segment-module.ts rename src/core/infrastructure/midaz/{product/midaz-create-product-repository.test.ts => segments/midaz-create-segment-repository.test.ts} (62%) rename src/core/infrastructure/midaz/{product/midaz-create-product-repository.ts => segments/midaz-create-segment-repository.ts} (59%) rename src/core/infrastructure/midaz/{product/midaz-delete-product-repository.test.ts => segments/midaz-delete-segment-repository.test.ts} (63%) rename src/core/infrastructure/midaz/{product/midaz-delete-product-repository.ts => segments/midaz-delete-segment-repository.ts} (72%) rename src/core/infrastructure/midaz/{product/midaz-fetch-all-products-repository.test.ts => segments/midaz-fetch-all-segments-repository.test.ts} (72%) rename src/core/infrastructure/midaz/{product/midaz-fetch-all-products-repository.ts => segments/midaz-fetch-all-segments-repository.ts} (66%) rename src/core/infrastructure/midaz/{product/midaz-fetch-product-by-id-repository.test.ts => segments/midaz-fetch-segment-by-id-repository.test.ts} (63%) rename src/core/infrastructure/midaz/{product/midaz-fetch-product-by-id-repository.ts => segments/midaz-fetch-segment-by-id-repository.ts} (60%) rename src/core/infrastructure/midaz/{product/midaz-update-product-repository.test.ts => segments/midaz-update-segment-repository.test.ts} (56%) rename src/core/infrastructure/midaz/{product/midaz-update-product-repository.ts => segments/midaz-update-segment-repository.ts} (57%) rename src/schema/{product.ts => segment.ts} (71%) diff --git a/STRUCTURE.md b/STRUCTURE.md index 41287ae3..cfae56db 100644 --- a/STRUCTURE.md +++ b/STRUCTURE.md @@ -23,7 +23,7 @@ The project is structured into several key directories, each serving specific ro │ | | └── [id] │ | | ├── accounts-and-portfolios │ | | ├── overview - │ | | └── products + │ | | └── segments │ | ├── settings │ | | └── organizations │ └── api @@ -40,8 +40,8 @@ The project is structured into several key directories, each serving specific ro | | | | └── [assetId] | | | ├── portfolios | | | | └── [portfolioId] - | | | └── products - | | | └── [productId] + | | | └── segments + | | | └── [segmentId] | | | | | └── ledgers-assets | └── utils diff --git a/locales/compiled/en.json b/locales/compiled/en.json index 7686216a..78c70abc 100644 --- a/locales/compiled/en.json +++ b/locales/compiled/en.json @@ -45,7 +45,7 @@ "common.new.account": "New Account", "common.new.asset": "New Asset", "common.new.portfolio": "New Portfolio", - "common.new.product": "New Product", + "common.new.segment": "New Product", "common.noOptions": "No options found.", "common.none": "None", "common.operations": "Operations", @@ -365,4 +365,4 @@ "transactions.subtitle": "View, edit, and manage the transactions of a specific ledger.", "transactions.tab.create": "New Transaction", "transactions.title": "Transactions" -} \ No newline at end of file +} diff --git a/locales/extracted/en.json b/locales/extracted/en.json index a2b5f771..3dfca52d 100644 --- a/locales/extracted/en.json +++ b/locales/extracted/en.json @@ -47,7 +47,7 @@ "common.new.account": "New Account", "common.new.asset": "New Asset", "common.new.portfolio": "New Portfolio", - "common.new.product": "New Product", + "common.new.segment": "New Segment", "common.noOptions": "No options found.", "common.none": "None", "common.operations": "Operations", @@ -101,7 +101,7 @@ "entity.portfolio.description": "Enter the unique identifier for the entity associated with this portfolio", "entity.portfolio.entityId": "Entity Id", "entity.portfolio.name": "Portfolio Name", - "entity.product.name": "Product Name", + "entity.segment.name": "Segment Name", "entity.transaction.asset": "Asset", "entity.transaction.value": "Value", "entity.transactions.data": "Data", @@ -114,7 +114,7 @@ "error.midaz.assetNameOrCodeDuplicate": "Error Midaz asset name or code duplicate", "error.midaz.codeUpperCaseRequirement": "Error Midaz code upper case requirement", "error.midaz.currencyCodeStandardCompliance": "Error Midaz currency code standard compliance", - "error.midaz.duplicateProductNameError": "Error Midaz duplicate product name error", + "error.midaz.duplicateSegmentNameError": "Error Midaz duplicate segment name error", "error.midaz.entityNotFound": "Error Midaz entity not found", "error.midaz.invalidCodeFormat": "Error Midaz invalid code format", "error.midaz.invalidCountryCode": "Error Midaz invalid country code", @@ -177,8 +177,8 @@ "ledgers.account.field.name.tooltip": "Enter the name of the account", "ledgers.account.field.portfolio": "Portfolio", "ledgers.account.field.portfolio.tooltip": "Portfolio that will receive this account", - "ledgers.account.field.product": "Product", - "ledgers.account.field.product.tooltip": "Category (cluster) of clients with specific characteristics", + "ledgers.account.field.segment": "Segment", + "ledgers.account.field.segment.tooltip": "Category (cluster) of clients with specific characteristics", "ledgers.account.field.type.tooltip": "The type of account", "ledgers.account.sheet.create.description": "Fill in the details of the Account you want to create.", "ledgers.account.sheet.create.title": "New Account", @@ -220,7 +220,7 @@ "ledgers.portfolio.deleteDialog.description": "You will delete a portfolio", "ledgers.portfolio.deleteDialog.title": "Are you sure?", "ledgers.portfolio.sheet.description": "Fill in the details of the Portfolio you want to create.", - "ledgers.portfolio.sheet.edit.description": "View and edit product fields.", + "ledgers.portfolio.sheet.edit.description": "View and edit segment fields.", "ledgers.portfolio.sheet.edit.title": "Edit {portfolioName}", "ledgers.portfolio.sheet.tabs.details": "Portfolio Details", "ledgers.portfolio.sheet.title": "New Portfolio", @@ -229,16 +229,16 @@ "ledgers.portfolio.tooltip": "Create portfolios and link accounts to manage more efficiently.", "ledgers.portfolios.emptyResource": "You haven't created any Portfolios yet", "ledgers.portfolios.showing": "{number, plural, =0 {No portfolios found} one {Showing {count} portfolio} other {Showing {count} portfolios}}.", - "ledgers.products.emptyResource": "You haven't created any Products yet", - "ledgers.products.sheet.description": "Fill in the details of the Product you want to create.", - "ledgers.products.sheet.edit.description": "View and edit product fields.", - "ledgers.products.sheet.edit.title": "Edit \"{productName}\"", - "ledgers.products.sheet.tabs.details": "Product Details", - "ledgers.products.sheet.title": "New Product", - "ledgers.products.showing": "{number, plural, =0 {No products found} one {Showing {count} product} other {Showing {count} products}}.", - "ledgers.products.subtitle": "Manage the products of this ledger.", - "ledgers.products.title": "Products", - "ledgers.products.tooltip": "Clustering or allocation of customers at different levels.", + "ledgers.segments.emptyResource": "You haven't created any Segments yet", + "ledgers.segments.sheet.description": "Fill in the details of the Segment you want to create.", + "ledgers.segments.sheet.edit.description": "View and edit segment fields.", + "ledgers.segments.sheet.edit.title": "Edit \"{segmentName}\"", + "ledgers.segments.sheet.tabs.details": "Segment Details", + "ledgers.segments.sheet.title": "New Segment", + "ledgers.segments.showing": "{number, plural, =0 {No segments found} one {Showing {count} segment} other {Showing {count} segments}}.", + "ledgers.segments.subtitle": "Manage the segments of this ledger.", + "ledgers.segments.title": "Segments", + "ledgers.segments.tooltip": "Clustering or allocation of customers at different levels.", "ledgers.sheet.tabs.details": "Ledger Details", "ledgers.sheetCreate.description": "Fill in the data of the Ledger you wish to create.", "ledgers.sheetCreate.title": "New Ledger", @@ -248,7 +248,7 @@ "ledgers.tab.assets": "Assets", "ledgers.tab.overview": "Overview", "ledgers.tab.portfolios": "Portfolios", - "ledgers.tab.products": "Products", + "ledgers.tab.segments": "Segments", "ledgers.title": "Ledgers", "ledgers.toast.accountCreated": "{accountName} account successfully created", "ledgers.toast.accountDeleted": "{accountName} account successfully deleted", @@ -291,12 +291,12 @@ "organizations.title": "Settings", "organizations.toast.create.success": "Organization created!", "organizations.toast.update.success": "Organization updated successfully!", - "products.delete.description": "You are about to permanently delete this product. This action cannot be undone. Do you wish to continue?", + "segments.delete.description": "You are about to permanently delete this segment. This action cannot be undone. Do you wish to continue?", "settings.system.language": "Language", "settings.system.locale.description": "Select the language you would like to use on Midaz.", "settings.system.paper.description": "Adjust system preferences.", "settings.tab.portfolios": "Portfolios", - "settings.tab.products": "Products", + "settings.tab.segments": "Segments", "settings.tabs.organizations": "Organizations", "settings.tabs.system": "System", "settings.title": "Settings", @@ -308,7 +308,7 @@ "settingsDropdown.system": "System", "sideBar.accountHolders.accounts": "Accounts", "sideBar.accountHolders.portfolios": "Portfolios", - "sideBar.accountHolders.products": "Products", + "sideBar.accountHolders.segments": "Segments", "sideBar.accountHolders.title": "AccountHolders", "sideBar.home": "Home", "sideBar.ledgers": "Ledgers", diff --git a/locales/extracted/pt.json b/locales/extracted/pt.json index e237fad0..3fff1265 100644 --- a/locales/extracted/pt.json +++ b/locales/extracted/pt.json @@ -50,7 +50,6 @@ "settingsDialog.title": "Configurações", "sideBar.accountHolders.accounts": "Contas", "sideBar.accountHolders.portfolios": "Portfólios", - "sideBar.accountHolders.products": "Produtos", "sideBar.accountHolders.title": "AccountHolders", "sideBar.home": "Home", "sideBar.ledgers": "Ledgers", @@ -79,7 +78,6 @@ "error.midaz.invalidType": "O 'tipo' fornecido não é válido. Os tipos aceitos são moeda, criptografia, commodities ou outros. Forneça um tipo válido.", "error.midaz.assetNameOrCodeDuplicate": "Já existe um ativo com o mesmo nome ou código em seu razão. Modifique o nome ou código do seu novo ativo.", "error.midaz.invalidScriptError": "O script fornecido na sua solicitação é inválido ou está em um formato incompatível. Verifique o formato do script e tente novamente.", - "error.midaz.duplicateProductNameError": "Já existe um produto com o nome para este ID contábil. Tente novamente com um razão ou nome diferente.", "error.midaz.unauthorized": "O token fornecido está expirado, inválido ou malformado. Forneça um token válido e tente novamente.", "common.status": "Status", "common.cancel": "Cancelar", @@ -96,7 +94,6 @@ "common.name": "Nome", "common.requiredFields": "(*) campos obrigatórios.", "common.table.metadata": "{number, plural, =0 {-} one {# registro} other {# registros}}", - "entity.product.name": "Nome do Produto", "errors.custom.date.invalid": "Data inválida", "errors.custom.one_lowercase_letter": "Campo deve conter pelo menos 1 letra minúscula", "errors.custom.one_number": "Campo deve conter pelo menos 1 número", @@ -116,20 +113,10 @@ "errors.too_small.string.exact": "Campo deve conter exatamente {minimum} {minimum, plural, =0 {caracteres} one {caractere} other {caracteres}}", "errors.too_small.string.inclusive": "Campo deve conter no mínimo {minimum} {minimum, plural, =0 {caracteres} one {caractere} other {caracteres}}", "errors.too_small.string.not_inclusive": "Campo deve conter mais de {minimum} {minimum, plural, =0 {caracteres} one {caractere} other {caracteres}}", - "ledgers.products.sheet.description": "Preencha os dados do Produto que você deseja criar.", - "ledgers.products.sheet.title": "Novo Produto", - "ledgers.products.subtitle": "Gerencie os produtos deste ledger.", - "ledgers.products.title": "Produtos", - "ledgers.tab.products": "Produtos", - "settings.tab.products": "Produtos", - "ledgers.products.emptyResource": "Você ainda não criou um Produto.", - "ledgers.products.sheet.edit.description": "Visualize e edite os campos do produto.", - "ledgers.products.sheet.edit.title": "Editar \"{productName}\"", "common.confirmDeletion": "Confirmar Exclusão", "common.remove": "Remover", "common.send": "Enviar", "organizations.delete.description": "Você está prestes a excluir permanentemente esta organização. Essa ação não pode ser desfeita. Deseja continuar?", - "products.delete.description": "Você está prestes a excluir permanentemente este produto. Essa ação não pode ser desfeita. Deseja continuar?", "entity.address": "Endereço", "entity.address.city": "Cidade", "entity.address.complement": "Complemento", @@ -200,8 +187,6 @@ "ledgers.account.field.name.tooltip": "Insira o nome da conta", "ledgers.account.field.portfolio": "Portfólio", "ledgers.account.field.portfolio.tooltip": "Portfólio que vai receber essa conta", - "ledgers.account.field.product": "Produto", - "ledgers.account.field.product.tooltip": "Categoria (cluster) de clientes com características específicas", "ledgers.account.sheet.create.description": "Preencha os detalhes da Conta que deseja criar.", "ledgers.account.sheet.create.title": "Nova Conta", "ledgers.account.sheet.edit.description": "Visualizar e editar campos da conta.", @@ -263,7 +248,6 @@ "ledgers.account.sheet.tabs.details": "Detalhes da Conta", "ledgers.assets.sheet.tabs.details": "Detalhes do Ativo", "ledgers.portfolio.sheet.tabs.details": "Detalhes do Portfólio", - "ledgers.products.sheet.tabs.details": "Detalhes do Produto", "ledgers.sheet.tabs.details": "Detalhes do Ledger", "common.records": "registros", "ledgers.tab.accounts": "Contas", @@ -271,7 +255,6 @@ "settings.tab.portfolios": "Portfólios", "notFound.backToHome": "Voltar para Home", "ledgers.assets.showing": "{number, plural, =0 {Nenhum ativo encontrado} one {Mostrando {count} ativo} other {Mostrando {count} ativos}}.", - "ledgers.products.showing": "{number, plural, =0 {Nenhum produto encontrado} one {Mostrando {count} produto} other {Mostrando {count} produtos}}.", "ledgers.showing": "Mostrando {count} {number, plural, =0 {ledgers} one {ledger} other {ledgers}}.", "ledgers.accounts.showing": "{number, plural, =0 {Nenhum conta encontrado} one {Mostrando {count} conta} other {Mostrando {count} contas}}.", "ledgers.portfolios.showing": "{number, plural, =0 {Nenhum portfólio encontrado} one {Mostrando {count} portfólio} other {Mostrando {count} portfólios}}.", @@ -333,8 +316,6 @@ "settings.tabs.system": "Sistema", "notAuthorized.backToHome": "Voltar para Home", "notAuthorized.title": "Você não tem autorização para acessar esta página.", - "common.new.product": "Novo Produto", - "ledgers.products.tooltip": "Clusterização ou alocação de clientes em diferentes níveis.", "common.new.asset": "Novo Ativo", "ledgers.assets.tooltip": "Moedas ou ativos de quaisquer naturezas transacionados neste Ledger.", "common.new.portfolio": "Novo Portfólio", @@ -378,5 +359,24 @@ "transactions.tab.list": "Lista de transações", "transactions.tab.operations": "Operações e Metadados", "transactions.tab.summary": "Resumo", - "transactions.toast.update.success": "Transação atualizada com sucesso" -} \ No newline at end of file + "transactions.toast.update.success": "Transação atualizada com sucesso", + "common.new.segment": "Novo Segmento", + "entity.segment.name": "Nome do Segmento", + "error.midaz.duplicateSegmentNameError": "Já existe um segmento com o nome para este ID contábil. Tente novamente com um razão ou nome diferente.", + "ledgers.account.field.segment": "Segmento", + "ledgers.account.field.segment.tooltip": "Categoria (cluster) de clientes com características específicas", + "ledgers.segments.emptyResource": "Você ainda não criou um Segmento.", + "ledgers.segments.sheet.description": "Preencha os dados do Segmento que você deseja criar.", + "ledgers.segments.sheet.edit.description": "Visualize e edite os campos do segmento.", + "ledgers.segments.sheet.edit.title": "Editar \"{segmentName}\"", + "ledgers.segments.sheet.tabs.details": "Detalhes do Segmento", + "ledgers.segments.sheet.title": "Novo Segmento", + "ledgers.segments.showing": "{number, plural, =0 {Nenhum segmento encontrado} one {Mostrando {count} segmento} other {Mostrando {count} segmentos}}.", + "ledgers.segments.subtitle": "Gerencie os segmentos deste ledger.", + "ledgers.segments.title": "Segmentos", + "ledgers.segments.tooltip": "Clusterização ou alocação de clientes em diferentes níveis.", + "ledgers.tab.segments": "Segmentos", + "segments.delete.description": "Você está prestes a excluir permanentemente este segmento. Essa ação não pode ser desfeita. Deseja continuar?", + "settings.tab.segments": "Segmentos", + "sideBar.accountHolders.segments": "Segmentos" +} diff --git a/src/app/(routes)/ledgers/[id]/accounts/accounts-sheet.tsx b/src/app/(routes)/ledgers/[id]/accounts/accounts-sheet.tsx index f93e9f2e..cc1d182c 100644 --- a/src/app/(routes)/ledgers/[id]/accounts/accounts-sheet.tsx +++ b/src/app/(routes)/ledgers/[id]/accounts/accounts-sheet.tsx @@ -17,7 +17,7 @@ import { DialogProps } from '@radix-ui/react-dialog' import { LoadingButton } from '@/components/ui/loading-button' import { useOrganization } from '@/context/organization-provider/organization-provider-client' import { MetadataField } from '@/components/form/metadata-field' -import { useListProducts } from '@/client/products' +import { useListSegments } from '@/client/segments' import { useCreateAccount, useUpdateAccount } from '@/client/accounts' import { useListPortfolios } from '@/client/portfolios' import { isNil, omitBy } from 'lodash' @@ -46,7 +46,7 @@ const initialValues = { name: '', entityId: '', portfolioId: '', - productId: '', + segmentId: '', assetCode: '', alias: '', type: '', @@ -70,7 +70,7 @@ export const AccountSheet = ({ const { id: ledgerId } = useParams<{ id: string }>() const { currentOrganization } = useOrganization() - const { data: rawProductListData } = useListProducts({ + const { data: rawSegmentListData } = useListSegments({ organizationId: currentOrganization.id!, ledgerId }) @@ -89,14 +89,14 @@ export const AccountSheet = ({ ) }, [rawPortfolioData]) - const productListData = useMemo(() => { + const segmentListData = useMemo(() => { return ( - rawProductListData?.items?.map((product) => ({ - value: product.id, - label: product.name + rawSegmentListData?.items?.map((segment) => ({ + value: segment.id, + label: segment.name })) || [] ) - }, [rawProductListData]) + }, [rawSegmentListData]) const { data: rawAssetListData } = useListAssets({ organizationId: currentOrganization.id!, @@ -412,21 +412,21 @@ export const AccountSheet = ({ - {productListData?.map((product) => ( - - {product.label} + {segmentListData?.map((segment) => ( + + {segment.label} ))} diff --git a/src/app/(routes)/ledgers/[id]/accounts/accounts-tab-content.tsx b/src/app/(routes)/ledgers/[id]/accounts/accounts-tab-content.tsx index 696790d0..6cca9d5c 100644 --- a/src/app/(routes)/ledgers/[id]/accounts/accounts-tab-content.tsx +++ b/src/app/(routes)/ledgers/[id]/accounts/accounts-tab-content.tsx @@ -57,7 +57,7 @@ export const AccountsTabContent = () => { ...account, assetCode: account.assetCode, parentAccountId: account.parentAccountId, - productId: account.productId, + segmentId: account.segmentId, metadata: account.metadata, portfolioId: account.portfolio?.id, portfolioName: account.portfolio?.name diff --git a/src/app/(routes)/ledgers/[id]/ledger-details-view.tsx b/src/app/(routes)/ledgers/[id]/ledger-details-view.tsx index 6bd80606..98889d80 100644 --- a/src/app/(routes)/ledgers/[id]/ledger-details-view.tsx +++ b/src/app/(routes)/ledgers/[id]/ledger-details-view.tsx @@ -6,7 +6,6 @@ import React from 'react' import { cn } from '@/lib/utils' import { Tabs, TabsList, TabsTrigger, TabsContent } from '@/components/ui/tabs' import { useIntl } from 'react-intl' -import { ProductsTabContent } from './products/products-tab-content' import { useTabs } from '@/hooks/use-tabs' import { getBreadcrumbPaths } from '@/components/breadcrumb/get-breadcrumb-paths' import { ILedgerType } from '@/types/ledgers-type' @@ -15,11 +14,12 @@ import { OverviewTabContent } from './overview/overview-tab-content' import { AssetsTabContent } from './assets/assets-tab-content' import { PortfoliosTabContent } from './portfolios/portfolios-tab-content' import { AccountsTabContent } from './accounts/accounts-tab-content' +import { SegmentsTabContent } from './segments/segments-tab-content' const TAB_VALUES = { OVERVIEW: 'overview', ASSETS: 'assets', - PRODUCTS: 'products', + SEGMENTS: 'segments', PORTFOLIOS: 'portfolios', ACCOUNTS: 'accounts' } @@ -61,10 +61,10 @@ const LedgerDetailsView = ({ data }: LedgerDetailsViewProps) => { }, { name: intl.formatMessage({ - id: `settings.tab.products`, - defaultMessage: 'Products' + id: `settings.tab.segments`, + defaultMessage: 'Segments' }), - active: () => activeTab === TAB_VALUES.PRODUCTS + active: () => activeTab === TAB_VALUES.SEGMENTS }, { name: intl.formatMessage({ @@ -121,10 +121,10 @@ const LedgerDetailsView = ({ data }: LedgerDetailsViewProps) => { })} - + {intl.formatMessage({ - id: 'ledgers.tab.products', - defaultMessage: 'Products' + id: 'ledgers.tab.segments', + defaultMessage: 'Segments' })} @@ -151,8 +151,8 @@ const LedgerDetailsView = ({ data }: LedgerDetailsViewProps) => { - - + + diff --git a/src/app/(routes)/ledgers/[id]/portfolios/portfolios-sheet.tsx b/src/app/(routes)/ledgers/[id]/portfolios/portfolios-sheet.tsx index 24a93206..b0783c9c 100644 --- a/src/app/(routes)/ledgers/[id]/portfolios/portfolios-sheet.tsx +++ b/src/app/(routes)/ledgers/[id]/portfolios/portfolios-sheet.tsx @@ -147,7 +147,7 @@ export const PortfolioSheet = ({ {intl.formatMessage({ id: 'ledgers.portfolio.sheet.edit.description', - defaultMessage: 'View and edit product fields.' + defaultMessage: 'View and edit segment fields.' })} diff --git a/src/app/(routes)/ledgers/[id]/products/products-sheet.tsx b/src/app/(routes)/ledgers/[id]/segments/segments-sheet.tsx similarity index 77% rename from src/app/(routes)/ledgers/[id]/products/products-sheet.tsx rename to src/app/(routes)/ledgers/[id]/segments/segments-sheet.tsx index 5f70efb2..3d68bac8 100644 --- a/src/app/(routes)/ledgers/[id]/products/products-sheet.tsx +++ b/src/app/(routes)/ledgers/[id]/segments/segments-sheet.tsx @@ -1,4 +1,3 @@ -import { useCreateProduct, useUpdateProduct } from '@/client/products' import { InputField } from '@/components/form' import { MetadataField } from '@/components/form/metadata-field' import { Form } from '@/components/ui/form' @@ -11,8 +10,7 @@ import { SheetTitle } from '@/components/ui/sheet' import { useOrganization } from '@/context/organization-provider/organization-provider-client' -import { ProductResponseDto } from '@/core/application/dto/product-dto' -import { product } from '@/schema/product' +import { segment } from '@/schema/segment' import { zodResolver } from '@hookform/resolvers/zod' import { DialogProps } from '@radix-ui/react-dialog' import React from 'react' @@ -22,11 +20,13 @@ import { z } from 'zod' import { isNil } from 'lodash' import { LoadingButton } from '@/components/ui/loading-button' import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs' +import { useCreateSegment, useUpdateSegment } from '@/client/segments' +import { SegmentResponseDto } from '@/core/application/dto/segment-dto' -export type ProductsSheetProps = DialogProps & { +export type SegmentsSheetProps = DialogProps & { ledgerId: string mode: 'create' | 'edit' - data?: ProductResponseDto | null + data?: SegmentResponseDto | null onSucess?: () => void } @@ -36,23 +36,23 @@ const defaultValues = { } const FormSchema = z.object({ - name: product.name, - metadata: product.metadata + name: segment.name, + metadata: segment.metadata }) type FormData = z.infer -export const ProductsSheet = ({ +export const SegmentsSheet = ({ ledgerId, mode, data, onSucess, onOpenChange, ...others -}: ProductsSheetProps) => { +}: SegmentsSheetProps) => { const intl = useIntl() const { currentOrganization } = useOrganization() - const { mutate: createProduct, isPending: createPending } = useCreateProduct({ + const { mutate: createSegment, isPending: createPending } = useCreateSegment({ organizationId: currentOrganization.id!, ledgerId, onSuccess: () => { @@ -60,10 +60,10 @@ export const ProductsSheet = ({ onOpenChange?.(false) } }) - const { mutate: updateProduct, isPending: updatePending } = useUpdateProduct({ + const { mutate: updateSegment, isPending: updatePending } = useUpdateSegment({ organizationId: currentOrganization!.id!, ledgerId, - productId: data?.id!, + segmentId: data?.id!, onSuccess: () => { onSucess?.() onOpenChange?.(false) @@ -72,14 +72,14 @@ export const ProductsSheet = ({ const form = useForm({ resolver: zodResolver(FormSchema), - defaultValues: Object.assign({}, defaultValues, product) + defaultValues: Object.assign({}, defaultValues, segment) }) const handleSubmit = (data: FormData) => { if (mode === 'create') { - createProduct(data) + createSegment(data) } else if (mode === 'edit') { - updateProduct(data) + updateSegment(data) } form.reset(defaultValues) @@ -106,15 +106,15 @@ export const ProductsSheet = ({ {intl.formatMessage({ - id: 'ledgers.products.sheet.title', - defaultMessage: 'New Product' + id: 'ledgers.segments.sheet.title', + defaultMessage: 'New Segment' })} {intl.formatMessage({ - id: 'ledgers.products.sheet.description', + id: 'ledgers.segments.sheet.description', defaultMessage: - 'Fill in the details of the Product you want to create.' + 'Fill in the details of the Segment you want to create.' })} @@ -125,18 +125,18 @@ export const ProductsSheet = ({ {intl.formatMessage( { - id: 'ledgers.products.sheet.edit.title', - defaultMessage: 'Edit "{productName}"' + id: 'ledgers.segments.sheet.edit.title', + defaultMessage: 'Edit "{segmentName}"' }, { - productName: data?.name + segmentName: data?.name } )} {intl.formatMessage({ - id: 'ledgers.products.sheet.edit.description', - defaultMessage: 'View and edit product fields.' + id: 'ledgers.segments.sheet.edit.description', + defaultMessage: 'View and edit segment fields.' })} @@ -151,8 +151,8 @@ export const ProductsSheet = ({ {intl.formatMessage({ - id: 'ledgers.products.sheet.tabs.details', - defaultMessage: 'Product Details' + id: 'ledgers.segments.sheet.tabs.details', + defaultMessage: 'Segment Details' })} @@ -167,8 +167,8 @@ export const ProductsSheet = ({ { +export const SegmentsTabContent = () => { const intl = useIntl() const { currentOrganization } = useOrganization() const { id: ledgerId } = useParams<{ id: string }>() @@ -58,7 +58,7 @@ export const ProductsTabContent = () => { data, refetch, isPending: listLoading - } = useListProducts({ + } = useListSegments({ organizationId: currentOrganization.id!, ledgerId, ...(searchValues as any) @@ -68,7 +68,7 @@ export const ProductsTabContent = () => { setTotal(data?.items.length || 0) }, [data?.items.length]) - const { mutate: deleteMutate, isPending: deletePending } = useDeleteProduct({ + const { mutate: deleteMutate, isPending: deletePending } = useDeleteSegment({ organizationId: currentOrganization.id!, ledgerId, onSuccess: () => { @@ -84,7 +84,7 @@ export const ProductsTabContent = () => { ) const { handleCreate, handleEdit, sheetProps } = - useCreateUpdateSheet() + useCreateUpdateSheet() const table = useReactTable({ data: data?.items!, @@ -109,29 +109,29 @@ export const ProductsTabContent = () => { defaultMessage: 'Confirm Deletion' })} description={intl.formatMessage({ - id: 'products.delete.description', + id: 'segments.delete.description', defaultMessage: - 'You are about to permanently delete this product. This action cannot be undone. Do you wish to continue?' + 'You are about to permanently delete this segment. This action cannot be undone. Do you wish to continue?' })} loading={deletePending} {...dialogProps} /> - + { @@ -160,14 +160,14 @@ export const ProductsTabContent = () => { (data?.items.length === 0 && ( @@ -205,11 +205,11 @@ export const ProductsTabContent = () => { - {table.getRowModel().rows.map((product) => ( - - - {product.original.name} - + {table.getRowModel().rows.map((segment) => ( + + + {segment.original.name} + @@ -222,7 +222,7 @@ export const ProductsTabContent = () => { handleEdit(product.original)} + onClick={() => handleEdit(segment.original)} > {intl.formatMessage({ id: `common.edit`, @@ -232,7 +232,7 @@ export const ProductsTabContent = () => { - handleDialogOpen(product.original.id) + handleDialogOpen(segment.original.id) } > {intl.formatMessage({ @@ -254,9 +254,9 @@ export const ProductsTabContent = () => { {intl.formatMessage( { - id: 'ledgers.products.showing', + id: 'ledgers.segments.showing', defaultMessage: - '{number, plural, =0 {No products found} one {Showing {count} product} other {Showing {count} products}}.' + '{number, plural, =0 {No segments found} one {Showing {count} segment} other {Showing {count} segments}}.' }, { number: data?.items?.length || 0, diff --git a/src/app/api/organizations/[id]/ledgers/[ledgerId]/products/[productId]/route.ts b/src/app/api/organizations/[id]/ledgers/[ledgerId]/segments/[segmentId]/route.ts similarity index 55% rename from src/app/api/organizations/[id]/ledgers/[ledgerId]/products/[productId]/route.ts rename to src/app/api/organizations/[id]/ledgers/[ledgerId]/segments/[segmentId]/route.ts index 52e39ce0..73645a08 100644 --- a/src/app/api/organizations/[id]/ledgers/[ledgerId]/products/[productId]/route.ts +++ b/src/app/api/organizations/[id]/ledgers/[ledgerId]/segments/[segmentId]/route.ts @@ -1,34 +1,34 @@ import { container } from '@/core/infrastructure/container-registry/container-registry' import { apiErrorHandler } from '@/app/api/utils/api-error-handler' import { - DeleteProduct, - DeleteProductUseCase -} from '@/core/application/use-cases/product/delete-product-use-case' + DeleteSegment, + DeleteSegmentUseCase +} from '@/core/application/use-cases/segment/delete-segment-use-case' import { - FetchProductById, - FetchProductByIdUseCase -} from '@/core/application/use-cases/product/fetch-product-by-id-use-case' + FetchSegmentById, + FetchSegmentByIdUseCase +} from '@/core/application/use-cases/segment/fetch-segment-by-id-use-case' import { - UpdateProduct, - UpdateProductUseCase -} from '@/core/application/use-cases/product/update-product-use-case' + UpdateSegment, + UpdateSegmentUseCase +} from '@/core/application/use-cases/segment/update-segment-use-case' import { NextResponse } from 'next/server' import { applyMiddleware } from '@/lib/applymiddleware/apply-middleware' import { loggerMiddleware } from '@/utils/logger-middleware-config' -const fetchProductById: FetchProductById = container.get( - FetchProductByIdUseCase +const fetchSegmentById: FetchSegmentById = container.get( + FetchSegmentByIdUseCase ) -const deleteProductUseCase: DeleteProduct = - container.get(DeleteProductUseCase) +const deleteSegmentUseCase: DeleteSegment = + container.get(DeleteSegmentUseCase) -const updateProductUseCase: UpdateProduct = - container.get(UpdateProductUseCase) +const updateSegmentUseCase: UpdateSegment = + container.get(UpdateSegmentUseCase) export async function GET( request: Request, - { params }: { params: { id: string; ledgerId: string; productId: string } } + { params }: { params: { id: string; ledgerId: string; segmentId: string } } ) { try { const { searchParams } = new URL(request.url) @@ -36,15 +36,15 @@ export async function GET( const page = Number(searchParams.get('page')) || 1 const organizationId = params.id const ledgerId = params.ledgerId - const productId = params.productId + const segmentId = params.segmentId - const products = await fetchProductById.execute( + const segments = await fetchSegmentById.execute( organizationId, ledgerId, - productId + segmentId ) - return NextResponse.json(products) + return NextResponse.json(segments) } catch (error: any) { const { message, status } = await apiErrorHandler(error) @@ -52,24 +52,24 @@ export async function GET( } } -interface ProductParams { +interface SegmentParams { id: string ledgerId: string - productId: string + segmentId: string } export const DELETE = applyMiddleware( [ loggerMiddleware({ - operationName: 'deleteProduct', + operationName: 'deleteSegment', method: 'DELETE' }) ], - async (request: Request, { params }: { params: ProductParams }) => { + async (request: Request, { params }: { params: SegmentParams }) => { try { - const { id: organizationId, ledgerId, productId } = params + const { id: organizationId, ledgerId, segmentId } = params - await deleteProductUseCase.execute(organizationId, ledgerId, productId) + await deleteSegmentUseCase.execute(organizationId, ledgerId, segmentId) return NextResponse.json({}, { status: 200 }) } catch (error: any) { @@ -82,22 +82,22 @@ export const DELETE = applyMiddleware( export async function PATCH( request: Request, - { params }: { params: { id: string; ledgerId: string; productId: string } } + { params }: { params: { id: string; ledgerId: string; segmentId: string } } ) { try { const body = await request.json() const organizationId = params.id const ledgerId = params.ledgerId - const productId = params.productId + const segmentId = params.segmentId - const productUpdated = await updateProductUseCase.execute( + const segmentUpdated = await updateSegmentUseCase.execute( organizationId, ledgerId, - productId, + segmentId, body ) - return NextResponse.json(productUpdated) + return NextResponse.json(segmentUpdated) } catch (error: any) { const { message, status } = await apiErrorHandler(error) diff --git a/src/app/api/organizations/[id]/ledgers/[ledgerId]/products/route.ts b/src/app/api/organizations/[id]/ledgers/[ledgerId]/segments/route.ts similarity index 62% rename from src/app/api/organizations/[id]/ledgers/[ledgerId]/products/route.ts rename to src/app/api/organizations/[id]/ledgers/[ledgerId]/segments/route.ts index 72693a54..3bb1e825 100644 --- a/src/app/api/organizations/[id]/ledgers/[ledgerId]/products/route.ts +++ b/src/app/api/organizations/[id]/ledgers/[ledgerId]/segments/route.ts @@ -1,18 +1,18 @@ import { container } from '@/core/infrastructure/container-registry/container-registry' import { apiErrorHandler } from '@/app/api/utils/api-error-handler' import { - CreateProduct, - CreateProductUseCase -} from '@/core/application/use-cases/product/create-product-use-case' + CreateSegment, + CreateSegmentUseCase +} from '@/core/application/use-cases/segment/create-segment-use-case' import { - FetchAllProducts, - FetchAllProductsUseCase -} from '@/core/application/use-cases/product/fetch-all-products-use-case' + FetchAllSegments, + FetchAllSegmentsUseCase +} from '@/core/application/use-cases/segment/fetch-all-segments-use-case' import { NextRequest, NextResponse } from 'next/server' import { applyMiddleware } from '@/lib/applymiddleware/apply-middleware' import { loggerMiddleware } from '@/utils/logger-middleware-config' -interface ProductParams { +interface SegmentParams { id: string ledgerId: string } @@ -20,26 +20,26 @@ interface ProductParams { export const POST = applyMiddleware( [ loggerMiddleware({ - operationName: 'createProduct', + operationName: 'createSegment', method: 'POST' }) ], - async (request: NextRequest, { params }: { params: ProductParams }) => { + async (request: NextRequest, { params }: { params: SegmentParams }) => { try { - const createProductUseCase: CreateProduct = - container.get(CreateProductUseCase) + const createSegmentUseCase: CreateSegment = + container.get(CreateSegmentUseCase) const body = await request.json() const organizationId = params.id const ledgerId = params.ledgerId - const productCreated = await createProductUseCase.execute( + const segmentCreated = await createSegmentUseCase.execute( organizationId, ledgerId, body ) - return NextResponse.json(productCreated) + return NextResponse.json(segmentCreated) } catch (error: any) { const { message, status } = await apiErrorHandler(error) @@ -51,28 +51,28 @@ export const POST = applyMiddleware( export const GET = applyMiddleware( [ loggerMiddleware({ - operationName: 'fetchAllProducts', + operationName: 'fetchAllSegments', method: 'GET' }) ], - async (request: NextRequest, { params }: { params: ProductParams }) => { + async (request: NextRequest, { params }: { params: SegmentParams }) => { try { - const fetchAllProductsUseCase: FetchAllProducts = - container.get(FetchAllProductsUseCase) + const fetchAllSegmentsUseCase: FetchAllSegments = + container.get(FetchAllSegmentsUseCase) const { searchParams } = new URL(request.url) const limit = Number(searchParams.get('limit')) || 10 const page = Number(searchParams.get('page')) || 1 const organizationId = params.id const ledgerId = params.ledgerId - const products = await fetchAllProductsUseCase.execute( + const segments = await fetchAllSegmentsUseCase.execute( organizationId, ledgerId, limit, page ) - return NextResponse.json(products) + return NextResponse.json(segments) } catch (error: any) { const { message, status } = await apiErrorHandler(error) diff --git a/src/client/products.ts b/src/client/segments.ts similarity index 67% rename from src/client/products.ts rename to src/client/segments.ts index cdfb2232..bf8f0c18 100644 --- a/src/client/products.ts +++ b/src/client/segments.ts @@ -1,5 +1,5 @@ import { PaginationDto } from '@/core/application/dto/pagination-dto' -import { ProductResponseDto } from '@/core/application/dto/product-dto' +import { SegmentResponseDto } from '@/core/application/dto/segment-dto' import { deleteFetcher, getFetcher, @@ -19,37 +19,37 @@ import { * TODO: Find a way to avoid the */ -type UseCreateProductProps = UseMutationOptions & { +type UseCreateSegmentProps = UseMutationOptions & { organizationId: string ledgerId: string } -export const useCreateProduct = ({ +export const useCreateSegment = ({ organizationId, ledgerId, ...options -}: UseCreateProductProps) => { +}: UseCreateSegmentProps) => { return useMutation({ mutationFn: postFetcher( - `/api/organizations/${organizationId}/ledgers/${ledgerId}/products` + `/api/organizations/${organizationId}/ledgers/${ledgerId}/segments` ), ...options }) } -type UseListProductsProps = UseCreateProductProps & PaginationRequest +type UseListSegmentsProps = UseCreateSegmentProps & PaginationRequest -export const useListProducts = ({ +export const useListSegments = ({ organizationId, ledgerId, limit, page, ...options -}: UseListProductsProps) => { - return useQuery>({ +}: UseListSegmentsProps) => { + return useQuery>({ queryKey: [organizationId, ledgerId, limit, page], queryFn: getPaginatedFetcher( - `/api/organizations/${organizationId}/ledgers/${ledgerId}/products`, + `/api/organizations/${organizationId}/ledgers/${ledgerId}/segments`, { limit, page } ), placeholderData: keepPreviousData, @@ -57,41 +57,41 @@ export const useListProducts = ({ }) } -type UseUpdateProductProps = UseMutationOptions & { +type UseUpdateSegmentProps = UseMutationOptions & { organizationId: string ledgerId: string - productId: string + segmentId: string } -export const useUpdateProduct = ({ +export const useUpdateSegment = ({ organizationId, ledgerId, - productId, + segmentId, ...options -}: UseUpdateProductProps) => { +}: UseUpdateSegmentProps) => { return useMutation({ - mutationKey: [organizationId, ledgerId, productId], + mutationKey: [organizationId, ledgerId, segmentId], mutationFn: patchFetcher( - `/api/organizations/${organizationId}/ledgers/${ledgerId}/products/${productId}` + `/api/organizations/${organizationId}/ledgers/${ledgerId}/segments/${segmentId}` ), ...options }) } -type UseDeleteProductProps = UseMutationOptions & { +type UseDeleteSegmentProps = UseMutationOptions & { organizationId: string ledgerId: string } -export const useDeleteProduct = ({ +export const useDeleteSegment = ({ organizationId, ledgerId, ...options -}: UseDeleteProductProps) => { +}: UseDeleteSegmentProps) => { return useMutation({ mutationKey: [organizationId, ledgerId], mutationFn: deleteFetcher( - `/api/organizations/${organizationId}/ledgers/${ledgerId}/products` + `/api/organizations/${organizationId}/ledgers/${ledgerId}/segments` ), ...options }) diff --git a/src/components/sidebar/index.tsx b/src/components/sidebar/index.tsx index 2a5a6447..c14989cb 100644 --- a/src/components/sidebar/index.tsx +++ b/src/components/sidebar/index.tsx @@ -84,11 +84,11 @@ export const Sidebar = () => { } - href="/products" + href="/segments" /> AccountHolders - } href="/products" /> + } href="/segments" /> } href="/accounts" /> maxHeight) { textAreaElement.style.height = `${maxHeight}px` textAreaElement.style.overflowY = 'auto' diff --git a/src/core/application/decorators/log-operation.ts b/src/core/application/decorators/log-operation.ts index 0df667ad..7e212dc5 100644 --- a/src/core/application/decorators/log-operation.ts +++ b/src/core/application/decorators/log-operation.ts @@ -21,7 +21,7 @@ export function LogOperation(options: { const originalMethod = descriptor.value // If operation is not provided, use the class name as operation - // Example: FetchAllProductsUseCase -> fetch_all_products + // Example: FetchAllSegmentsUseCase -> fetch_all_segments if (!options.operation) { options.operation = snakeCase( target.constructor.name.replace('UseCase', '') diff --git a/src/core/application/dto/account-dto.ts b/src/core/application/dto/account-dto.ts index 604b3c03..116fd50a 100644 --- a/src/core/application/dto/account-dto.ts +++ b/src/core/application/dto/account-dto.ts @@ -8,7 +8,7 @@ export interface CreateAccountDto { entityId?: string | null parentAccountId?: string | null portfolioId?: string | null - productId?: string + segmentId?: string allowSending?: boolean allowReceiving?: boolean status: { @@ -29,7 +29,7 @@ export interface AccountResponseDto { entityId: string parentAccountId: string portfolioId?: string | null - productId: string + segmentId: string status: StatusDto allowSending?: boolean allowReceiving?: boolean @@ -46,7 +46,7 @@ export interface UpdateAccountDto { type?: string entityId?: string parentAccountId?: string - productId?: string + segmentId?: string portfolioId?: string allowSending?: boolean allowReceiving?: boolean diff --git a/src/core/application/dto/product-dto.ts b/src/core/application/dto/segment-dto.ts similarity index 77% rename from src/core/application/dto/product-dto.ts rename to src/core/application/dto/segment-dto.ts index 433fce25..f4f7b455 100644 --- a/src/core/application/dto/product-dto.ts +++ b/src/core/application/dto/segment-dto.ts @@ -1,12 +1,12 @@ import { StatusDto } from './status.dto' -export interface CreateProductDto { +export interface CreateSegmentDto { name: string status: StatusDto metadata: Record } -export interface ProductResponseDto { +export interface SegmentResponseDto { id: string ledgerId: string organizationId: string @@ -18,7 +18,7 @@ export interface ProductResponseDto { deletedAt: Date | null } -export interface UpdateProductDto { +export interface UpdateSegmentDto { name?: string status?: StatusDto metadata?: Record diff --git a/src/core/application/mappers/account-mapper.ts b/src/core/application/mappers/account-mapper.ts index f99bffc3..93b5ea0f 100644 --- a/src/core/application/mappers/account-mapper.ts +++ b/src/core/application/mappers/account-mapper.ts @@ -27,7 +27,7 @@ export class AccountMapper { alias: account.alias, assetCode: account.assetCode, parentAccountId: account.parentAccountId!, - productId: account.productId!, + segmentId: account.segmentId!, portfolioId: account.portfolioId, allowSending: account.allowSending, allowReceiving: account.allowReceiving @@ -45,7 +45,7 @@ export class AccountMapper { assetCode: dto.assetCode!, status: dto.status!, parentAccountId: dto.parentAccountId, - productId: dto.productId, + segmentId: dto.segmentId, portfolioId: dto.portfolioId, allowSending: dto.allowSending, allowReceiving: dto.allowReceiving, diff --git a/src/core/application/mappers/ledger-mapper.ts b/src/core/application/mappers/ledger-mapper.ts index c26746b0..1a44e5eb 100644 --- a/src/core/application/mappers/ledger-mapper.ts +++ b/src/core/application/mappers/ledger-mapper.ts @@ -1,13 +1,13 @@ import { LedgerEntity } from '@/core/domain/entities/ledger-entity' import { CreateLedgerDto } from '../dto/create-ledger-dto' import { LedgerResponseDto } from '../dto/ledger-response-dto' -import { UpdateProductDto } from '../dto/product-dto' +import { UpdateSegmentDto } from '../dto/segment-dto' import { PaginationEntity } from '@/core/domain/entities/pagination-entity' import { PaginationMapper } from './pagination-mapper' export class LedgerMapper { public static toDomain( - dto: CreateLedgerDto | UpdateProductDto + dto: CreateLedgerDto | UpdateSegmentDto ): LedgerEntity { return { name: dto.name!, diff --git a/src/core/application/mappers/product-mapper.ts b/src/core/application/mappers/product-mapper.ts deleted file mode 100644 index e90ce2a6..00000000 --- a/src/core/application/mappers/product-mapper.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { ProductEntity } from '@/core/domain/entities/product-entity' -import { - CreateProductDto, - ProductResponseDto, - UpdateProductDto -} from '../dto/product-dto' -import { PaginationEntity } from '@/core/domain/entities/pagination-entity' -import { PaginationMapper } from './pagination-mapper' - -export class ProductMapper { - static toDomain(dto: CreateProductDto | UpdateProductDto): ProductEntity { - return { - name: dto.name!, - status: dto.status!, - metadata: dto.metadata! - } - } - - static toResponseDto(product: ProductEntity): ProductResponseDto { - return { - id: product.id!, - organizationId: product.organizationId!, - ledgerId: product.ledgerId!, - name: product.name, - status: { - code: product.status.code, - description: product.status.description ?? '' - }, - metadata: product.metadata ?? {}, - createdAt: product.createdAt!, - updatedAt: product.updatedAt!, - deletedAt: product.deletedAt! - } - } - - static toPaginationResponseDto( - result: PaginationEntity - ): PaginationEntity { - return PaginationMapper.toResponseDto(result, ProductMapper.toResponseDto) - } -} diff --git a/src/core/application/mappers/segment-mapper.ts b/src/core/application/mappers/segment-mapper.ts new file mode 100644 index 00000000..34e7b34f --- /dev/null +++ b/src/core/application/mappers/segment-mapper.ts @@ -0,0 +1,41 @@ +import { SegmentEntity } from '@/core/domain/entities/segment-entity' +import { + CreateSegmentDto, + SegmentResponseDto, + UpdateSegmentDto +} from '../dto/segment-dto' +import { PaginationEntity } from '@/core/domain/entities/pagination-entity' +import { PaginationMapper } from './pagination-mapper' + +export class SegmentMapper { + static toDomain(dto: CreateSegmentDto | UpdateSegmentDto): SegmentEntity { + return { + name: dto.name!, + status: dto.status!, + metadata: dto.metadata! + } + } + + static toResponseDto(segment: SegmentEntity): SegmentResponseDto { + return { + id: segment.id!, + organizationId: segment.organizationId!, + ledgerId: segment.ledgerId!, + name: segment.name, + status: { + code: segment.status.code, + description: segment.status.description ?? '' + }, + metadata: segment.metadata ?? {}, + createdAt: segment.createdAt!, + updatedAt: segment.updatedAt!, + deletedAt: segment.deletedAt! + } + } + + static toPaginationResponseDto( + result: PaginationEntity + ): PaginationEntity { + return PaginationMapper.toResponseDto(result, SegmentMapper.toResponseDto) + } +} diff --git a/src/core/application/use-cases/product/create-product-use-case.ts b/src/core/application/use-cases/product/create-product-use-case.ts deleted file mode 100644 index d84a283c..00000000 --- a/src/core/application/use-cases/product/create-product-use-case.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { ProductEntity } from '@/core/domain/entities/product-entity' -import type { - CreateProductDto, - ProductResponseDto -} from '../../dto/product-dto' -import { ProductMapper } from '../../mappers/product-mapper' -import { CreateProductRepository } from '@/core/domain/repositories/products/create-product-repository' -import { inject, injectable } from 'inversify' -import { LogOperation } from '../../decorators/log-operation' - -export interface CreateProduct { - execute: ( - organizationId: string, - ledgerId: string, - product: CreateProductDto - ) => Promise -} - -@injectable() -export class CreateProductUseCase implements CreateProduct { - constructor( - @inject(CreateProductRepository) - private readonly createProductRepository: CreateProductRepository - ) {} - - @LogOperation({ layer: 'application' }) - async execute( - organizationId: string, - ledgerId: string, - product: CreateProductDto - ): Promise { - const productEntity: ProductEntity = ProductMapper.toDomain(product) - - const productCreated = await this.createProductRepository.create( - organizationId, - ledgerId, - productEntity - ) - - const productResponseDto: ProductResponseDto = - ProductMapper.toResponseDto(productCreated) - - return productResponseDto - } -} diff --git a/src/core/application/use-cases/product/fetch-all-products-use-case.ts b/src/core/application/use-cases/product/fetch-all-products-use-case.ts deleted file mode 100644 index 09dd372e..00000000 --- a/src/core/application/use-cases/product/fetch-all-products-use-case.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { FetchAllProductsRepository } from '@/core/domain/repositories/products/fetch-all-products-repository' -import { PaginationDto } from '../../dto/pagination-dto' -import { ProductResponseDto } from '../../dto/product-dto' -import { ProductMapper } from '../../mappers/product-mapper' -import { inject, injectable } from 'inversify' -import { LogOperation } from '../../decorators/log-operation' - -export interface FetchAllProducts { - execute: ( - organizationId: string, - ledgerId: string, - limit: number, - page: number - ) => Promise> -} - -@injectable() -export class FetchAllProductsUseCase implements FetchAllProducts { - constructor( - @inject(FetchAllProductsRepository) - private readonly fetchAllProductsRepository: FetchAllProductsRepository - ) {} - - @LogOperation({ layer: 'application' }) - async execute( - organizationId: string, - ledgerId: string, - limit: number, - page: number - ): Promise> { - const productsResult = await this.fetchAllProductsRepository.fetchAll( - organizationId, - ledgerId, - limit, - page - ) - - return ProductMapper.toPaginationResponseDto(productsResult) - } -} diff --git a/src/core/application/use-cases/product/fetch-product-by-id-use-case.ts b/src/core/application/use-cases/product/fetch-product-by-id-use-case.ts deleted file mode 100644 index 1ea9bd74..00000000 --- a/src/core/application/use-cases/product/fetch-product-by-id-use-case.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { FetchProductByIdRepository } from '@/core/domain/repositories/products/fetch-product-by-id-repository' -import { ProductResponseDto } from '../../dto/product-dto' -import { ProductMapper } from '../../mappers/product-mapper' -import { inject, injectable } from 'inversify' - -export interface FetchProductById { - execute: ( - organizationId: string, - ledgerId: string, - productId: string - ) => Promise -} - -@injectable() -export class FetchProductByIdUseCase implements FetchProductById { - constructor( - @inject(FetchProductByIdRepository) - private readonly fetchProductByIdRepository: FetchProductByIdRepository - ) {} - - async execute( - organizationId: string, - ledgerId: string, - productId: string - ): Promise { - const product = await this.fetchProductByIdRepository.fetchById( - organizationId, - ledgerId, - productId - ) - - return ProductMapper.toResponseDto(product) - } -} diff --git a/src/core/application/use-cases/product/update-product-use-case.ts b/src/core/application/use-cases/product/update-product-use-case.ts deleted file mode 100644 index 48e78b87..00000000 --- a/src/core/application/use-cases/product/update-product-use-case.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { UpdateProductRepository } from '@/core/domain/repositories/products/update-product-repository' -import { ProductResponseDto, UpdateProductDto } from '../../dto/product-dto' -import { ProductEntity } from '@/core/domain/entities/product-entity' -import { ProductMapper } from '../../mappers/product-mapper' -import { inject, injectable } from 'inversify' - -export interface UpdateProduct { - execute: ( - organizationId: string, - ledgerId: string, - productId: string, - product: Partial - ) => Promise -} - -@injectable() -export class UpdateProductUseCase implements UpdateProduct { - constructor( - @inject(UpdateProductRepository) - private readonly updateProductRepository: UpdateProductRepository - ) {} - - async execute( - organizationId: string, - ledgerId: string, - productId: string, - product: Partial - ): Promise { - const productEntity: Partial = - ProductMapper.toDomain(product) - - const updatedProduct: ProductEntity = - await this.updateProductRepository.update( - organizationId, - ledgerId, - productId, - productEntity - ) - - return ProductMapper.toResponseDto(updatedProduct) - } -} diff --git a/src/core/application/use-cases/segment/create-segment-use-case.ts b/src/core/application/use-cases/segment/create-segment-use-case.ts new file mode 100644 index 00000000..863b0225 --- /dev/null +++ b/src/core/application/use-cases/segment/create-segment-use-case.ts @@ -0,0 +1,45 @@ +import { SegmentEntity } from '@/core/domain/entities/segment-entity' +import type { + CreateSegmentDto, + SegmentResponseDto +} from '../../dto/segment-dto' +import { SegmentMapper } from '../../mappers/segment-mapper' +import { CreateSegmentRepository } from '@/core/domain/repositories/segments/create-segment-repository' +import { inject, injectable } from 'inversify' +import { LogOperation } from '../../decorators/log-operation' + +export interface CreateSegment { + execute: ( + organizationId: string, + ledgerId: string, + segment: CreateSegmentDto + ) => Promise +} + +@injectable() +export class CreateSegmentUseCase implements CreateSegment { + constructor( + @inject(CreateSegmentRepository) + private readonly createSegmentRepository: CreateSegmentRepository + ) {} + + @LogOperation({ layer: 'application' }) + async execute( + organizationId: string, + ledgerId: string, + segment: CreateSegmentDto + ): Promise { + const segmentEntity: SegmentEntity = SegmentMapper.toDomain(segment) + + const segmentCreated = await this.createSegmentRepository.create( + organizationId, + ledgerId, + segmentEntity + ) + + const segmentResponseDto: SegmentResponseDto = + SegmentMapper.toResponseDto(segmentCreated) + + return segmentResponseDto + } +} diff --git a/src/core/application/use-cases/product/delete-product-use-case.ts b/src/core/application/use-cases/segment/delete-segment-use-case.ts similarity index 50% rename from src/core/application/use-cases/product/delete-product-use-case.ts rename to src/core/application/use-cases/segment/delete-segment-use-case.ts index d814f2cb..0d7d96b3 100644 --- a/src/core/application/use-cases/product/delete-product-use-case.ts +++ b/src/core/application/use-cases/segment/delete-segment-use-case.ts @@ -1,31 +1,31 @@ -import { DeleteProductRepository } from '@/core/domain/repositories/products/delete-product-repository' +import { DeleteSegmentRepository } from '@/core/domain/repositories/segments/delete-segment-repository' import { inject, injectable } from 'inversify' import { LogOperation } from '../../decorators/log-operation' -export interface DeleteProduct { +export interface DeleteSegment { execute: ( organizationId: string, ledgerId: string, - productId: string + segmentId: string ) => Promise } @injectable() -export class DeleteProductUseCase implements DeleteProduct { +export class DeleteSegmentUseCase implements DeleteSegment { constructor( - @inject(DeleteProductRepository) - private readonly deleteProductRepository: DeleteProductRepository + @inject(DeleteSegmentRepository) + private readonly deleteSegmentRepository: DeleteSegmentRepository ) {} @LogOperation({ layer: 'application' }) async execute( organizationId: string, ledgerId: string, - productId: string + segmentId: string ): Promise { - await this.deleteProductRepository.delete( + await this.deleteSegmentRepository.delete( organizationId, ledgerId, - productId + segmentId ) } } diff --git a/src/core/application/use-cases/segment/fetch-all-segments-use-case.ts b/src/core/application/use-cases/segment/fetch-all-segments-use-case.ts new file mode 100644 index 00000000..75a29e34 --- /dev/null +++ b/src/core/application/use-cases/segment/fetch-all-segments-use-case.ts @@ -0,0 +1,40 @@ +import { FetchAllSegmentsRepository } from '@/core/domain/repositories/segments/fetch-all-segments-repository' +import { PaginationDto } from '../../dto/pagination-dto' +import { SegmentResponseDto } from '../../dto/segment-dto' +import { SegmentMapper } from '../../mappers/segment-mapper' +import { inject, injectable } from 'inversify' +import { LogOperation } from '../../decorators/log-operation' + +export interface FetchAllSegments { + execute: ( + organizationId: string, + ledgerId: string, + limit: number, + page: number + ) => Promise> +} + +@injectable() +export class FetchAllSegmentsUseCase implements FetchAllSegments { + constructor( + @inject(FetchAllSegmentsRepository) + private readonly fetchAllSegmentsRepository: FetchAllSegmentsRepository + ) {} + + @LogOperation({ layer: 'application' }) + async execute( + organizationId: string, + ledgerId: string, + limit: number, + page: number + ): Promise> { + const segmentsResult = await this.fetchAllSegmentsRepository.fetchAll( + organizationId, + ledgerId, + limit, + page + ) + + return SegmentMapper.toPaginationResponseDto(segmentsResult) + } +} diff --git a/src/core/application/use-cases/segment/fetch-segment-by-id-use-case.ts b/src/core/application/use-cases/segment/fetch-segment-by-id-use-case.ts new file mode 100644 index 00000000..5c26f00a --- /dev/null +++ b/src/core/application/use-cases/segment/fetch-segment-by-id-use-case.ts @@ -0,0 +1,34 @@ +import { FetchSegmentByIdRepository } from '@/core/domain/repositories/segments/fetch-segment-by-id-repository' +import { SegmentResponseDto } from '../../dto/segment-dto' +import { SegmentMapper } from '../../mappers/segment-mapper' +import { inject, injectable } from 'inversify' + +export interface FetchSegmentById { + execute: ( + organizationId: string, + ledgerId: string, + segmentId: string + ) => Promise +} + +@injectable() +export class FetchSegmentByIdUseCase implements FetchSegmentById { + constructor( + @inject(FetchSegmentByIdRepository) + private readonly fetchSegmentByIdRepository: FetchSegmentByIdRepository + ) {} + + async execute( + organizationId: string, + ledgerId: string, + segmentId: string + ): Promise { + const segment = await this.fetchSegmentByIdRepository.fetchById( + organizationId, + ledgerId, + segmentId + ) + + return SegmentMapper.toResponseDto(segment) + } +} diff --git a/src/core/application/use-cases/segment/update-segment-use-case.ts b/src/core/application/use-cases/segment/update-segment-use-case.ts new file mode 100644 index 00000000..a875416f --- /dev/null +++ b/src/core/application/use-cases/segment/update-segment-use-case.ts @@ -0,0 +1,42 @@ +import { UpdateSegmentRepository } from '@/core/domain/repositories/segments/update-segment-repository' +import { SegmentResponseDto, UpdateSegmentDto } from '../../dto/segment-dto' +import { SegmentEntity } from '@/core/domain/entities/segment-entity' +import { SegmentMapper } from '../../mappers/segment-mapper' +import { inject, injectable } from 'inversify' + +export interface UpdateSegment { + execute: ( + organizationId: string, + ledgerId: string, + segmentId: string, + segment: Partial + ) => Promise +} + +@injectable() +export class UpdateSegmentUseCase implements UpdateSegment { + constructor( + @inject(UpdateSegmentRepository) + private readonly updateSegmentRepository: UpdateSegmentRepository + ) {} + + async execute( + organizationId: string, + ledgerId: string, + segmentId: string, + segment: Partial + ): Promise { + const segmentEntity: Partial = + SegmentMapper.toDomain(segment) + + const updatedSegment: SegmentEntity = + await this.updateSegmentRepository.update( + organizationId, + ledgerId, + segmentId, + segmentEntity + ) + + return SegmentMapper.toResponseDto(updatedSegment) + } +} diff --git a/src/core/domain/entities/account-entity.ts b/src/core/domain/entities/account-entity.ts index ddfeeed5..6c8a56fd 100644 --- a/src/core/domain/entities/account-entity.ts +++ b/src/core/domain/entities/account-entity.ts @@ -5,7 +5,7 @@ export type AccountEntity = { ledgerId?: string organizationId?: string parentAccountId?: string | null - productId?: string | null + segmentId?: string | null portfolioId?: string | null entityId?: string | null name: string diff --git a/src/core/domain/entities/product-entity.ts b/src/core/domain/entities/segment-entity.ts similarity index 88% rename from src/core/domain/entities/product-entity.ts rename to src/core/domain/entities/segment-entity.ts index 3b4641bc..66ec65b2 100644 --- a/src/core/domain/entities/product-entity.ts +++ b/src/core/domain/entities/segment-entity.ts @@ -1,6 +1,6 @@ import { StatusEntity } from './status-entity' -export interface ProductEntity { +export interface SegmentEntity { id?: string ledgerId?: string organizationId?: string diff --git a/src/core/domain/repositories/portfolios/create-portfolio-repository.ts b/src/core/domain/repositories/portfolios/create-portfolio-repository.ts index 437418dd..e210ee06 100644 --- a/src/core/domain/repositories/portfolios/create-portfolio-repository.ts +++ b/src/core/domain/repositories/portfolios/create-portfolio-repository.ts @@ -4,6 +4,6 @@ export abstract class CreatePortfolioRepository { abstract create: ( organizationId: string, ledgerId: string, - product: PortfolioEntity + segment: PortfolioEntity ) => Promise } diff --git a/src/core/domain/repositories/products/create-product-repository.ts b/src/core/domain/repositories/products/create-product-repository.ts deleted file mode 100644 index 8773a28c..00000000 --- a/src/core/domain/repositories/products/create-product-repository.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { ProductEntity } from '../../entities/product-entity' - -export abstract class CreateProductRepository { - abstract create: ( - organizationId: string, - ledgerId: string, - product: ProductEntity - ) => Promise -} diff --git a/src/core/domain/repositories/products/delete-product-repository.test.ts b/src/core/domain/repositories/products/delete-product-repository.test.ts deleted file mode 100644 index 9850a0e8..00000000 --- a/src/core/domain/repositories/products/delete-product-repository.test.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { DeleteProductRepository } from './delete-product-repository' - -describe('DeleteProductRepository', () => { - let deleteProductRepository: DeleteProductRepository - - beforeEach(() => { - deleteProductRepository = { - delete: jest.fn() - } - }) - - it('should call delete with correct parameters', async () => { - const organizationId = 'org123' - const ledgerId = 'ledger123' - const productId = 'product123' - - await deleteProductRepository.delete(organizationId, ledgerId, productId) - - expect(deleteProductRepository.delete).toHaveBeenCalledWith( - organizationId, - ledgerId, - productId - ) - }) - - it('should return a promise that resolves to void', async () => { - const organizationId = 'org123' - const ledgerId = 'ledger123' - const productId = 'product123' - - ;(deleteProductRepository.delete as jest.Mock).mockResolvedValueOnce( - undefined - ) - - await expect( - deleteProductRepository.delete(organizationId, ledgerId, productId) - ).resolves.toBeUndefined() - }) -}) diff --git a/src/core/domain/repositories/products/fetch-product-by-id-repository.test.ts b/src/core/domain/repositories/products/fetch-product-by-id-repository.test.ts deleted file mode 100644 index 34b0d42b..00000000 --- a/src/core/domain/repositories/products/fetch-product-by-id-repository.test.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { FetchProductByIdRepository } from './fetch-product-by-id-repository' -import { ProductEntity } from '../../entities/product-entity' - -const product: ProductEntity = { - id: '1', - name: 'Test Product', - organizationId: 'org123', - ledgerId: 'ledger123', - metadata: { key: 'value' }, - status: { code: 'active', description: 'Active' }, - createdAt: new Date(), - updatedAt: new Date(), - deletedAt: null -} - -class MockFetchProductByIdRepository implements FetchProductByIdRepository { - fetchById( - organizationId: string, - ledgerId: string, - productId: string - ): Promise { - return Promise.resolve(product) - } -} - -describe('FetchProductByIdRepository', () => { - let repository: FetchProductByIdRepository - - beforeEach(() => { - repository = new MockFetchProductByIdRepository() - }) - - it('should fetch product by id', async () => { - const organizationId = 'org123' - const ledgerId = 'ledger123' - const productId = '1' - - const product = await repository.fetchById( - organizationId, - ledgerId, - productId - ) - - expect(product).toEqual(product) - }) - - it('should return a product with the correct id', async () => { - const organizationId = 'org123' - const ledgerId = 'ledger123' - const productId = '1' - - const product = await repository.fetchById( - organizationId, - ledgerId, - productId - ) - - expect(product.id).toBe(productId) - }) -}) diff --git a/src/core/domain/repositories/products/fetch-product-by-id-repository.ts b/src/core/domain/repositories/products/fetch-product-by-id-repository.ts deleted file mode 100644 index 7752c202..00000000 --- a/src/core/domain/repositories/products/fetch-product-by-id-repository.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { ProductEntity } from '../../entities/product-entity' - -export abstract class FetchProductByIdRepository { - abstract fetchById: ( - organizationId: string, - ledgerId: string, - productId: string - ) => Promise -} diff --git a/src/core/domain/repositories/products/update-product-repository.test.ts b/src/core/domain/repositories/products/update-product-repository.test.ts deleted file mode 100644 index ef4bae35..00000000 --- a/src/core/domain/repositories/products/update-product-repository.test.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { UpdateProductRepository } from './update-product-repository' -import { ProductEntity } from '../../entities/product-entity' - -describe('UpdateProductRepository', () => { - let updateProductRepository: UpdateProductRepository - - beforeEach(() => { - updateProductRepository = { - update: jest.fn() - } - }) - - it('should update a product successfully', async () => { - const organizationId = 'org123' - const ledgerId = 'ledger123' - const productId = 'product123' - const product: Partial = { name: 'Updated Product' } - const updatedProduct: ProductEntity = { - id: productId, - name: 'Updated Product', - organizationId, - ledgerId, - metadata: {}, - status: { code: 'active', description: 'Active' }, - createdAt: new Date(), - updatedAt: new Date(), - deletedAt: null - } - - ;(updateProductRepository.update as jest.Mock).mockResolvedValue( - updatedProduct - ) - - const result = await updateProductRepository.update( - organizationId, - ledgerId, - productId, - product - ) - - expect(result).toEqual(updatedProduct) - expect(updateProductRepository.update).toHaveBeenCalledWith( - organizationId, - ledgerId, - productId, - product - ) - }) - - it('should throw an error if update fails', async () => { - const organizationId = 'org123' - const ledgerId = 'ledger123' - const productId = 'product123' - const product: Partial = { name: 'Updated Product' } - const errorMessage = 'Update failed' - - ;(updateProductRepository.update as jest.Mock).mockRejectedValue( - new Error(errorMessage) - ) - - await expect( - updateProductRepository.update( - organizationId, - ledgerId, - productId, - product - ) - ).rejects.toThrow(errorMessage) - expect(updateProductRepository.update).toHaveBeenCalledWith( - organizationId, - ledgerId, - productId, - product - ) - }) -}) diff --git a/src/core/domain/repositories/products/update-product-repository.ts b/src/core/domain/repositories/products/update-product-repository.ts deleted file mode 100644 index fda412f5..00000000 --- a/src/core/domain/repositories/products/update-product-repository.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { ProductEntity } from '../../entities/product-entity' - -export abstract class UpdateProductRepository { - abstract update: ( - organizationId: string, - ledgerId: string, - productId: string, - product: Partial - ) => Promise -} diff --git a/src/core/domain/repositories/products/create-product-repository.test.ts b/src/core/domain/repositories/segments/create-segment-repository.test.ts similarity index 51% rename from src/core/domain/repositories/products/create-product-repository.test.ts rename to src/core/domain/repositories/segments/create-segment-repository.test.ts index 89a0839b..09d521d7 100644 --- a/src/core/domain/repositories/products/create-product-repository.test.ts +++ b/src/core/domain/repositories/segments/create-segment-repository.test.ts @@ -1,25 +1,25 @@ -import { CreateProductRepository } from './create-product-repository' -import { ProductEntity } from '../../entities/product-entity' +import { CreateSegmentRepository } from './create-segment-repository' +import { SegmentEntity } from '../../entities/segment-entity' -class MockCreateProductRepository implements CreateProductRepository { +class MockCreateSegmentRepository implements CreateSegmentRepository { async create( organizationId: string, ledgerId: string, - product: ProductEntity - ): Promise { - return product + segment: SegmentEntity + ): Promise { + return segment } } -describe('CreateProductRepository', () => { - let repository: CreateProductRepository - let mockProduct: ProductEntity +describe('CreateSegmentRepository', () => { + let repository: CreateSegmentRepository + let mockSegment: SegmentEntity beforeEach(() => { - repository = new MockCreateProductRepository() - mockProduct = { + repository = new MockCreateSegmentRepository() + mockSegment = { id: '1', - name: 'Test Product', + name: 'Test Segment', organizationId: 'org123', ledgerId: 'ledger123', metadata: { @@ -35,7 +35,7 @@ describe('CreateProductRepository', () => { } }) - it('should create a product successfully', async () => { + it('should create a segment successfully', async () => { const organizationId = 'org123' const ledgerId = 'ledger123' @@ -44,24 +44,24 @@ describe('CreateProductRepository', () => { const result = await repository.create( organizationId, ledgerId, - mockProduct + mockSegment ) - expect(result).toEqual(mockProduct) + expect(result).toEqual(mockSegment) expect(spyCreate).toHaveBeenCalledWith( organizationId, ledgerId, - mockProduct + mockSegment ) }) - it('should throw an error if product creation fails', async () => { - const failingRepository: CreateProductRepository = { + it('should throw an error if segment creation fails', async () => { + const failingRepository: CreateSegmentRepository = { create: jest.fn().mockRejectedValue(new Error('Creation failed')) } await expect( - failingRepository.create('org123', 'ledger123', mockProduct) + failingRepository.create('org123', 'ledger123', mockSegment) ).rejects.toThrow('Creation failed') }) }) diff --git a/src/core/domain/repositories/segments/create-segment-repository.ts b/src/core/domain/repositories/segments/create-segment-repository.ts new file mode 100644 index 00000000..380c1b27 --- /dev/null +++ b/src/core/domain/repositories/segments/create-segment-repository.ts @@ -0,0 +1,9 @@ +import { SegmentEntity } from '../../entities/segment-entity' + +export abstract class CreateSegmentRepository { + abstract create: ( + organizationId: string, + ledgerId: string, + segment: SegmentEntity + ) => Promise +} diff --git a/src/core/domain/repositories/segments/delete-segment-repository.test.ts b/src/core/domain/repositories/segments/delete-segment-repository.test.ts new file mode 100644 index 00000000..5a692ca1 --- /dev/null +++ b/src/core/domain/repositories/segments/delete-segment-repository.test.ts @@ -0,0 +1,39 @@ +import { DeleteSegmentRepository } from './delete-segment-repository' + +describe('DeleteSegmentRepository', () => { + let deleteSegmentRepository: DeleteSegmentRepository + + beforeEach(() => { + deleteSegmentRepository = { + delete: jest.fn() + } + }) + + it('should call delete with correct parameters', async () => { + const organizationId = 'org123' + const ledgerId = 'ledger123' + const segmentId = 'segment123' + + await deleteSegmentRepository.delete(organizationId, ledgerId, segmentId) + + expect(deleteSegmentRepository.delete).toHaveBeenCalledWith( + organizationId, + ledgerId, + segmentId + ) + }) + + it('should return a promise that resolves to void', async () => { + const organizationId = 'org123' + const ledgerId = 'ledger123' + const segmentId = 'segment123' + + ;(deleteSegmentRepository.delete as jest.Mock).mockResolvedValueOnce( + undefined + ) + + await expect( + deleteSegmentRepository.delete(organizationId, ledgerId, segmentId) + ).resolves.toBeUndefined() + }) +}) diff --git a/src/core/domain/repositories/products/delete-product-repository.ts b/src/core/domain/repositories/segments/delete-segment-repository.ts similarity index 57% rename from src/core/domain/repositories/products/delete-product-repository.ts rename to src/core/domain/repositories/segments/delete-segment-repository.ts index 4ac3e2d2..b94e4702 100644 --- a/src/core/domain/repositories/products/delete-product-repository.ts +++ b/src/core/domain/repositories/segments/delete-segment-repository.ts @@ -1,7 +1,7 @@ -export abstract class DeleteProductRepository { +export abstract class DeleteSegmentRepository { abstract delete: ( organizationId: string, ledgerId: string, - productId: string + segmentId: string ) => Promise } diff --git a/src/core/domain/repositories/products/fetch-all-products-repository.test.ts b/src/core/domain/repositories/segments/fetch-all-segments-repository.test.ts similarity index 55% rename from src/core/domain/repositories/products/fetch-all-products-repository.test.ts rename to src/core/domain/repositories/segments/fetch-all-segments-repository.test.ts index 180c809e..17bcdac5 100644 --- a/src/core/domain/repositories/products/fetch-all-products-repository.test.ts +++ b/src/core/domain/repositories/segments/fetch-all-segments-repository.test.ts @@ -1,26 +1,26 @@ -import { FetchAllProductsRepository } from './fetch-all-products-repository' +import { FetchAllSegmentsRepository } from './fetch-all-segments-repository' import { PaginationEntity } from '../../entities/pagination-entity' -import { ProductEntity } from '../../entities/product-entity' +import { SegmentEntity } from '../../entities/segment-entity' -describe('FetchAllProductsRepository', () => { - let fetchAllProductsRepository: FetchAllProductsRepository +describe('FetchAllSegmentsRepository', () => { + let fetchAllSegmentsRepository: FetchAllSegmentsRepository beforeEach(() => { - fetchAllProductsRepository = { + fetchAllSegmentsRepository = { fetchAll: jest.fn() } }) - it('should fetch all products with given organizationId and ledgerId', async () => { + it('should fetch all segments with given organizationId and ledgerId', async () => { const organizationId = 'org123' const ledgerId = 'ledger123' const limit = 10 const page = 1 - const expectedProducts: PaginationEntity = { + const expectedSegments: PaginationEntity = { items: [ { id: '1', - name: 'Test Product', + name: 'Test Segment', organizationId: 'org123', ledgerId: 'ledger123', metadata: { key: 'value' }, @@ -31,7 +31,7 @@ describe('FetchAllProductsRepository', () => { }, { id: '2', - name: 'Test Product 2', + name: 'Test Segment 2', organizationId: 'org123', ledgerId: 'ledger123', metadata: { key: 'value' }, @@ -44,37 +44,37 @@ describe('FetchAllProductsRepository', () => { page: 1, limit: 10 } - ;(fetchAllProductsRepository.fetchAll as jest.Mock).mockResolvedValue( - expectedProducts + ;(fetchAllSegmentsRepository.fetchAll as jest.Mock).mockResolvedValue( + expectedSegments ) - const result = await fetchAllProductsRepository.fetchAll( + const result = await fetchAllSegmentsRepository.fetchAll( organizationId, ledgerId, limit, page ) - expect(fetchAllProductsRepository.fetchAll).toHaveBeenCalledWith( + expect(fetchAllSegmentsRepository.fetchAll).toHaveBeenCalledWith( organizationId, ledgerId, limit, page ) - expect(result).toEqual(expectedProducts) + expect(result).toEqual(expectedSegments) }) - it('should handle errors when fetching products', async () => { + it('should handle errors when fetching segments', async () => { const organizationId = 'org123' const ledgerId = 'ledger123' const limit = 10 const page = 1 - const error = new Error('Failed to fetch products') + const error = new Error('Failed to fetch segments') - ;(fetchAllProductsRepository.fetchAll as jest.Mock).mockRejectedValue(error) + ;(fetchAllSegmentsRepository.fetchAll as jest.Mock).mockRejectedValue(error) await expect( - fetchAllProductsRepository.fetchAll(organizationId, ledgerId, limit, page) - ).rejects.toThrow('Failed to fetch products') + fetchAllSegmentsRepository.fetchAll(organizationId, ledgerId, limit, page) + ).rejects.toThrow('Failed to fetch segments') }) }) diff --git a/src/core/domain/repositories/products/fetch-all-products-repository.ts b/src/core/domain/repositories/segments/fetch-all-segments-repository.ts similarity index 52% rename from src/core/domain/repositories/products/fetch-all-products-repository.ts rename to src/core/domain/repositories/segments/fetch-all-segments-repository.ts index 15303ad8..de08a3dc 100644 --- a/src/core/domain/repositories/products/fetch-all-products-repository.ts +++ b/src/core/domain/repositories/segments/fetch-all-segments-repository.ts @@ -1,11 +1,11 @@ import { PaginationEntity } from '../../entities/pagination-entity' -import { ProductEntity } from '../../entities/product-entity' +import { SegmentEntity } from '../../entities/segment-entity' -export abstract class FetchAllProductsRepository { +export abstract class FetchAllSegmentsRepository { abstract fetchAll: ( organizationId: string, ledgerId: string, limit: number, page: number - ) => Promise> + ) => Promise> } diff --git a/src/core/domain/repositories/segments/fetch-segment-by-id-repository.test.ts b/src/core/domain/repositories/segments/fetch-segment-by-id-repository.test.ts new file mode 100644 index 00000000..47fac37d --- /dev/null +++ b/src/core/domain/repositories/segments/fetch-segment-by-id-repository.test.ts @@ -0,0 +1,60 @@ +import { FetchSegmentByIdRepository } from './fetch-segment-by-id-repository' +import { SegmentEntity } from '../../entities/segment-entity' + +const segment: SegmentEntity = { + id: '1', + name: 'Test Segment', + organizationId: 'org123', + ledgerId: 'ledger123', + metadata: { key: 'value' }, + status: { code: 'active', description: 'Active' }, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null +} + +class MockFetchSegmentByIdRepository implements FetchSegmentByIdRepository { + fetchById( + organizationId: string, + ledgerId: string, + segmentId: string + ): Promise { + return Promise.resolve(segment) + } +} + +describe('FetchSegmentByIdRepository', () => { + let repository: FetchSegmentByIdRepository + + beforeEach(() => { + repository = new MockFetchSegmentByIdRepository() + }) + + it('should fetch segment by id', async () => { + const organizationId = 'org123' + const ledgerId = 'ledger123' + const segmentId = '1' + + const segment = await repository.fetchById( + organizationId, + ledgerId, + segmentId + ) + + expect(segment).toEqual(segment) + }) + + it('should return a segment with the correct id', async () => { + const organizationId = 'org123' + const ledgerId = 'ledger123' + const segmentId = '1' + + const segment = await repository.fetchById( + organizationId, + ledgerId, + segmentId + ) + + expect(segment.id).toBe(segmentId) + }) +}) diff --git a/src/core/domain/repositories/segments/fetch-segment-by-id-repository.ts b/src/core/domain/repositories/segments/fetch-segment-by-id-repository.ts new file mode 100644 index 00000000..0e5c3dd2 --- /dev/null +++ b/src/core/domain/repositories/segments/fetch-segment-by-id-repository.ts @@ -0,0 +1,9 @@ +import { SegmentEntity } from '../../entities/segment-entity' + +export abstract class FetchSegmentByIdRepository { + abstract fetchById: ( + organizationId: string, + ledgerId: string, + segmentId: string + ) => Promise +} diff --git a/src/core/domain/repositories/segments/update-segment-repository.test.ts b/src/core/domain/repositories/segments/update-segment-repository.test.ts new file mode 100644 index 00000000..5e281abb --- /dev/null +++ b/src/core/domain/repositories/segments/update-segment-repository.test.ts @@ -0,0 +1,76 @@ +import { UpdateSegmentRepository } from './update-segment-repository' +import { SegmentEntity } from '../../entities/segment-entity' + +describe('UpdateSegmentRepository', () => { + let updateSegmentRepository: UpdateSegmentRepository + + beforeEach(() => { + updateSegmentRepository = { + update: jest.fn() + } + }) + + it('should update a segment successfully', async () => { + const organizationId = 'org123' + const ledgerId = 'ledger123' + const segmentId = 'segment123' + const segment: Partial = { name: 'Updated Segment' } + const updatedSegment: SegmentEntity = { + id: segmentId, + name: 'Updated Segment', + organizationId, + ledgerId, + metadata: {}, + status: { code: 'active', description: 'Active' }, + createdAt: new Date(), + updatedAt: new Date(), + deletedAt: null + } + + ;(updateSegmentRepository.update as jest.Mock).mockResolvedValue( + updatedSegment + ) + + const result = await updateSegmentRepository.update( + organizationId, + ledgerId, + segmentId, + segment + ) + + expect(result).toEqual(updatedSegment) + expect(updateSegmentRepository.update).toHaveBeenCalledWith( + organizationId, + ledgerId, + segmentId, + segment + ) + }) + + it('should throw an error if update fails', async () => { + const organizationId = 'org123' + const ledgerId = 'ledger123' + const segmentId = 'segment123' + const segment: Partial = { name: 'Updated Segment' } + const errorMessage = 'Update failed' + + ;(updateSegmentRepository.update as jest.Mock).mockRejectedValue( + new Error(errorMessage) + ) + + await expect( + updateSegmentRepository.update( + organizationId, + ledgerId, + segmentId, + segment + ) + ).rejects.toThrow(errorMessage) + expect(updateSegmentRepository.update).toHaveBeenCalledWith( + organizationId, + ledgerId, + segmentId, + segment + ) + }) +}) diff --git a/src/core/domain/repositories/segments/update-segment-repository.ts b/src/core/domain/repositories/segments/update-segment-repository.ts new file mode 100644 index 00000000..b7198ed3 --- /dev/null +++ b/src/core/domain/repositories/segments/update-segment-repository.ts @@ -0,0 +1,10 @@ +import { SegmentEntity } from '../../entities/segment-entity' + +export abstract class UpdateSegmentRepository { + abstract update: ( + organizationId: string, + ledgerId: string, + segmentId: string, + segment: Partial + ) => Promise +} diff --git a/src/core/infrastructure/container-registry/container-registry.ts b/src/core/infrastructure/container-registry/container-registry.ts index 93255ecf..c892a4eb 100644 --- a/src/core/infrastructure/container-registry/container-registry.ts +++ b/src/core/infrastructure/container-registry/container-registry.ts @@ -7,7 +7,7 @@ import { LedgerUseCaseModule } from './use-cases/ledger-module' import { PortfolioUseCaseModule } from './use-cases/portfolios-module' import { AccountUseCaseModule } from './use-cases/account-module' import { AssetUseCaseModule } from './use-cases/asset-module' -import { ProductUseCaseModule } from './use-cases/product-module' +import { SegmentUseCaseModule } from './use-cases/segment-module' import { CasdoorModule } from '../casdoor/module/casdoor-module' import { AuthUseCaseModule } from './use-cases/auth-module' import { LoggerModule } from '../logger/module/logger-module' @@ -29,7 +29,7 @@ container.load(LedgerUseCaseModule) container.load(PortfolioUseCaseModule) container.load(AccountUseCaseModule) container.load(AssetUseCaseModule) -container.load(ProductUseCaseModule) +container.load(SegmentUseCaseModule) container.load(LoggerApplicationModule) container.load(TransactionUseCaseModule) diff --git a/src/core/infrastructure/container-registry/use-cases/product-module.ts b/src/core/infrastructure/container-registry/use-cases/product-module.ts deleted file mode 100644 index c5b6ed09..00000000 --- a/src/core/infrastructure/container-registry/use-cases/product-module.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { Container, ContainerModule } from '../../utils/di/container' - -import { - CreateProduct, - CreateProductUseCase -} from '@/core/application/use-cases/product/create-product-use-case' -import { - DeleteProduct, - DeleteProductUseCase -} from '@/core/application/use-cases/product/delete-product-use-case' -import { - FetchAllProducts, - FetchAllProductsUseCase -} from '@/core/application/use-cases/product/fetch-all-products-use-case' -import { - FetchProductById, - FetchProductByIdUseCase -} from '@/core/application/use-cases/product/fetch-product-by-id-use-case' -import { - UpdateProduct, - UpdateProductUseCase -} from '@/core/application/use-cases/product/update-product-use-case' - -export const ProductUseCaseModule = new ContainerModule( - (container: Container) => { - container.bind(CreateProductUseCase).toSelf() - container.bind(FetchAllProductsUseCase).toSelf() - container.bind(UpdateProductUseCase).toSelf() - container.bind(DeleteProductUseCase).toSelf() - container.bind(FetchProductByIdUseCase).toSelf() - } -) diff --git a/src/core/infrastructure/container-registry/use-cases/segment-module.ts b/src/core/infrastructure/container-registry/use-cases/segment-module.ts new file mode 100644 index 00000000..aecdb4f8 --- /dev/null +++ b/src/core/infrastructure/container-registry/use-cases/segment-module.ts @@ -0,0 +1,32 @@ +import { Container, ContainerModule } from '../../utils/di/container' + +import { + CreateSegment, + CreateSegmentUseCase +} from '@/core/application/use-cases/segment/create-segment-use-case' +import { + DeleteSegment, + DeleteSegmentUseCase +} from '@/core/application/use-cases/segment/delete-segment-use-case' +import { + FetchAllSegments, + FetchAllSegmentsUseCase +} from '@/core/application/use-cases/segment/fetch-all-segments-use-case' +import { + FetchSegmentById, + FetchSegmentByIdUseCase +} from '@/core/application/use-cases/segment/fetch-segment-by-id-use-case' +import { + UpdateSegment, + UpdateSegmentUseCase +} from '@/core/application/use-cases/segment/update-segment-use-case' + +export const SegmentUseCaseModule = new ContainerModule( + (container: Container) => { + container.bind(CreateSegmentUseCase).toSelf() + container.bind(FetchAllSegmentsUseCase).toSelf() + container.bind(UpdateSegmentUseCase).toSelf() + container.bind(DeleteSegmentUseCase).toSelf() + container.bind(FetchSegmentByIdUseCase).toSelf() + } +) diff --git a/src/core/infrastructure/midaz/module/midaz-module.ts b/src/core/infrastructure/midaz/module/midaz-module.ts index 4d2ebab3..cde610a9 100644 --- a/src/core/infrastructure/midaz/module/midaz-module.ts +++ b/src/core/infrastructure/midaz/module/midaz-module.ts @@ -4,7 +4,7 @@ import { MidazAssetModule } from './asset-module' import { MidazLedgerModule } from './ledger-module' import { MidazOrganizationModule } from './organization-module' import { MidazPortfolioModule } from './portfolio-module' -import { MidazProductModule } from './product-module' +import { MidazSegmentModule } from './segment-module' import { MidazTransactionModule } from './transaction-module' export const MidazModule = new ContainerModule((container: Container) => { @@ -13,6 +13,6 @@ export const MidazModule = new ContainerModule((container: Container) => { container.load(MidazPortfolioModule) container.load(MidazAccountModule) container.load(MidazAssetModule) - container.load(MidazProductModule) + container.load(MidazSegmentModule) container.load(MidazTransactionModule) }) diff --git a/src/core/infrastructure/midaz/module/product-module.ts b/src/core/infrastructure/midaz/module/product-module.ts deleted file mode 100644 index e72cf6d6..00000000 --- a/src/core/infrastructure/midaz/module/product-module.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { Container, ContainerModule } from '../../utils/di/container' - -import { CreateProductRepository } from '@/core/domain/repositories/products/create-product-repository' -import { DeleteProductRepository } from '@/core/domain/repositories/products/delete-product-repository' -import { FetchAllProductsRepository } from '@/core/domain/repositories/products/fetch-all-products-repository' -import { FetchProductByIdRepository } from '@/core/domain/repositories/products/fetch-product-by-id-repository' -import { UpdateProductRepository } from '@/core/domain/repositories/products/update-product-repository' - -import { MidazCreateProductRepository } from '../product/midaz-create-product-repository' -import { MidazFetchAllProductsRepository } from '../product/midaz-fetch-all-products-repository' -import { MidazUpdateProductRepository } from '../product/midaz-update-product-repository' -import { MidazDeleteProductRepository } from '../product/midaz-delete-product-repository' -import { MidazFetchProductByIdRepository } from '../product/midaz-fetch-product-by-id-repository' - -export const MidazProductModule = new ContainerModule( - (container: Container) => { - container - .bind(CreateProductRepository) - .to(MidazCreateProductRepository) - - container - .bind(FetchAllProductsRepository) - .to(MidazFetchAllProductsRepository) - - container - .bind(UpdateProductRepository) - .to(MidazUpdateProductRepository) - - container - .bind(DeleteProductRepository) - .to(MidazDeleteProductRepository) - - container - .bind(FetchProductByIdRepository) - .to(MidazFetchProductByIdRepository) - } -) diff --git a/src/core/infrastructure/midaz/module/segment-module.ts b/src/core/infrastructure/midaz/module/segment-module.ts new file mode 100644 index 00000000..3d7484fd --- /dev/null +++ b/src/core/infrastructure/midaz/module/segment-module.ts @@ -0,0 +1,37 @@ +import { Container, ContainerModule } from '../../utils/di/container' + +import { CreateSegmentRepository } from '@/core/domain/repositories/segments/create-segment-repository' +import { DeleteSegmentRepository } from '@/core/domain/repositories/segments/delete-segment-repository' +import { FetchAllSegmentsRepository } from '@/core/domain/repositories/segments/fetch-all-segments-repository' +import { FetchSegmentByIdRepository } from '@/core/domain/repositories/segments/fetch-segment-by-id-repository' +import { UpdateSegmentRepository } from '@/core/domain/repositories/segments/update-segment-repository' + +import { MidazCreateSegmentRepository } from '../segments/midaz-create-segment-repository' +import { MidazFetchAllSegmentsRepository } from '../segments/midaz-fetch-all-segments-repository' +import { MidazUpdateSegmentRepository } from '../segments/midaz-update-segment-repository' +import { MidazDeleteSegmentRepository } from '../segments/midaz-delete-segment-repository' +import { MidazFetchSegmentByIdRepository } from '../segments/midaz-fetch-segment-by-id-repository' + +export const MidazSegmentModule = new ContainerModule( + (container: Container) => { + container + .bind(CreateSegmentRepository) + .to(MidazCreateSegmentRepository) + + container + .bind(FetchAllSegmentsRepository) + .to(MidazFetchAllSegmentsRepository) + + container + .bind(UpdateSegmentRepository) + .to(MidazUpdateSegmentRepository) + + container + .bind(DeleteSegmentRepository) + .to(MidazDeleteSegmentRepository) + + container + .bind(FetchSegmentByIdRepository) + .to(MidazFetchSegmentByIdRepository) + } +) diff --git a/src/core/infrastructure/midaz/product/midaz-create-product-repository.test.ts b/src/core/infrastructure/midaz/segments/midaz-create-segment-repository.test.ts similarity index 62% rename from src/core/infrastructure/midaz/product/midaz-create-product-repository.test.ts rename to src/core/infrastructure/midaz/segments/midaz-create-segment-repository.test.ts index edeaabd8..9b4ab9ee 100644 --- a/src/core/infrastructure/midaz/product/midaz-create-product-repository.test.ts +++ b/src/core/infrastructure/midaz/segments/midaz-create-segment-repository.test.ts @@ -1,5 +1,5 @@ -import { MidazCreateProductRepository } from './midaz-create-product-repository' -import { ProductEntity } from '@/core/domain/entities/product-entity' +import { MidazCreateSegmentRepository } from './midaz-create-segment-repository' +import { SegmentEntity } from '@/core/domain/entities/segment-entity' import { HTTP_METHODS } from '../../utils/http-fetch-utils' jest.mock('../../utils/http-fetch-utils', () => ({ @@ -9,45 +9,45 @@ jest.mock('../../utils/http-fetch-utils', () => ({ } })) -describe('MidazCreateProductRepository', () => { - let repository: MidazCreateProductRepository +describe('MidazCreateSegmentRepository', () => { + let repository: MidazCreateSegmentRepository let mockHttpFetchUtils: { httpMidazAuthFetch: jest.Mock } beforeEach(() => { mockHttpFetchUtils = { httpMidazAuthFetch: jest.fn() } - repository = new MidazCreateProductRepository(mockHttpFetchUtils as any) + repository = new MidazCreateSegmentRepository(mockHttpFetchUtils as any) jest.clearAllMocks() }) - it('should create a product successfully', async () => { + it('should create a segment successfully', async () => { const organizationId = '1' const ledgerId = '1' - const product: ProductEntity = { + const segment: SegmentEntity = { id: '1', - name: 'Test Product', + name: 'Test Segment', status: { code: 'ACTIVE', description: '' }, metadata: {} } - const response: ProductEntity = { ...product } + const response: SegmentEntity = { ...segment } mockHttpFetchUtils.httpMidazAuthFetch.mockResolvedValueOnce(response) - const result = await repository.create(organizationId, ledgerId, product) + const result = await repository.create(organizationId, ledgerId, segment) expect(mockHttpFetchUtils.httpMidazAuthFetch).toHaveBeenCalledWith({ - url: `${process.env.MIDAZ_BASE_PATH}/organizations/${organizationId}/ledgers/${ledgerId}/products`, + url: `${process.env.MIDAZ_BASE_PATH}/organizations/${organizationId}/ledgers/${ledgerId}/segments`, method: HTTP_METHODS.POST, - body: JSON.stringify(product) + body: JSON.stringify(segment) }) expect(result).toEqual(response) }) - it('should handle errors when creating a product', async () => { + it('should handle errors when creating a segment', async () => { const organizationId = '1' const ledgerId = '1' - const product: ProductEntity = { + const segment: SegmentEntity = { id: '1', - name: 'Test Product', + name: 'Test Segment', status: { code: 'ACTIVE', description: '' }, metadata: {} } @@ -56,13 +56,13 @@ describe('MidazCreateProductRepository', () => { mockHttpFetchUtils.httpMidazAuthFetch.mockRejectedValueOnce(error) await expect( - repository.create(organizationId, ledgerId, product) + repository.create(organizationId, ledgerId, segment) ).rejects.toThrow('Error occurred') expect(mockHttpFetchUtils.httpMidazAuthFetch).toHaveBeenCalledWith({ - url: `${process.env.MIDAZ_BASE_PATH}/organizations/${organizationId}/ledgers/${ledgerId}/products`, + url: `${process.env.MIDAZ_BASE_PATH}/organizations/${organizationId}/ledgers/${ledgerId}/segments`, method: HTTP_METHODS.POST, - body: JSON.stringify(product) + body: JSON.stringify(segment) }) }) }) diff --git a/src/core/infrastructure/midaz/product/midaz-create-product-repository.ts b/src/core/infrastructure/midaz/segments/midaz-create-segment-repository.ts similarity index 59% rename from src/core/infrastructure/midaz/product/midaz-create-product-repository.ts rename to src/core/infrastructure/midaz/segments/midaz-create-segment-repository.ts index b6c10cbe..9f5e584c 100644 --- a/src/core/infrastructure/midaz/product/midaz-create-product-repository.ts +++ b/src/core/infrastructure/midaz/segments/midaz-create-segment-repository.ts @@ -1,10 +1,11 @@ -import { ProductEntity } from '@/core/domain/entities/product-entity' -import { CreateProductRepository } from '@/core/domain/repositories/products/create-product-repository' +import { SegmentEntity } from '@/core/domain/entities/segment-entity' +import { CreateSegmentRepository } from '@/core/domain/repositories/segments/create-segment-repository' import { HTTP_METHODS, MidazHttpFetchUtils } from '../../utils/http-fetch-utils' import { injectable, inject } from 'inversify' import { ContainerTypeMidazHttpFetch } from '../../container-registry/midaz-http-fetch-module' + @injectable() -export class MidazCreateProductRepository implements CreateProductRepository { +export class MidazCreateSegmentRepository implements CreateSegmentRepository { private baseUrl: string = process.env.MIDAZ_BASE_PATH as string constructor( @@ -15,14 +16,14 @@ export class MidazCreateProductRepository implements CreateProductRepository { async create( organizationId: string, ledgerId: string, - product: ProductEntity - ): Promise { - const url = `${this.baseUrl}/organizations/${organizationId}/ledgers/${ledgerId}/products` + segment: SegmentEntity + ): Promise { + const url = `${this.baseUrl}/organizations/${organizationId}/ledgers/${ledgerId}/segments` const response = - await this.midazHttpFetchUtils.httpMidazAuthFetch({ + await this.midazHttpFetchUtils.httpMidazAuthFetch({ url, method: HTTP_METHODS.POST, - body: JSON.stringify(product) + body: JSON.stringify(segment) }) return response diff --git a/src/core/infrastructure/midaz/product/midaz-delete-product-repository.test.ts b/src/core/infrastructure/midaz/segments/midaz-delete-segment-repository.test.ts similarity index 63% rename from src/core/infrastructure/midaz/product/midaz-delete-product-repository.test.ts rename to src/core/infrastructure/midaz/segments/midaz-delete-segment-repository.test.ts index 49d25463..c6114d5c 100644 --- a/src/core/infrastructure/midaz/product/midaz-delete-product-repository.test.ts +++ b/src/core/infrastructure/midaz/segments/midaz-delete-segment-repository.test.ts @@ -1,4 +1,4 @@ -import { MidazDeleteProductRepository } from './midaz-delete-product-repository' +import { MidazDeleteSegmentRepository } from './midaz-delete-segment-repository' import { HTTP_METHODS } from '../../utils/http-fetch-utils' jest.mock('../../utils/http-fetch-utils', () => ({ @@ -8,45 +8,45 @@ jest.mock('../../utils/http-fetch-utils', () => ({ } })) -describe('MidazDeleteProductRepository', () => { - let repository: MidazDeleteProductRepository +describe('MidazDeleteSegmentRepository', () => { + let repository: MidazDeleteSegmentRepository let mockHttpFetchUtils: { httpMidazAuthFetch: jest.Mock } beforeEach(() => { mockHttpFetchUtils = { httpMidazAuthFetch: jest.fn() } - repository = new MidazDeleteProductRepository(mockHttpFetchUtils as any) + repository = new MidazDeleteSegmentRepository(mockHttpFetchUtils as any) jest.clearAllMocks() }) - it('should delete a product successfully', async () => { + it('should delete a segment successfully', async () => { const organizationId = '1' const ledgerId = '1' - const productId = '1' + const segmentId = '1' mockHttpFetchUtils.httpMidazAuthFetch.mockResolvedValueOnce(undefined) - await repository.delete(organizationId, ledgerId, productId) + await repository.delete(organizationId, ledgerId, segmentId) expect(mockHttpFetchUtils.httpMidazAuthFetch).toHaveBeenCalledWith({ - url: `${process.env.MIDAZ_BASE_PATH}/organizations/${organizationId}/ledgers/${ledgerId}/products/${productId}`, + url: `${process.env.MIDAZ_BASE_PATH}/organizations/${organizationId}/ledgers/${ledgerId}/segments/${segmentId}`, method: HTTP_METHODS.DELETE }) }) - it('should handle errors when deleting a product', async () => { + it('should handle errors when deleting a segment', async () => { const organizationId = '1' const ledgerId = '1' - const productId = '1' + const segmentId = '1' const error = new Error('Error occurred') mockHttpFetchUtils.httpMidazAuthFetch.mockRejectedValueOnce(error) await expect( - repository.delete(organizationId, ledgerId, productId) + repository.delete(organizationId, ledgerId, segmentId) ).rejects.toThrow('Error occurred') expect(mockHttpFetchUtils.httpMidazAuthFetch).toHaveBeenCalledWith({ - url: `${process.env.MIDAZ_BASE_PATH}/organizations/${organizationId}/ledgers/${ledgerId}/products/${productId}`, + url: `${process.env.MIDAZ_BASE_PATH}/organizations/${organizationId}/ledgers/${ledgerId}/segments/${segmentId}`, method: HTTP_METHODS.DELETE }) }) diff --git a/src/core/infrastructure/midaz/product/midaz-delete-product-repository.ts b/src/core/infrastructure/midaz/segments/midaz-delete-segment-repository.ts similarity index 72% rename from src/core/infrastructure/midaz/product/midaz-delete-product-repository.ts rename to src/core/infrastructure/midaz/segments/midaz-delete-segment-repository.ts index bde51c0f..e8effbe6 100644 --- a/src/core/infrastructure/midaz/product/midaz-delete-product-repository.ts +++ b/src/core/infrastructure/midaz/segments/midaz-delete-segment-repository.ts @@ -1,10 +1,10 @@ -import { DeleteProductRepository } from '@/core/domain/repositories/products/delete-product-repository' +import { DeleteSegmentRepository } from '@/core/domain/repositories/segments/delete-segment-repository' import { HTTP_METHODS, MidazHttpFetchUtils } from '../../utils/http-fetch-utils' import { inject, injectable } from 'inversify' import { ContainerTypeMidazHttpFetch } from '../../container-registry/midaz-http-fetch-module' @injectable() -export class MidazDeleteProductRepository implements DeleteProductRepository { +export class MidazDeleteSegmentRepository implements DeleteSegmentRepository { private baseUrl: string = process.env.MIDAZ_BASE_PATH as string constructor( @inject(ContainerTypeMidazHttpFetch.MidazHttpFetchUtils) @@ -13,9 +13,9 @@ export class MidazDeleteProductRepository implements DeleteProductRepository { async delete( organizationId: string, ledgerId: string, - productId: string + segmentId: string ): Promise { - const url = `${this.baseUrl}/organizations/${organizationId}/ledgers/${ledgerId}/products/${productId}` + const url = `${this.baseUrl}/organizations/${organizationId}/ledgers/${ledgerId}/segments/${segmentId}` await this.midazHttpFetchUtils.httpMidazAuthFetch({ url, diff --git a/src/core/infrastructure/midaz/product/midaz-fetch-all-products-repository.test.ts b/src/core/infrastructure/midaz/segments/midaz-fetch-all-segments-repository.test.ts similarity index 72% rename from src/core/infrastructure/midaz/product/midaz-fetch-all-products-repository.test.ts rename to src/core/infrastructure/midaz/segments/midaz-fetch-all-segments-repository.test.ts index 0c13e9a7..7c0e39c0 100644 --- a/src/core/infrastructure/midaz/product/midaz-fetch-all-products-repository.test.ts +++ b/src/core/infrastructure/midaz/segments/midaz-fetch-all-segments-repository.test.ts @@ -1,5 +1,5 @@ -import { MidazFetchAllProductsRepository } from './midaz-fetch-all-products-repository' -import { ProductEntity } from '@/core/domain/entities/product-entity' +import { MidazFetchAllSegmentsRepository } from './midaz-fetch-all-segments-repository' +import { SegmentEntity } from '@/core/domain/entities/segment-entity' import { PaginationEntity } from '@/core/domain/entities/pagination-entity' import { HTTP_METHODS } from '../../utils/http-fetch-utils' @@ -10,32 +10,32 @@ jest.mock('../../utils/http-fetch-utils', () => ({ } })) -describe('MidazFetchAllProductsRepository', () => { - let repository: MidazFetchAllProductsRepository +describe('MidazFetchAllSegmentsRepository', () => { + let repository: MidazFetchAllSegmentsRepository let mockHttpFetchUtils: { httpMidazAuthFetch: jest.Mock } beforeEach(() => { mockHttpFetchUtils = { httpMidazAuthFetch: jest.fn() } - repository = new MidazFetchAllProductsRepository(mockHttpFetchUtils as any) + repository = new MidazFetchAllSegmentsRepository(mockHttpFetchUtils as any) jest.clearAllMocks() }) - it('should fetch all products successfully', async () => { + it('should fetch all segments successfully', async () => { const organizationId = '1' const ledgerId = '1' const limit = 10 const page = 1 - const response: PaginationEntity = { + const response: PaginationEntity = { items: [ { id: '1', - name: 'Test Product', + name: 'Test Segment', status: { code: 'ACTIVE', description: '' }, metadata: {} }, { id: '2', - name: 'Test Product 2', + name: 'Test Segment 2', status: { code: 'ACTIVE', description: '' }, metadata: {} } @@ -54,13 +54,13 @@ describe('MidazFetchAllProductsRepository', () => { ) expect(mockHttpFetchUtils.httpMidazAuthFetch).toHaveBeenCalledWith({ - url: `${process.env.MIDAZ_BASE_PATH}/organizations/${organizationId}/ledgers/${ledgerId}/products?limit=${limit}&page=${page}`, + url: `${process.env.MIDAZ_BASE_PATH}/organizations/${organizationId}/ledgers/${ledgerId}/segments?limit=${limit}&page=${page}`, method: HTTP_METHODS.GET }) expect(result).toEqual(response) }) - it('should handle errors when fetching all products', async () => { + it('should handle errors when fetching all segments', async () => { const organizationId = '1' const ledgerId = '1' const limit = 10 @@ -74,7 +74,7 @@ describe('MidazFetchAllProductsRepository', () => { ).rejects.toThrow('Error occurred') expect(mockHttpFetchUtils.httpMidazAuthFetch).toHaveBeenCalledWith({ - url: `${process.env.MIDAZ_BASE_PATH}/organizations/${organizationId}/ledgers/${ledgerId}/products?limit=${limit}&page=${page}`, + url: `${process.env.MIDAZ_BASE_PATH}/organizations/${organizationId}/ledgers/${ledgerId}/segments?limit=${limit}&page=${page}`, method: HTTP_METHODS.GET }) }) diff --git a/src/core/infrastructure/midaz/product/midaz-fetch-all-products-repository.ts b/src/core/infrastructure/midaz/segments/midaz-fetch-all-segments-repository.ts similarity index 66% rename from src/core/infrastructure/midaz/product/midaz-fetch-all-products-repository.ts rename to src/core/infrastructure/midaz/segments/midaz-fetch-all-segments-repository.ts index e5fae83a..97658815 100644 --- a/src/core/infrastructure/midaz/product/midaz-fetch-all-products-repository.ts +++ b/src/core/infrastructure/midaz/segments/midaz-fetch-all-segments-repository.ts @@ -1,13 +1,13 @@ import { PaginationEntity } from '@/core/domain/entities/pagination-entity' -import { ProductEntity } from '@/core/domain/entities/product-entity' -import { FetchAllProductsRepository } from '@/core/domain/repositories/products/fetch-all-products-repository' +import { SegmentEntity } from '@/core/domain/entities/segment-entity' +import { FetchAllSegmentsRepository } from '@/core/domain/repositories/segments/fetch-all-segments-repository' import { HTTP_METHODS, MidazHttpFetchUtils } from '../../utils/http-fetch-utils' import { inject, injectable } from 'inversify' import { ContainerTypeMidazHttpFetch } from '../../container-registry/midaz-http-fetch-module' @injectable() -export class MidazFetchAllProductsRepository - implements FetchAllProductsRepository +export class MidazFetchAllSegmentsRepository + implements FetchAllSegmentsRepository { private baseUrl: string = process.env.MIDAZ_BASE_PATH as string constructor( @@ -19,11 +19,11 @@ export class MidazFetchAllProductsRepository ledgerId: string, limit: number, page: number - ): Promise> { - const url = `${this.baseUrl}/organizations/${organizationId}/ledgers/${ledgerId}/products?limit=${limit}&page=${page}` + ): Promise> { + const url = `${this.baseUrl}/organizations/${organizationId}/ledgers/${ledgerId}/segments?limit=${limit}&page=${page}` const response = await this.midazHttpFetchUtils.httpMidazAuthFetch< - PaginationEntity + PaginationEntity >({ url, method: HTTP_METHODS.GET diff --git a/src/core/infrastructure/midaz/product/midaz-fetch-product-by-id-repository.test.ts b/src/core/infrastructure/midaz/segments/midaz-fetch-segment-by-id-repository.test.ts similarity index 63% rename from src/core/infrastructure/midaz/product/midaz-fetch-product-by-id-repository.test.ts rename to src/core/infrastructure/midaz/segments/midaz-fetch-segment-by-id-repository.test.ts index f830a63e..97c341e3 100644 --- a/src/core/infrastructure/midaz/product/midaz-fetch-product-by-id-repository.test.ts +++ b/src/core/infrastructure/midaz/segments/midaz-fetch-segment-by-id-repository.test.ts @@ -1,5 +1,5 @@ -import { MidazFetchProductByIdRepository } from './midaz-fetch-product-by-id-repository' -import { ProductEntity } from '@/core/domain/entities/product-entity' +import { MidazFetchSegmentByIdRepository } from './midaz-fetch-segment-by-id-repository' +import { SegmentEntity } from '@/core/domain/entities/segment-entity' import { HTTP_METHODS } from '../../utils/http-fetch-utils' jest.mock('../../utils/http-fetch-utils', () => ({ @@ -9,23 +9,23 @@ jest.mock('../../utils/http-fetch-utils', () => ({ } })) -describe('MidazFetchProductByIdRepository', () => { - let repository: MidazFetchProductByIdRepository +describe('MidazFetchSegmentByIdRepository', () => { + let repository: MidazFetchSegmentByIdRepository let mockHttpFetchUtils: { httpMidazAuthFetch: jest.Mock } beforeEach(() => { mockHttpFetchUtils = { httpMidazAuthFetch: jest.fn() } - repository = new MidazFetchProductByIdRepository(mockHttpFetchUtils as any) + repository = new MidazFetchSegmentByIdRepository(mockHttpFetchUtils as any) jest.clearAllMocks() }) - it('should fetch a product by id successfully', async () => { + it('should fetch a segment by id successfully', async () => { const organizationId = '1' const ledgerId = '1' - const productId = '1' - const response: ProductEntity = { + const segmentId = '1' + const response: SegmentEntity = { id: '1', - name: 'Test Product', + name: 'Test Segment', status: { code: 'ACTIVE', description: '' }, metadata: {} } @@ -35,30 +35,30 @@ describe('MidazFetchProductByIdRepository', () => { const result = await repository.fetchById( organizationId, ledgerId, - productId + segmentId ) expect(mockHttpFetchUtils.httpMidazAuthFetch).toHaveBeenCalledWith({ - url: `${process.env.MIDAZ_BASE_PATH}/organizations/${organizationId}/ledgers/${ledgerId}/products/${productId}`, + url: `${process.env.MIDAZ_BASE_PATH}/organizations/${organizationId}/ledgers/${ledgerId}/segments/${segmentId}`, method: HTTP_METHODS.GET }) expect(result).toEqual(response) }) - it('should handle errors when fetching a product by id', async () => { + it('should handle errors when fetching a segment by id', async () => { const organizationId = '1' const ledgerId = '1' - const productId = '1' + const segmentId = '1' const error = new Error('Error occurred') mockHttpFetchUtils.httpMidazAuthFetch.mockRejectedValueOnce(error) await expect( - repository.fetchById(organizationId, ledgerId, productId) + repository.fetchById(organizationId, ledgerId, segmentId) ).rejects.toThrow('Error occurred') expect(mockHttpFetchUtils.httpMidazAuthFetch).toHaveBeenCalledWith({ - url: `${process.env.MIDAZ_BASE_PATH}/organizations/${organizationId}/ledgers/${ledgerId}/products/${productId}`, + url: `${process.env.MIDAZ_BASE_PATH}/organizations/${organizationId}/ledgers/${ledgerId}/segments/${segmentId}`, method: HTTP_METHODS.GET }) }) diff --git a/src/core/infrastructure/midaz/product/midaz-fetch-product-by-id-repository.ts b/src/core/infrastructure/midaz/segments/midaz-fetch-segment-by-id-repository.ts similarity index 60% rename from src/core/infrastructure/midaz/product/midaz-fetch-product-by-id-repository.ts rename to src/core/infrastructure/midaz/segments/midaz-fetch-segment-by-id-repository.ts index dbc23bf0..efc75e33 100644 --- a/src/core/infrastructure/midaz/product/midaz-fetch-product-by-id-repository.ts +++ b/src/core/infrastructure/midaz/segments/midaz-fetch-segment-by-id-repository.ts @@ -1,12 +1,12 @@ -import { FetchProductByIdRepository } from '@/core/domain/repositories/products/fetch-product-by-id-repository' +import { FetchSegmentByIdRepository } from '@/core/domain/repositories/segments/fetch-segment-by-id-repository' import { HTTP_METHODS, MidazHttpFetchUtils } from '../../utils/http-fetch-utils' -import { ProductEntity } from '@/core/domain/entities/product-entity' +import { SegmentEntity } from '@/core/domain/entities/segment-entity' import { injectable, inject } from 'inversify' import { ContainerTypeMidazHttpFetch } from '../../container-registry/midaz-http-fetch-module' @injectable() -export class MidazFetchProductByIdRepository - implements FetchProductByIdRepository +export class MidazFetchSegmentByIdRepository + implements FetchSegmentByIdRepository { private baseUrl: string = process.env.MIDAZ_BASE_PATH as string @@ -18,12 +18,12 @@ export class MidazFetchProductByIdRepository async fetchById( organizationId: string, ledgerId: string, - productId: string - ): Promise { - const url = `${this.baseUrl}/organizations/${organizationId}/ledgers/${ledgerId}/products/${productId}` + segmentId: string + ): Promise { + const url = `${this.baseUrl}/organizations/${organizationId}/ledgers/${ledgerId}/segments/${segmentId}` const response = - await this.midazHttpFetchUtils.httpMidazAuthFetch({ + await this.midazHttpFetchUtils.httpMidazAuthFetch({ url, method: HTTP_METHODS.GET }) diff --git a/src/core/infrastructure/midaz/product/midaz-update-product-repository.test.ts b/src/core/infrastructure/midaz/segments/midaz-update-segment-repository.test.ts similarity index 56% rename from src/core/infrastructure/midaz/product/midaz-update-product-repository.test.ts rename to src/core/infrastructure/midaz/segments/midaz-update-segment-repository.test.ts index d5f6184a..d9449a6d 100644 --- a/src/core/infrastructure/midaz/product/midaz-update-product-repository.test.ts +++ b/src/core/infrastructure/midaz/segments/midaz-update-segment-repository.test.ts @@ -1,5 +1,5 @@ -import { MidazUpdateProductRepository } from './midaz-update-product-repository' -import { ProductEntity } from '@/core/domain/entities/product-entity' +import { MidazUpdateSegmentRepository } from './midaz-update-segment-repository' +import { SegmentEntity } from '@/core/domain/entities/segment-entity' import { HTTP_METHODS } from '../../utils/http-fetch-utils' jest.mock('../../utils/http-fetch-utils', () => ({ @@ -9,24 +9,24 @@ jest.mock('../../utils/http-fetch-utils', () => ({ } })) -describe('MidazUpdateProductRepository', () => { - let repository: MidazUpdateProductRepository +describe('MidazUpdateSegmentRepository', () => { + let repository: MidazUpdateSegmentRepository let mockHttpFetchUtils: { httpMidazAuthFetch: jest.Mock } beforeEach(() => { mockHttpFetchUtils = { httpMidazAuthFetch: jest.fn() } - repository = new MidazUpdateProductRepository(mockHttpFetchUtils as any) + repository = new MidazUpdateSegmentRepository(mockHttpFetchUtils as any) jest.clearAllMocks() }) - it('should update a product successfully', async () => { + it('should update a segment successfully', async () => { const organizationId = '1' const ledgerId = '1' - const productId = '1' - const productData: Partial = { name: 'Updated Product' } - const response: ProductEntity = { - id: productId, - name: 'Updated Product', + const segmentId = '1' + const segmentData: Partial = { name: 'Updated Segment' } + const response: SegmentEntity = { + id: segmentId, + name: 'Updated Segment', status: { code: 'ACTIVE', description: '' }, metadata: {} } @@ -36,35 +36,35 @@ describe('MidazUpdateProductRepository', () => { const result = await repository.update( organizationId, ledgerId, - productId, - productData + segmentId, + segmentData ) expect(mockHttpFetchUtils.httpMidazAuthFetch).toHaveBeenCalledWith({ - url: `${process.env.MIDAZ_BASE_PATH}/organizations/${organizationId}/ledgers/${ledgerId}/products/${productId}`, + url: `${process.env.MIDAZ_BASE_PATH}/organizations/${organizationId}/ledgers/${ledgerId}/segments/${segmentId}`, method: HTTP_METHODS.PATCH, - body: JSON.stringify(productData) + body: JSON.stringify(segmentData) }) expect(result).toEqual(response) }) - it('should handle errors when updating a product', async () => { + it('should handle errors when updating a segment', async () => { const organizationId = '1' const ledgerId = '1' - const productId = '1' - const productData: Partial = { name: 'Updated Product' } + const segmentId = '1' + const segmentData: Partial = { name: 'Updated Segment' } const error = new Error('Error occurred') mockHttpFetchUtils.httpMidazAuthFetch.mockRejectedValueOnce(error) await expect( - repository.update(organizationId, ledgerId, productId, productData) + repository.update(organizationId, ledgerId, segmentId, segmentData) ).rejects.toThrow('Error occurred') expect(mockHttpFetchUtils.httpMidazAuthFetch).toHaveBeenCalledWith({ - url: `${process.env.MIDAZ_BASE_PATH}/organizations/${organizationId}/ledgers/${ledgerId}/products/${productId}`, + url: `${process.env.MIDAZ_BASE_PATH}/organizations/${organizationId}/ledgers/${ledgerId}/segments/${segmentId}`, method: HTTP_METHODS.PATCH, - body: JSON.stringify(productData) + body: JSON.stringify(segmentData) }) }) }) diff --git a/src/core/infrastructure/midaz/product/midaz-update-product-repository.ts b/src/core/infrastructure/midaz/segments/midaz-update-segment-repository.ts similarity index 57% rename from src/core/infrastructure/midaz/product/midaz-update-product-repository.ts rename to src/core/infrastructure/midaz/segments/midaz-update-segment-repository.ts index 98845c73..ffa645d1 100644 --- a/src/core/infrastructure/midaz/product/midaz-update-product-repository.ts +++ b/src/core/infrastructure/midaz/segments/midaz-update-segment-repository.ts @@ -1,11 +1,11 @@ -import { ProductEntity } from '@/core/domain/entities/product-entity' -import { UpdateProductRepository } from '@/core/domain/repositories/products/update-product-repository' +import { SegmentEntity } from '@/core/domain/entities/segment-entity' +import { UpdateSegmentRepository } from '@/core/domain/repositories/segments/update-segment-repository' import { HTTP_METHODS, MidazHttpFetchUtils } from '../../utils/http-fetch-utils' import { injectable, inject } from 'inversify' import { ContainerTypeMidazHttpFetch } from '../../container-registry/midaz-http-fetch-module' @injectable() -export class MidazUpdateProductRepository implements UpdateProductRepository { +export class MidazUpdateSegmentRepository implements UpdateSegmentRepository { private baseUrl: string = process.env.MIDAZ_BASE_PATH as string constructor( @@ -16,16 +16,16 @@ export class MidazUpdateProductRepository implements UpdateProductRepository { async update( organizationId: string, ledgerId: string, - productId: string, - product: Partial - ): Promise { - const url = `${this.baseUrl}/organizations/${organizationId}/ledgers/${ledgerId}/products/${productId}` + segmentId: string, + segment: Partial + ): Promise { + const url = `${this.baseUrl}/organizations/${organizationId}/ledgers/${ledgerId}/segments/${segmentId}` const response = - await this.midazHttpFetchUtils.httpMidazAuthFetch({ + await this.midazHttpFetchUtils.httpMidazAuthFetch({ url, method: HTTP_METHODS.PATCH, - body: JSON.stringify(product) + body: JSON.stringify(segment) }) return response diff --git a/src/core/infrastructure/utils/midaz-error-handler.ts b/src/core/infrastructure/utils/midaz-error-handler.ts index 5694c82c..272fb1a3 100644 --- a/src/core/infrastructure/utils/midaz-error-handler.ts +++ b/src/core/infrastructure/utils/midaz-error-handler.ts @@ -72,8 +72,8 @@ export async function handleMidazError( case '0015': throw new MidazError( intl.formatMessage({ - id: 'error.midaz.duplicateProductNameError', - defaultMessage: 'Error Midaz duplicate product name error' + id: 'error.midaz.duplicateSegmentNameError', + defaultMessage: 'Error Midaz duplicate segment name error' }) ) diff --git a/src/schema/account.ts b/src/schema/account.ts index 362f7373..1ee712cf 100644 --- a/src/schema/account.ts +++ b/src/schema/account.ts @@ -11,7 +11,7 @@ const assetCode = z.string() const portfolioId = z.string().nullable().optional() -const productId = z.string().nullable().optional() +const segmentId = z.string().nullable().optional() const type = z.string() @@ -25,7 +25,7 @@ export const accountSchema = z.object({ entityId, assetCode, portfolioId, - productId, + segmentId, metadata, type, allowSending, diff --git a/src/schema/product.ts b/src/schema/segment.ts similarity index 71% rename from src/schema/product.ts rename to src/schema/segment.ts index fc830ca7..ee746ca1 100644 --- a/src/schema/product.ts +++ b/src/schema/segment.ts @@ -3,4 +3,4 @@ import { metadata } from './metadata' const name = z.string().min(1).max(255) -export const product = { name, metadata } +export const segment = { name, metadata } diff --git a/src/types/accounts-type.ts b/src/types/accounts-type.ts index 3dd05966..51c88db2 100644 --- a/src/types/accounts-type.ts +++ b/src/types/accounts-type.ts @@ -13,7 +13,7 @@ export type AccountType = { portfolioId?: string | null portfolio: Pick portfolioName?: string - productId: string + segmentId: string status: { code: string description: string