From 90497deebfbd971a0eccbb648dcc54e60f6bc6b8 Mon Sep 17 00:00:00 2001 From: root Date: Wed, 29 Apr 2026 06:14:06 +0200 Subject: [PATCH] rbac crud api --- src/routes/adminRoutes.js | 205 +++++++++++++- src/services/rbacManager.js | 513 +++++++++++------------------------- 2 files changed, 349 insertions(+), 369 deletions(-) diff --git a/src/routes/adminRoutes.js b/src/routes/adminRoutes.js index d20ecdc..41e519f 100644 --- a/src/routes/adminRoutes.js +++ b/src/routes/adminRoutes.js @@ -76,15 +76,204 @@ module.exports = { }); - app.post('/api/rbac/getEntities', async (req, res) => { - // res.status(200).json(await service.get('rbacManager').getEntities()); - }) - app.post('/api/rbac/auths/create', async (req, res) => { - const { auths } = req.body; - // await service.get('rbacManager').createAuths(auths); - res.status(200).json({ ok: true }); - }) + // ========================================================= + // 👤 AUTH + // ========================================================= + + app.post('/api/rbac/auth/create', async (req, res) => { + try { + const user = await rbac.createAuth(req.body); + res.json(user); + } catch (err) { + res.status(500).json({ error: err.message }); + } + }); + + app.put('/api/rbac/auth/:id', async (req, res) => { + try { + await rbac.updateAuth(req.params.id, req.body); + res.json({ ok: true }); + } catch (err) { + res.status(500).json({ error: err.message }); + } + }); + + app.delete('/api/rbac/auth/:id', async (req, res) => { + try { + await rbac.deleteAuth(req.params.id); + res.json({ ok: true }); + } catch (err) { + res.status(500).json({ error: err.message }); + } + }); + + // ========================================================= + // 👥 GROUPS + // ========================================================= + + app.post('/api/rbac/group/create', async (req, res) => { + try { + const group = await rbac.createGroup(req.body); + res.json(group); + } catch (err) { + res.status(500).json({ error: err.message }); + } + }); + + app.put('/api/rbac/group/:id', async (req, res) => { + try { + await rbac.updateGroup(req.params.id, req.body); + res.json({ ok: true }); + } catch (err) { + res.status(500).json({ error: err.message }); + } + }); + + app.delete('/api/rbac/group/:id', async (req, res) => { + try { + await rbac.deleteGroup(req.params.id); + res.json({ ok: true }); + } catch (err) { + res.status(500).json({ error: err.message }); + } + }); + + // ========================================================= + // 🔗 USER ↔ GROUP + // ========================================================= + + app.post('/api/rbac/group/add-user', async (req, res) => { + try { + const { authId, groupId } = req.body; + await rbac.addUserToGroup(authId, groupId); + res.json({ ok: true }); + } catch (err) { + res.status(500).json({ error: err.message }); + } + }); + + app.post('/api/rbac/group/remove-user', async (req, res) => { + try { + const { authId, groupId } = req.body; + await rbac.removeUserFromGroup(authId, groupId); + res.json({ ok: true }); + } catch (err) { + res.status(500).json({ error: err.message }); + } + }); + + // ========================================================= + // 🎭 ROLES + // ========================================================= + + app.post('/api/rbac/role/get', async (req, res) => { + try { + const role = await rbac.createRole(req.body); + res.json(role); + } catch (err) { + res.status(500).json({ error: err.message }); + } + }); + + app.put('/api/rbac/role/:id', async (req, res) => { + try { + await rbac.updateRole(req.params.id, req.body); + res.json({ ok: true }); + } catch (err) { + res.status(500).json({ error: err.message }); + } + }); + + app.delete('/api/rbac/role/:id', async (req, res) => { + try { + await rbac.deleteRole(req.params.id); + res.json({ ok: true }); + } catch (err) { + res.status(500).json({ error: err.message }); + } + }); + + // ========================================================= + // 🔗 ROLE ASSIGNMENTS + // ========================================================= + + app.post('/api/rbac/role/assign-user', async (req, res) => { + try { + const { authId, roleId } = req.body; + await rbac.assignRoleToUser(authId, roleId); + res.json({ ok: true }); + } catch (err) { + res.status(500).json({ error: err.message }); + } + }); + + app.post('/api/rbac/role/assign-group', async (req, res) => { + try { + const { groupId, roleId } = req.body; + await rbac.assignRoleToGroup(groupId, roleId); + res.json({ ok: true }); + } catch (err) { + res.status(500).json({ error: err.message }); + } + }); + + // ========================================================= + // 🔐 PERMISSIONS + // ========================================================= + + app.post('/permission', async (req, res) => { + try { + const perm = await rbac.createPermission(req.body); + res.json(perm); + } catch (err) { + res.status(500).json({ error: err.message }); + } + }); + + app.put('/permission/:id', async (req, res) => { + try { + await rbac.updatePermission(req.params.id, req.body); + res.json({ ok: true }); + } catch (err) { + res.status(500).json({ error: err.message }); + } + }); + + app.delete('/permission/:id', async (req, res) => { + try { + await rbac.deletePermission(req.params.id); + res.json({ ok: true }); + } catch (err) { + res.status(500).json({ error: err.message }); + } + }); + + // ========================================================= + // 🔗 ROLE ↔ PERMISSION + // ========================================================= + + app.post('/api/rbac/role/add-permission', async (req, res) => { + try { + const { roleId, permissionId } = req.body; + await rbac.addPermissionToRole(roleId, permissionId); + res.json({ ok: true }); + } catch (err) { + res.status(500).json({ error: err.message }); + } + }); + + app.post('/api/rbac/role/remove-permission', async (req, res) => { + try { + const { roleId, permissionId } = req.body; + await rbac.removePermissionFromRole(roleId, permissionId); + res.json({ ok: true }); + } catch (err) { + res.status(500).json({ error: err.message }); + } + }); + + app.post('/api/plugins/activation', async (req, res) => { const { name, state } = req.body; diff --git a/src/services/rbacManager.js b/src/services/rbacManager.js index 4fcdf3b..9277f3c 100644 --- a/src/services/rbacManager.js +++ b/src/services/rbacManager.js @@ -237,416 +237,207 @@ class RBACManager { //#region CRUD -// ========================================================= -// 👤 AUTH CRUD -// ========================================================= + // ========================================================= + // 👤 AUTH CRUD + // ========================================================= -async createAuth(data) { - const Auth = this.db.get('authentication'); + async createAuth(data) { + const Auth = this.db.get('authentication'); - return await Auth.create({ - sAMAccountName: data.sAMAccountName, - mail: data.mail, - sn: data.sn, - givenName: data.givenName, - active: true - }); -} + return await Auth.create({ + sAMAccountName: data.sAMAccountName, + mail: data.mail, + sn: data.sn, + givenName: data.givenName, + active: true + }); + } -async updateAuth(id, data) { - const Auth = this.db.get('authentication'); + async updateAuth(id, data) { + const Auth = this.db.get('authentication'); - return await Auth.update(data, { - where: { ObjectGUID: id } - }); -} + return await Auth.update(data, { + where: { ObjectGUID: id } + }); + } -async deleteAuth(id) { - const Auth = this.db.get('authentication'); + async deleteAuth(id) { + const Auth = this.db.get('authentication'); - return await Auth.destroy({ - where: { ObjectGUID: id } - }); -} + return await Auth.destroy({ + where: { ObjectGUID: id } + }); + } -// ========================================================= -// 👥 GROUP CRUD -// ========================================================= + // ========================================================= + // 👥 GROUP CRUD + // ========================================================= -async createGroup(data) { - const Group = this.db.get('groupsModel'); + async createGroup(data) { + const Group = this.db.get('groupsModel'); - return await Group.create({ - Name: data.name, - Description: data.description || null - }); -} + return await Group.create({ + Name: data.name, + Description: data.description || null + }); + } -async updateGroup(id, data) { - const Group = this.db.get('groupsModel'); + async updateGroup(id, data) { + const Group = this.db.get('groupsModel'); - return await Group.update(data, { - where: { ObjectGUID: id } - }); -} + return await Group.update(data, { + where: { ObjectGUID: id } + }); + } -async deleteGroup(id) { - const Group = this.db.get('groupsModel'); + async deleteGroup(id) { + const Group = this.db.get('groupsModel'); - return await Group.destroy({ - where: { ObjectGUID: id } - }); -} + return await Group.destroy({ + where: { ObjectGUID: id } + }); + } -// ========================================================= -// 🔗 AUTH ↔ GROUP RELATION -// ========================================================= + // ========================================================= + // 🔗 AUTH ↔ GROUP RELATION + // ========================================================= -async addUserToGroup(authId, groupId) { - const AuthGroups = this.db.get('authenticationGroupsModel'); + async addUserToGroup(authId, groupId) { + const AuthGroups = this.db.get('authenticationGroupsModel'); - return await AuthGroups.create({ - Authentication_ObjectGUID: authId, - Group_ObjectGUID: groupId - }); -} - -async removeUserFromGroup(authId, groupId) { - const AuthGroups = this.db.get('authenticationGroupsModel'); - - return await AuthGroups.destroy({ - where: { + return await AuthGroups.create({ Authentication_ObjectGUID: authId, Group_ObjectGUID: groupId - } - }); -} + }); + } -// ========================================================= -// 🎭 ROLE CRUD -// ========================================================= + async removeUserFromGroup(authId, groupId) { + const AuthGroups = this.db.get('authenticationGroupsModel'); -async createRole(data) { - const Role = this.db.get('rolesModel'); - - return await Role.create({ - Name: data.name, - Description: data.description || null - }); -} - -async updateRole(id, data) { - const Role = this.db.get('rolesModel'); - - return await Role.update(data, { - where: { ID: id } - }); -} - -async deleteRole(id) { - const Role = this.db.get('rolesModel'); - - return await Role.destroy({ - where: { ID: id } - }); -} - -// ========================================================= -// 🔗 ROLE ASSIGNMENTS -// ========================================================= - -async assignRoleToUser(authId, roleId) { - const AuthRoles = this.db.get('authenticationRolesModel'); - - return await AuthRoles.create({ - Authentication_ObjectGUID: authId, - Role_ID: roleId - }); -} - -async assignRoleToGroup(groupId, roleId) { - const GroupRoles = this.db.get('groupRolesModel'); - - return await GroupRoles.create({ - Group_ObjectGUID: groupId, - Role_ID: roleId - }); -} - -async removeRoleFromUser(authId, roleId) { - const AuthRoles = this.db.get('authenticationRolesModel'); - - return await AuthRoles.destroy({ - where: { - Authentication_ObjectGUID: authId, - Role_ID: roleId - } - }); -} - -// ========================================================= -// 🔐 PERMISSION CRUD -// ========================================================= - -async createPermission(data) { - const Permission = this.db.get('permissionModel'); - - return await Permission.create({ - Scope: data.scope, - Resource: data.resource, - Action: data.action - }); -} - -async updatePermission(id, data) { - const Permission = this.db.get('permissionModel'); - - return await Permission.update(data, { - where: { ID: id } - }); -} - -async deletePermission(id) { - const Permission = this.db.get('permissionModel'); - - return await Permission.destroy({ - where: { ID: id } - }); -} - -// ========================================================= -// 🔗 ROLE ↔ PERMISSION -// ========================================================= - -async addPermissionToRole(roleId, permissionId) { - const RolePerms = this.db.get('rolePermissionsModel'); - - return await RolePerms.create({ - Role_ID: roleId, - Permission_ID: permissionId - }); -} - -async removePermissionFromRole(roleId, permissionId) { - const RolePerms = this.db.get('rolePermissionsModel'); - - return await RolePerms.destroy({ - where: { - Role_ID: roleId, - Permission_ID: permissionId - } - }); -} - //#endregion - - - - - const express = require('express'); - -function rbacRoutes(rbac) { - const router = express.Router(); + return await AuthGroups.destroy({ + where: { + Authentication_ObjectGUID: authId, + Group_ObjectGUID: groupId + } + }); + } // ========================================================= - // 👤 AUTH + // 🎭 ROLE CRUD // ========================================================= - router.post('/auth/create', async (req, res) => { - try { - const user = await rbac.createAuth(req.body); - res.json(user); - } catch (err) { - res.status(500).json({ error: err.message }); - } - }); + async createRole(data) { + const Role = this.db.get('rolesModel'); - router.put('/auth/:id', async (req, res) => { - try { - await rbac.updateAuth(req.params.id, req.body); - res.json({ ok: true }); - } catch (err) { - res.status(500).json({ error: err.message }); - } - }); + return await Role.create({ + Name: data.name, + Description: data.description || null + }); + } - router.delete('/auth/:id', async (req, res) => { - try { - await rbac.deleteAuth(req.params.id); - res.json({ ok: true }); - } catch (err) { - res.status(500).json({ error: err.message }); - } - }); + async updateRole(id, data) { + const Role = this.db.get('rolesModel'); - // ========================================================= - // 👥 GROUPS - // ========================================================= + return await Role.update(data, { + where: { ID: id } + }); + } - router.post('/group', async (req, res) => { - try { - const group = await rbac.createGroup(req.body); - res.json(group); - } catch (err) { - res.status(500).json({ error: err.message }); - } - }); + async deleteRole(id) { + const Role = this.db.get('rolesModel'); - router.put('/group/:id', async (req, res) => { - try { - await rbac.updateGroup(req.params.id, req.body); - res.json({ ok: true }); - } catch (err) { - res.status(500).json({ error: err.message }); - } - }); - - router.delete('/group/:id', async (req, res) => { - try { - await rbac.deleteGroup(req.params.id); - res.json({ ok: true }); - } catch (err) { - res.status(500).json({ error: err.message }); - } - }); - - // ========================================================= - // 🔗 USER ↔ GROUP - // ========================================================= - - router.post('/group/add-user', async (req, res) => { - try { - const { authId, groupId } = req.body; - await rbac.addUserToGroup(authId, groupId); - res.json({ ok: true }); - } catch (err) { - res.status(500).json({ error: err.message }); - } - }); - - router.post('/group/remove-user', async (req, res) => { - try { - const { authId, groupId } = req.body; - await rbac.removeUserFromGroup(authId, groupId); - res.json({ ok: true }); - } catch (err) { - res.status(500).json({ error: err.message }); - } - }); - - // ========================================================= - // 🎭 ROLES - // ========================================================= - - router.post('/role', async (req, res) => { - try { - const role = await rbac.createRole(req.body); - res.json(role); - } catch (err) { - res.status(500).json({ error: err.message }); - } - }); - - router.put('/role/:id', async (req, res) => { - try { - await rbac.updateRole(req.params.id, req.body); - res.json({ ok: true }); - } catch (err) { - res.status(500).json({ error: err.message }); - } - }); - - router.delete('/role/:id', async (req, res) => { - try { - await rbac.deleteRole(req.params.id); - res.json({ ok: true }); - } catch (err) { - res.status(500).json({ error: err.message }); - } - }); + return await Role.destroy({ + where: { ID: id } + }); + } // ========================================================= // 🔗 ROLE ASSIGNMENTS // ========================================================= - router.post('/role/assign-user', async (req, res) => { - try { - const { authId, roleId } = req.body; - await rbac.assignRoleToUser(authId, roleId); - res.json({ ok: true }); - } catch (err) { - res.status(500).json({ error: err.message }); - } - }); + async assignRoleToUser(authId, roleId) { + const AuthRoles = this.db.get('authenticationRolesModel'); - router.post('/role/assign-group', async (req, res) => { - try { - const { groupId, roleId } = req.body; - await rbac.assignRoleToGroup(groupId, roleId); - res.json({ ok: true }); - } catch (err) { - res.status(500).json({ error: err.message }); - } - }); + return await AuthRoles.create({ + Authentication_ObjectGUID: authId, + Role_ID: roleId + }); + } + + async assignRoleToGroup(groupId, roleId) { + const GroupRoles = this.db.get('groupRolesModel'); + + return await GroupRoles.create({ + Group_ObjectGUID: groupId, + Role_ID: roleId + }); + } + + async removeRoleFromUser(authId, roleId) { + const AuthRoles = this.db.get('authenticationRolesModel'); + + return await AuthRoles.destroy({ + where: { + Authentication_ObjectGUID: authId, + Role_ID: roleId + } + }); + } // ========================================================= - // 🔐 PERMISSIONS + // 🔐 PERMISSION CRUD // ========================================================= - router.post('/permission', async (req, res) => { - try { - const perm = await rbac.createPermission(req.body); - res.json(perm); - } catch (err) { - res.status(500).json({ error: err.message }); - } - }); + async createPermission(data) { + const Permission = this.db.get('permissionModel'); - router.put('/permission/:id', async (req, res) => { - try { - await rbac.updatePermission(req.params.id, req.body); - res.json({ ok: true }); - } catch (err) { - res.status(500).json({ error: err.message }); - } - }); + return await Permission.create({ + Scope: data.scope, + Resource: data.resource, + Action: data.action + }); + } - router.delete('/permission/:id', async (req, res) => { - try { - await rbac.deletePermission(req.params.id); - res.json({ ok: true }); - } catch (err) { - res.status(500).json({ error: err.message }); - } - }); + async updatePermission(id, data) { + const Permission = this.db.get('permissionModel'); + + return await Permission.update(data, { + where: { ID: id } + }); + } + + async deletePermission(id) { + const Permission = this.db.get('permissionModel'); + + return await Permission.destroy({ + where: { ID: id } + }); + } // ========================================================= // 🔗 ROLE ↔ PERMISSION // ========================================================= - router.post('/role/add-permission', async (req, res) => { - try { - const { roleId, permissionId } = req.body; - await rbac.addPermissionToRole(roleId, permissionId); - res.json({ ok: true }); - } catch (err) { - res.status(500).json({ error: err.message }); - } - }); + async addPermissionToRole(roleId, permissionId) { + const RolePerms = this.db.get('rolePermissionsModel'); - router.post('/role/remove-permission', async (req, res) => { - try { - const { roleId, permissionId } = req.body; - await rbac.removePermissionFromRole(roleId, permissionId); - res.json({ ok: true }); - } catch (err) { - res.status(500).json({ error: err.message }); - } - }); + return await RolePerms.create({ + Role_ID: roleId, + Permission_ID: permissionId + }); + } - return router; -} + async removePermissionFromRole(roleId, permissionId) { + const RolePerms = this.db.get('rolePermissionsModel'); -module.exports = rbacRoutes; + return await RolePerms.destroy({ + where: { + Role_ID: roleId, + Permission_ID: permissionId + } + }); + } +//#endregio } module.exports = RBACManager; \ No newline at end of file