A robust Role Management Microservice built with NestJS, MongoDB, and Redis for high-performance permission management.
-
Manage Permissions (CRUD)
- Create, Read, Update, Delete permissions
- Each permission has a unique
slugand optionalmetafield
-
Manage Roles (CRUD)
- Create, Read, Update, Delete roles
- Each role has a unique
nameand an array ofpermissions
-
Resolve Permissions Endpoint
- High-performance endpoint to resolve the union of permissions for given role names
- Returns unique permission slugs across all specified roles
- Implemented with Redis caching for optimal performance
Permission Collection:
slug(String, unique, indexed) - Unique identifier for the permissionmeta(Object) - Additional metadata for the permissioncreatedAt,updatedAt- Timestamps
Role Collection:
name(String, unique, indexed) - Unique name for the rolepermissions(Array of ObjectId) - References to Permission documentscreatedAt,updatedAt- Timestamps
- Redis is used for caching resolved permissions
- Cache keys are generated based on sorted role names
- Cache TTL: 5 minutes (300 seconds)
- Cache Invalidation: Automatic invalidation when:
- A permission is created, updated, or deleted
- A role is created, updated, or deleted
- Cache invalidation uses pattern matching to clear related entries
npm installThe easiest way to run the application with all dependencies:
# Start all services (MongoDB, Redis, and the application)
docker-compose up -d
# View logs
docker-compose logs -f app
# Stop all services
docker-compose downThe application will be available at http://localhost:3000
- Node.js 20+
- MongoDB (running on localhost:27017)
- Redis (running on localhost:6379)
- Install dependencies:
npm install- Create a
.envfile in the root directory:
MONGODB_URI=mongodb://localhost:27017/role-manager
REDIS_HOST=localhost
REDIS_PORT=6379
PORT=3000- Run the application:
# Development mode
npm run start:dev
# Production mode
npm run build
npm run start:prodThe application will be available at http://localhost:3000
POST /permissions
Content-Type: application/json
{
"slug": "users.read",
"meta": {
"description": "Read user information"
}
}GET /permissionsGET /permissions/:idPATCH /permissions/:id
Content-Type: application/json
{
"slug": "users.write",
"meta": {
"description": "Write user information"
}
}DELETE /permissions/:idPOST /roles
Content-Type: application/json
{
"name": "admin",
"permissions": ["<permission_id_1>", "<permission_id_2>"]
}GET /rolesGET /roles/:idPATCH /roles/:id
Content-Type: application/json
{
"name": "super-admin",
"permissions": ["<permission_id_1>"]
}DELETE /roles/:idPOST /roles/resolve-permissions
Content-Type: application/json
{
"roleNames": ["admin", "editor", "viewer"]
}Response:
{
"permissions": [
"users.read",
"users.write",
"posts.read",
"posts.write",
"comments.read"
]
}# Unit tests
npm run test
# E2E tests
npm run test:e2e
# Test coverage
npm run test:cov- AppModule: Main application module
- PermissionsModule: Handles all permission-related operations
- RolesModule: Handles all role-related operations
- RedisModule: Global module for Redis caching
- PermissionsService: Business logic for permission management
- RolesService: Business logic for role management and permission resolution
- RedisService: Redis client wrapper for caching operations
The microservice implements intelligent cache invalidation:
- Permission Changes: When any permission is modified, all cached role permission resolutions are invalidated
- Role Changes: When a role is modified, its specific cache entry is invalidated
- Pattern-based Invalidation: Uses Redis pattern matching to clear multiple related cache entries efficiently
- Redis Caching: Frequently accessed permission resolutions are cached
- Database Indexing: Unique indexes on
slug(Permission) andname(Role) for fast lookups - Efficient Query: Uses MongoDB's populate feature to fetch role permissions in a single query
- Union Operation: Implements Set data structure for O(1) permission deduplication
# Format code
npm run format
# Lint code
npm run lint
# Watch mode
npm run start:devsrc/
├── common/
│ └── redis/
│ ├── redis.module.ts
│ └── redis.service.ts
├── permissions/
│ ├── dto/
│ │ ├── create-permission.dto.ts
│ │ └── update-permission.dto.ts
│ ├── schemas/
│ │ └── permission.schema.ts
│ ├── permissions.controller.ts
│ ├── permissions.module.ts
│ └── permissions.service.ts
├── roles/
│ ├── dto/
│ │ ├── create-role.dto.ts
│ │ ├── update-role.dto.ts
│ │ └── resolve-permissions.dto.ts
│ ├── schemas/
│ │ └── role.schema.ts
│ ├── roles.controller.ts
│ ├── roles.module.ts
│ └── roles.service.ts
├── app.module.ts
└── main.ts
- NestJS - Progressive Node.js framework
- MongoDB - NoSQL database with Mongoose ODM
- Redis - In-memory caching
- TypeScript - Type-safe development
- class-validator - DTO validation
- class-transformer - Object transformation
ISC