@mamoorali295/rbac
Version:
Complete RBAC (Role-Based Access Control) system for Node.js with Express middleware, NestJS integration, GraphQL support, MongoDB & PostgreSQL support, modern admin dashboard, TypeScript support, and dynamic permission management
166 lines (165 loc) • 6.29 kB
JavaScript
;
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var RbacModule_1;
Object.defineProperty(exports, "__esModule", { value: true });
exports.RbacModule = void 0;
const common_1 = require("@nestjs/common");
const core_1 = require("../core");
const permissions_guard_1 = require("./guards/permissions.guard");
const register_user_guard_1 = require("./guards/register-user.guard");
const rbac_service_1 = require("./rbac.service");
/**
* NestJS module for RBAC integration.
* Provides guards, services, and configuration for role-based access control.
*
* @example
* ```typescript
* // Basic configuration
* @Module({
* imports: [
* RbacModule.forRoot({
* database: {
* type: 'mongodb',
* connection: mongooseConnection
* },
* authAdapter: async (req) => ({ user_id: req.user.id }),
* defaultRole: 'user'
* })
* ]
* })
* export class AppModule {}
*
* // Global configuration (available in all modules)
* @Module({
* imports: [
* RbacModule.forRoot({
* global: true,
* database: {
* type: 'postgresql',
* connection: pgPool
* },
* authAdapter: async (req) => ({ user_id: req.user.id }),
* defaultRole: 'user'
* })
* ]
* })
* export class AppModule {}
*
* // Async configuration
* @Module({
* imports: [
* RbacModule.forRootAsync({
* useFactory: async (configService: ConfigService) => ({
* database: {
* type: 'mongodb',
* connection: await createMongoConnection(configService.get('MONGO_URL'))
* },
* authAdapter: async (req) => ({ user_id: req.user.id }),
* defaultRole: configService.get('DEFAULT_ROLE', 'user')
* }),
* inject: [ConfigService]
* })
* ]
* })
* export class AppModule {}
* ```
*/
let RbacModule = RbacModule_1 = class RbacModule {
/**
* Creates a dynamic module with RBAC configuration.
* Initializes the RBAC system and provides guards and services.
*/
static forRoot(options) {
const providers = [
{
provide: 'RBAC_CONFIG',
useValue: options,
},
{
provide: 'RBAC_INITIALIZED',
useFactory: (config) => __awaiter(this, void 0, void 0, function* () {
yield core_1.CoreRBAC.init(config);
return true;
}),
inject: ['RBAC_CONFIG'],
},
{
provide: 'RBAC_DB_ADAPTER',
useFactory: () => {
if (!core_1.CoreRBAC.dbAdapter) {
throw new Error('RBAC system not initialized. Database adapter not available.');
}
return core_1.CoreRBAC.dbAdapter;
},
inject: ['RBAC_INITIALIZED'],
},
rbac_service_1.RbacService,
permissions_guard_1.PermissionsGuard,
register_user_guard_1.RegisterUserGuard,
];
return {
module: RbacModule_1,
global: options.global || false,
providers,
exports: [rbac_service_1.RbacService, permissions_guard_1.PermissionsGuard, register_user_guard_1.RegisterUserGuard, 'RBAC_CONFIG', 'RBAC_DB_ADAPTER'],
};
}
/**
* Creates a dynamic module with async RBAC configuration.
* Useful when configuration depends on other services or external resources.
*/
static forRootAsync(options) {
const providers = [
{
provide: 'RBAC_CONFIG',
useFactory: options.useFactory,
inject: options.inject || [],
},
{
provide: 'RBAC_INITIALIZED',
useFactory: (config) => __awaiter(this, void 0, void 0, function* () {
yield core_1.CoreRBAC.init(config);
return true;
}),
inject: ['RBAC_CONFIG'],
},
{
provide: 'RBAC_DB_ADAPTER',
useFactory: () => {
if (!core_1.CoreRBAC.dbAdapter) {
throw new Error('RBAC system not initialized. Database adapter not available.');
}
return core_1.CoreRBAC.dbAdapter;
},
inject: ['RBAC_INITIALIZED'],
},
rbac_service_1.RbacService,
permissions_guard_1.PermissionsGuard,
register_user_guard_1.RegisterUserGuard,
];
return {
module: RbacModule_1,
global: options.global || false,
providers,
exports: [rbac_service_1.RbacService, permissions_guard_1.PermissionsGuard, register_user_guard_1.RegisterUserGuard, 'RBAC_CONFIG', 'RBAC_DB_ADAPTER'],
};
}
};
exports.RbacModule = RbacModule;
exports.RbacModule = RbacModule = RbacModule_1 = __decorate([
(0, common_1.Module)({})
], RbacModule);