Domain Events
The access-control libraries emit domain events so other services can react when user or role data changes. Events are dispatched via the @digiwedge/scl-events module and persisted in the outbox table for reliable delivery.
Events
| Event | Trigger | Payload |
|---|---|---|
user.created | New user account created | userId, tenantId, invited |
user.updated | User details or role assignments changed | userId, changedFields |
user.deleted | User soft-deleted or permanently removed | userId, tenantId |
role.created | Admin defines a new role | roleId, tenantId |
role.assigned | Role granted to a user | userId, roleId, tenantId |
session.revoked | All sessions for a user revoked | userId, reason |
Event Flow
- Domain service performs operation (e.g.,
UserDataService.createUser) - Event is created and written to outbox table
- Outbox processor publishes event to message broker
- Subscribing services receive and process event
Subscribing to Events
import { OnEvent } from '@nestjs/event-emitter';
@Injectable()
export class UserEventHandler {
@OnEvent('user.created')
handleUserCreated(event: UserCreatedEvent) {
// React to new user
}
@OnEvent('role.assigned')
handleRoleAssigned(event: RoleAssignedEvent) {
// React to role assignment
}
}
Validation Rules
Incoming HTTP DTOs are validated with class-validator decorators:
| Entity | Validation |
|---|---|
| Tenant names | 3–50 characters (@Length(3,50)) |
| Invitation tokens | Exactly 32 characters (@Length(32,32)) |
Pagination skip | Integer, default 0 |
Pagination take | Integer, default 20, max 100 |
API Schemas
The backend exposes OpenAPI documentation:
- Endpoint:
GET /api/docs/json - UI:
GET /api/docs
Frontend packages consume this schema with openapi-generator-cli to create typed clients and form validators.
Source Files
- Events module:
libs/scl/scl-events - Event types:
libs/access-control/src/lib/events - Outbox processor:
libs/scl/scl-events/src/lib/outbox