Your IP : 216.73.216.91


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

import {
    UniqueConstraintError,
    InvalidPropertyError,
    RequiredParameterError
} from '../helpers/errors.js'
import makeHttpError from '../helpers/http-error.js'
import makeVendor from './vendor.js'
import validateHeaders from '../helpers/validate-headers.js'
import makeUserList from '../users/user-list.js'
import makeDb from '../db/index.js';
import makeCategoryList from '../categories/category-list.js'
import makeorderList from '../orders/order-list.js'

const database = makeDb()

export default function makeVendorsEndpointHandler({ vendorList }) {
    
    return {
        postVendor : postVendor,
        getVendors : getVendors,
        getVendorsWithCategories : getVendorsWithCategories,
        updateVendor : updateVendor,
        deletevendor : deleteVendor,
        vendorstats : vendorStats
    }
    
    
    
    
    // return async function handle(httpRequest) {
    //     var userSession = httpRequest.user;
    //     try {
    //         validateHeaders(httpRequest.headers)
    //     } catch (e) {
    //         //console.log("e",e);
    //         return makeHttpError({
    //             errorMessage: e.message,
    //             statusCode: e instanceof ApiTokenError ||
    //                 e instanceof AuthorizationTokenError
    //                 ? 403
    //                 : 500
    //         })
    //     }


    //     switch (httpRequest.method) {
    //         case 'POST':
    //             return postVendor(httpRequest, userSession)

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

    //         case 'DELETE':
    //             return deleteVendor(httpRequest, userSession)

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

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

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

    // todo
    async function updateVendor(req , res) {
        const { id } = req.params || {}
        let { location }  = req.body;
        let data = { ...req.body  } 
        console.log("vendorInfo" ,data.timings);
        
        if(location){
            location.coordinates = [parseFloat(location.coordinates[0]) , parseFloat(location.coordinates[1]) ]
            data = {...data , location}
        }
        if(data.timings && data.timings.length > 0);
        data.timings = data.timings.map((m)=>{
            if(m.openingTime){
                m.openingTime = parseInt(m.openingTime)
            }
            if(m.closingTime){
                m.closingTime = parseInt(m.closingTime)
            }
            return m

        })
        console.log("vendorInfo.timings" ,data.timings);
        console.log("data" , data);
        const result = await vendorList.update({ vendorId: id, vendor: data })

        return res.status(200).json({
            headers: {
                'Content-Type': 'application/json'
            },
            statusCode: 200,
            data: result
        })
    }

    // todo
    async function replaceVendor(httpRequest) {

    }

    // todo
    async function postVendor(req, res) {
        //console.log("req " , req.body , req.body.location);
        req.body.location['coordinates'] =  [parseFloat(req.body.location["coordinates"][0]) , parseFloat(req.body.location["coordinates"][1])]
        
        let httpRequest = req
        let session = req.user
        let vendorInfo = httpRequest.body

        if (!(session.userType == "Admin")) {

            return res.status(403).json({
                headers: {
                    'Content-Type': 'application/json'
                },
                statusCode: 403,
                errorMessage: `Access not granted.`
            })
            
        }


        if (!vendorInfo) {

            return res.status(400).json({
                headers: {
                    'Content-Type': 'application/json'
                },
                statusCode: 400,
                errorMessage: 'Bad request. No POST body.'
            })
        
            
        }

        if (typeof httpRequest.body === 'string') {
            try {
                vendorInfo = JSON.parse(vendorInfo)
            } catch {
                return res.status(400).json({
                    headers: {
                        'Content-Type': 'application/json'
                    },
                    statusCode: 400,
                    errorMessage: 'Bad request. POST body must be valid JSON.'
                })
            
            }
        }


        try {
            vendorInfo['imageURL'] = []
            if(vendorInfo.isOpened == "true" || vendorInfo.isOpened == true ){
                vendorInfo.isOpened = true
            }else{
                vendorInfo.isOpened = false       
            }
            if(vendorInfo.timings && vendorInfo.timings.length > 0){
            vendorInfo.timings = vendorInfo.timings.map((m)=>{
                if(m.openingTime){
                    m.openingTime = parseInt(m.openingTime)
                }
                if(m.closingTime){
                    m.closingTime = parseInt(m.closingTime)
                }
                return m
    
            })
            console.log("vendorInfo.timings" ,vendorInfo.timings);
        }
            // if(vendorInfo.openingTime){
            //     vendorInfo.openingTime = parseInt(vendorInfo.openingTime)
            // }
            // if(vendorInfo.closingTime){
            //     vendorInfo.closingTime = parseInt(vendorInfo.closingTime)
            // }

            if(req.files && req.files.length > 0){
                for (var i = 0; i < req.files.length; i++) {
                    var file = req.files[i]
                    vendorInfo['imageURL'].push(file.path)
                }
                //console.log(vendorInfo , req.files);
            }
         
            const vendor = makeVendor(vendorInfo)
            const result = await vendorList.add(vendor)
            return res.status(200).json({
                headers: {
                    'Content-Type': 'application/json'
                },
                statusCode: 201,
                data: result
            })
        } catch (e) {
            console.log("e" , e);
            return res.status(400).json({
                errorMessage: e.message,
                statusCode:
                    e instanceof UniqueConstraintError
                        ? 409
                        : e instanceof InvalidPropertyError ||
                            e instanceof RequiredParameterError
                            ? 400
                            : 500
            })
          
         
        }
    }

    // async function getVendor(httpRequest) {
    //     switch
    // }

    async function vendorStats(req , res){
        try{
            let {id} = req.params;
            //console.log("ID", id);
            let product  = 0;
            let userlist = makeUserList({database});
            let categoryList = makeCategoryList({database});
            let orderList = makeorderList({database})
            let userCount = await userlist.getItems({companyId : id});
            let categoriesCount = await categoryList.getItems({ vendorID : id});
            let order = await orderList.getItems({vendorId : id})
            categoriesCount.forEach(element => {
                product += element.products.length;
            });
            let initialSale = 0;
            let sale = order.reduce((a,b)=> parseInt(a) + parseInt(b.subTotal) , initialSale  );


            res.status(200).json({
                user : userCount.length,
                category : categoriesCount.length,
                product ,
                order : order.length,
                sale
            })
        }
        catch(err){
            //console.log("ERR" , err);
            return res.status(400).json({
                headers: {
                    'Content-Type': 'application/json'
                },
                data: err
            })
        }
    }
   
    
    // todo
    async function getVendors(req , res) {
        let httpRequest = req
        //console.log("req" , req.user);
        const { id } = httpRequest.params || {}
        const { max, before, after , latitude , longitude, name } = httpRequest.query || {}
        let sorted_result = [];
        let featured_result = []

        const result = id
            ? await vendorList.findById({ vendorId: id })
            :latitude && longitude ? await vendorList.getVendorByLocation({ latitude, longitude , max, userId : req.user.userId , name}) :
            await vendorList.getItems({ max, before, after, name })
            // name ? await vendorList.searchVendors(name)
        if (result && result.length == 0){
            return res.status(200).json({
                headers: {
                    'Content-Type': 'application/json'
                },
                statusCode: 200,
                data: []
            })
        }
        sorted_result = result;
        if(latitude && longitude){
            sorted_result.sort((a,b)=> (a.ratingAverage < b.ratingAverage ? 1 : -1));
            sorted_result = sorted_result.slice(0,5)

            featured_result = result.filter(i=>i.featured)

            return res.status(200).json({
                headers: {
                    'Content-Type': 'application/json'
                },
                statusCode: 200,
                data: { vendors : result , popular_vendors : sorted_result||[] , featured_vendors : featured_result || []} 
            })
        }

        
        return res.status(200).json({
            headers: {
                'Content-Type': 'application/json'
            },
            statusCode: 200,
            data: result
        })
    }

    async function getVendorsWithCategories(req , res){
        let {id } = req.params || {};
        let {name } = req.query || {};
        
        try{
        let vendor = await vendorList.findById({vendorId : id});
        if( vendor.isEnabled == false){
            return res.status(400).json({
                headers: {
                    'Content-Type': 'application/json'
                },
                statusCode: 400,
                errorMessage: 'Vendor is not enabled' 
            })
        }
        const user = await vendorList.getVendorsWithCategories({id : id, name , userId: req.user.userId});
        //console.log("result" , user);
        
        return res.status(200).json({
            headers: {
                'Content-Type': 'application/json'
            },
            statusCode: 200,
            data: user
        })
        }
        catch(err){
            console.log("err" , err);
            res.status(400).json({
                headers: {
                    'Content-Type': 'application/json'
                },
                statusCode: 400,
                errorMessage: err 
            })
        }
    }

    // todo
    async function deleteVendor(req , res) {
        const { id } = req.params || {}
        //console.log("req" , req.user);

        if (!(req.user.userType == "Admin")) {
            return makeHttpError({
                statusCode: 403,
                errorMessage: `Access not granted.`
            })
        }


        const result = await vendorList.remove(id);
        //console.log("result" , result);

        return  res.status(200).json({
            headers: {
                'Content-Type': 'application/json'
            },
            statusCode: 200,
            data: "Sucessfully deleted"
        })
    }


}