a2973be208
- เพิ่ม POST /api/ai/jobs + GET /api/ai/jobs/:jobId endpoints (FR-001, FR-002) - เพิ่ม BullMQ Worker MigrateDocumentWorker + OCR auto-detect (FR-003, FR-004) - เพิ่ม cleanup-temp-files + expire-pending-reviews workers (FR-005, FR-005a/b) - สร้าง SQL deltas: tags, correspondence_tags, alter migration_review_queue (FR-006, ADR-009) - เพิ่ม MigrationReviewService.commitRecord() + SELECT FOR UPDATE (FR-007, FR-007a) - เพิ่ม CASL permission migration.commit + MigrationReviewController (FR-007) - สร้าง TagsModule + TagsService + TagsController (US3) - สร้าง Migration Review Queue frontend page + ReviewQueueTable (US2) - อัปเดต n8n guide: deterministic Idempotency-Key + token pre-flight (FR-001a, FR-010a/b) - สร้าง spec.md, plan.md, tasks.md, data-model.md, contracts/, quickstart.md - สร้าง ADR-028 document + validation-report.md (PASS 32/32 tasks, 173/173 tests)
51 lines
1.8 KiB
TypeScript
51 lines
1.8 KiB
TypeScript
// File: src/modules/migration/migration-review.controller.ts
|
|
// Change Log:
|
|
// - 2026-05-22: Initial creation for US2 - Staging Migration Review Commit (T020b)
|
|
|
|
import { Controller, Post, Body, Headers, UseGuards } from '@nestjs/common';
|
|
import { MigrationReviewService } from './migration-review.service';
|
|
import { CommitMigrationReviewDto } from './dto/commit-migration-review.dto';
|
|
import { JwtAuthGuard } from '../../common/guards/jwt-auth.guard';
|
|
import { PermissionsGuard } from '../../common/auth/guards/permissions.guard';
|
|
import { RequirePermission } from '../../common/decorators/require-permission.decorator';
|
|
import { CurrentUser } from '../../common/decorators/current-user.decorator';
|
|
import { User } from '../user/entities/user.entity';
|
|
import { ValidationException } from '../../common/exceptions';
|
|
import {
|
|
ApiTags,
|
|
ApiOperation,
|
|
ApiBearerAuth,
|
|
ApiHeader,
|
|
} from '@nestjs/swagger';
|
|
|
|
@ApiTags('Migration Review')
|
|
@ApiBearerAuth()
|
|
@Controller('ai/migration')
|
|
export class MigrationReviewController {
|
|
constructor(private readonly reviewService: MigrationReviewService) {}
|
|
|
|
@Post('review')
|
|
@UseGuards(JwtAuthGuard, PermissionsGuard)
|
|
@RequirePermission('migration.commit')
|
|
@ApiOperation({
|
|
summary:
|
|
'Approve and commit a document from staging review queue into the live system',
|
|
})
|
|
@ApiHeader({
|
|
name: 'Idempotency-Key',
|
|
description: 'Unique key per commit request to prevent duplicate inserts',
|
|
required: true,
|
|
})
|
|
async commitRecord(
|
|
@Body() dto: CommitMigrationReviewDto,
|
|
@Headers('idempotency-key') idempotencyKey: string,
|
|
@CurrentUser() user: User
|
|
) {
|
|
if (!idempotencyKey) {
|
|
throw new ValidationException('Idempotency-Key header is required');
|
|
}
|
|
const userId = user?.user_id || 5;
|
|
return this.reviewService.commitRecord(dto, userId);
|
|
}
|
|
}
|