Your IP : 216.73.216.91


Current Path : /var/node/inatote/Inatote-Backend/products/
Upload File :
Current File : /var/node/inatote/Inatote-Backend/products/products-endpoint.js

import {
    UniqueConstraintError,
    InvalidPropertyError,
    RequiredParameterError,
    ApiTokenError,
    AuthorizationTokenError
} from '../helpers/errors.js'
import makeHttpError from '../helpers/http-error.js'
import makeProduct from './product.js'
import multer from 'multer'
import validateHeaders from '../helpers/validate-headers.js'
import config from '../config.js'

var Storage = multer.diskStorage({
    destination: function (httpRequest, file, callback) {
        //console.log("function", httpRequest, file);
        callback(null, "/")
    },

    filename: (req, file, cb) => {
        cb(null, Date.now()+ "-"+ file.originalname)
    },
})

var upload = multer({
    storage: Storage
})
// .single("imageURL")


export default function makeproductsEndpointHandler({ productList }) {
    //  return async function handle(httpRequest) {
    return {
        postproduct : postproduct,
        getproducts : getproducts,
        updateproduct : updateproduct,
        deleteproduct : deleteproduct,
        updateproductvariants: updateproductvariants
    }
    //     switch (httpRequest.method) {
    //         case 'POST':
    //             return postproduct(httpRequest)

    //         case 'GET':
    //             return getproducts(httpRequest)

    //         case 'DELETE':
    //             return deleteproduct(httpRequest)

    //         case 'PUT':
    //             return updateproduct(httpRequest)

    //         case 'PATCH':
    //             return replaceproduct(httpRequest)

    //         default:
    //             return makeHttpError({
    //                 statusCode: 405,
    //                 errorMessage: `${httpRequest.method} method not allowed.`
    //             })
    //     }
    // }

    // todo
    async function updateproductvariants(req , res){
        const { value  , index } = req.body ;
        const { id } = req.params;
        
        let {product , categoryId} = await productList.findOne(id);
        
        product.variants[index].status = value ? "Available" : "Disable";
        console.log("categoryId" ,categoryId);
        
        const result = await productList.update({ productId: id, categoryId: categoryId, product: product })
        console.log("prod" , result);
        
        res.status(200).json({
            headers: config.app.headers,
            statusCode: 200,
            data: result
        })


        
    }

    async function updateproduct(req , res) {
        const { categoryId, id } = req.params || {}
        //console.log("files" , req.files ,req.body)
        //console.log(id)
        let productInfo = req.body;
        let imageArr = []
        
     
        if(req.files && req.files.length > 0){
            for (var i = 0; i < req.files.length; i++) {
                var file = req.files[i]
                //console.log("files" , file);
                imageArr.push(file.path)
            }
            if(productInfo["images"] && productInfo["images"].length > 0 ){
                productInfo['imageURL'] = [...imageArr , ...productInfo["images"]];
            }
            else{
                productInfo['imageURL'] = [...imageArr ];
            }
        }
        
        if(typeof productInfo.inStock == "string"){
            productInfo["inStock"] = productInfo["inStock"] == "true" ? true : false
        }
        //console.log("FILES agae" , req.files);
        if(productInfo.images && productInfo.images.length >0 && req.files.length == 0  ){
            productInfo["imageURL"] = productInfo["images"]  
        }

        if(productInfo.variants){
            productInfo["variants"] = JSON.parse(productInfo["variants"]) 
        }

     
        //console.log("image---------------" , productInfo );

        if(productInfo['colors']){
            productInfo["colors"] = productInfo.colors ? JSON.parse(productInfo.colors) : ''
        
        }
        if(productInfo["sizes"]){
            productInfo["sizes"] = productInfo.sizes ? JSON.parse(productInfo.sizes) : ''
        
        }
        productInfo = JSON.parse(JSON.stringify(productInfo));

        const result = await productList.update({ productId: id, categoryId: categoryId, product: productInfo })

        res.status(200).json({
            headers: config.app.headers,
            statusCode: 200,
            data: result
        })
    }

    // todo
    async function replaceproduct(httpRequest) { }

    // todo
    async function postproduct(req , res) {
        let productInfo = req.body
        if (!productInfo) {
            return makeHttpError({
                statusCode: 400,
                errorMessage: 'Bad request. No POST body.'
            })
        }

        if (typeof req.body === 'string') {
            try {
                productInfo = JSON.parse(productInfo)
            } catch {
                return makeHttpError({
                    statusCode: 400,
                    errorMessage: 'Bad request. POST body must be valid JSON.'
                })
            }
        }


        try {
            if (productInfo.variants)
                productInfo.variants =  JSON.parse(productInfo.variants);
                productInfo.variants =  productInfo.variants.map(m=>JSON.parse(m))
            if (productInfo.colors)
                productInfo.colors = JSON.parse(productInfo.colors)
            if(productInfo.isEnabled){
                productInfo.isEnabled = productInfo.isEnabled == 'true' || productInfo.isEnabled == true ? true : false
            }
            if(productInfo.inStock)
            {
                productInfo.inStock = productInfo.inStock == 'true' || productInfo.inStock == true ? true : false
            }


            let imageArr = []
            var d = Date.now()
            for (var i = 0; i < req.files.length; i++) {
                var file = req.files[i];
                //console.log("FILE" , file)
                imageArr.push(file.path)
            }
            //console.log("productInfo" ,productInfo );
            productInfo['imageURL'] = imageArr;
            const product = makeProduct(productInfo)
            const result = await productList.add(product)
            res.json({
                headers: config.app.headers,
                statusCode: 201,
                data: result
            })
        } catch (e) {
            //console.log("errs", e);
            return makeHttpError({
                errorMessage: e.message ? e.message : e,
                statusCode:
                    e instanceof UniqueConstraintError
                        ? 409
                        : e instanceof InvalidPropertyError ||
                            e instanceof RequiredParameterError
                            ? 400
                            : 500
            })
        }
    }

    // todo
    async function getproducts(req , res) {
       //console.log("req" , req.query);
        const { id } =req.params || {}
        const { max, page, _id , name , search_by, latitude , longitude } = req.query || {}
        const result = id
            ? await productList.findById({ productId: id , latitude , longitude })
            : await productList.getItems({ max, page, _id, name , search_by })

        res.status(200).json({
            headers: config.app.headers,
            statusCode: 200,
            data: result
        })
    }

    // todo
    async function deleteproduct(req , res) {
        const { id } = req.params || {}
        let product = {isEnabled : false}
        const result = await productList.remove({ productId: id  ,product})

        res.status(200).json({
            headers: config.app.headers,
            statusCode: 200,
            data: result
        })
    }

}