diff --git a/modules/users/controllers/admin.controller.js b/modules/users/controllers/admin.controller.js index 0c709b076..ad0db2739 100644 --- a/modules/users/controllers/admin.controller.js +++ b/modules/users/controllers/admin.controller.js @@ -60,6 +60,20 @@ exports.delete = async (req, res) => { } }; +/** + * @desc Endpoint to get stats of users and return data + * @param {Object} req - Express request object + * @param {Object} res - Express response object + */ +exports.stats = async (req, res) => { + const data = await UserService.stats(); + if (!data.err) { + responses.success(res, 'users stats')(data); + } else { + responses.error(res, 422, 'Unprocessable Entity', errors.getMessage(data.err))(data.err); + } +}; + /** * @desc MiddleWare to ask the service the user for this id * @param {Object} req - Express request object diff --git a/modules/users/policies/users.policy.js b/modules/users/policies/users.policy.js index 13b27f14b..d2061cd67 100644 --- a/modules/users/policies/users.policy.js +++ b/modules/users/policies/users.policy.js @@ -42,6 +42,11 @@ exports.invokeRolesPolicies = () => { resources: '/api/users/:userId', permissions: ['get', 'put', 'delete'], }], - }, - ]); + }, { + roles: ['guest'], + allows: [{ + resources: '/api/users/stats', + permissions: ['get'], + }], + }]); }; diff --git a/modules/users/repositories/user.repository.js b/modules/users/repositories/user.repository.js index eca1e960d..9ab5ea107 100644 --- a/modules/users/repositories/user.repository.js +++ b/modules/users/repositories/user.repository.js @@ -54,6 +54,12 @@ exports.delete = async (user) => { return null; }; +/** + * @desc Function to get collection stats + * @return {Object} scrap + */ +exports.stats = () => User.countDocuments(); + /** * @desc Function to import list of users in db * @param {[Object]} users diff --git a/modules/users/routes/admin.routes.js b/modules/users/routes/admin.routes.js index 56db21e2b..a910b81f6 100644 --- a/modules/users/routes/admin.routes.js +++ b/modules/users/routes/admin.routes.js @@ -11,6 +11,10 @@ module.exports = (app) => { /* eslint global-require: 0 */ require('./users.routes.js')(app); + // stats + app.route('/api/users/stats').all(policy.isAllowed) + .get(admin.stats); + // Users collection routes app.route('/api/users') .get(passport.authenticate('jwt'), policy.isAllowed, admin.list); // list diff --git a/modules/users/services/user.service.js b/modules/users/services/user.service.js index c962d5b6e..40cbd6d65 100644 --- a/modules/users/services/user.service.js +++ b/modules/users/services/user.service.js @@ -114,6 +114,15 @@ exports.delete = async (user) => { return Promise.resolve(result); }; +/** + * @desc Function to get all stats of db + * @return {Promise} All stats + */ +exports.stats = async () => { + const result = await UserRepository.stats(); + return Promise.resolve(result); +}; + /** * @desc Function to authenticate user) * @param {String} email