diff --git a/src/routes/index.js b/src/routes/index.js new file mode 100644 index 0000000..8f766d4 --- /dev/null +++ b/src/routes/index.js @@ -0,0 +1,263 @@ +/** + * @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; +} \ No newline at end of file