diff --git a/src/apps/public/index.js b/src/apps/public/index.js index b672e9c..c2cd661 100644 --- a/src/apps/public/index.js +++ b/src/apps/public/index.js @@ -10,7 +10,9 @@ const metaData = require('./meta-data/routes.js'); const metaGroups = require('./meta-groups/routes.js'); const productCategories = require('./product-categories/routes.js'); const products = require('./products/routes.js'); +const publicCompanies = require('./public-companies/routes.js'); const publicVehicles = require('./public-vehicles/routes.js'); +const publicLoads = require('./public-loads/routes.js'); const publicLoadAttachments = require('./public-load-attachments/routes.js'); const states = require('./states/routes.js'); const test = require('./test/routes.js'); @@ -21,7 +23,9 @@ router.use('/meta-data', metaData); router.use('/meta-groups', metaGroups); router.use('/product-categories', productCategories); router.use('/products', products); +router.use("/public-companies", publicCompanies); router.use("/public-vehicles", publicVehicles); +router.use('/public-loads', publicLoads ); router.use('/public-load-attachments', publicLoadAttachments ); router.use('/states', states); diff --git a/src/apps/public/public-companies/routes.js b/src/apps/public/public-companies/routes.js new file mode 100644 index 0000000..3e66e59 --- /dev/null +++ b/src/apps/public/public-companies/routes.js @@ -0,0 +1,8 @@ +'use strict'; +const router = require('express').Router(); +const services= require('./services.js'); + +router.get('/shipper', services.getListShippers); +router.get('/carrier', services.getListCarriers); + +module.exports = router; diff --git a/src/apps/public/public-companies/services.js b/src/apps/public/public-companies/services.js new file mode 100644 index 0000000..8f5d19e --- /dev/null +++ b/src/apps/public/public-companies/services.js @@ -0,0 +1,83 @@ +"use strict"; + +const { query } = require("express"); + +const { ROOT_PATH, LIB_PATH, MODELS_PATH, HANDLERS_PATH } = process.env; +const { getPagination , getPage } = require( `${ROOT_PATH}/${LIB_PATH}/Misc.js` ); +const { GenericHandler } = require( `${ROOT_PATH}/${HANDLERS_PATH}/Generic.handler.js` ); +const Model = require( `${ROOT_PATH}/${MODELS_PATH}/companies.model.js` ); +const categoriesModel = require( `${ROOT_PATH}/${MODELS_PATH}/product-categories.model.js` ); + +const populate_select = { + categories:"-_id name", +}; +const generic = new GenericHandler( Model, null, null , populate_select ); + +function join_field_list( obj_with_fields , list_of_fields ) +{ + for(let field_idx=0; field_idx < list_of_fields.length; field_idx++){ + const field_name = list_of_fields[ field_idx ]; + const new_field_name = "_" + list_of_fields[ field_idx ]; + obj_with_fields[ new_field_name ] = obj_with_fields[field_name].join(", "); + } + return obj_with_fields; +} + +async function getListByType( type , req ){ + const filter = { "company_type" : type , "is_hidden" : false }; + const select = [ + "rfc", + "company_type", + "company_code", + "company_city", + "company_state", + "createdAt", + "membership", + "categories", + "truck_type", + "company_description" + ]; + const { elements } = getPagination( req.query ); + const page = 0;// No pagination allowed to this endpoint + let query_elements; + if( elements >= 100 ){ + query_elements = 100;// Never return more than 100 elements + }else{ + query_elements = elements; + } + const queryVal = await generic.getList(page , query_elements, filter, select ); + const data_list = queryVal.data; + for(let i=0; i c.name); + data_list[i]._truck_types = data_list[i]._truck_type; + data_list[i]._categories = categories.join(", "); + + /** Remove not requried fields */ + delete data_list[i].categories; + delete data_list[i].company_city; + delete data_list[i].company_state; + delete data_list[i].truck_type; + delete data_list[i]._truck_type; + } + const retVal = { + total : queryVal.total, + limit : queryVal.limit, + skip : queryVal.skip, + data : data_list + }; + return retVal; +} + +const getListShippers = async(req, res) => { + const retVal = await getListByType( "Shipper" , req ); + res.send( retVal ); +}; + +const getListCarriers = async(req, res) => { + const retVal = await getListByType( "Carrier" , req ); + res.send( retVal ); +}; + +module.exports = { getListShippers, getListCarriers }; diff --git a/src/apps/public/public-loads/routes.js b/src/apps/public/public-loads/routes.js new file mode 100644 index 0000000..a3b6809 --- /dev/null +++ b/src/apps/public/public-loads/routes.js @@ -0,0 +1,7 @@ +'use strict'; +const router = require('express').Router(); +const services= require('./services.js'); + +router.get('/', services.getList); + +module.exports = router; diff --git a/src/apps/public/public-loads/services.js b/src/apps/public/public-loads/services.js new file mode 100644 index 0000000..3740adc --- /dev/null +++ b/src/apps/public/public-loads/services.js @@ -0,0 +1,32 @@ +"use strict"; +const { ROOT_PATH, LIB_PATH, MODELS_PATH, HANDLERS_PATH } = process.env; +const { getPagination , getPage } = 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 categoriesModel = require( `${ROOT_PATH}/${MODELS_PATH}/product-categories.model.js` ); + +const populate_list = ['categories']; +const generic = new GenericHandler( Model, null, populate_list ); + +const getList = async(req, res) => { + const filter = null;//{ status : "Published" }; + const select = [ + "categories", + "truck_type", + "published_date", + "createdAt", + "status", + "weight", + "est_loading_date", + "est_unloading_date", + "origin.city", + "origin.state", + "destination.city", + "destination.state", + ]; + const { page , elements } = getPagination( req.query ); + const retVal = await generic.getList(page , elements, filter, select ); + res.send( retVal ); +}; + +module.exports = { getList }; diff --git a/src/apps/public/public-vehicles/routes.js b/src/apps/public/public-vehicles/routes.js index 3ae6ea0..b43ee82 100644 --- a/src/apps/public/public-vehicles/routes.js +++ b/src/apps/public/public-vehicles/routes.js @@ -2,6 +2,7 @@ const router = require('express').Router(); const services= require('./services.js'); -router.get('/', services.getPublicVehiclesList); +router.get('/published', services.getListPublished); +router.get('/location', services.getListLocations); module.exports = router; diff --git a/src/apps/public/public-vehicles/services.js b/src/apps/public/public-vehicles/services.js index 601f341..31d89d8 100644 --- a/src/apps/public/public-vehicles/services.js +++ b/src/apps/public/public-vehicles/services.js @@ -1,10 +1,15 @@ "use strict"; const { ROOT_PATH, LIB_PATH, MODELS_PATH, HANDLERS_PATH } = process.env; const { getPagination , getPage } = require( `${ROOT_PATH}/${LIB_PATH}/Misc.js` ); +const { GenericHandler } = require( `${ROOT_PATH}/${HANDLERS_PATH}/Generic.handler.js` ); const Model = require( `${ROOT_PATH}/${MODELS_PATH}/vehicles.model.js` ); +const categoriesModel = require( `${ROOT_PATH}/${MODELS_PATH}/product-categories.model.js` ); -const getPublicVehiclesList = async(req, res) => { - const filter = { status : "Free" }; +const populate_list = ['categories']; +const generic = new GenericHandler( Model, null, populate_list ); + +const getListPublished = async(req, res) => { + const filter = { is_available : true }; const select = [ "city", "state", @@ -15,11 +20,50 @@ const getPublicVehiclesList = async(req, res) => { "createdAt", "updatedAt", "published_date", - "status" + "status", + "is_available", + "categories" ]; - const { page , elements } = getPagination( req.query ); - const retVal = await getPage( page , elements, Model, filter, select ); + const { elements } = getPagination( req.query ); + const page = 0;// No pagination allowed to this endpoint + let query_elements; + if( elements >= 100 ){ + query_elements = 100;// Never return more than 100 elements + }else{ + query_elements = elements; + } + const retVal = await generic.getList(page , query_elements, filter, select ); res.send( retVal ); }; -module.exports = { getPublicVehiclesList }; +const getListLocations = async(req, res) => { + const filter = { status : "Free" }; + const select = [ + "last_location_geo", + "driver", + "updatedAt", + "status" + ]; + const { elements } = getPagination( req.query ); + const page = 0;// No pagination allowed to this endpoint + let query_elements; + if( elements >= 100 ){ + query_elements = 100;// Never return more than 100 elements + }else{ + query_elements = elements; + } + + const objQuery = await generic.getListQuery( page , query_elements, filter, select ); + + const data = await objQuery.query.sort("field -updatedAt").exec(); + + const retVal = { + total : objQuery.total, + limit : objQuery.limit, + skip : objQuery.skip, + data : data + }; + res.send( retVal ); +}; + +module.exports = { getListPublished, getListLocations }; diff --git a/src/lib/Handlers/Generic.handler.js b/src/lib/Handlers/Generic.handler.js index 9463be5..c06e7b0 100644 --- a/src/lib/Handlers/Generic.handler.js +++ b/src/lib/Handlers/Generic.handler.js @@ -24,22 +24,29 @@ async function getPageQuery(page, elements, Model, filter=null, projection=null) } class GenericHandler{ - constructor( Model, search_param=null, populate_list=null ) { + constructor( Model, search_param=null, populate_list=null, populate_select=null ) { this.Model = Model; - this.search_param = search_param; + this.search_param = search_param || null; this.populate_list = populate_list || []; + this.populate_select = populate_select || null; } - async populateQuey( query ){ + async populateQuery( query ){ if( this.populate_list.length > 0 ){ query.populate( this.populate_list ); } + else + if( this.populate_select != null ){ + for( const [key,value] of Object.entries(this.populate_select) ){ + query.populate( key , value ); + } + } return await query.exec(); } async getList( page, elements, filter=null, projection=null ){ const { query , total, skip } = await getPageQuery( page , elements, this.Model, filter, projection ); - const list = await this.populateQuey( query ); + const list = await this.populateQuery( query ); return { total : total, limit : elements, @@ -47,6 +54,31 @@ class GenericHandler{ data : list }; } + + /** + * Not populated query. + * + * Typical usage: + * @code{js} + * const queryObj = await generic.getListQuery(page, elements, filter, projection ); + * queryObj.query.SOME_ACTIONS(); + * const data = await generic.populateQuery( queryObj.query ); + * @endcode + * @param {*} page + * @param {*} elements + * @param {*} filter + * @param {*} projection + * @returns { total , limit, skip, query} + */ + async getListQuery( page, elements , filter=null, projection=null ){ + const { query , total, skip } = await getPageQuery( page , elements, this.Model, filter, projection ); + return { + total : total, + limit : elements, + skip : skip, + query : query + }; + } async findList( find_string, page, elements, projection=null ){ if( !this.search_param ){ @@ -61,7 +93,7 @@ class GenericHandler{ async getById( id, projection=null ){ const query = Model.findById( id, projection ); - return await this.populateQuey( query ); + return await this.populateQuery( query ); } }; diff --git a/src/lib/Models/branches.model.js b/src/lib/Models/branches.model.js index 88a5803..c60ed64 100644 --- a/src/lib/Models/branches.model.js +++ b/src/lib/Models/branches.model.js @@ -2,7 +2,7 @@ const mongoose = require('mongoose'); const { Schema } = mongoose; const schema = new Schema({ - categories: [{ type: Schema.Types.ObjectId, ref: 'product-categories' }], + categories: [{ type: Schema.Types.ObjectId, ref: 'productcategories' }], company: { type: Schema.Types.ObjectId, ref: 'companies' }, branch_name: { type: String }, phone: { type: String }, diff --git a/src/lib/Models/companies.model.js b/src/lib/Models/companies.model.js index e976c1a..dcceb88 100644 --- a/src/lib/Models/companies.model.js +++ b/src/lib/Models/companies.model.js @@ -35,7 +35,7 @@ const schema = new Schema({ rfc: { type: String }, - company_type: [{ type: String }], // SHIPPER , CARRIER + company_type: [{ type: String }], // Shipper , Carrier is_broker: { type: Boolean, default: false }, membership: { type: String }, membership_start_at: { type: Date }, diff --git a/src/lib/Models/users.model.js b/src/lib/Models/users.model.js index 15b1795..9568fcc 100644 --- a/src/lib/Models/users.model.js +++ b/src/lib/Models/users.model.js @@ -37,7 +37,7 @@ const schema = new Schema({ active_load: { type: Schema.Types.ObjectId, ref: 'loads' }, - categories: [{ type: Schema.Types.ObjectId, ref: 'product-categories' }], + categories: [{ type: Schema.Types.ObjectId, ref: 'productcategories' }], user_city: [{ type: String }], user_state: [{ type: String }], user_description: { type: String }, diff --git a/src/lib/Models/vehicles.model.js b/src/lib/Models/vehicles.model.js index 6ca80f5..84a9c54 100644 --- a/src/lib/Models/vehicles.model.js +++ b/src/lib/Models/vehicles.model.js @@ -31,7 +31,7 @@ const schema = new Schema({ status: { type: String, enum: ['Free', 'Loading', 'Transit', 'Downloading'] }, - categories: [{ type: Schema.Types.ObjectId, ref: 'product-categories' }], + categories: [{ type: Schema.Types.ObjectId, ref: 'productcategories' }], published_date: { type: Date }, available_date: { type: String },