/** * @fileoverview This file contains the route definitions for the user-related endpoints. */ import {Router} from 'express' import { getDeviceController, getDeviceByUuidController, postDeviceController, putDeviceController, deleteDeviceController, getDeviceswithMinimumStockController, getDeviceBySerialNumberController, getDeviceByModelController, getDeviceByBrandController } from '../controllers/resource_types/deviceController.js' import { getUserListController, getUserInfoController, postUserController, putUserController, softDeleteUserController } from '../controllers/authorization/userController.js' import { getRoleController, getRoleInfoController, postRoleController, putRoleController, deleteRoleController } from '../controllers/authorization/rolesController.js' import { getPermissionController, getPermissionByUuidController, postPermissionController, putPermissionController, softDeletePermissionController } from '../controllers/authorization/permissionsController.js' import { indexController } from '../controllers/indexController.js' import { postLoginController } from '../controllers/authorization/loginController.js' import { addLinks } from '../utils/links.js' import { linkRoutes } from '../index.js' import { sendCreatedResponse, sendLoginSuccessfullResponse, sendOkResponse, sendResponseNoContent, } from '../utils/responses.js' import { integer, uuid, varChar} from '../validators/expressValidator/customValidators.js' import {payloadExpressValidator} from '../validators/expressValidator/payloadExpressValidator.js' import { error422, errorHandler } from '../utils/errors.js' import { authorizePermission, setToken, authenticateToken} from '../middlewares/auth.js' /** * @function default * @param {Object} configuration based on environment * @returns {Router} all endpoint routes */ export default(config) => { /** * Express router to mount user related functions on. * @type {Object} * @const * @namespace deviceRouter */ const routes = Router() const hasAddLinks = config.environment !== 'production' /** * Gets message from data object result from index controller to check if server is up. * Ideally, if server is working correctly it should return message * @name get/ * @function * @inner * @memberof deviceRouter * @route GET / * @returns {Device} 200 - The data object with message * @returns {ErrorResponse} 404 - Data not found * @returns {ErrorResponse} 500 - Internal server error */ routes.get( '/', (req, res, next) => indexController(req, res, next, config), (result, req, res, next) => addLinks(result, req, res, next, hasAddLinks, linkRoutes), (result, req, res, _) => sendOkResponse(result, req, res) ) // User Routes routes.get( '/users', (req, res, next) => authenticateToken(req, res, next, config), (req, res, next) => authorizePermission('/users')(req, res, next, config), [ uuid('uuid').optional({ nullable: false, values: 'falsy' }), varChar('username').optional({ nullable: false, values: 'falsy' }), varChar('email').optional({ nullable: false, values: 'falsy' }) ], (req, res, next) => payloadExpressValidator(req, res, next, config), (req, res, next) => getUserListController(req, res, next, config), (result, req, res, next) => addLinks(result, req, res, next, hasAddLinks, linkRoutes), (result, req, res, _) => sendOkResponse(result, req, res) ); routes.get( '/users/:uuid', (req, res, next) => authenticateToken(req, res, next, config), (req, res, next) => authorizePermission('/users/:uuid')(req, res, next, config), [ uuid('uuid') ], (req, res, next) => payloadExpressValidator(req, res, next, config), (req, res, next) => getUserInfoController(req, res, next, config), (result, req, res, next) => addLinks(result, req, res, next, hasAddLinks, linkRoutes), (result, req, res, _) => sendOkResponse(result, req, res) ); routes.post( '/users', (req, res, next) => authenticateToken(req, res, next, config), (req, res, next) => authorizePermission('/users')(req, res, next, config), [ varChar('username'), varChar('password'), varChar('email').optional({ nullable: true, values: 'falsy' }), uuid('fk_role') ], (req, res, next) => payloadExpressValidator(req, res, next, config), (req, res, next) => postUserController(req, res, next, config), (result, req, res, next) => addLinks(result, req, res, next, hasAddLinks, linkRoutes), (result, req, res, _) => sendCreatedResponse(result, req, res) ); routes.put( '/users/:uuid', (req, res, next) => authenticateToken(req, res, next, config), (req, res, next) => authorizePermission('/users/:uuid')(req, res, next, config), [ uuid('uuid'), varChar('username').optional({ nullable: false, values: 'falsy' }), varChar('email').optional({ nullable: true, values: 'falsy' }), uuid('fk_role').optional({ nullable: false, values: 'falsy' }) ], (req, res, next) => payloadExpressValidator(req, res, next, config), (req, res, next) => putUserController(req, res, next, config), (result, req, res, next) => addLinks(result, req, res, next, hasAddLinks, linkRoutes), (result, req, res, _) => sendCreatedResponse(result, req, res) ); routes.put( '/users/:uuid', (req, res, next) => authenticateToken(req, res, next, config), (req, res, next) => authorizePermission('/users/:uuid')(req, res, next, config), [ uuid('uuid') ], (req, res, next) => payloadExpressValidator(req, res, next, config), (req, res, next) => softDeleteUserController(req, res, next, config), (result, req, res, next) => addLinks(result, req, res, next, hasAddLinks, linkRoutes), (result, req, res, _) => sendResponseNoContent(result, req, res) ); routes.get( '/roles', (req, res, next) => authenticateToken(req, res, next, config), (req, res, next) => payloadExpressValidator(req, res, next, config), (req, res, next) => getRoleController(req, res, next, config), (result, req, res, next) => addLinks(result, req, res, next, hasAddLinks, linkRoutes), (result, req, res, _) => sendOkResponse(result, req, res) ); routes.get( '/roles/:uuid', (req, res, next) => authenticateToken(req, res, next, config), [ uuid('uuid') ], (req, res, next) => payloadExpressValidator(req, res, next, config), (req, res, next) => getRoleInfoController(req, res, next, config), (result, req, res, next) => addLinks(result, req, res, next, hasAddLinks, linkRoutes), (result, req, res, _) => sendOkResponse(result, req, res) ); routes.post( '/roles', (req, res, next) => authenticateToken(req, res, next, config), [ varChar('name') ], (req, res, next) => payloadExpressValidator(req, res, next, config), (req, res, next) => postRoleController(req, res, next, config), (result, req, res, next) => addLinks(result, req, res, next, hasAddLinks, linkRoutes), (result, req, res, _) => sendCreatedResponse(result, req, res) ); routes.put( '/roles/:uuid', (req, res, next) => authenticateToken(req, res, next, config), [ uuid('uuid'), varChar('name').optional({ nullable: false, values: 'falsy' }) ], (req, res, next) => payloadExpressValidator(req, res, next, config), (req, res, next) => putRoleController(req, res, next, config), (result, req, res, next) => addLinks(result, req, res, next, hasAddLinks, linkRoutes), (result, req, res, _) => sendCreatedResponse(result, req, res) ); routes.delete( '/roles/:uuid', (req, res, next) => authenticateToken(req, res, next, config), [ uuid('uuid') ], (req, res, next) => payloadExpressValidator(req, res, next, config), (req, res, next) => deleteRoleController(req, res, next, config), (result, req, res, next) => addLinks(result, req, res, next, hasAddLinks, linkRoutes), (result, req, res, _) => sendResponseNoContent(result, req, res) ); routes.get( '/permissions', (req, res, next) => authenticateToken(req, res, next, config), (req, res, next) => payloadExpressValidator(req, res, next, config), (req, res, next) => getPermissionController(req, res, next, config), (result, req, res, next) => addLinks(result, req, res, next, hasAddLinks, linkRoutes), (result, req, res, _) => sendOkResponse(result, req, res) ); routes.get( '/permissions/:uuid', (req, res, next) => authenticateToken(req, res, next, config), [ uuid('uuid') ], (req, res, next) => payloadExpressValidator(req, res, next, config), (req, res, next) => getPermissionByUuidController(req, res, next, config), (result, req, res, next) => addLinks(result, req, res, next, hasAddLinks, linkRoutes), (result, req, res, _) => sendOkResponse(result, req, res) ); routes.post( '/permissions', (req, res, next) => authenticateToken(req, res, next, config), [ varChar('name') ], (req, res, next) => payloadExpressValidator(req, res, next, config), (req, res, next) => postPermissionController(req, res, next, config), (result, req, res, next) => addLinks(result, req, res, next, hasAddLinks, linkRoutes), (result, req, res, _) => sendCreatedResponse(result, req, res) ); routes.put( '/permissions/:uuid', (req, res, next) => authenticateToken(req, res, next, config), [ uuid('uuid') ], (req, res, next) => payloadExpressValidator(req, res, next, config), (req, res, next) => putPermissionController(req, res, next, config), (result, req, res, next) => addLinks(result, req, res, next, hasAddLinks, linkRoutes), (result, req, res, _) => sendCreatedResponse(result, req, res) ); routes.delete( '/permissions/:uuid', (req, res, next) => authenticateToken(req, res, next, config), (req, res, next) => authorizePermission('permissions')(req, res, next, config), [ uuid('uuid') ], (req, res, next) => payloadExpressValidator(req, res, next, config), (req, res, next) => softDeletePermissionController(req, res, next, config), (result, req, res, next) => addLinks(result, req, res, next, hasAddLinks, linkRoutes), (result, req, res, _) => sendResponseNoContent(result, req, res) ); // Login Endpoint routes.post( '/login', [ varChar('username'), varChar('password') ], (req, res, next) => payloadExpressValidator(req, res, next, config), (req, res, next) => postLoginController(req, res, next, config), (result, req, res, next) => setToken(result, req, res, next), (result, req, res, next) => addLinks(result, req, res, next, hasAddLinks, linkRoutes), (result, req, res, _) => sendLoginSuccessfullResponse(result, req, res) ); return routes; }