diff --git a/controllers/roles.controllers.js b/controllers/roles.controllers.js new file mode 100644 index 0000000..3f59d1b --- /dev/null +++ b/controllers/roles.controllers.js @@ -0,0 +1,173 @@ +const roleDb = require("../db/role.db"); +const { setResponse } = require("../helpers/utils"); + +module.exports = { + getAllRoles: async (req, res) => { + try { + const { search } = req.query; + const roles = await roleDb.getAllRolesDb(search || ''); + + return res.status(200).json(setResponse(roles, 'Roles retrieved successfully', 200)); + } catch (err) { + return res.status(err.statusCode || 500).json( + setResponse([], err.message || 'Failed to retrieve roles', err.statusCode || 500) + ); + } + }, + + getRolesById: async (req, res, next) => { + try { + const { id } = req.params; + + if (!id) { + return res.status(400).json(setResponse(null, "Role ID is required", 400)); + } + + const role = await roleDb.getRoleByIdDb(id); + + if (!role) { + return res.status(404).json(setResponse(null, "Role not found", 404)); + } + + return res.status(200).json(setResponse(role, "Role retrieved successfully", 200)); + } catch (err) { + next(err); + } + }, + + createRoles: async (req, res, next) => { + try { + let { role_name, role_description, role_level,} = req.body; + + if (!role_name || role_level === undefined || role_level === null) { + return res.status(400).json( + setResponse( + null, + "Please provide role_name and role_level", + 400 + ) + ); + } + + const level = parseInt(role_level); + if (isNaN(level)) { + return res.status(400).json( + setResponse( + null, + "role_level must be a number", + 400 + ) + ); + } + + const dataToCreate = { + role_name, + role_description, + role_level: level, + }; + + Object.keys(dataToCreate).forEach( + (key) => dataToCreate[key] === undefined && delete dataToCreate[key] + ); + + const insertedId = await roleDb.createRoleDb(dataToCreate); + + const newRole = insertedId + ? await roleDb.getRoleByIdDb(insertedId) + : { role_id: null, ...dataToCreate }; + + return res.status(201).json(setResponse(newRole, "Role has been created!", 201)); + } catch (err) { + next(err); + } + }, + + updateRoles: async (req, res, next) => { + try { + const { id } = req.params; + const { role_name, role_description, role_level } = req.body; + + if (!id) { + return res.status(400).json(setResponse(null, "Role ID is required", 400)); + } + + const dataToUpdate = {}; + if (role_name) dataToUpdate.role_name = role_name; + + if (Object.prototype.hasOwnProperty.call(req.body, "role_description")) { + dataToUpdate.role_description = role_description; + } + + if (role_level !== undefined && role_level !== null) { + const level = parseInt(role_level); + if (isNaN(level)) { + return res.status(400).json( + setResponse( + null, + "role_level must be a number", + 400 + ) + ); + } + dataToUpdate.role_level = level; + } + + if (Object.keys(dataToUpdate).length === 0) { + return res.status(400).json( + setResponse( + null, + "No valid data provided for update", + 400 + ) + ); + } + + const existingRole = await roleDb.getRoleByIdDb(id); + if (!existingRole) { + return res.status(404).json(setResponse(null, "Role not found", 404)); + } + + await roleDb.updateRoleDb(id, dataToUpdate); + + const updatedRole = await roleDb.getRoleByIdDb(id); + + return res.status(200).json( + setResponse( + updatedRole, + "Role has been updated successfully", + 200 + ) + ); + } catch (err) { + next(err); + } + }, + + deleteRoles: async (req, res, next) => { + try { + const { id } = req.params; + const deletedBy = req.user?.id || 1; + + if (!id) { + return res.status(400).json(setResponse(null, "Role ID is required", 400)); + } + + const existingRole = await roleDb.getRoleByIdDb(id); + if (!existingRole) { + return res.status(404).json(setResponse(null, "Role not found", 404)); + } + + await roleDb.deleteRoleDb(id, deletedBy); + + return res.status(200).json( + setResponse( + null, + "Role has been soft deleted successfully", + 200 + ) + ); + } catch (err) { + next(err); + } + }, +}; \ No newline at end of file diff --git a/db/role.db.js b/db/role.db.js index 2d72533..ccdfa2a 100644 --- a/db/role.db.js +++ b/db/role.db.js @@ -51,19 +51,23 @@ const getRoleByIdDb = async (id) => { // Create role const createRoleDb = async (data) => { + const roles = { ...data }; + const { query, values } = pool.buildDynamicInsert("m_roles", { - ...data, - created_at: new Date(), + ...roles, }); + const result = await pool.query(query, values); return result.recordset[0]?.inserted_id || null; }; + + // Update role const updateRoleDb = async (id, data) => { const { query, values } = pool.buildDynamicUpdate( "m_roles", - { ...data, updated_at: new Date() }, + { ...data }, { role_id: id } ); await pool.query(query, values); diff --git a/routes/index.js b/routes/index.js index f78ea07..5765b89 100644 --- a/routes/index.js +++ b/routes/index.js @@ -2,9 +2,11 @@ const router = require("express").Router(); const auth = require("./auth.route"); const users = require("./users.route"); const device = require('./device.route'); +const roles = require('./roles.route') router.use("/auth", auth); router.use("/user", users); router.use("/device", device); +router.use("/roles", roles); module.exports = router; diff --git a/routes/roles.route.js b/routes/roles.route.js new file mode 100644 index 0000000..743760a --- /dev/null +++ b/routes/roles.route.js @@ -0,0 +1,13 @@ +const express = require('express'); +const router = express.Router(); + +const { createRoles, getAllRoles, deleteRoles, updateRoles, getRolesById } = require("../controllers/roles.controllers"); + +router.post("/roles", createRoles); +router.get("/roles", getAllRoles); +router.get("/roles/:id", getRolesById) +router.delete("/roles/:id", deleteRoles); +router.put("/roles/:id", updateRoles); + + +module.exports = router; \ No newline at end of file