"use strict"; const { getModel } = require( '../../../lib/Models' ); const { getPagination } = require( '../../../lib/Misc' ); const { GenericHandler } = require( '../../../lib/Handlers/Generic.handler' ); const { onPostEvent, onPatchEvent } = require('../../../lib/Handlers/Proposals.handler'); const Model = getModel('proposals'); const populate_list = [ { path:'load' , populate : { path : 'categories' } }, { path:'load' , populate : { path : 'company' } }, 'shipper', 'carrier', 'vehicle', { path:'vehicle' , populate : { path : 'driver' , select : { password : 0 , session_token : 0 , session_token_exp : 0 } } }, { path:'bidder', select : { password : 0 , session_token : 0 , session_token_exp : 0 } }, { path:'accepted_by', select : { password : 0 , session_token : 0 , session_token_exp : 0 } } ]; const generic = new GenericHandler( Model, null, populate_list ); function getAndFilterList( query ){ const filter_list = []; const { shipper, carrier, load, categories, branch_name, phone, city, state, truck_type, is_accepted, is_withdrawn, is_completed, } = query; if( is_completed ) { filter_list.push({ is_completed }); } if( is_withdrawn ) { filter_list.push({ is_withdrawn }); } if( is_accepted ) { filter_list.push({ is_accepted }); } if( shipper ) { filter_list.push({ shipper }); } if( carrier ) { filter_list.push({ carrier }); } if( load ) { filter_list.push({ load }); } if( categories ) { filter_list.push({ categories }); } if( branch_name ) { filter_list.push({ branch_name }); } if( phone ) { filter_list.push({ phone }); } if( city ) { filter_list.push({ city }); } if( state ) { filter_list.push({ state }); } if( truck_type ) { filter_list.push({ truck_type }); } if( filter_list.length == 0 ){ return null; } return filter_list; } async function findElements( query ){ const { page, elements } = getPagination( query ); const andFilterList = getAndFilterList( query ); let filter; if( andFilterList ){ filter = { $and : andFilterList }; }else{ filter = null; } const { total , limit, skip, data } = await generic.getList( page , elements, filter ); return { total, limit, skip, data:data }; } async function findElementById( elementId , companyId ){ const filter = { $and : [ { _id : elementId }, { $or :[ { shipper : companyId }, { carrier : companyId } ]} ] }; let retVal = await Model.findOne( filter ).populate( populate_list ) || {}; return retVal; } const findList = async(req, res) => { try{ const query = req.query || {}; const retVal = await findElements( query ); res.send( retVal ); }catch(error){ console.error( error ); return res.status( 500 ).send({ error }); } }; const getById = async(req, res) => { try{ const companyId = req.context.companyId; const elementId = req.params.id; res.send( await findElementById( elementId , companyId ) ); }catch(error){ console.error( error ); return res.status( 500 ).send({ error }); } }; const patchProposal = async(req, res) => { try{ const elementId = req.params.id; const proposal = await Model.findById( elementId ); const data = req.body; if( !proposal ){ throw "You can't modify this proposal"; } if( !data ){ throw "proposal data not sent"; } await Model.findByIdAndUpdate( elementId , data ); await onPatchEvent( req.context.userId, elementId, data ); return res.send( await Model.findById( elementId ) ); }catch(error){ console.error( error ); return res.status( 500 ).send({ error }); } }; const postProposal = async(req, res) => { try{ const data = req.body; if( !data ){ throw "proposal data not sent"; } const proposal = new Model( data ); await proposal.save(); await onPostEvent( req.context.userId, proposal.id, data); return res.send( proposal ); }catch(error){ console.error( error ); return res.status( 500 ).send({ error }); } }; const deleteProposal = async(req, res) => { try{ const elementId = req.params.id; const proposal = await Model.findById( elementId ); if(!proposal){ throw "You can't delete this proposal"; } await Model.findByIdAndDelete( elementId ); return res.send(proposal); }catch(error){ console.error( error ); return res.status( 500 ).send({ error }); } }; module.exports = { findList, getById, patchProposal, postProposal, deleteProposal };