feat: Adding public Endpoints

- New Endpoints:
 	- public-companies
 	- public-vehicles
 	- public-loads
This commit is contained in:
2023-11-08 00:58:00 -06:00
parent ac1dd38cb0
commit d4f69627a9
12 changed files with 227 additions and 16 deletions

View File

@@ -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);

View 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;

View 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 };

View File

@@ -0,0 +1,7 @@
'use strict';
const router = require('express').Router();
const services= require('./services.js');
router.get('/', services.getList);
module.exports = router;

View 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 };

View File

@@ -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;

View File

@@ -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 };

View File

@@ -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,
@@ -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 ){ async findList( find_string, page, elements, projection=null ){
if( !this.search_param ){ if( !this.search_param ){
throw new Error( "No search parameter setted up" ); throw new Error( "No search parameter setted up" );
@@ -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 );
} }
}; };

View File

@@ -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 },

View File

@@ -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 },

View File

@@ -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 },

View File

@@ -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 },