@@ -19,18 +19,147 @@ const createProductUseCase = ({ makeProductModelHandler }) => async function
1919 const newProduct = await createProductDbHandler ( validatedProductData ) ;
2020 return Object . freeze ( newProduct )
2121 } catch ( error ) {
22- console . log ( "Error from product handler: " , error ) ;
22+ console . log ( "Error from create product handler: " , error ) ;
2323 logEvents (
24- `${ error . no } :${ error . code } \t${ error . name } \t${ error . message } ` ,
25- "product .log"
24+ `${ error . no } :${ error . code } \t${ error . name || error . TypeError || error . ReferenceError } \t${ error . message } ` ,
25+ "productHandler .log"
2626 ) ;
2727 throw new Error ( error . message ) ;
2828 }
2929}
3030
31+ //find one product from DB
32+ const findOneProductUseCase = ( { productValidation } ) => async function
33+ findOneProductUseCaseHandler ( { productId, logEvents, findOneProductDbHandler, errorHandlers } ) {
34+ const { InvalidPropertyError } = errorHandlers ;
35+ const { validateUUID } = productValidation ;
36+ try {
37+ // validate id
38+ const uuid = validateUUID ( productId , InvalidPropertyError ) ;
39+ // store product in database mongodb
40+ const newProduct = await findOneProductDbHandler ( { productId : uuid } ) ;
41+ return Object . freeze ( newProduct )
42+ } catch ( error ) {
43+ console . log ( "Error from fetch one product handler: " , error ) ;
44+ logEvents (
45+ `${ error . no } :${ error . code } \t${ error . name || error . TypeError || error . ReferenceError } \t${ error . message } ` ,
46+ "productHandler.log"
47+ ) ;
48+ throw new Error ( error . message ) ;
49+ }
50+ }
51+
52+
53+ // find all product use case handler
54+ const findAllProductsUseCase = ( ) => findAllProductUseCaseHandler = async ( { dbProductHandler, logEvents, filterOptions } ) => {
55+
56+ try {
3157
58+ const allProducts = await dbProductHandler . findAllProductsDbHandler ( filterOptions ) ;
59+ // console.log("from find all products use case: ", allProducts);
60+ return Object . freeze ( allProducts )
61+ } catch ( e ) {
62+ console . log ( "Error from fetch all product handler: " , e ) ;
63+ logEvents (
64+ `${ error . no } :${ error . code } \t${ error . name || error . TypeError || error . ReferenceError } \t${ error . message } ` ,
65+ "productHandler.log"
66+ ) ;
67+ throw new Error ( e . message ) ;
68+ }
69+ }
70+
71+ // delete product use case
72+ const deleteProductUseCase = ( ) => async function deleteProductUseCaseHandler ( { productId, logEvents, dbProductHandler, errorHandlers } ) {
73+
74+ const { findOneProductDbHandler, deleteProductDbHandler } = dbProductHandler ;
75+ const { InvalidPropertyError } = errorHandlers ;
76+ const { validateUUID } = productValidation ;
77+ try {
78+ // validate id
79+ const uuid = validateUUID ( productId , InvalidPropertyError ) ;
80+ // check first that the product exists
81+ const existingProduct = await findOneProductDbHandler ( { productId : uuid } ) ;
82+ if ( ! existingProduct ) {
83+ throw new Error ( "Product not exists! cannot delete it." ) ;
84+ }
85+ // store product in database mongodb
86+ const newProduct = await deleteProductDbHandler ( { productId : existingProduct . id } ) ;
87+ const result = {
88+ deletedCount : newProduct . id ? 1 : 0 ,
89+ message : newProduct . id ? 'product successfully deleted' : ' product not found'
90+ }
91+ return Object . freeze ( result )
92+ } catch ( error ) {
93+ console . log ( "Error from delete product handler: " , error ) ;
94+ logEvents (
95+ `${ error . no } :${ error . code } \t${ error . name || error . TypeError || error . ReferenceError } \t${ error . message } ` ,
96+ "productHandler.log"
97+ ) ;
98+ throw new Error ( error . message ) ;
99+ }
100+ }
101+
102+ // update product
103+ const updateProductUseCase = ( { makeProductModelHandler } ) => async function
104+ updateProductUseCaseHandler ( { productId, updateData, logEvents, dbProductHandler, errorHandlers } ) {
105+
106+ const { findOneProductDbHandler, updateProductDbHandler } = dbProductHandler ;
107+ const { InvalidPropertyError } = errorHandlers ;
108+ const { validateUUID } = productValidation ;
109+ try {
110+ // validate id
111+ const uuid = validateUUID ( productId , InvalidPropertyError ) ;
112+ // check first that the product exists
113+ const existingProduct = await findOneProductDbHandler ( { productId : uuid } ) ;
114+ if ( ! existingProduct ) {
115+ throw new RangeError ( "Product not exists! cannot update it." ) ;
116+ }
117+
118+ // validate data before mutation
119+ const productData = await makeProductModelHandler ( { productData : { ...existingProduct , ...updateData } , errorHandlers } ) ;
120+
121+ // store product in database mongodb
122+ const newProduct = await updateProductDbHandler ( { productId, ...productData } ) ;
123+ console . log ( " from product handler after DB: " , newProduct ) ;
124+ return Object . freeze ( newProduct )
125+ } catch ( error ) {
126+ console . log ( "Error from update product handler: " , error ) ;
127+ logEvents (
128+ `${ error . no } :${ error . code } \t${ error . name || error . TypeError || error . ReferenceError } \t${ error . message } ` ,
129+ "productHandler.log"
130+ ) ;
131+ throw new Error ( error . message ) ;
132+ }
133+ }
134+
135+
136+ // rate product in transaction with both Rate model and Product model
137+ const rateProductUseCase = ( { makeProductRatingModelHandler } ) => async function rateProductUseCaseHandler ( {
138+ userId, ratingValue, productId, logEvents, dbProductHandler, errorHandlers
139+ } ) {
140+ console . log ( "hit rating use case handler" )
141+ const ratingData = { ratingValue, userId, productId } ;
142+ try {
143+ /* validate and build rating model */
144+ const ratingModel = await makeProductRatingModelHandler ( { errorHandlers, ...ratingData } ) ;
145+ const newProduct = await dbProductHandler . rateProductDbHandler ( ratingModel ) ;
146+ console . log ( " from rating product handler after DB: " , newProduct ) ;
147+ return Object . freeze ( newProduct )
148+ } catch ( error ) {
149+ console . log ( "Error from fetch one product handler: " , error ) ;
150+ logEvents (
151+ `${ error . no } :${ error . code } \t${ error . name || error . TypeError || error . ReferenceError } \t${ error . message } ` ,
152+ "productHandler.log"
153+ ) ;
154+ throw new Error ( error . message ) ;
155+ }
156+ }
32157
33158module . exports = Object . freeze ( {
34159 createProductUseCase,
160+ findOneProductUseCase,
161+ findAllProductsUseCase,
162+ deleteProductUseCase,
163+ updateProductUseCase,
164+ rateProductUseCase
35165} )
36-
0 commit comments