From 82483892694e0ee0b9b9c6e2e583d9f302e331c4 Mon Sep 17 00:00:00 2001 From: karol Date: Thu, 9 Jul 2026 16:57:18 +0000 Subject: [PATCH] =?UTF-8?q?Implementaci=C3=B3n=20m=C3=B3dulo=20permisos=20?= =?UTF-8?q?para=20roles?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/src/app.ts | 7 +- .../modules/permissions/permission.routes.ts | 4 +- .../rolePermission.controller.ts | 141 ++++++++++++++++++ .../rolePermission.interface.ts | 14 ++ .../role-permissions/rolePermission.model.ts | 41 +++++ .../role-permissions/rolePermission.router.ts | 21 +++ .../rolePermission.service.ts | 122 +++++++++++++++ 7 files changed, 348 insertions(+), 2 deletions(-) create mode 100644 backend/src/modules/role-permissions/rolePermission.controller.ts create mode 100644 backend/src/modules/role-permissions/rolePermission.interface.ts create mode 100644 backend/src/modules/role-permissions/rolePermission.model.ts create mode 100644 backend/src/modules/role-permissions/rolePermission.router.ts create mode 100644 backend/src/modules/role-permissions/rolePermission.service.ts diff --git a/backend/src/app.ts b/backend/src/app.ts index 0e2d980..c191a8b 100644 --- a/backend/src/app.ts +++ b/backend/src/app.ts @@ -16,7 +16,8 @@ import lpgRouter from "./modules/lpg/lpg.routes"; import anomalyRouter from "./modules/anomalies/anomaly.routes"; import pumpReadingRouter from "./modules/pump-reading/pumpReading.routes"; import dashboardRouter from "./modules/dashboard/dashboard.routes"; - +import permissionRouter from "./modules/permissions/permission.routes"; +import rolePermissionRoute from "./modules/role-permissions/rolePermission.router"; @@ -40,6 +41,10 @@ app.use("/api/lpg",lpgRouter); app.use("/api/anomaly", anomalyRouter); app.use("/api/pumpReading", pumpReadingRouter); app.use("/api/dashboard", dashboardRouter); +app.use("/api/permission", permissionRouter); +app.use("/api/rolePermission", rolePermissionRoute); +app.use("/api/permission", permissionRouter); +app.use("/api/rolePermission", rolePermissionRoute); app.use(express.urlencoded({ extended:true diff --git a/backend/src/modules/permissions/permission.routes.ts b/backend/src/modules/permissions/permission.routes.ts index a93a6ac..d46283a 100644 --- a/backend/src/modules/permissions/permission.routes.ts +++ b/backend/src/modules/permissions/permission.routes.ts @@ -18,4 +18,6 @@ permissionRouter.post("/", authMiddleware, controller.create); permissionRouter.put("/:id", authMiddleware, controller.update); -permissionRouter.delete("/:id", authMiddleware, controller.delete); \ No newline at end of file +permissionRouter.delete("/:id", authMiddleware, controller.delete); + +export default permissionRouter; \ No newline at end of file diff --git a/backend/src/modules/role-permissions/rolePermission.controller.ts b/backend/src/modules/role-permissions/rolePermission.controller.ts new file mode 100644 index 0000000..c9e6235 --- /dev/null +++ b/backend/src/modules/role-permissions/rolePermission.controller.ts @@ -0,0 +1,141 @@ +import { Request, Response } from "express"; +import { RolePermissionService } from "./rolePermission.service"; + +const service = new RolePermissionService(); + +export class RolePermissionController{ + + async getAll( + req:Request, + res:Response + ){ + try{ + + const rolePermissions = await service.getAll(); + res.json(rolePermissions); + + } catch (error){ + res.status(500).json({ + message:"Error al obtener configuación de permisos", + error + }); + } + } + + async getById( + req:Request, + res:Response + ){ + try{ + + const rolePermission = await service.getById( + req.params.id as string + ); + + if(!rolePermission){ + return res.status(404).json({ + message:"Configuración de permisos no encontrada" + }); + } + res.json(rolePermission); + } catch(error){ + res.status(500).json({ + message:"Error al obtener configuración de permiso" + }); + } + } + + async getByRole( + req:Request, + res:Response + ){ + try{ + + const rolePermission = await service.getByRole( + req.params.roleId as string + ); + + if(!rolePermission){ + return res.status(404).json({ + message:"El rol no tiene permisos asignados" + }); + } + res.json(rolePermission); + } catch(error){ + res.status(500).json({ + message:"Error al obtener permisos del rol" + }); + } + } + + async create( + req:Request, + res:Response + ){ + try{ + const rolePemission = await service.create( + req.body + ); + + res.status(201).json(rolePemission); + + }catch(error){ + res.status(500).json({ + message:"Error al crear configuración de permiso" + }); + } + } + + async update( + req:Request, + res:Response + ){ + try{ + + const rolePermission = await service.update( + req.params.id as string, + req.body + ) + + if (!rolePermission) { + return res.status(404).json({ + message: + "Configuración de permiso no encontrada" + }); + } + } catch(error){ + res.status(500).json({ + message:"Error al actualizar configuración de permiso" + }); + } + } + + async delete( + req:Request, + res:Response + ){ + try{ + + const rolePermission = await service.delete( + req.params.id as string + ); + + if(!rolePermission){ + return res.status(404).json({ + message: + "Configuración de permiso no encontrada" + }); + } + res.json({ + message:"Configuración de permiso eliminada correctamente" + }); + + }catch(error){ + res.status(500).json({ + message:"Error al eliminar configuración de vehículo" + + }) + + } + } +} \ No newline at end of file diff --git a/backend/src/modules/role-permissions/rolePermission.interface.ts b/backend/src/modules/role-permissions/rolePermission.interface.ts new file mode 100644 index 0000000..b653583 --- /dev/null +++ b/backend/src/modules/role-permissions/rolePermission.interface.ts @@ -0,0 +1,14 @@ +import { Types } from "mongoose"; + +export interface IRolePermission{ + + roleId:Types.ObjectId; + + permissions: Types.ObjectId[]; + + active: boolean; + + createdBy: Types.ObjectId; + + updateBy: Types.ObjectId; +} \ No newline at end of file diff --git a/backend/src/modules/role-permissions/rolePermission.model.ts b/backend/src/modules/role-permissions/rolePermission.model.ts new file mode 100644 index 0000000..c0d5c76 --- /dev/null +++ b/backend/src/modules/role-permissions/rolePermission.model.ts @@ -0,0 +1,41 @@ +import mongoose from "mongoose"; +import { IRolePermission } from "./rolePermission.interface"; + +const rolePermissionSchema = new mongoose.Schema({ + + roleId:{ + type: mongoose.Schema.Types.ObjectId, + ref:"Role", + required:true, + unique:true, + }, + + permissions:{ + type: mongoose.Schema.Types.ObjectId, + ref:"Permission", + required:true + }, + + active:{ + type:Boolean, + default:true + }, + + createdBy:{ + type: mongoose.Schema.Types.ObjectId, + ref:"User", + required:true + }, + + updateBy:{ + type: mongoose.Schema.Types.ObjectId, + ref:"User", + } +}, + { + timestamps:true, + versionKey:false + } +); + +export default mongoose.model("RolePermission", rolePermissionSchema); \ No newline at end of file diff --git a/backend/src/modules/role-permissions/rolePermission.router.ts b/backend/src/modules/role-permissions/rolePermission.router.ts new file mode 100644 index 0000000..a7e477d --- /dev/null +++ b/backend/src/modules/role-permissions/rolePermission.router.ts @@ -0,0 +1,21 @@ +import { Router } from "express"; +import { RolePermissionController } from "./rolePermission.controller"; +import { authMiddleware } from "../auth/auth.middleware"; + +const rolePermissionRoute = Router(); + +const controller = new RolePermissionController(); + +rolePermissionRoute.get("/", authMiddleware, controller.getAll); + +rolePermissionRoute.get("/role/:roleId", authMiddleware, controller.getByRole); + +rolePermissionRoute.get("/:id", authMiddleware, controller.getById); + +rolePermissionRoute.post("/", authMiddleware, controller.create); + +rolePermissionRoute.put("/:id", authMiddleware, controller.update); + +rolePermissionRoute.delete("/:id", authMiddleware, controller.delete); + +export default rolePermissionRoute; \ No newline at end of file diff --git a/backend/src/modules/role-permissions/rolePermission.service.ts b/backend/src/modules/role-permissions/rolePermission.service.ts new file mode 100644 index 0000000..e883b1e --- /dev/null +++ b/backend/src/modules/role-permissions/rolePermission.service.ts @@ -0,0 +1,122 @@ +import rolePermissionModel from "./rolePermission.model"; +import { IRolePermission } from "./rolePermission.interface"; + +export class RolePermissionService { + + + async getAll() { + + return await rolePermissionModel + .find() + .populate("roleId") + .populate("permissions") + .populate("createdBy", "userName") + .populate("updatedBy", "userName"); + + } + + async getById( + id: string + ) { + + return await rolePermissionModel + .findById(id) + .populate("roleId") + .populate("permissions") + .populate("createdBy", "userName") + .populate("updatedBy", "userName"); + + } + + async getByRole( + roleId: string + ) { + + return await rolePermissionModel + .findOne({ + + roleId, + + active: true + + }) + .populate("roleId") + .populate("permissions") + .populate("createdBy", "userName") + .populate("updatedBy", "userName"); + + } + + async getPermissionByRole( + roleId:string + ){ + + const rolePermission = await rolePermissionModel.findOne({ + + roleId, + + active:true + }) + .populate("permissions"); + + if(!rolePermission){ + return[]; + } + + return rolePermission.permissions; + } + + async create( + data: IRolePermission + ) { + + const exists = await rolePermissionModel.findOne({ + + roleId: data.roleId + + }); + + if (exists) { + + throw new Error("Este rol ya tiene permisos asignados."); + } + + return await rolePermissionModel.create( + data + ); + + } + + + async update( + id: string, + data: Partial + ) { + + return await rolePermissionModel.findByIdAndUpdate( + id, + data, + { + new: true + } + + ) + .populate("roleId") + .populate("permissions") + .populate("createdBy", "userName") + .populate("updatedBy", "userName"); + + } + + + async delete( + id: string + ) { + + return await rolePermissionModel.findByIdAndDelete( + id + ); + + } + +} \ No newline at end of file