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 metaGroups = require('./meta-groups/routes.js');
|
||||||
const productCategories = require('./product-categories/routes.js');
|
const productCategories = require('./product-categories/routes.js');
|
||||||
const products = require('./products/routes.js');
|
const products = require('./products/routes.js');
|
||||||
|
const publicCompanies = require('./public-companies/routes.js');
|
||||||
const publicVehicles = require('./public-vehicles/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 publicLoadAttachments = require('./public-load-attachments/routes.js');
|
||||||
const states = require('./states/routes.js');
|
const states = require('./states/routes.js');
|
||||||
const test = require('./test/routes.js');
|
const test = require('./test/routes.js');
|
||||||
@@ -21,7 +23,9 @@ router.use('/meta-data', metaData);
|
|||||||
router.use('/meta-groups', metaGroups);
|
router.use('/meta-groups', metaGroups);
|
||||||
router.use('/product-categories', productCategories);
|
router.use('/product-categories', productCategories);
|
||||||
router.use('/products', products);
|
router.use('/products', products);
|
||||||
|
router.use("/public-companies", publicCompanies);
|
||||||
router.use("/public-vehicles", publicVehicles);
|
router.use("/public-vehicles", publicVehicles);
|
||||||
|
router.use('/public-loads', publicLoads );
|
||||||
router.use('/public-load-attachments', publicLoadAttachments );
|
router.use('/public-load-attachments', publicLoadAttachments );
|
||||||
router.use('/states', states);
|
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 router = require('express').Router();
|
||||||
const services= require('./services.js');
|
const services= require('./services.js');
|
||||||
|
|
||||||
router.get('/', services.getPublicVehiclesList);
|
router.get('/published', services.getListPublished);
|
||||||
|
router.get('/location', services.getListLocations);
|
||||||
|
|
||||||
module.exports = router;
|
module.exports = router;
|
||||||
|
|||||||
@@ -1,10 +1,15 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
const { ROOT_PATH, LIB_PATH, MODELS_PATH, HANDLERS_PATH } = process.env;
|
const { ROOT_PATH, LIB_PATH, MODELS_PATH, HANDLERS_PATH } = process.env;
|
||||||
const { getPagination , getPage } = require( `${ROOT_PATH}/${LIB_PATH}/Misc.js` );
|
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 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 populate_list = ['categories'];
|
||||||
const filter = { status : "Free" };
|
const generic = new GenericHandler( Model, null, populate_list );
|
||||||
|
|
||||||
|
const getListPublished = async(req, res) => {
|
||||||
|
const filter = { is_available : true };
|
||||||
const select = [
|
const select = [
|
||||||
"city",
|
"city",
|
||||||
"state",
|
"state",
|
||||||
@@ -15,11 +20,50 @@ const getPublicVehiclesList = async(req, res) => {
|
|||||||
"createdAt",
|
"createdAt",
|
||||||
"updatedAt",
|
"updatedAt",
|
||||||
"published_date",
|
"published_date",
|
||||||
"status"
|
"status",
|
||||||
|
"is_available",
|
||||||
|
"categories"
|
||||||
];
|
];
|
||||||
const { page , elements } = getPagination( req.query );
|
const { elements } = getPagination( req.query );
|
||||||
const retVal = await getPage( page , elements, Model, filter, select );
|
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 );
|
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{
|
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.Model = Model;
|
||||||
this.search_param = search_param;
|
this.search_param = search_param || null;
|
||||||
this.populate_list = populate_list || [];
|
this.populate_list = populate_list || [];
|
||||||
|
this.populate_select = populate_select || null;
|
||||||
}
|
}
|
||||||
|
|
||||||
async populateQuey( query ){
|
async populateQuery( query ){
|
||||||
if( this.populate_list.length > 0 ){
|
if( this.populate_list.length > 0 ){
|
||||||
query.populate( this.populate_list );
|
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();
|
return await query.exec();
|
||||||
}
|
}
|
||||||
|
|
||||||
async getList( page, elements, filter=null, projection=null ){
|
async getList( page, elements, filter=null, projection=null ){
|
||||||
const { query , total, skip } = await getPageQuery( page , elements, this.Model, filter, projection );
|
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 {
|
return {
|
||||||
total : total,
|
total : total,
|
||||||
limit : elements,
|
limit : elements,
|
||||||
@@ -47,6 +54,31 @@ class GenericHandler{
|
|||||||
data : list
|
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 ){
|
async findList( find_string, page, elements, projection=null ){
|
||||||
if( !this.search_param ){
|
if( !this.search_param ){
|
||||||
@@ -61,7 +93,7 @@ class GenericHandler{
|
|||||||
|
|
||||||
async getById( id, projection=null ){
|
async getById( id, projection=null ){
|
||||||
const query = Model.findById( id, projection );
|
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 } = mongoose;
|
||||||
|
|
||||||
const schema = new Schema({
|
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' },
|
company: { type: Schema.Types.ObjectId, ref: 'companies' },
|
||||||
branch_name: { type: String },
|
branch_name: { type: String },
|
||||||
phone: { type: String },
|
phone: { type: String },
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ const schema = new Schema({
|
|||||||
rfc: { type: String },
|
rfc: { type: String },
|
||||||
|
|
||||||
|
|
||||||
company_type: [{ type: String }], // SHIPPER , CARRIER
|
company_type: [{ type: String }], // Shipper , Carrier
|
||||||
is_broker: { type: Boolean, default: false },
|
is_broker: { type: Boolean, default: false },
|
||||||
membership: { type: String },
|
membership: { type: String },
|
||||||
membership_start_at: { type: Date },
|
membership_start_at: { type: Date },
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ const schema = new Schema({
|
|||||||
|
|
||||||
active_load: { type: Schema.Types.ObjectId, ref: 'loads' },
|
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_city: [{ type: String }],
|
||||||
user_state: [{ type: String }],
|
user_state: [{ type: String }],
|
||||||
user_description: { type: String },
|
user_description: { type: String },
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ const schema = new Schema({
|
|||||||
|
|
||||||
status: { type: String, enum: ['Free', 'Loading', 'Transit', 'Downloading'] },
|
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 },
|
published_date: { type: Date },
|
||||||
available_date: { type: String },
|
available_date: { type: String },
|
||||||
|
|||||||
Reference in New Issue
Block a user