From 56983c6bc542096aa5a0a83ddc4b431106a50c50 Mon Sep 17 00:00:00 2001 From: vincenzo Date: Fri, 28 Apr 2023 14:19:55 -0300 Subject: [PATCH 1/2] feat: create mapper and reponsetory to Warehouse and ProductWarehouse --- src/infra/repositories/Repository.js | 1 - .../productWarehouse/ProductWarehouseMapper.js | 13 +++++++++++++ .../productWarehouse/ProductWarehouseRepository.js | 14 ++++++++++++++ .../repositories/warehouse/WarehouseMapper.js | 12 ++++++++++++ .../repositories/warehouse/WarehouseRepository.js | 14 ++++++++++++++ 5 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 src/infra/repositories/productWarehouse/ProductWarehouseMapper.js create mode 100644 src/infra/repositories/productWarehouse/ProductWarehouseRepository.js create mode 100644 src/infra/repositories/warehouse/WarehouseMapper.js create mode 100644 src/infra/repositories/warehouse/WarehouseRepository.js diff --git a/src/infra/repositories/Repository.js b/src/infra/repositories/Repository.js index 484a144..95913df 100644 --- a/src/infra/repositories/Repository.js +++ b/src/infra/repositories/Repository.js @@ -8,7 +8,6 @@ class Repository { async create(domainEntity) { const model = await new this.ResourceModel(this.ResourceMapper.toInputDatabase(domainEntity)); const dbCreatedResource = await model.save(); - console.log('dbCreatedResource', dbCreatedResource); return this.ResourceMapper.toOutputDabase(dbCreatedResource); } diff --git a/src/infra/repositories/productWarehouse/ProductWarehouseMapper.js b/src/infra/repositories/productWarehouse/ProductWarehouseMapper.js new file mode 100644 index 0000000..949ccbd --- /dev/null +++ b/src/infra/repositories/productWarehouse/ProductWarehouseMapper.js @@ -0,0 +1,13 @@ +// const { Warehouse, WarehouseOutput } = require('../../../domain/entities/Warehouse'); + +const ProductWarehouseMapper = { + toInputDatabase(entry) { + console.log(entry); + return entry; + }, + toOutputDabase({ dataValues }) { + return dataValues; + } +}; + +module.exports = () => ProductWarehouseMapper; diff --git a/src/infra/repositories/productWarehouse/ProductWarehouseRepository.js b/src/infra/repositories/productWarehouse/ProductWarehouseRepository.js new file mode 100644 index 0000000..a9746a5 --- /dev/null +++ b/src/infra/repositories/productWarehouse/ProductWarehouseRepository.js @@ -0,0 +1,14 @@ +const Repository = require('../Repository'); + +class WarehouseRepository extends Repository { + constructor({ sequelize, productWarehouseMapper, exceptions }) { + const { ProductWarehouse } = sequelize.models; + super({ + ResourceModel: ProductWarehouse, + ResourceMapper: productWarehouseMapper, + Exceptions: exceptions + }); + } +} + +module.exports = WarehouseRepository; diff --git a/src/infra/repositories/warehouse/WarehouseMapper.js b/src/infra/repositories/warehouse/WarehouseMapper.js new file mode 100644 index 0000000..04dae0e --- /dev/null +++ b/src/infra/repositories/warehouse/WarehouseMapper.js @@ -0,0 +1,12 @@ +const { Warehouse, WarehouseOutput } = require('../../../domain/entities/Warehouse'); + +const WarehouseMapper = { + toInputDatabase(entry) { + return new Warehouse({ ...entry }).toJSON(); + }, + toOutputDabase({ dataValues }) { + return new WarehouseOutput({ ...dataValues }).toJSON(); + } +}; + +module.exports = () => WarehouseMapper; diff --git a/src/infra/repositories/warehouse/WarehouseRepository.js b/src/infra/repositories/warehouse/WarehouseRepository.js new file mode 100644 index 0000000..2c41a4b --- /dev/null +++ b/src/infra/repositories/warehouse/WarehouseRepository.js @@ -0,0 +1,14 @@ +const Repository = require('../Repository'); + +class WarehouseRepository extends Repository { + constructor({ sequelize, warehouseMapper, exceptions }) { + const { Warehouse } = sequelize.models; + super({ + ResourceModel: Warehouse, + ResourceMapper: warehouseMapper, + Exceptions: exceptions + }); + } +} + +module.exports = WarehouseRepository; From 5680b9b255f6c6122d6a5da0f1718c2224cb2360 Mon Sep 17 00:00:00 2001 From: vincenzo Date: Fri, 28 Apr 2023 14:23:21 -0300 Subject: [PATCH 2/2] feat: implments new usecases to create Product --- .../operations/product/createProductOperation.js | 15 ++++++++++++--- src/app/usecases/bindingProductWarehouse.js | 15 +++++++++++++++ src/app/usecases/createProductWarehouseUsecase.js | 6 ++++++ src/app/usecases/createWarehouseUsecase.js | 6 ++++++ src/domain/entities/Warehouse.js | 9 ++++++++- 5 files changed, 47 insertions(+), 4 deletions(-) create mode 100644 src/app/usecases/bindingProductWarehouse.js create mode 100644 src/app/usecases/createProductWarehouseUsecase.js create mode 100644 src/app/usecases/createWarehouseUsecase.js diff --git a/src/app/operations/product/createProductOperation.js b/src/app/operations/product/createProductOperation.js index 9d71da4..cfb81f4 100644 --- a/src/app/operations/product/createProductOperation.js +++ b/src/app/operations/product/createProductOperation.js @@ -1,6 +1,15 @@ -module.exports = ({ createProductUsecase }) => ({ +module.exports = ({ createProductUsecase, createWarehouseUsecase, bindingProductWarehouse }) => ({ execute: async (data) => { - const response = await createProductUsecase.execute(data); - return response; + const { warehouse } = data; + const product = await createProductUsecase.execute(data); + if (!product) { + return; + } + if (warehouse) { + const warehouseCretead = await Promise.all(warehouse.map((element) => createWarehouseUsecase.execute(element))); + // TODO: validate warehouseCreated + await bindingProductWarehouse.execute(product.id, warehouseCretead); + } + return product; } }); diff --git a/src/app/usecases/bindingProductWarehouse.js b/src/app/usecases/bindingProductWarehouse.js new file mode 100644 index 0000000..9fc6f87 --- /dev/null +++ b/src/app/usecases/bindingProductWarehouse.js @@ -0,0 +1,15 @@ +module.exports = ({ createProductWarehouseUsecase }) => ({ + execute: async (productId, warehouseIds) => { + const bind = []; + if (Array.isArray(warehouseIds) === false) { + const created = await createProductWarehouseUsecase.execute({ productId, warehouseIds }); + bind.push(created); + return bind; + } + for (const { id } of warehouseIds) { + const created = await createProductWarehouseUsecase.execute({ productId, warehouseId: id }); + bind.push(created); + } + return bind; + } +}); diff --git a/src/app/usecases/createProductWarehouseUsecase.js b/src/app/usecases/createProductWarehouseUsecase.js new file mode 100644 index 0000000..2630c07 --- /dev/null +++ b/src/app/usecases/createProductWarehouseUsecase.js @@ -0,0 +1,6 @@ +module.exports = ({ productWarehouseRepository }) => ({ + execute: async (data) => { + const response = await productWarehouseRepository.create(data); + return response; + } +}); diff --git a/src/app/usecases/createWarehouseUsecase.js b/src/app/usecases/createWarehouseUsecase.js new file mode 100644 index 0000000..5563f36 --- /dev/null +++ b/src/app/usecases/createWarehouseUsecase.js @@ -0,0 +1,6 @@ +module.exports = ({ warehouseRepository }) => ({ + execute: async (data) => { + const response = await warehouseRepository.create(data); + return response; + } +}); diff --git a/src/domain/entities/Warehouse.js b/src/domain/entities/Warehouse.js index 36155f3..85fd81a 100644 --- a/src/domain/entities/Warehouse.js +++ b/src/domain/entities/Warehouse.js @@ -17,4 +17,11 @@ const Warehouse = attributes({ type: { ...types.required_number } })(class Warehouse {}); -module.exports = Warehouse; +const WarehouseOutput = attributes({ + id: { ...types.required_number }, + locality: { ...types.required_string }, + quantity: Number, + type: { ...types.required_number } +})(class Warehouse {}); + +module.exports = { Warehouse, WarehouseOutput };