feat: Adding states endpoint and regex find to current endpoints

This commit is contained in:
2023-10-06 00:23:36 -06:00
parent bf65d9a5cf
commit ce3ec074eb
11 changed files with 117 additions and 16 deletions

View File

@@ -5,3 +5,30 @@ ETA Viaporte API
# Dependencies # Dependencies
- NodeJS v18 - NodeJS v18
- Docker
# Endpoints
All endpoints that return a list of elements is paginable with the following queries:
- `elements`: Number of elements for each page.
- `page`: Page number (from 0 to n)
Example:
- `/endpoint?elements=50&page=2` : Get page 2 with 50 elements per page.
- `/endpoint?page=2` : Get page 2 with default (10) elements per page.
- `/endpoint?elements=50` : Get page 0 with 50 elements.
## Public endpoints
Read registered resources:
- `/cities`: List registered cities.
- `/countries`: List registered countries.
- `/product-categories`: List registered product-categories.
- `/states`: List registered states.
All these endpoints support the following parameters:
- `/` : List registered resources with pagination.
- `/:id` : Read specific resource identified by Id.
- `/find?regex=xxx` : List resources that matches with regex (support pagination).

View File

@@ -25,10 +25,10 @@ function getPagination( query ){
return limit; return limit;
} }
async function queryPage( page , elements , model ){ async function queryPage( page, elements, model, filter=null, projection=null){
const skip = elements * page; const skip = elements * page;
const total = await model.count(); const total = await model.count();
const list = await model.find( null , null, { skip : skip , limit : elements } ); const list = await model.find( filter, projection, { skip : skip , limit : elements } );
return { return {
total : total, total : total,
limit : elements, limit : elements,

View File

@@ -3,6 +3,7 @@ const router = require('express').Router();
const services= require('./services.js'); const services= require('./services.js');
router.get('/', services.getCitiesList); router.get('/', services.getCitiesList);
router.get('/find', services.findCitiesList);
router.get('/:id', services.getCity); router.get('/:id', services.getCity);
module.exports = router; module.exports = router;

View File

@@ -1,17 +1,28 @@
"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 , queryPage } = require( `${ROOT_PATH}/${LIB_PATH}/Misc.js` ); const { getPagination , queryPage } = require( `${ROOT_PATH}/${LIB_PATH}/Misc.js` );
const citiesModel = require( `${ROOT_PATH}/${MODELS_PATH}/cities.model.js` ); const Model = require( `${ROOT_PATH}/${MODELS_PATH}/cities.model.js` );
const getCitiesList = async(req, res) => { const getCitiesList = async(req, res) => {
const { page , elements } = getPagination( req.query ); const { page , elements } = getPagination( req.query );
const retVal = await queryPage( page , elements, citiesModel ); const retVal = await queryPage( page , elements, Model );
res.send( retVal );
};
const findCitiesList = async(req, res) => {
let filter=null;
if( req.query.regex ){
const re = new RegExp( req.query.regex );
filter = { "city_name" : { $regex: re, $options: 'i' }};
}
const { page , elements } = getPagination( req.query );
const retVal = await queryPage( page, elements, Model, filter );
res.send( retVal ); res.send( retVal );
}; };
const getCity = async(req, res) => { const getCity = async(req, res) => {
const retVal = await citiesModel.findById( req.params.id ); const retVal = await Model.findById( req.params.id );
res.send( retVal ); res.send( retVal );
}; };
module.exports = { getCitiesList , getCity }; module.exports = { getCitiesList , findCitiesList , getCity };

View File

@@ -3,6 +3,7 @@ const router = require('express').Router();
const services= require('./services.js'); const services= require('./services.js');
router.get('/', services.getCountriesList); router.get('/', services.getCountriesList);
router.get('/find', services.findCountriesList);
router.get('/:id', services.getCountry); router.get('/:id', services.getCountry);
module.exports = router; module.exports = router;

View File

@@ -1,17 +1,28 @@
"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 , queryPage } = require( `${ROOT_PATH}/${LIB_PATH}/Misc.js` ); const { getPagination , queryPage } = require( `${ROOT_PATH}/${LIB_PATH}/Misc.js` );
const countriesModel = require( `${ROOT_PATH}/${MODELS_PATH}/countries.model.js` ); const Model = require( `${ROOT_PATH}/${MODELS_PATH}/countries.model.js` );
const getCountriesList = async(req, res) => { const getCountriesList = async(req, res) => {
const { page , elements } = getPagination( req.query ); const { page , elements } = getPagination( req.query );
const retVal = await queryPage( page , elements, countriesModel ); const retVal = await queryPage( page , elements, Model );
res.send( retVal );
};
const findCountriesList = async(req, res) => {
let filter=null;
if( req.query.regex ){
const re = new RegExp( req.query.regex );
filter = { "country_name" : { $regex: re, $options: 'i' }};
}
const { page , elements } = getPagination( req.query );
const retVal = await queryPage( page, elements, Model, filter );
res.send( retVal ); res.send( retVal );
}; };
const getCountry = async(req, res) => { const getCountry = async(req, res) => {
const retVal = await countriesModel.findById( req.params.id ); const retVal = await Model.findById( req.params.id );
res.send( retVal ); res.send( retVal );
}; };
module.exports = { getCountriesList , getCountry }; module.exports = { getCountriesList, findCountriesList, getCountry };

View File

@@ -3,6 +3,7 @@ const router = require('express').Router();
const services= require('./services.js'); const services= require('./services.js');
router.get('/', services.getProductCategoriesList); router.get('/', services.getProductCategoriesList);
router.get('/find', services.findProductCategoriesList);
router.get('/:id', services.getProductCategory ); router.get('/:id', services.getProductCategory );
module.exports = router; module.exports = router;

View File

@@ -1,17 +1,28 @@
"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 , queryPage } = require( `${ROOT_PATH}/${LIB_PATH}/Misc.js` ); const { getPagination , queryPage } = require( `${ROOT_PATH}/${LIB_PATH}/Misc.js` );
const productCategoriesModel = require( `${ROOT_PATH}/${MODELS_PATH}/product-categories.model.js` ); const Model = require( `${ROOT_PATH}/${MODELS_PATH}/product-categories.model.js` );
const getProductCategoriesList = async(req, res) => { const getProductCategoriesList = async(req, res) => {
const { page , elements } = getPagination( req.query ); const { page , elements } = getPagination( req.query );
const retVal = await queryPage( page , elements, productCategoriesModel ); const retVal = await queryPage( page , elements, Model );
res.send( retVal );
};
const findProductCategoriesList = async(req, res) => {
let filter=null;
if( req.query.regex ){
const re = new RegExp( req.query.regex );
filter = { "name" : { $regex: re, $options: 'i' }};
}
const { page , elements } = getPagination( req.query );
const retVal = await queryPage( page, elements, Model, filter );
res.send( retVal ); res.send( retVal );
}; };
const getProductCategory = async(req, res) => { const getProductCategory = async(req, res) => {
const retVal = await productCategoriesModel.findById( req.params.id ); const retVal = await Model.findById( req.params.id );
res.send( retVal ); res.send( retVal );
}; };
module.exports = { getProductCategoriesList , getProductCategory }; module.exports = { getProductCategoriesList, findProductCategoriesList, getProductCategory };

View File

@@ -10,12 +10,13 @@ const users = require('./users/routes.js');
const countries = require('./countries/routes.js'); const countries = require('./countries/routes.js');
const cities = require('./cities/routes.js'); const cities = require('./cities/routes.js');
const productCategories = require('./product-categories/routes.js'); const productCategories = require('./product-categories/routes.js');
const states = require('./states/routes.js');
router.use("/test", test); router.use("/test", test);
router.use('/countries', countries); router.use('/countries', countries);
router.use('/cities', cities); router.use('/cities', cities);
router.use('/states', test);
router.use('/product-categories', productCategories); router.use('/product-categories', productCategories);
router.use('/states', states);
router.use( jwtValidator.middleware ); router.use( jwtValidator.middleware );

View File

@@ -0,0 +1,9 @@
'use strict';
const router = require('express').Router();
const services= require('./services.js');
router.get('/', services.getStatesList);
router.get('/find', services.findStatesList);
router.get('/:id', services.getState);
module.exports = router;

View File

@@ -0,0 +1,28 @@
"use strict";
const { ROOT_PATH, LIB_PATH, MODELS_PATH, HANDLERS_PATH } = process.env;
const { getPagination , queryPage } = require( `${ROOT_PATH}/${LIB_PATH}/Misc.js` );
const Model = require( `${ROOT_PATH}/${MODELS_PATH}/states.model.js` );
const getStatesList = async(req, res) => {
const { page , elements } = getPagination( req.query );
const retVal = await queryPage( page , elements, Model );
res.send( retVal );
};
const findStatesList = async(req, res) => {
let filter=null;
if( req.query.regex ){
const re = new RegExp( req.query.regex );
filter = { "state_name" : { $regex: re, $options: 'i' }};
}
const { page , elements } = getPagination( req.query );
const retVal = await queryPage( page, elements, Model, filter );
res.send( retVal );
};
const getState = async(req, res) => {
const retVal = await Model.findById( req.params.id );
res.send( retVal );
};
module.exports = { getStatesList, findStatesList, getState };