created http requests router

This commit is contained in:
Pau 2025-04-01 20:38:59 +02:00
parent c70e65e58c
commit 11b570336f
1 changed files with 263 additions and 0 deletions

263
src/routes/index.js Normal file
View File

@ -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;
}