diff --git a/README.md b/README.md index 2fd3018..e08a8e4 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ Read registered resources: - `GET /meta-data`: List registered meta-data. - `GET /meta-groups`: List registered meta-data. - `GET /product-categories`: List registered product-categories. - - `GET /public-companies`: List registered companies. + - `GET /public-companies`: List registered companies. Pagination limited to 100 elements and page 0. - `GET /public-loads`: List registered loads. - `GET /public-load-attachments/download/:id`: Downloads the attachment of the load identified by Id. - `GET /public-vehicles`: List registered vehicles. @@ -291,7 +291,7 @@ Work In Progress ### /companies -Work In Progress +Same as public-companies but with full pagination. ### /dashboard diff --git a/src/apps/index.js b/src/apps/index.js index 0bcd457..d0836c2 100644 --- a/src/apps/index.js +++ b/src/apps/index.js @@ -1,10 +1,10 @@ -const express = require('express'); -const app = express(); - -const private = require('./private'); -const public = require('./public'); - -app.use( public ); -app.use( private ); - -module.exports = app; +const express = require('express'); +const app = express(); + +const private = require('./private'); +const public = require('./public'); + +app.use( public ); +app.use( private ); + +module.exports = app; diff --git a/src/apps/private/companies/routes.js b/src/apps/private/companies/routes.js index 546c84b..bf695f0 100644 --- a/src/apps/private/companies/routes.js +++ b/src/apps/private/companies/routes.js @@ -4,13 +4,12 @@ const services= require('./services.js'); router.get('/own', services.getOwnCompany); -router.post('/own', services.postOwnCompany); router.patch('/own', services.patchOwnCompany); -router.get('/:id', services.getCompanyById); - router.get('/shipper', services.getListShippers); router.get('/carrier', services.getListCarriers); + router.get('/users/:companyId', services.getUserLists); +router.get('/:id', services.getCompanyById); module.exports = router; diff --git a/src/apps/private/companies/services.js b/src/apps/private/companies/services.js index eee8db1..9563ed5 100644 --- a/src/apps/private/companies/services.js +++ b/src/apps/private/companies/services.js @@ -1,44 +1,219 @@ "use strict"; -const { ROOT_PATH, MODELS_PATH } = process.env; +const { ROOT_PATH, MODELS_PATH, HANDLERS_PATH, LIB_PATH } = process.env; const { getModel } = require( `${ROOT_PATH}/${MODELS_PATH}` ); +const { GenericHandler } = require( `${ROOT_PATH}/${HANDLERS_PATH}/Generic.handler.js` ); +const { getPagination } = require( `${ROOT_PATH}/${LIB_PATH}/Misc.js` ); + const usersModel = getModel('users'); -// const companiesModel = getModel('companies'); -// const branchesModel = getModel('branches'); -// const vehiclesModel = getModel('vehicles'); -// const loadsModel = getModel('loads'); -// const productCategoriesModel = getModel('product_categories'); +const companiesModel = getModel('companies'); +const branchesModel = getModel('branches'); +const vehiclesModel = getModel('vehicles'); +const loadsModel = getModel('loads'); +const productCategoriesModel = getModel('product_categories'); -async function getOwnCompany( req , res ) { +const populate_select = { + categories:"-_id name", +}; +const generic = new GenericHandler( companiesModel, null, null , populate_select ); +const user_generic = new GenericHandler( usersModel ); +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 postOwnCompany( req , res ) { +function getAndFilterList( query ){ + const filter_list = []; + const { company_type, company_name, truck_type, categories, company_state, company_city } = query; + if( company_name ){ filter_list.push( { company_name } ); } + if( company_type ){ filter_list.push( { company_type } ); } + if( company_state ){ filter_list.push( { company_state } ); } + if( company_city ){ filter_list.push( { company_city } ); } + if( truck_type ){ filter_list.push( { truck_type } ); } + if( categories ){ filter_list.push( { categories } ); } + + if( filter_list.length == 0 ){ + return null; + } + return filter_list; +} + +async function getListByType( type , req ){ + const filter = { "company_type" : type , "is_hidden" : false }; + const select = [ + "rfc", + "company_name", + "company_type", + "company_code", + "company_city", + "company_state", + "createdAt", + "membership", + "categories", + "truck_type", + "company_description" + ]; + const { elements , page } = getPagination( req.query ); + let query_elements; + if( elements >= 100 ){ + query_elements = 100;// Never return more than 100 elements + }else{ + query_elements = elements; + } + + const andFilterList = getAndFilterList( req.query ); + + if( andFilterList ){ + filter.$and = andFilterList; + } + + const queryVal = await generic.getList(page , query_elements, filter, select ); + const data_list = queryVal.data; + for(let i=0; i 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; +} + +async function getOwnCompany( req , res ) { + try{ + const companyId = req.context.companyId; + const result = await companiesModel.findById( companyId ); + return res.send( result ); + }catch( error ){ + console.error( error ); + return res.status( 500 ).send({ error }); + } } async function patchOwnCompany( req , res ) { - + try{ + const companyId = req.context.companyId; + const data = req.body; + if( data.company_type ){ delete data.company_type; } + const company = await companiesModel.findByIdAndUpdate( companyId , data ); + const result = await companiesModel.findById( companyId ); + return res.send( result ); + }catch( error ){ + console.error( error ); + return res.status( 500 ).send({ error }); + } } async function getCompanyById( req , res ) { - + try{ + const companyId = req.params.id; + const result = await companiesModel.findById( companyId ); + return res.send( result ); + }catch( error ){ + console.error( error ); + return res.status( 500 ).send({ error }); + } } async function getListShippers( req , res ) { - + try{ + const retVal = await getListByType( "Shipper" , req ); + res.send( retVal ); + }catch( error ){ + console.error( error ); + return res.status( 500 ).send({ error }); + } } async function getListCarriers( req , res ) { - + try{ + const retVal = await getListByType( "Carrier" , req ); + res.send( retVal ); + }catch( error ){ + console.error( error ); + return res.status( 500 ).send({ error }); + } } -async function getUserLists( req , res ) { +const getUserLists = async(req, res) => { + try{ + const companyId = req.params.companyId; -} + const { elements, page } = getPagination( req.query ); + let query_elements; + if( elements >= 100 ){ + query_elements = 100;// Never return more than 100 elements + }else{ + query_elements = elements; + } + + const select = [ + "first_name", + "middle_name", + "last_name", + "company", + "employe_id", + "phone", + "phone2", + "email", + "categories", + "user_city", + "user_state", + "truck_type" + ]; + const queryVal = await user_generic.getList(page , query_elements, { company : companyId }, select ); + const data_list = queryVal.data; + for(let i=0; i c.name); + + /** Remove not requried fields */ + delete data_list[i].categories; + delete data_list[i].user_city; + delete data_list[i].user_state; + delete data_list[i].truck_type; + } + const retVal = { + total : queryVal.total, + limit : queryVal.limit, + skip : queryVal.skip, + data : data_list + }; + return res.status(200).send( retVal ); + } catch ( err ){ + console.error( err ); + return res.status(500).send({ error : "Public-Companies: Internal error" }); + } +}; module.exports = { getOwnCompany, - postOwnCompany, patchOwnCompany, getCompanyById, getListShippers, diff --git a/src/apps/private/users/services.js b/src/apps/private/users/services.js index 09450f7..966e606 100644 --- a/src/apps/private/users/services.js +++ b/src/apps/private/users/services.js @@ -77,6 +77,9 @@ function job_role_change_allowance( change_author_job_role , affected_job_role ) const patchTeamMemberProfileData = async(req, res) => { try{ const id = req.params.id; + if( id === req.context.userId ){ + return await patchProfileData( req, res); + } const companyId = req.context.companyId; if( !companyId ){ return res.status(400).send( { error : "Not authorized to modify this user" } ); diff --git a/src/apps/public/public-companies/services.js b/src/apps/public/public-companies/services.js index 40e4156..a9d5455 100644 --- a/src/apps/public/public-companies/services.js +++ b/src/apps/public/public-companies/services.js @@ -13,7 +13,7 @@ const populate_select = { categories:"-_id name", }; const generic = new GenericHandler( Model, null, null , populate_select ); - + const user_generic = new GenericHandler( usersModel ); function join_field_list( obj_with_fields , list_of_fields ) diff --git a/src/lib/Handlers/Account/index.js b/src/lib/Handlers/Account/index.js index 2b77df0..862acca 100644 --- a/src/lib/Handlers/Account/index.js +++ b/src/lib/Handlers/Account/index.js @@ -14,7 +14,8 @@ async function create_account( email, password ){ email, password : safe_password, job_role : 'owner',//Always a new user created from signup is owner - isVerified : false//Allows old API to recover password + isVerified : true, + has_password : true }); await user.save(); } @@ -22,7 +23,9 @@ async function create_account( email, password ){ async function reset_password( email, password ){ let safe_password = toSha256( password + pwd_secret ); const user = await UserModel.findOne({ email }); - user.password = safe_password, + user.password = safe_password; + user.isVerified = true; + user.has_password = true; await user.save(); return user; } diff --git a/src/lib/Handlers/Users.handler.js b/src/lib/Handlers/Users.handler.js index 26ac055..16ed6fb 100644 --- a/src/lib/Handlers/Users.handler.js +++ b/src/lib/Handlers/Users.handler.js @@ -14,7 +14,6 @@ async function getUserById( id , filter ){ if( filter ){ filter._id = id; const user = await usersModel.findOne( filter , { password : 0 , session_token : 0 , session_token_exp : 0 } ); - console.log( filter , user ); return user; }else{ return await usersModel.findById( id , { password : 0 , session_token : 0 , session_token_exp : 0 } ); @@ -148,6 +147,7 @@ async function createUserWithinCompany( companyId , data ){ }else{ throw "email is required"; } + data.isVerified = false; const user = new usersModel( data ); await user.save(); return user; @@ -165,6 +165,7 @@ async function deleteUserWithinCompany( manager_id , user_to_remove_id ){ if( !user ){ throw "User is invalid"; } user.is_deleted = true; + user.isVerified = false; user.email = user.id; user.password = null; user.deleted_at = new Date();