From ce3ec074ebe4fa35e5f6fbecc0105676576117a6 Mon Sep 17 00:00:00 2001 From: "Josepablo C." Date: Fri, 6 Oct 2023 00:23:36 -0600 Subject: [PATCH] feat: Adding states endpoint and regex find to current endpoints --- README.md | 29 ++++++++++++++++++++++++- lib/Misc.js | 4 ++-- sections/cities/routes.js | 1 + sections/cities/services.js | 19 ++++++++++++---- sections/countries/routes.js | 1 + sections/countries/services.js | 19 ++++++++++++---- sections/product-categories/routes.js | 1 + sections/product-categories/services.js | 19 ++++++++++++---- sections/sections.js | 3 ++- sections/states/routes.js | 9 ++++++++ sections/states/services.js | 28 ++++++++++++++++++++++++ 11 files changed, 117 insertions(+), 16 deletions(-) create mode 100644 sections/states/routes.js create mode 100644 sections/states/services.js diff --git a/README.md b/README.md index 50a3da4..5dd2c64 100644 --- a/README.md +++ b/README.md @@ -4,4 +4,31 @@ ETA Viaporte API # Dependencies - - NodeJS v18 \ No newline at end of file + - 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). diff --git a/lib/Misc.js b/lib/Misc.js index 29a191f..99d4954 100644 --- a/lib/Misc.js +++ b/lib/Misc.js @@ -25,10 +25,10 @@ function getPagination( query ){ return limit; } -async function queryPage( page , elements , model ){ +async function queryPage( page, elements, model, filter=null, projection=null){ const skip = elements * page; 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 { total : total, limit : elements, diff --git a/sections/cities/routes.js b/sections/cities/routes.js index d08b61c..c924483 100644 --- a/sections/cities/routes.js +++ b/sections/cities/routes.js @@ -3,6 +3,7 @@ const router = require('express').Router(); const services= require('./services.js'); router.get('/', services.getCitiesList); +router.get('/find', services.findCitiesList); router.get('/:id', services.getCity); module.exports = router; diff --git a/sections/cities/services.js b/sections/cities/services.js index 1566fdc..3f49ac6 100644 --- a/sections/cities/services.js +++ b/sections/cities/services.js @@ -1,17 +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 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 { 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 ); }; const getCity = async(req, res) => { - const retVal = await citiesModel.findById( req.params.id ); + const retVal = await Model.findById( req.params.id ); res.send( retVal ); }; -module.exports = { getCitiesList , getCity }; \ No newline at end of file +module.exports = { getCitiesList , findCitiesList , getCity }; diff --git a/sections/countries/routes.js b/sections/countries/routes.js index 1a2f08d..6e5c96a 100644 --- a/sections/countries/routes.js +++ b/sections/countries/routes.js @@ -3,6 +3,7 @@ const router = require('express').Router(); const services= require('./services.js'); router.get('/', services.getCountriesList); +router.get('/find', services.findCountriesList); router.get('/:id', services.getCountry); module.exports = router; diff --git a/sections/countries/services.js b/sections/countries/services.js index 3973074..bf17fee 100644 --- a/sections/countries/services.js +++ b/sections/countries/services.js @@ -1,17 +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 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 { 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 ); }; const getCountry = async(req, res) => { - const retVal = await countriesModel.findById( req.params.id ); + const retVal = await Model.findById( req.params.id ); res.send( retVal ); }; -module.exports = { getCountriesList , getCountry }; \ No newline at end of file +module.exports = { getCountriesList, findCountriesList, getCountry }; diff --git a/sections/product-categories/routes.js b/sections/product-categories/routes.js index c2ecfef..ba848db 100644 --- a/sections/product-categories/routes.js +++ b/sections/product-categories/routes.js @@ -3,6 +3,7 @@ const router = require('express').Router(); const services= require('./services.js'); router.get('/', services.getProductCategoriesList); +router.get('/find', services.findProductCategoriesList); router.get('/:id', services.getProductCategory ); module.exports = router; diff --git a/sections/product-categories/services.js b/sections/product-categories/services.js index 2bddcdc..5e1f7bc 100644 --- a/sections/product-categories/services.js +++ b/sections/product-categories/services.js @@ -1,17 +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 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 { 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 ); }; const getProductCategory = async(req, res) => { - const retVal = await productCategoriesModel.findById( req.params.id ); + const retVal = await Model.findById( req.params.id ); res.send( retVal ); }; -module.exports = { getProductCategoriesList , getProductCategory }; \ No newline at end of file +module.exports = { getProductCategoriesList, findProductCategoriesList, getProductCategory }; diff --git a/sections/sections.js b/sections/sections.js index 96316d0..f36f526 100644 --- a/sections/sections.js +++ b/sections/sections.js @@ -10,12 +10,13 @@ const users = require('./users/routes.js'); const countries = require('./countries/routes.js'); const cities = require('./cities/routes.js'); const productCategories = require('./product-categories/routes.js'); +const states = require('./states/routes.js'); router.use("/test", test); router.use('/countries', countries); router.use('/cities', cities); -router.use('/states', test); router.use('/product-categories', productCategories); +router.use('/states', states); router.use( jwtValidator.middleware ); diff --git a/sections/states/routes.js b/sections/states/routes.js new file mode 100644 index 0000000..99d6d87 --- /dev/null +++ b/sections/states/routes.js @@ -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; diff --git a/sections/states/services.js b/sections/states/services.js new file mode 100644 index 0000000..62ac46c --- /dev/null +++ b/sections/states/services.js @@ -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 };