2025-01-03 09:24:46 +08:00
|
|
|
import { PrismaClient, Resource } from '@prisma/client'
|
|
|
|
import { ProcessResult, ResourceProcessor } from '../types'
|
2025-01-06 18:30:16 +08:00
|
|
|
import { db, ResourceStatus } from '@nice/common'
|
2025-01-03 09:24:46 +08:00
|
|
|
import { Logger } from '@nestjs/common';
|
|
|
|
|
|
|
|
|
|
|
|
// Pipeline 类
|
|
|
|
export class ResourceProcessingPipeline {
|
|
|
|
private processors: ResourceProcessor[] = []
|
|
|
|
private logger = new Logger(ResourceProcessingPipeline.name);
|
|
|
|
|
|
|
|
constructor() { }
|
|
|
|
|
|
|
|
// 添加处理器
|
|
|
|
addProcessor(processor: ResourceProcessor): ResourceProcessingPipeline {
|
|
|
|
this.processors.push(processor)
|
|
|
|
return this
|
|
|
|
}
|
|
|
|
|
|
|
|
// 执行处理管道
|
|
|
|
async execute(resource: Resource): Promise<ProcessResult> {
|
|
|
|
let currentResource = resource
|
|
|
|
try {
|
|
|
|
this.logger.log(`开始处理资源: ${resource.id}`)
|
|
|
|
|
|
|
|
currentResource = await this.updateProcessStatus(
|
|
|
|
resource.id,
|
2025-01-06 18:30:16 +08:00
|
|
|
ResourceStatus.PROCESSING
|
2025-01-03 09:24:46 +08:00
|
|
|
)
|
|
|
|
this.logger.log(`资源状态已更新为处理中`)
|
|
|
|
|
|
|
|
for (const processor of this.processors) {
|
|
|
|
const processorName = processor.constructor.name
|
|
|
|
this.logger.log(`开始执行处理器: ${processorName}`)
|
|
|
|
|
|
|
|
currentResource = await this.updateProcessStatus(
|
|
|
|
currentResource.id,
|
2025-01-06 18:30:16 +08:00
|
|
|
processor.constructor.name as ResourceStatus
|
2025-01-03 09:24:46 +08:00
|
|
|
)
|
|
|
|
|
|
|
|
currentResource = await processor.process(currentResource)
|
|
|
|
this.logger.log(`处理器 ${processorName} 执行完成`)
|
|
|
|
|
|
|
|
currentResource = await db.resource.update({
|
|
|
|
where: { id: currentResource.id },
|
|
|
|
data: currentResource
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
currentResource = await this.updateProcessStatus(
|
|
|
|
currentResource.id,
|
2025-01-06 18:30:16 +08:00
|
|
|
ResourceStatus.PROCESSED
|
2025-01-03 09:24:46 +08:00
|
|
|
)
|
|
|
|
this.logger.log(`资源 ${resource.id} 处理成功 ${JSON.stringify(currentResource.metadata)}`)
|
|
|
|
|
|
|
|
return {
|
|
|
|
success: true,
|
|
|
|
resource: currentResource
|
|
|
|
}
|
|
|
|
} catch (error) {
|
|
|
|
this.logger.error(`资源 ${resource.id} 处理失败:`, error)
|
|
|
|
|
|
|
|
currentResource = await this.updateProcessStatus(
|
|
|
|
currentResource.id,
|
2025-01-06 18:30:16 +08:00
|
|
|
ResourceStatus.PROCESS_FAILED
|
2025-01-03 09:24:46 +08:00
|
|
|
)
|
|
|
|
|
|
|
|
return {
|
|
|
|
success: false,
|
|
|
|
resource: currentResource,
|
|
|
|
error: error as Error
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
private async updateProcessStatus(
|
|
|
|
resourceId: string,
|
2025-01-06 18:30:16 +08:00
|
|
|
status: ResourceStatus
|
2025-01-03 09:24:46 +08:00
|
|
|
): Promise<Resource> {
|
|
|
|
return db.resource.update({
|
|
|
|
where: { id: resourceId },
|
2025-01-06 18:30:16 +08:00
|
|
|
data: { status }
|
2025-01-03 09:24:46 +08:00
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|