Skip to content

Commit 6236da9

Browse files
committed
WIP for CRUD products
1 parent d7133ee commit 6236da9

7 files changed

Lines changed: 179 additions & 13 deletions

File tree

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
node_modules
22
.env
33

4-
/interface-adapters/middleware/logs/
4+
/interface-adapters/middlewares/logs/
55
logs
Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
const {
2-
createProductUseCase
2+
createProductUseCase,
3+
findOneProductUseCase
34
} = require("./product-handlers");
45

56
const {
@@ -8,7 +9,9 @@ const {
89

910

1011
const createProductUseCaseHandler = createProductUseCase({ makeProductModelHandler });
12+
const findOneProductUseCaseHandler = findOneProductUseCase({ makeProductModelHandler });
1113

1214
module.exports = {
1315
createProductUseCaseHandler,
16+
findOneProductUseCaseHandler
1417
}

application-business-rules/use-cases/products/product-handlers.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,28 @@ const createProductUseCase = ({ makeProductModelHandler }) => async function
2828
}
2929
}
3030

31+
//find one product from DB
32+
const findOneProductUseCase = ({ makeProductModelHandler }) => async function
33+
findOneProductUseCaseHandler({ findOneProductDbHandler, productData, errorHandlers }) {
34+
35+
try {
36+
const validatedProductData = await makeProductModelHandler({ productData, errorHandlers });
37+
// store product in database mongodb
38+
const newProduct = await findOneProductDbHandler(validatedProductData);
39+
return Object.freeze(newProduct)
40+
} catch (error) {
41+
console.log("Error from product handler: ", error);
42+
logEvents(
43+
`${error.no}:${error.code}\t${error.name}\t${error.message}`,
44+
"product.log"
45+
);
46+
throw new Error(error.message);
47+
}
48+
}
3149

3250

3351
module.exports = Object.freeze({
3452
createProductUseCase,
53+
findOneProductUseCase
3554
})
3655

interface-adapters/controllers/products/index.js

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
1-
const { createProductDbHandler } = require("../../database-access")
1+
const {
2+
createProductDbHandler,
3+
findOneProductDbHandler
4+
} = require("../../database-access")
25

