Data Migrations
The Data Migrations system manages database schema evolution and data transformations in Wrkbelt. Built on NestJS and Mongoose, it provides a robust framework for tracking and executing database changes.
Entity Relationship Diagram
Key Features
Migration Tracking
- Unique Names: Each migration has a unique identifier (e.g.,
001_seed-users_and_rbac) - Status Management: Tracks migration states (
pending,completed,rolled_back,failed) - Execution Metrics: Records execution time and completion status
- Timestamps: Automatic tracking of creation and update times
Migration Scripts
- Dependency Injection: Full access to NestJS dependency injection system
- Type Safety: TypeScript interfaces ensure consistent migration structure
- Bidirectional: Support for both
up()anddown()operations - Logging: Built-in logger for tracking migration progress
Implementation Details
Migration Interface
interface MigrationInterface {
unique_name: string; // Unique identifier
description: string; // Purpose description
logger: Logger; // NestJS logger
up(): Promise<void>; // Forward migration
down(): Promise<void>; // Rollback migration
}
Migration States
- pending: Migration hasn't been executed
- completed: Successfully executed
- rolled_back: Successfully reversed
- failed: Execution failed, needs attention
Example Migration
@Injectable()
export class SeedUsersAndRBAC implements MigrationInterface {
public readonly unique_name = '001_seed-users-and-rbac';
public readonly description = 'Seeds initial users and RBAC data';
constructor(
private userService: UserService,
private roleService: RoleService
) {}
async up(): Promise<void> {
// Forward migration logic
}
async down(): Promise<void> {
// Rollback logic
}
}
Design Principles
-
Atomicity
- Each migration is a single, atomic operation
- Rollback support for failed migrations
- Transaction support where possible
-
Dependency Management
- NestJS dependency injection
- Service-based operations
- Clean separation of concerns
-
Reliability
- Status tracking
- Error handling
- Execution metrics
- Detailed logging
-
Maintainability
- Clear naming conventions
- Descriptive metadata
- Version control friendly
- Self-documenting structure