From ff5101702c1c51c0fbe9283209b24bb454d07a78 Mon Sep 17 00:00:00 2001 From: Josepablo C Date: Mon, 11 Mar 2024 19:24:56 -0600 Subject: [PATCH] feat: Adding branches, loads, proposals and vehicles endpoints --- src/apps/private/branches/routes.js | 12 ++ src/apps/private/branches/services.js | 122 ++++++++++++++++ src/apps/private/index.js | 12 +- src/apps/private/loads/routes.js | 6 +- src/apps/private/loads/services.js | 185 +++++++++++++++++++++---- src/apps/private/proposals/routes.js | 12 ++ src/apps/private/proposals/services.js | 119 ++++++++++++++++ src/apps/private/vehicles/routes.js | 12 ++ src/apps/private/vehicles/services.js | 175 +++++++++++++++++++++++ 9 files changed, 619 insertions(+), 36 deletions(-) create mode 100644 src/apps/private/branches/routes.js create mode 100644 src/apps/private/branches/services.js create mode 100644 src/apps/private/proposals/routes.js create mode 100644 src/apps/private/proposals/services.js create mode 100644 src/apps/private/vehicles/routes.js create mode 100644 src/apps/private/vehicles/services.js diff --git a/src/apps/private/branches/routes.js b/src/apps/private/branches/routes.js new file mode 100644 index 0000000..f4ddf71 --- /dev/null +++ b/src/apps/private/branches/routes.js @@ -0,0 +1,12 @@ +'use strict'; +const router = require('express').Router(); +const services= require('./services.js'); + +router.get('/find', services.findList); +router.post('/new', services.postLoad); + +router.patch('/:id', services.patchLoad); +router.delete('/:id', services.deleteLoad); +router.get('/:id', services.getById); + +module.exports = router; diff --git a/src/apps/private/branches/services.js b/src/apps/private/branches/services.js new file mode 100644 index 0000000..2ac6832 --- /dev/null +++ b/src/apps/private/branches/services.js @@ -0,0 +1,122 @@ +"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('branches'); + +const populate_list = ['company', 'categories']; +const generic = new GenericHandler( Model, null, populate_list ); + +function getAndFilterList( query ){ + const filter_list = []; + const { categories, branch_name, phone, city, state, truck_type } = query; + + 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( 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 ); + const list_elements = data; + // for(let i=0; i c.name); + // item._categories = categories.join(", "); + // } + // if (item.truck_type) { + // item._truck_types = item.truck_type.join(", "); + // } + // list_elements[i] = item; + // } + return { + total, + limit, + skip, + data:list_elements + }; +} + +async function findElementById( elementId , companyId ){ + const filter = { + $and : [ + { _id : elementId }, + { company : companyId } + ] + }; + let retVal = await Model.findOne( filter ).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 patchLoad = async(req, res) => { + try{ + console.log( req.body ); + return res.status( 500 ).send({ error : "Not implemented yet" }); + }catch(error){ + console.error( error ); + return res.status( 500 ).send({ error }); + } +}; + +const postLoad = async(req, res) => { + try{ + console.log( req.body ); + return res.status( 500 ).send({ error : "Not implemented yet" }); + }catch(error){ + console.error( error ); + return res.status( 500 ).send({ error }); + } +}; + +const deleteLoad = async(req, res) => { + try{ + return res.status( 500 ).send({ error : "Not implemented yet" }); + }catch(error){ + console.error( error ); + return res.status( 500 ).send({ error }); + } +}; + +module.exports = { findList, getById, patchLoad, postLoad, deleteLoad }; diff --git a/src/apps/private/index.js b/src/apps/private/index.js index 45526aa..cd235af 100644 --- a/src/apps/private/index.js +++ b/src/apps/private/index.js @@ -7,28 +7,30 @@ const jwtValidator = require( `${ROOT_PATH}/${LIB_PATH}/jwtValidator.js` ); const context = require( './lib/context' ); const account = require('./account/routes.js'); +const branches = require('./branches/routes.js'); +const companies = require('./companies/routes.js'); const loadAttachments = require('./load-attachments/routes.js'); const loads = require('./loads/routes.js'); +const proposals = require('./proposals/routes.js'); const users = require('./users/routes.js'); -const companies = require('./companies/routes.js') +const vehicles = require('./vehicles/routes.js'); router.use( jwtValidator.middleware ); router.use( context.middleware ); router.use('/account', account); +router.use('/branches', branches); router.use('/companies', companies); router.use('/load-attachments', loadAttachments ); router.use('/loads', loads); +router.use('/proposals', proposals); router.use('/users', users); +router.use('/vehicles', vehicles); /* router.use('/orders', test); -router.use('/vehicles', test); router.use('/mailer', test); -router.use('/authmanagement', test); router.use('/memberships', test); -router.use('/checkAccount', test); -router.use('/proposals', test); router.use('/bootresolvers', test); router.use('/budgets', test); router.use('/news', test); diff --git a/src/apps/private/loads/routes.js b/src/apps/private/loads/routes.js index edc6e25..f4ddf71 100644 --- a/src/apps/private/loads/routes.js +++ b/src/apps/private/loads/routes.js @@ -2,7 +2,11 @@ const router = require('express').Router(); const services= require('./services.js'); -router.get('/', services.getList); +router.get('/find', services.findList); +router.post('/new', services.postLoad); + +router.patch('/:id', services.patchLoad); +router.delete('/:id', services.deleteLoad); router.get('/:id', services.getById); module.exports = router; diff --git a/src/apps/private/loads/services.js b/src/apps/private/loads/services.js index 4493c9e..7112a0d 100644 --- a/src/apps/private/loads/services.js +++ b/src/apps/private/loads/services.js @@ -1,52 +1,177 @@ "use strict"; const { ROOT_PATH, LIB_PATH, MODELS_PATH, HANDLERS_PATH } = process.env; -const { getPagination , queryPage } = require( `${ROOT_PATH}/${LIB_PATH}/Misc.js` ); +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 = require( `${ROOT_PATH}/${MODELS_PATH}/loads.model.js` ); -const UserModel = require( `${ROOT_PATH}/${MODELS_PATH}/users.model.js` ); -const CompaniesModel = require( `${ROOT_PATH}/${MODELS_PATH}/companies.model.js` ); -const VehiclesModel = require( `${ROOT_PATH}/${MODELS_PATH}/vehicles.model.js` ); -const ProposalsModel = require( `${ROOT_PATH}/${MODELS_PATH}/proposals.model.js` ); +const Model = getModel('loads'); +const ProposalsModel = getModel('proposals'); const populate_list = ['product', 'company', 'carrier', 'vehicle', 'categories']; const generic = new GenericHandler( Model, null, populate_list ); -async function getAuthorizationFilter( userId ){ - const user = await UserModel.findById( userId ); - const companyId = user.company.toString(); - return { - $or: [ - { company : companyId }, - { carrier : companyId }, - ] - }; +function getAndFilterList( query ){ + const filter_list = []; + const { status, posted_by_name, load_status, published_date, loaded_date, transit_date, categories, product } = query; + + if( status ){ filter_list.push( { status } ); } + if( posted_by_name ) { filter_list.push({ posted_by_name }); } + if( load_status ) { filter_list.push({ load_status }); } + if( published_date ) { filter_list.push({ published_date }); } + if( loaded_date ) { filter_list.push({ loaded_date }); } + if( transit_date ) { filter_list.push({ transit_date }); } + if( categories ) { filter_list.push({ categories }); } + if( product ) { filter_list.push({ product }); } + + if( filter_list.length == 0 ){ + return null; + } + return filter_list; } -const getList = async(req, res) => { - const filter = await getAuthorizationFilter( req.JWT.payload.sub ); - const { page , elements } = getPagination( req.query ); - const retVal = await generic.getList(page , elements, filter ); - const load_list = retVal.data; +async function findLoads( companyId , query ){ + const { page, elements } = getPagination( query ); + const andFilterList = getAndFilterList( query ); + let filter; + if( andFilterList ){ + andFilterList.push({$or : [ + { company : companyId }, + { carrier : companyId } + ]}); + filter = { $and : andFilterList }; + }else{ + filter = {$or : [ + { company : companyId }, + { carrier : companyId } + ]}; + } + const { total , limit, skip, data } = await generic.getList( page , elements, filter ); + const load_list = data; for(let i=0; i { - const loadId = req.params.id; - const CompanyAccessFilter = await getAuthorizationFilter( req.JWT.payload.sub ); +async function findLoadById( loadId , companyId ){ const filter = { $and : [ { _id : loadId }, - CompanyAccessFilter + { + $or : [ + { company : companyId }, + { carrier : companyId } + ] + } ] }; - const retVal = await Model.findOne( filter ).populate( populate_list ) || {}; - res.send( retVal ); + let retVal = await Model.findOne( filter ).populate( populate_list ); + if( retVal ){ + retVal = retVal.toObject(); + const no_of_proposals = await ProposalsModel.count({ load : loadId }); + retVal.no_of_proposals = no_of_proposals; + }else{ + retVal = {}; + } + return retVal; +} + +const findList = async(req, res) => { + try{ + const query = req.query || {}; + const companyId = req.context.companyId; + const retVal = await findLoads( companyId , query ); + res.send( retVal ); + }catch(error){ + console.error( error ); + return res.status( 500 ).send({ error }); + } }; -module.exports = { getList, getById }; +const getById = async(req, res) => { + try{ + const companyId = req.context.companyId; + const loadId = req.params.id; + res.send( await findLoadById( loadId , companyId ) ); + }catch(error){ + console.error( error ); + return res.status( 500 ).send({ error }); + } +}; + +const patchLoad = async(req, res) => { + try{ + const companyId = req.context.companyId; + const loadId = req.params.id; + const data = req.body; + const load = await findElementById( elementId , companyId ); + if( !load ){ + throw "You can't modify this load"; + } + if( !data ){ + throw "load data not sent"; + } + if(permissions !== "role_shipper" ){ + throw "You can't modify loads"; + } + await Model.findByIdAndUpdate( elementId , data ); + return res.send( await Model.findById( elementId ) ); + }catch(error){ + console.error( error ); + return res.status( 500 ).send({ error }); + } +}; + +const postLoad = async(req, res) => { + try{ + const companyId = req.context.companyId; + const userId = req.context.userId; + const user_name = req.context.user.first_name; + const permissions = req.context.permissions; + const data = req.body; + if( !data ){ + throw "Load data not sent"; + } + if(permissions !== "role_shipper" ){ + throw "You can't create loads"; + } + data.company = companyId; + data.posted_by = userId; + data.name = user_name; + const load = new Model( data ); + await load.save(); + return res.send( load ); + }catch(error){ + console.error( error ); + return res.status( 500 ).send({ error }); + } +}; + +const deleteLoad = async(req, res) => { + try{ + const companyId = req.context.companyId; + const loadId = req.params.id; + const permissions = req.context.permissions; + const load = await findLoadById( loadId , companyId ); + if(!load){ + throw "You can't delete this load"; + } + if(permissions !== "role_shipper" ){ + throw "You can't delete loads"; + } + await Model.findByIdAndDelete( elementId ); + return res.send(load); + }catch(error){ + console.error( error ); + return res.status( 500 ).send({ error }); + } +}; + +module.exports = { findList, getById, patchLoad, postLoad, deleteLoad }; diff --git a/src/apps/private/proposals/routes.js b/src/apps/private/proposals/routes.js new file mode 100644 index 0000000..a56661d --- /dev/null +++ b/src/apps/private/proposals/routes.js @@ -0,0 +1,12 @@ +'use strict'; +const router = require('express').Router(); +const services= require('./services.js'); + +router.get('/find', services.findList); +router.post('/new', services.postProposal); + +router.patch('/:id', services.patchProposal); +router.delete('/:id', services.deleteProposal); +router.get('/:id', services.getById); + +module.exports = router; diff --git a/src/apps/private/proposals/services.js b/src/apps/private/proposals/services.js new file mode 100644 index 0000000..52fbc24 --- /dev/null +++ b/src/apps/private/proposals/services.js @@ -0,0 +1,119 @@ +"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('proposals'); + +const populate_list = ['load', 'shipper','carrier','vehicle','bidder','accepted_by']; +const generic = new GenericHandler( Model, null, populate_list ); + +function getAndFilterList( query ){ + const filter_list = []; + const { categories, branch_name, phone, city, state, truck_type } = query; + + 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( companyId , query ){ + const { page, elements } = getPagination( query ); + const andFilterList = getAndFilterList( query ); + let filter; + if( andFilterList ){ + andFilterList.push({ $or :[ + { shipper : companyId }, + { carrier : companyId } + ]}); + filter = { $and : andFilterList }; + }else{ + filter = { $or :[ + { shipper : companyId }, + { carrier : companyId } + ]}; + } + 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 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 patchProposal = async(req, res) => { + try{ + console.log( req.body ); + return res.status( 500 ).send({ error : "Not implemented yet" }); + }catch(error){ + console.error( error ); + return res.status( 500 ).send({ error }); + } +}; + +const postProposal = async(req, res) => { + try{ + console.log( req.body ); + return res.status( 500 ).send({ error : "Not implemented yet" }); + }catch(error){ + console.error( error ); + return res.status( 500 ).send({ error }); + } +}; + +const deleteProposal = async(req, res) => { + try{ + return res.status( 500 ).send({ error : "Not implemented yet" }); + }catch(error){ + console.error( error ); + return res.status( 500 ).send({ error }); + } +}; + +module.exports = { findList, getById, patchProposal, postProposal, deleteProposal }; diff --git a/src/apps/private/vehicles/routes.js b/src/apps/private/vehicles/routes.js new file mode 100644 index 0000000..ec320c0 --- /dev/null +++ b/src/apps/private/vehicles/routes.js @@ -0,0 +1,12 @@ +'use strict'; +const router = require('express').Router(); +const services= require('./services.js'); + +router.get('/find', services.findList); +router.post('/new', services.postVehicle); + +router.patch('/:id', services.patchVehicle); +router.delete('/:id', services.deleteVehicle); +router.get('/:id', services.getById); + +module.exports = router; diff --git a/src/apps/private/vehicles/services.js b/src/apps/private/vehicles/services.js new file mode 100644 index 0000000..b19f0b3 --- /dev/null +++ b/src/apps/private/vehicles/services.js @@ -0,0 +1,175 @@ +"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 }; + } + console.log( filter ); + 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 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"; + } + 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 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; + 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 };