add : CRUD roles

This commit is contained in:
Muhammad Afif
2025-10-09 13:22:41 +07:00
parent 5d27056906
commit c81e8ef22d
4 changed files with 195 additions and 3 deletions

View File

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

View File

@@ -51,19 +51,23 @@ const getRoleByIdDb = async (id) => {
// Create role // Create role
const createRoleDb = async (data) => { const createRoleDb = async (data) => {
const roles = { ...data };
const { query, values } = pool.buildDynamicInsert("m_roles", { const { query, values } = pool.buildDynamicInsert("m_roles", {
...data, ...roles,
created_at: new Date(),
}); });
const result = await pool.query(query, values); const result = await pool.query(query, values);
return result.recordset[0]?.inserted_id || null; return result.recordset[0]?.inserted_id || null;
}; };
// Update role // Update role
const updateRoleDb = async (id, data) => { const updateRoleDb = async (id, data) => {
const { query, values } = pool.buildDynamicUpdate( const { query, values } = pool.buildDynamicUpdate(
"m_roles", "m_roles",
{ ...data, updated_at: new Date() }, { ...data },
{ role_id: id } { role_id: id }
); );
await pool.query(query, values); await pool.query(query, values);

View File

@@ -2,9 +2,11 @@ const router = require("express").Router();
const auth = require("./auth.route"); const auth = require("./auth.route");
const users = require("./users.route"); const users = require("./users.route");
const device = require('./device.route'); const device = require('./device.route');
const roles = require('./roles.route')
router.use("/auth", auth); router.use("/auth", auth);
router.use("/user", users); router.use("/user", users);
router.use("/device", device); router.use("/device", device);
router.use("/roles", roles);
module.exports = router; module.exports = router;

13
routes/roles.route.js Normal file
View File

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