- install @nestjs/schedule and register ScheduleModule in AppModule
- add ScenarioSchedulerService with two 1s interval jobs:
- activatePendingRuns: flips pending runs to in_progress
- processPendingStepRuns: executes next pending step run (login or exec),
runs optional validateCode, advances or fails the run accordingly
- on step pass: next waiting step becomes pending; last step pass flips run to pass
- on step fail: remaining steps set to cancelled, run flipped to fail
- add cancelled to RunStepStatus union
- add GET /scenarios/:id/runs with pagination and optional ?status= filter
29 lines
727 B
TypeScript
29 lines
727 B
TypeScript
import { ApiPropertyOptional } from '@nestjs/swagger';
|
|
import { Type } from 'class-transformer';
|
|
import { IsIn, IsInt, IsOptional, Min } from 'class-validator';
|
|
import { RunStatus } from '../scenario-run.entity';
|
|
|
|
export class RunsQueryDto {
|
|
@ApiPropertyOptional({ example: 1, default: 1 })
|
|
@IsOptional()
|
|
@Type(() => Number)
|
|
@IsInt()
|
|
@Min(1)
|
|
page?: number = 1;
|
|
|
|
@ApiPropertyOptional({ example: 20, default: 20 })
|
|
@IsOptional()
|
|
@Type(() => Number)
|
|
@IsInt()
|
|
@Min(1)
|
|
limit?: number = 20;
|
|
|
|
@ApiPropertyOptional({
|
|
enum: ['pending', 'in_progress', 'pass', 'fail'],
|
|
description: 'Filter by run status',
|
|
})
|
|
@IsOptional()
|
|
@IsIn(['pending', 'in_progress', 'pass', 'fail'])
|
|
status?: RunStatus;
|
|
}
|