@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
310 lines (309 loc) • 11.7 kB
JavaScript
"use strict";
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());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.rbacResolvers = void 0;
const RBAC_1 = require("../../RBAC");
/**
* GraphQL resolvers for RBAC operations.
* Provides full CRUD operations for users, roles, features, and permissions.
*
* @example
* Usage with Apollo Server:
* const server = new ApolloServer({ typeDefs, resolvers: rbacResolvers, ... });
*/
exports.rbacResolvers = {
Query: {
/**
* Get all users with pagination support
*/
users(_, args) {
return __awaiter(this, void 0, void 0, function* () {
const { page = 1, limit = 10, search } = args;
if (!RBAC_1.RBAC['dbAdapter']) {
throw new Error('RBAC system not initialized');
}
const offset = (page - 1) * limit;
const result = yield RBAC_1.RBAC['dbAdapter'].getAllUsers(limit, offset, search);
return {
data: result.items,
pagination: {
page,
limit,
total: result.total,
pages: Math.ceil(result.total / limit)
}
};
});
},
/**
* Get user by ID
*/
user(_, args) {
return __awaiter(this, void 0, void 0, function* () {
if (!RBAC_1.RBAC['dbAdapter']) {
throw new Error('RBAC system not initialized');
}
return yield RBAC_1.RBAC['dbAdapter'].findUserByUserIdWithRole(args.user_id);
});
},
/**
* Get all roles
*/
roles() {
return __awaiter(this, void 0, void 0, function* () {
if (!RBAC_1.RBAC['dbAdapter']) {
throw new Error('RBAC system not initialized');
}
const result = yield RBAC_1.RBAC['dbAdapter'].getAllRoles();
return result.items;
});
},
/**
* Get role by ID
*/
role(_, args) {
return __awaiter(this, void 0, void 0, function* () {
if (!RBAC_1.RBAC['dbAdapter']) {
throw new Error('RBAC system not initialized');
}
return yield RBAC_1.RBAC['dbAdapter'].findRoleByIdWithFeatures(args.id);
});
},
/**
* Get all features
*/
features() {
return __awaiter(this, void 0, void 0, function* () {
if (!RBAC_1.RBAC['dbAdapter']) {
throw new Error('RBAC system not initialized');
}
const result = yield RBAC_1.RBAC['dbAdapter'].getAllFeatures();
return result.items;
});
},
/**
* Get all permissions
*/
permissions() {
return __awaiter(this, void 0, void 0, function* () {
if (!RBAC_1.RBAC['dbAdapter']) {
throw new Error('RBAC system not initialized');
}
const result = yield RBAC_1.RBAC['dbAdapter'].getAllPermissions();
return result.items;
});
},
/**
* Get user permissions for a specific feature
*/
userFeaturePermissions(_, args) {
return __awaiter(this, void 0, void 0, function* () {
return yield RBAC_1.RBAC.getFeaturePermissions(args.user_id, args.feature);
});
},
/**
* Get dashboard statistics
*/
rbacStats() {
return __awaiter(this, void 0, void 0, function* () {
if (!RBAC_1.RBAC['dbAdapter']) {
throw new Error('RBAC system not initialized');
}
return yield RBAC_1.RBAC['dbAdapter'].getDashboardStats();
});
}
},
Mutation: {
/**
* Create a new user
*/
createUser(_, args) {
return __awaiter(this, void 0, void 0, function* () {
const { input } = args;
if (!RBAC_1.RBAC['dbAdapter']) {
throw new Error('RBAC system not initialized');
}
// Check if user already exists
const existingUser = yield RBAC_1.RBAC['dbAdapter'].findUserByUserId(input.user_id);
if (existingUser) {
throw new Error('User already exists');
}
yield RBAC_1.RBAC['dbAdapter'].createUser({
user_id: input.user_id,
name: input.name || '',
email: input.email || '',
role_id: input.role_id
});
return yield RBAC_1.RBAC['dbAdapter'].findUserByUserIdWithRole(input.user_id);
});
},
/**
* Update a user
*/
updateUser(_, args) {
return __awaiter(this, void 0, void 0, function* () {
yield RBAC_1.RBAC.updateUser(args.user_id, args.input);
return yield RBAC_1.RBAC['dbAdapter'].findUserByUserIdWithRole(args.user_id);
});
},
/**
* Delete a user
*/
deleteUser(_, args) {
return __awaiter(this, void 0, void 0, function* () {
if (!RBAC_1.RBAC['dbAdapter']) {
throw new Error('RBAC system not initialized');
}
yield RBAC_1.RBAC['dbAdapter'].deleteUser(args.user_id);
return true;
});
},
/**
* Assign role to user
*/
assignRole(_, args) {
return __awaiter(this, void 0, void 0, function* () {
yield RBAC_1.RBAC.assignRole(args.user_id, args.role_name);
return yield RBAC_1.RBAC['dbAdapter'].findUserByUserIdWithRole(args.user_id);
});
},
/**
* Create a new role
*/
createRole(_, args) {
return __awaiter(this, void 0, void 0, function* () {
const { input } = args;
if (!RBAC_1.RBAC['dbAdapter']) {
throw new Error('RBAC system not initialized');
}
const role = yield RBAC_1.RBAC['dbAdapter'].createRole({
name: input.name,
description: ''
});
if (input.features && input.features.length > 0) {
yield RBAC_1.RBAC['dbAdapter'].assignRoleFeaturePermissions(role.id, input.features);
}
return yield RBAC_1.RBAC['dbAdapter'].findRoleByIdWithFeatures(role.id);
});
},
/**
* Update a role
*/
updateRole(_, args) {
return __awaiter(this, void 0, void 0, function* () {
if (!RBAC_1.RBAC['dbAdapter']) {
throw new Error('RBAC system not initialized');
}
yield RBAC_1.RBAC['dbAdapter'].updateRole(args.id, {
name: args.input.name
});
if (args.input.features) {
yield RBAC_1.RBAC['dbAdapter'].assignRoleFeaturePermissions(args.id, args.input.features);
}
return yield RBAC_1.RBAC['dbAdapter'].findRoleByIdWithFeatures(args.id);
});
},
/**
* Delete a role
*/
deleteRole(_, args) {
return __awaiter(this, void 0, void 0, function* () {
if (!RBAC_1.RBAC['dbAdapter']) {
throw new Error('RBAC system not initialized');
}
yield RBAC_1.RBAC['dbAdapter'].deleteRole(args.id);
return true;
});
},
/**
* Create a new feature
*/
createFeature(_, args) {
return __awaiter(this, void 0, void 0, function* () {
if (!RBAC_1.RBAC['dbAdapter']) {
throw new Error('RBAC system not initialized');
}
const feature = yield RBAC_1.RBAC['dbAdapter'].createFeature({
name: args.input.name,
description: ''
});
return feature;
});
},
/**
* Update a feature
*/
updateFeature(_, args) {
return __awaiter(this, void 0, void 0, function* () {
if (!RBAC_1.RBAC['dbAdapter']) {
throw new Error('RBAC system not initialized');
}
yield RBAC_1.RBAC['dbAdapter'].updateFeature(args.id, {
name: args.input.name
});
return yield RBAC_1.RBAC['dbAdapter'].findFeatureById(args.id);
});
},
/**
* Delete a feature
*/
deleteFeature(_, args) {
return __awaiter(this, void 0, void 0, function* () {
if (!RBAC_1.RBAC['dbAdapter']) {
throw new Error('RBAC system not initialized');
}
yield RBAC_1.RBAC['dbAdapter'].deleteFeature(args.id);
return true;
});
},
/**
* Create a new permission
*/
createPermission(_, args) {
return __awaiter(this, void 0, void 0, function* () {
if (!RBAC_1.RBAC['dbAdapter']) {
throw new Error('RBAC system not initialized');
}
const permission = yield RBAC_1.RBAC['dbAdapter'].createPermission({
name: args.input.name,
description: ''
});
return permission;
});
},
/**
* Update a permission
*/
updatePermission(_, args) {
return __awaiter(this, void 0, void 0, function* () {
if (!RBAC_1.RBAC['dbAdapter']) {
throw new Error('RBAC system not initialized');
}
yield RBAC_1.RBAC['dbAdapter'].updatePermission(args.id, {
name: args.input.name
});
return yield RBAC_1.RBAC['dbAdapter'].findPermissionById(args.id);
});
},
/**
* Delete a permission
*/
deletePermission(_, args) {
return __awaiter(this, void 0, void 0, function* () {
if (!RBAC_1.RBAC['dbAdapter']) {
throw new Error('RBAC system not initialized');
}
yield RBAC_1.RBAC['dbAdapter'].deletePermission(args.id);
return true;
});
}
}
};