NexGenStudioDev/FastKit

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

オープン

#6 opened on 2025/06/27

 (0 件のコメント) (0 件のリアクション) (0 人の担当者)TypeScript (0 件のフォーク)auto 404
TypeScriptbackenddocumentationenhancementgood first issuehelp wantednpm

Repository metrics

Stars
 (1 個のスター)
PR merge metrics
 (PR metrics pending)

説明

🔐 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


コントリビューターガイド