@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
345 lines (306 loc) • 10.1 kB
text/typescript
/**
* Complete NestJS Example with RBAC Admin Dashboard
*
* This example demonstrates how to integrate the RBAC system with NestJS
* including the new admin dashboard functionality.
*
* Features demonstrated:
* - NestJS module setup with RBAC
* - Admin dashboard integration
* - Controller with permission decorators
* - Service integration
* - Session management setup
* - Multi-database support examples
*/
import { Module, Controller, Get, Post, UseGuards, Injectable, Body, Param } from '@nestjs/common';
import { NestFactory } from '@nestjs/core';
import { Connection } from 'mongoose';
import * as session from 'express-session';
// RBAC imports
import {
RbacModule,
RbacService,
CheckPermissions,
PermissionsGuard,
RegisterUser,
RegisterUserGuard
} from '@mamoorali295/rbac/nestjs';
// NEW: Admin dashboard imports
import {
RbacAdminModule,
RbacAdminService
} from '@mamoorali295/rbac/nestjs';
// =====================================
// 1. NESTJS APP WITH MONGODB
// =====================================
()
class UserService {
constructor(
private rbacService: RbacService,
private adminService: RbacAdminService // NEW: Admin service injection
) {}
// Regular RBAC operations
async createUser(userData: any) {
await this.rbacService.registerUser(userData.id, {
name: userData.name,
email: userData.email
});
return userData;
}
async assignRole(userId: string, roleName: string) {
return await this.rbacService.assignRole(userId, roleName);
}
// NEW: Admin dashboard operations
async getAdminDashboardStats() {
return await this.adminService.getDashboardStats();
}
async getAllUsersForAdmin(page: number = 1, limit: number = 10, search: string = '') {
const skip = (page - 1) * limit;
return await this.adminService.getAllUsers(limit, skip, search);
}
async bulkDeleteUsers(userIds: string[]) {
for (const userId of userIds) {
await this.adminService.deleteUser(userId);
}
return { deleted: userIds.length };
}
}
('billing')
(PermissionsGuard)
class BillingController {
constructor(private userService: UserService) {}
('invoices')
() // Auto-infers: feature="billing", permission="read"
async getInvoices() {
return { invoices: ['Invoice 1', 'Invoice 2'] };
}
('create')
({ feature: 'billing', permission: 'create' })
async createInvoice(() data: any) {
return { invoice: data, id: Date.now() };
}
('users')
(RegisterUserGuard)
()
async createBillingUser(() userData: any) {
return await this.userService.createUser(userData);
}
}
// NEW: Custom admin controller (optional - extends default functionality)
('custom-admin')
export class CustomAdminController {
constructor(private adminService: RbacAdminService) {}
('stats')
async getCustomStats() {
const stats = await this.adminService.getDashboardStats();
const users = await this.adminService.getAllUsers(5, 0, '');
return {
...stats,
recentUsers: users.items,
customMetric: 'Additional data'
};
}
('bulk-operations')
async bulkOperations(() body: { operation: string; userIds: string[] }) {
const { operation, userIds } = body;
if (operation === 'delete') {
for (const userId of userIds) {
await this.adminService.deleteUser(userId);
}
return { message: `Deleted ${userIds.length} users` };
}
return { message: 'Operation not supported' };
}
}
({
imports: [
// Main RBAC module setup
RbacModule.forRoot({
database: {
type: 'mongodb',
connection: {} as Connection // Your mongoose connection
},
authAdapter: async (req) => ({ user_id: req.user?.id }),
defaultRole: 'user',
onUserRegister: (user) => console.log('User registered:', user.user_id),
onRoleUpdate: (data) => console.log('Role updated:', data)
}),
// NEW: Admin dashboard module
RbacAdminModule.forRoot({
adminCredentials: {
username: 'admin',
password: 'secure-password-123'
},
sessionSecret: 'your-secret-session-key-here',
sessionOptions: {
name: 'rbac.admin.sid',
maxAge: 24 * 60 * 60 * 1000, // 24 hours
httpOnly: true,
secure: false // Set to true in production with HTTPS
}
})
],
controllers: [BillingController, CustomAdminController],
providers: [UserService]
})
class AppModule {}
// =====================================
// 2. NESTJS APP WITH POSTGRESQL
// =====================================
({
imports: [
RbacModule.forRoot({
database: {
type: 'postgresql',
connection: {} // Your PostgreSQL pool connection
},
authAdapter: async (req) => ({ user_id: req.user?.id }),
defaultRole: 'user'
}),
// Admin dashboard with PostgreSQL
RbacAdminModule.forRoot({
adminCredentials: {
username: 'admin',
password: 'postgres-admin-pass'
},
sessionSecret: 'postgres-session-secret'
})
],
controllers: [BillingController, CustomAdminController],
providers: [UserService]
})
class PostgresAppModule {}
// =====================================
// 3. ASYNC CONFIGURATION EXAMPLE
// =====================================
import { ConfigService } from '@nestjs/config';
({
imports: [
// Async RBAC configuration
RbacModule.forRootAsync({
useFactory: async (configService: ConfigService) => ({
database: {
type: configService.get('DB_TYPE', 'mongodb'),
connection: {} // Dynamic connection based on config
},
authAdapter: async (req) => ({ user_id: req.user?.id }),
defaultRole: configService.get('DEFAULT_ROLE', 'user')
}),
inject: [ConfigService]
}),
// Async admin dashboard configuration
RbacAdminModule.forRootAsync({
useFactory: async (configService: ConfigService) => ({
adminCredentials: {
username: configService.get('ADMIN_USERNAME', 'admin'),
password: configService.get('ADMIN_PASSWORD', 'changeme')
},
sessionSecret: configService.get('SESSION_SECRET', 'fallback-secret'),
sessionOptions: {
name: 'rbac.admin.sid',
maxAge: parseInt(configService.get('SESSION_MAX_AGE', '86400000')),
secure: configService.get('NODE_ENV') === 'production',
httpOnly: true
}
}),
inject: [ConfigService]
})
],
controllers: [BillingController, CustomAdminController],
providers: [UserService]
})
class AsyncConfigAppModule {}
// =====================================
// 4. APPLICATION BOOTSTRAP
// =====================================
async function bootstrap() {
const app = await NestFactory.create(AppModule);
// Session middleware setup (required for admin dashboard)
app.use(session({
secret: 'your-secret-session-key-here',
resave: false,
saveUninitialized: false,
name: 'rbac.admin.sid',
cookie: {
maxAge: 24 * 60 * 60 * 1000, // 24 hours
httpOnly: true,
secure: false // Set to true in production with HTTPS
}
}));
await app.listen(3000);
console.log('🚀 NestJS app with RBAC Admin Dashboard running on http://localhost:3000');
console.log('📊 Admin Dashboard: http://localhost:3000/rbac-admin');
console.log('🔐 Admin Login: username=admin, password=secure-password-123');
}
// =====================================
// 5. USAGE EXAMPLES
// =====================================
/**
* Admin Dashboard Features Available:
*
* 1. Dashboard Home: http://localhost:3000/rbac-admin
* - Real-time statistics
* - Database counts
* - Quick navigation
*
* 2. User Management: http://localhost:3000/rbac-admin/users
* - Paginated user list
* - Search functionality
* - Create, update, delete users
* - Role assignment
*
* 3. Role Management: http://localhost:3000/rbac-admin/roles
* - Create and manage roles
* - Assign features and permissions
* - Role-based access control
*
* 4. Feature Management: http://localhost:3000/rbac-admin/features
* - Application feature management
* - Feature descriptions
* - Feature-role relationships
*
* 5. Permission Management: http://localhost:3000/rbac-admin/permissions
* - Granular permission control
* - Standard permissions (read, create, update, delete, sudo)
* - Custom permission creation
*
* API Endpoints:
* - GET /rbac-admin/api/stats - Real-time dashboard statistics
* - All CRUD operations available via the admin interface
*/
/**
* Environment Variables (.env):
*
* # Database Configuration
* DB_TYPE=mongodb # or postgresql
* MONGODB_URI=mongodb://localhost:27017/rbac
* POSTGRES_URL=postgresql://user:pass@localhost:5432/rbac
*
* # Admin Dashboard Configuration
* ADMIN_USERNAME=admin
* ADMIN_PASSWORD=your-secure-password
* SESSION_SECRET=your-super-secure-session-secret
* SESSION_MAX_AGE=86400000 # 24 hours in milliseconds
*
* # Security
* NODE_ENV=production # Enables secure cookies
*/
/**
* Package.json dependencies:
*
* {
* "dependencies": {
* "@nestjs/common": "^10.0.0",
* "@nestjs/core": "^10.0.0",
* "@nestjs/config": "^3.0.0",
* "@mamoorali295/rbac": "latest",
* "express-session": "^1.17.3",
* "mongoose": "^7.0.0", // For MongoDB
* "pg": "^8.8.0" // For PostgreSQL
* },
* "devDependencies": {
* "@types/express-session": "^1.17.7"
* }
* }
*/
export { AppModule, PostgresAppModule, AsyncConfigAppModule, bootstrap };