NexGenStudioDev/FastKit

Build Role & Permission Feature (Pluggable + Class-Based)

Aberta

#6 aberto em 27 de jun. de 2025

 (0 comentário) (0 reação) (0 responsável)TypeScript (0 fork)auto 404
TypeScriptbackenddocumentationenhancementgood first issuehelp wantednpm

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


Guia do colaborador