36
const {
47
createProductController,
58
// updateProductController,
69
// deleteProductController,
710
// findAllProductController,
8-
// findOneProductController,
11+
findOneProductController,
912
// findProductRatingController,
1013
// findBestUserRaterController
1114
} = require("./product-controller")();
@@ -15,7 +18,7 @@ const {
1518
// updateProductUseHandler,
1619
// deleteProductUseHandler,
1720
// findAllProductUseHandler,
18-
// findProductUseHandler,
21+
findOneProductUseCaseHandler,
1922
// findProductRatingUseCaseHandler,
2023
// findBestUserRaterUseCaseHandler
2124
} = require("../../../application-business-rules/use-cases/products");
@@ -30,7 +33,7 @@ const createProductControllerHandler = createProductController({ createProductUs
3033
// const updateProductControllerHandler = updateProductController({ dbProductHandler, updateProductUseHandler, errorHandlers });
3134
// const deleteProductControllerHandler = deleteProductController({ dbProductHandler, deleteProductUseHandler, errorHandlers });
3235
// const findAllProductsControllerHandler = findAllProductController({ dbProductHandler, findAllProductUseHandler, errorHandlers });
33-
// const findOneProductControllerHandler = findOneProductController({ dbProductHandler, findProductUseHandler, errorHandlers });
36+
const findOneProductControllerHandler = findOneProductController({ findOneProductDbHandler, findOneProductUseCaseHandler, errorHandlers });
3437
// const findProductRatingControllerHandler = findProductRatingController({ dbProductHandler, findProductRatingUseCaseHandler, errorHandlers });
3538
// const findBestUserRaterControllerHandler = findBestUserRaterController({ dbProductHandler, findBestUserRaterUseCaseHandler, errorHandlers });
3639

@@ -41,7 +44,7 @@ module.exports = {
4144
// updateProductControllerHandler,
4245
// deleteProductControllerHandler,
4346
// findAllProductsControllerHandler,
44-
// findOneProductControllerHandler,
47+
findOneProductControllerHandler,
4548
// findProductRatingControllerHandler,
4649
// findBestUserRaterControllerHandler
4750
}

interface-adapters/controllers/products/product-controller.js

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,64 @@ const createProductController = ({ createProductUseCaseHandler, createProductDbH
7272

7373
}
7474

75+
// find one product controller
76+
const findOneProductController = ({ findOneProductDbHandler, findOneProductUseCaseHandler, errorHandlers }) => async function findOneProductControllerHandler(httpRequest) {
77+
78+
const { UniqueConstraintError, InvalidPropertyError } = errorHandlers;
79+
80+
const { productId } = httpRequest.params;
81+
if (!productId) {
82+
return makeHttpError({
83+
statusCode: 400,
84+
errorMessage: 'No product Id provided'
85+
});
86+
}
87+
try {
88+
const product = await findOneProductUseCaseHandler({ productId, errorHandlers, findOneProductDbHandler });
89+
return {
90+
headers: {
91+
'Content-Type': 'application/json'
92+
},
93+
statusCode: 201,
94+
data: JSON.stringify(product)
95+
};
96+
} catch (e) {
97+
logEvents(
98+
`${e.no}:${e.code}\t${e.name}\t${e.message}`,
99+
"controllerHandlerErr.log"
100+
);
101+
console.log("error from findOneProductController controller handler: ", e);
102+
return makeHttpError({ errorMessage: e.message, statusCode: e.statusCode });
103+
}
104+
}
105+
106+
107+
// find all product controller
108+
const findAllProductController = ({ findAllProductsDbHandler, findAllProductUseCaseHandler, errorHandlers }) => async function findAllProductControllerHandler(httpRequest) {
109+
110+
const { UniqueConstraintError, InvalidPropertyError } = errorHandlers;
111+
try {
112+
const products = await findAllProductUseCaseHandler({ findAllProductsDbHandler, errorHandlers });
113+
return {
114+
headers: {
115+
'Content-Type': 'application/json'
116+
},
117+
statusCode: 201,
118+
data: JSON.stringify(products)
119+
};
120+
} catch (e) {
121+
logEvents(
122+
`${e.no}:${e.code}\t${e.name}\t${e.message}`,
123+
"controllerHandlerErr.log"
124+
);
125+
console.log("error from findAllProductController controller handler: ", e);
126+
return makeHttpError({ errorMessage: e.message, statusCode: e.statusCode });
127+
}
128+
}
129+
130+
131+
75132
module.exports = () => Object.freeze({
76133
createProductController,
134+
findOneProductController
77135
})
Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,18 @@
11
const { dbconnection } = require("./db-connection");
2-
const makeUserdb = require("./store-user");
2+
const { logEvents } = require("../middlewares/loggers/logger");
33

44

5-
const { createProductDbHandler } = require("./store-product")({ dbconnection });
5+
const makeUserdb = require("./store-user");
6+
const {
7+
createProductDbHandler,
8+
findOneProductDbHandler,
9+
findAllProductsDbHandler
10+
} = require("./store-product")({ dbconnection, logEvents });
611
const dbUserHandler = makeUserdb({ dbconnection });
712

8-
module.exports = { dbUserHandler, createProductDbHandler };
13+
module.exports = {
14+
dbUserHandler,
15+
createProductDbHandler,
16+
findOneProductDbHandler,
17+
findAllProductsDbHandler
18+
};

interface-adapters/database-access/store-product.js

Lines changed: 76 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
//collection, rating as an array of objects with reference to ratings collection, also a brand enumeration
33

44

5-
async function createProduct(productData, dbconnection) {
5+
async function createProduct(productData, dbconnection, logEvents) {
66

77
console.log("from createProduct DB handler");
88
const db = await dbconnection();
@@ -18,12 +18,85 @@ async function createProduct(productData, dbconnection) {
1818
}
1919
}
2020

21+
// find one product from DB
22+
const findOneProduct = async ({ productId, dbconnection }) => {
23+
24+
const db = await dbconnection();
25+
try {
26+
const product = await db.collection('products').findOne({ _id: ObjectId(productId) }, {
27+
projection: {
28+
_id: 1, title: 1, description: 1, price: 1, category: 1, brand: 1, inventory: 1, creationDate: 1, expirationDate: 1, origin: 1, variations: 1, salePrice: 1, slug: 1, totalRatings: 1, totalReviews: 1, totalSales: 1, rateAverage: 1,
29+
lastModified: 1,
30+
instock: 1
31+
}
32+
});
33+
if (!product) {
34+
console.log("No product found");
35+
return null;
36+
}
37+
console.log("\n\nproduct before deleting: \n\n", product);
38+
const { _id, ...rest } = product;
39+
const isDeleted = delete product._id;
40+
console.log("\n\nafter deleting product = : ", product);
41+
console.log("\n\n rest after deleting: ", rest);
42+
43+
if (isDeleted) {
44+
console.log("product deleted and returned ");
45+
return product;
46+
}
47+
console.log("product NOT deleted and REST isreturned ");
48+
return rest;
49+
} catch (error) {
50+
console.log("Error from product DB handler: ", error);
51+
logEvents(
52+
`${error.no}:${error.code}\t${error.name}\t${error.message}`,
53+
"product.log"
54+
);
55+
return null;
56+
}
57+
}
58+
59+
// find all products from the database
60+
const findAllProducts = async ({ dbconnection }) => {
61+
62+
const db = dbconnection();
63+
64+
try {
65+
const allProducts = await db.collection('products').find({}, {
66+
projection: {
67+
_id: 1, title: 1, description: 1, price: 1, category: 1, brand: 1, inventory: 1, creationDate: 1, expirationDate: 1, origin: 1, variations: 1, salePrice: 1, slug: 1, totalRatings: 1, totalReviews: 1, totalSales: 1, rateAverage: 1,
68+
lastModified: 1,
69+
instock: 1
70+
}
71+
});
72+
73+
const is_IdDeleted = delete allProducts._id;
74+
if (is_IdDeleted) {
75+
console.log("allProducts _id deleted and returned ");
76+
return allProducts;
77+
}
78+
console.log("allProducts _id NOT deleted and REST isreturned ");
79+
const { _id, ...rest } = allProducts;
80+
return rest;
81+
} catch (error) {
82+
console.log("Error from product DB handler: ", error);
83+
logEvents(
84+
`${error.no}:${error.code}\t${error.name}\t${error.message}`,
85+
"product.log"
86+
);
87+
return [];
88+
}
89+
90+
}
91+
2192

2293

2394

24-
module.exports = ({ dbconnection }) => {
95+
module.exports = ({ dbconnection, logEvents }) => {
2596

2697
return Object.freeze({
27-
createProductDbHandler: async (productData) => createProduct(productData, dbconnection)
98+
createProductDbHandler: async (productData) => createProduct(productData, dbconnection, logEvents),
99+
findOneProductDbHandler: async ({ productId }) => findOneProduct({ productId, dbconnection, logEvents }),
100+
findAllProductsDbHandler: async () => findAllProducts({ dbconnection, logEvents }),
28101
})
29102
}

0 commit comments

Comments
 (0)