Build Role & Permission Feature (Pluggable + Class-Based)
#6 aberto em 27 de jun. de 2025
Métricas do repositório
- Stars
- (1 estrela)
- Métricas de merge de PR
- (Métricas PR pendentes)
Description
🔐 Role & Permission Feature Module (FastKit-style)
🧩 Description
Build a fully pluggable and reusable Role & Permission module to manage role-based access control in any Express.js project.
**This module must:**
-
Define and assign roles to users
-
Check access before protected routes
-
Export class-based RoleController, RoleService
-
Provide reusable middleware like allowRoles(...) for any route
-
Use clean constants and bind-safe class methods
🧱 Why This Is Important
-
🔒 Enforces security through central role control
-
♻️ Promotes reusability across microservices or large codebases
-
🧩 Keeps logic modular, testable, and easy to extend
-
✅ Helps any developer plug & protect sensitive routes easily
🟢 Difficulty Level: Intermediate
You’ll need knowledge of:
-
Express middleware chaining
-
Role/Permission modeling
-
Token-based or session-based auth (used externally)
-
Class-based clean architecture
✅ Tasks
1. 🧱 Role Model (Role.model.ts)
[ ] Fields: - name: string (admin, user, guest, etc.)
- permissions: string[] (optional, extendable)
- isRoleBlocked
- isRoleVarified
.........
[ ] Sample (if using Mongoose or Prisma):
{
name: 'admin',
permissions: ['user:read', 'post:create']
}
2. 🧱 Role Service (Role.service.ts)
[ ] Methods:
-
createRole(data)
-
getAllRoles()
-
assignPermissions(roleId, permissions)
-
getPermissionsByRole(roleId)
[ ] Business logic — clean, reusable, DB-agnostic
3. 🎮 Role Controller (Role.controller.ts)
[ ] Class methods:
- createRole(req, res)
- getRoles(req, res)
- assignPermissions(req, res)
- getPermissionsByRole(req, res)
[ ] Must be bind-safe
router.post('/roles'); roleController.createRole);
4. 🛡️ Middleware (Role.middleware.ts)
[ ] allowRoles(...roles: string[]) Use in any route to restrict access:
- allowRoles('admin', 'user')
[ ] Accepts decoded token (after verifyToken) and checks role.
5. 📜 Validators (Role.validators.ts)
-
[ ] Validate:
-
Role name (unique)
-
Permissions (optional but if passed, must be array of strings)
[ ] Use Zod or Joi
6. ❗ Constants (Role.constant.ts)
[ ] Add reusable constants:
export const ROLE_ERRORS = {
ROLE_EXISTS: 'Role already exists.',
ROLE_NOT_FOUND: 'Role not found.',
PERMISSION_ASSIGN_FAILED: 'Failed to assign permissions.'
..........
};
[ ] Add ROLE_DEFAULTS, if any.
7. 📘 README.md
Include:
-
How to define roles
-
How to use allowRoles
-
Sample middleware and controller usage
8. 🧪 Demo (Role.demo.ts)
-
Create a sample admin role
-
Assign permissions
-
Simulate a protected route
📁 Final Folder Structure
src/
└── features/
└── Role/
└── v1/
├── Role.controller.ts # Role management controller
├── Role.service.ts # Handles DB/business logic
├── Role.validators.ts # Joi/Zod schemas
├── Role.middleware.ts # allowRoles() middleware
├── Role.constant.ts # Error and status message
├── Role.utils.ts # Role Utility Class
├── Role.model.ts # Role model
├── Role.demo.ts # Sample role usage
└── README.md # Full usage guide
🎯 Expected Outcome
-
Class-based RoleController with route-safe methods
-
Optional permission assignment
-
Middleware allowRoles(...) for any route
-
Custom error responses and constants
-
Easy integration into any Express API
🔐 Example Route Usage
import { verifyToken } from '../auth/Auth.middleware';
import { allowRoles } from '../features/Role/v1/Role.middleware';
import { ProtectedController } from './Protected.controller';
router.get(
'/protected-route',
verifyToken,
allowRoles('admin', 'user'),
ProtectedController.handleRequest
);
✨ Benefits
-
✅ Role-based access is centralized, not scattered across routes
-
🔁 Middleware can be reused with any auth strategy
-
🧱 Encourages layered architecture — controller, service, middleware
-
🚀 Ready for microservices, multi-tenant systems, or admin panels
🙋🏻♂️ Looking For
Contributors to:
-
Add support for permissions per endpoint (e.g., post:create)
-
Create database-agnostic role storage (MongoDB)
-
Extend to include dynamic roles, hierarchies, or group roles
-
Write unit and integration tests
-
Write Doc