localhost_oa_based/src/modules/system/task/task.dto.ts

106 lines
2.5 KiB
TypeScript
Raw Normal View History

2024-02-28 08:32:35 +08:00
import { BadRequestException } from '@nestjs/common'
import { ApiProperty, ApiPropertyOptional, IntersectionType, PartialType } from '@nestjs/swagger'
import {
IsDateString,
IsIn,
IsInt,
IsOptional,
IsString,
MaxLength,
Min,
MinLength,
Validate,
ValidateIf,
ValidationArguments,
ValidatorConstraint,
ValidatorConstraintInterface,
} from 'class-validator'
import * as parser from 'cron-parser'
import { isEmpty } from 'lodash'
import { PagerDto } from '~/common/dto/pager.dto'
// cron 表达式验证bull lib下引用了cron-parser
@ValidatorConstraint({ name: 'isCronExpression', async: false })
export class IsCronExpression implements ValidatorConstraintInterface {
validate(value: string, _args: ValidationArguments) {
try {
if (isEmpty(value))
throw new BadRequestException('cron expression is empty')
parser.parseExpression(value)
return true
}
catch (e) {
return false
}
}
defaultMessage(_args: ValidationArguments) {
return 'this cron expression ($value) invalid'
}
}
export class TaskDto {
@ApiProperty({ description: '任务名称' })
@IsString()
@MinLength(2)
@MaxLength(50)
name: string
@ApiProperty({ description: '调用的服务' })
@IsString()
@MinLength(1)
service: string
@ApiProperty({ description: '任务类别cron | interval' })
@IsIn([0, 1])
type: number
@ApiProperty({ description: '任务状态' })
@IsIn([0, 1])
status: number
@ApiPropertyOptional({ description: '开始时间', type: Date })
@IsDateString()
@ValidateIf(o => !isEmpty(o.startTime))
startTime: string
@ApiPropertyOptional({ description: '结束时间', type: Date })
@IsDateString()
@ValidateIf(o => !isEmpty(o.endTime))
endTime: string
@ApiPropertyOptional({
description: '限制执行次数,负数则无限制',
})
@IsOptional()
@IsInt()
limit?: number = -1
@ApiProperty({ description: 'cron表达式' })
@Validate(IsCronExpression)
@ValidateIf(o => o.type === 0)
cron: string
@ApiProperty({ description: '执行间隔,毫秒单位' })
@IsInt()
@Min(100)
@ValidateIf(o => o.type === 1)
every?: number
@ApiPropertyOptional({ description: '执行参数' })
@IsOptional()
@IsString()
data?: string
@ApiPropertyOptional({ description: '任务备注' })
@IsOptional()
@IsString()
remark?: string
}
export class TaskUpdateDto extends PartialType(TaskDto) {}
export class TaskQueryDto extends IntersectionType(PagerDto, PartialType(TaskDto)) {}