import { Injectable } from '@nestjs/common'; import { PrismaService } from '../../infrastructure/database/prisma.service'; /** * M-AI-02-05: 不可变 Job 输入快照 Repository * * 约束: * - 只允许 create + findByJobId * - 禁止 update / upsert / 覆盖已有 Snapshot * - Snapshot 内容必须在应用层通过安全扫描后方可写入 */ @Injectable() export class AiJobSnapshotRepository { constructor(private readonly prisma: PrismaService) {} /** * 创建快照。每个 Job 最多一个 Snapshot(jobId UNIQUE)。 * 若已存在则抛出 Prisma 唯一约束错误,调用方应处理。 */ async create(data: { jobId: string; jobType: string; schemaVersion: string; redactionVersion?: string; content: Record; contentHash?: string; expiresAt?: Date; }) { return this.prisma.aiJobSnapshot.create({ data }); } /** 按 jobId 查询快照 */ async findByJobId(jobId: string) { return this.prisma.aiJobSnapshot.findUnique({ where: { jobId }, }); } /** 删除过期的快照(由 cleanup service 调用) */ async deleteExpired(before: Date) { const result = await this.prisma.aiJobSnapshot.deleteMany({ where: { expiresAt: { lt: before } }, }); return result.count; } }