feat: add Valkey integration for task queue (closes #98)
- Add ioredis package dependency for Redis-compatible operations - Create ValkeyModule as global NestJS module - Implement ValkeyService with task queue operations: - enqueue(task): Add tasks to FIFO queue - dequeue(): Get next task and update to PROCESSING status - getStatus(taskId): Retrieve task metadata and status - updateStatus(taskId, status): Update task state (COMPLETED/FAILED) - getQueueLength(): Monitor queue depth - clearQueue(): Queue management utility - healthCheck(): Verify Valkey connectivity - Add TaskDto, EnqueueTaskDto, UpdateTaskStatusDto interfaces - Implement TaskStatus enum (PENDING/PROCESSING/COMPLETED/FAILED) - Add comprehensive test suite with in-memory Redis mock (20 tests) - Integrate ValkeyModule into app.module.ts - Valkey Docker Compose service already configured in docker-compose.yml - VALKEY_URL environment variable already in .env.example - Add detailed README with usage examples and API documentation Technical Details: - Uses FIFO queue (RPUSH/LPOP for strict ordering) - Task metadata stored with 24-hour TTL - Lifecycle hooks for connection management (onModuleInit/onModuleDestroy) - Automatic retry with exponential backoff on connection errors - Global module - no explicit imports needed Tests verify: - Connection initialization and health checks - FIFO enqueue/dequeue behavior - Status lifecycle transitions - Concurrent task handling - Queue management operations - Complete task processing workflows
This commit is contained in:
47
apps/api/src/valkey/dto/task.dto.ts
Normal file
47
apps/api/src/valkey/dto/task.dto.ts
Normal file
@@ -0,0 +1,47 @@
|
||||
/**
|
||||
* Task status enum
|
||||
*/
|
||||
export enum TaskStatus {
|
||||
PENDING = 'pending',
|
||||
PROCESSING = 'processing',
|
||||
COMPLETED = 'completed',
|
||||
FAILED = 'failed',
|
||||
}
|
||||
|
||||
/**
|
||||
* Task metadata interface
|
||||
*/
|
||||
export interface TaskMetadata {
|
||||
[key: string]: unknown;
|
||||
}
|
||||
|
||||
/**
|
||||
* Task DTO for queue operations
|
||||
*/
|
||||
export interface TaskDto {
|
||||
id: string;
|
||||
type: string;
|
||||
data: TaskMetadata;
|
||||
status: TaskStatus;
|
||||
error?: string;
|
||||
createdAt?: Date;
|
||||
updatedAt?: Date;
|
||||
completedAt?: Date;
|
||||
}
|
||||
|
||||
/**
|
||||
* Enqueue task request DTO
|
||||
*/
|
||||
export interface EnqueueTaskDto {
|
||||
type: string;
|
||||
data: TaskMetadata;
|
||||
}
|
||||
|
||||
/**
|
||||
* Update task status DTO
|
||||
*/
|
||||
export interface UpdateTaskStatusDto {
|
||||
status: TaskStatus;
|
||||
error?: string;
|
||||
result?: TaskMetadata;
|
||||
}
|
||||
Reference in New Issue
Block a user