"use strict"; const { ROOT_PATH, LIB_PATH, MODELS_PATH, HANDLERS_PATH } = process.env; const { getModel } = require( `${ROOT_PATH}/${MODELS_PATH}` ); const { getPagination } = require( `${ROOT_PATH}/${LIB_PATH}/Misc.js` ); const { GenericHandler } = require( `${ROOT_PATH}/${HANDLERS_PATH}/Generic.handler.js` ); const Model = getModel('vehicles'); const populate_list = ['categories', 'active_load','load_shipper','driver']; const generic = new GenericHandler( Model, null, populate_list ); function getAndFilterList( query ){ const filter_list = []; const { categories, active_load, load_shipper, driver, vehicle_code, vehicle_name, vehicle_number, circulation_serial_number, truck_type, tyre_type, city, state, status, destino } = query; if( categories ) { filter_list.push({ categories }); } if( active_load ) { filter_list.push({ active_load }); } if( load_shipper ) { filter_list.push({ load_shipper }); } if( driver ) { filter_list.push({ driver }); } if( vehicle_code ) { filter_list.push({ vehicle_code }); } if( vehicle_name ) { filter_list.push({ vehicle_name }); } if( vehicle_number ) { filter_list.push({ vehicle_number }); } if( circulation_serial_number ) { filter_list.push({ circulation_serial_number }); } if( truck_type ) { filter_list.push({ truck_type }); } if( tyre_type ) { filter_list.push({ tyre_type }); } if( city ) { filter_list.push({ city }); } if( state ) { filter_list.push({ state }); } if( status ) { filter_list.push({ status }); } if( destino ) { filter_list.push({ destino }); } if( filter_list.length == 0 ){ return null; } return filter_list; } async function findElements( companyId , query ){ const { page, elements } = getPagination( query ); const andFilterList = getAndFilterList( query ); let filter; if( andFilterList ){ andFilterList.push({ company : companyId }); filter = { $and : andFilterList }; }else{ filter = { company : companyId }; } const { total , limit, skip, data } = await generic.getList( page , elements, filter ); return { total, limit, skip, data:data }; } async function findElementById( elementId , companyId ){ let retVal = await Model.findById( elementId ).populate( populate_list ) || {}; return retVal; } const findList = async(req, res) => { try{ const query = req.query || {}; const companyId = req.context.companyId; const retVal = await findElements( companyId , 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 patchVehicle = async(req, res) => { try{ const companyId = req.context.companyId; const elementId = req.params.id; const permissions = req.context.permissions; const vehicle = await findElementById( elementId , companyId ); const data = req.body; if( !vehicle ){ throw "You can't modify this vehicle"; } if( !data ){ throw "Vehicle data not sent"; } if( permissions !== "role_carrier" ){ throw "You can't modify vehicles"; } data.company = companyId; await Model.findByIdAndUpdate( elementId , data ); return res.send( await Model.findById( elementId ) ); }catch(error){ console.error( error ); return res.status( 500 ).send({ error }); } }; const postVehicle = async(req, res) => { try{ const userId = req.context.userId; const companyId = req.context.companyId; const permissions = req.context.permissions; const data = req.body; if( !data ){ throw "Vehicle data not sent"; } if(permissions !== "role_carrier" ){ throw "You can't create vehicles"; } data.company = companyId; data.status = "Free"; data.is_available = false; data.posted_by = userId; const vehicle = new Model( data ); await vehicle.save(); return res.send( vehicle ); }catch(error){ console.error( error ); return res.status( 500 ).send({ error }); } }; const deleteVehicle = async(req, res) => { try{ const companyId = req.context.companyId; const elementId = req.params.id; const permissions = req.context.permissions; const vehicle = await findElementById( elementId , companyId ); if( !vehicle ){ throw "You can't delete this vehicle"; } if(permissions !== "role_carrier" ){ throw "You can't delete vehicles"; } await Model.findByIdAndDelete( elementId ); return res.send(vehicle); }catch(error){ console.error( error ); return res.status( 500 ).send({ error }); } }; module.exports = { findList, getById, patchVehicle, postVehicle, deleteVehicle };