feat: Adding public Endpoints
- New Endpoints: - public-companies - public-vehicles - public-loads
This commit is contained in:
@@ -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);
|
||||
|
||||
|
||||
8
src/apps/public/public-companies/routes.js
Normal file
8
src/apps/public/public-companies/routes.js
Normal file
@@ -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;
|
||||
83
src/apps/public/public-companies/services.js
Normal file
83
src/apps/public/public-companies/services.js
Normal file
@@ -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<data_list.length; i++){
|
||||
data_list[i] = data_list[i].toObject();
|
||||
data_list[i] = join_field_list( data_list[i] , ["company_city","company_state","truck_type"] );
|
||||
let categories = data_list[i].categories.map( ( c ) => 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 };
|
||||
7
src/apps/public/public-loads/routes.js
Normal file
7
src/apps/public/public-loads/routes.js
Normal file
@@ -0,0 +1,7 @@
|
||||
'use strict';
|
||||
const router = require('express').Router();
|
||||
const services= require('./services.js');
|
||||
|
||||
router.get('/', services.getList);
|
||||
|
||||
module.exports = router;
|
||||
32
src/apps/public/public-loads/services.js
Normal file
32
src/apps/public/public-loads/services.js
Normal file
@@ -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 };
|
||||
@@ -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;
|
||||
|
||||
@@ -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 };
|
||||
|
||||
@@ -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,
|
||||
@@ -48,6 +55,31 @@ class GenericHandler{
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* 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 ){
|
||||
throw new Error( "No search parameter setted up" );
|
||||
@@ -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 );
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -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 },
|
||||
|
||||
@@ -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 },
|
||||
|
||||
@@ -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 },
|
||||
|
||||
@@ -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 },
|
||||
|
||||
Reference in New Issue
Block a user