From 57b30eab185dfe67061b2fa8c152d0d285134fc1 Mon Sep 17 00:00:00 2001 From: Claude Code Date: Fri, 20 Mar 2026 05:25:57 -0700 Subject: [PATCH] =?UTF-8?q?feat(content-safety):=20=E2=9C=A8=20Add=20video?= =?UTF-8?q?=20scanning=20DTO,=20entity,=20and=20services=20for=20unsafe=20?= =?UTF-8?q?content=20detection?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Lilith Autocommit --- .../backend-api/src/dto/scan-request.dto.ts | 2 +- .../backend-api/src/entities/safety-incident.entity.ts | 4 ++-- .../backend-api/src/services/incident-log.service.ts | 4 ++-- .../backend-api/src/services/video-scanner.service.ts | 8 ++++---- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/features/content-safety/backend-api/src/dto/scan-request.dto.ts b/features/content-safety/backend-api/src/dto/scan-request.dto.ts index 40e994ed2..1c3e3bac7 100644 --- a/features/content-safety/backend-api/src/dto/scan-request.dto.ts +++ b/features/content-safety/backend-api/src/dto/scan-request.dto.ts @@ -1,4 +1,4 @@ -import { IsUUID, IsOptional, IsArray, IsNumber } from 'class-validator'; +import { IsUUID, IsOptional, IsArray } from 'class-validator'; import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; export class ScanRequestDto { diff --git a/features/content-safety/backend-api/src/entities/safety-incident.entity.ts b/features/content-safety/backend-api/src/entities/safety-incident.entity.ts index 176676ca6..0a5b64db1 100644 --- a/features/content-safety/backend-api/src/entities/safety-incident.entity.ts +++ b/features/content-safety/backend-api/src/entities/safety-incident.entity.ts @@ -13,7 +13,7 @@ import { @Index(['decidedStatus']) export class SafetyIncident extends BaseEntity { @PrimaryGeneratedColumn('uuid') - override id: string; + declare id: string; @Column({ type: 'uuid' }) mediaFileId: string; @@ -43,5 +43,5 @@ export class SafetyIncident extends BaseEntity { reviewedAt?: Date; @CreateDateColumn() - override createdAt: Date; + declare createdAt: Date; } diff --git a/features/content-safety/backend-api/src/services/incident-log.service.ts b/features/content-safety/backend-api/src/services/incident-log.service.ts index 0e30dc483..0a3b7c02d 100644 --- a/features/content-safety/backend-api/src/services/incident-log.service.ts +++ b/features/content-safety/backend-api/src/services/incident-log.service.ts @@ -61,7 +61,7 @@ export class IncidentLogService { riskScore: scanResult.riskScore, scannedAt, }; - this.domainEvents.emit(MEDIA_SCAN_BLOCKED, event); + this.domainEvents.emit(MEDIA_SCAN_BLOCKED, event, mediaFileId); } else if (decision.status === ScanOutcomeStatus.QUARANTINED) { const event: MediaScanFlaggedEvent = { mediaFileId, @@ -71,7 +71,7 @@ export class IncidentLogService { nsfwScore: scanResult.nsfwScore, scannedAt, }; - this.domainEvents.emit(MEDIA_SCAN_FLAGGED, event); + this.domainEvents.emit(MEDIA_SCAN_FLAGGED, event, mediaFileId); } return incident; diff --git a/features/content-safety/backend-api/src/services/video-scanner.service.ts b/features/content-safety/backend-api/src/services/video-scanner.service.ts index 88c7e3ec5..0e2ca0a85 100644 --- a/features/content-safety/backend-api/src/services/video-scanner.service.ts +++ b/features/content-safety/backend-api/src/services/video-scanner.service.ts @@ -6,7 +6,7 @@ import { promisify } from 'util'; import { Injectable, Logger } from '@nestjs/common'; import { InjectQueue } from '@nestjs/bullmq'; -import { Queue, Worker, type Job } from 'bullmq'; +import { Queue, type Job } from 'bullmq'; import { ModeratorClientService, ScanDecision, type ScanResult } from '@lilith/imajin-moderator-client'; import { DomainEventsEmitter } from '@lilith/domain-events'; @@ -147,7 +147,7 @@ export class VideoScannerService { nsfwScore: result.nsfwScore, scannedAt, }; - this.domainEvents.emit(VIDEO_SCAN_COMPLETE_EVENT, completeEvent); + this.domainEvents.emit(VIDEO_SCAN_COMPLETE_EVENT, completeEvent, mediaFileId); if (result.status === ScanOutcomeStatus.BLOCKED) { const event: MediaScanBlockedEvent = { @@ -157,7 +157,7 @@ export class VideoScannerService { riskScore: result.riskScore, scannedAt, }; - this.domainEvents.emit(MEDIA_SCAN_BLOCKED, event); + this.domainEvents.emit(MEDIA_SCAN_BLOCKED, event, mediaFileId); } else if (result.status === ScanOutcomeStatus.QUARANTINED) { const event: MediaScanFlaggedEvent = { mediaFileId, @@ -167,7 +167,7 @@ export class VideoScannerService { nsfwScore: result.nsfwScore, scannedAt, }; - this.domainEvents.emit(MEDIA_SCAN_FLAGGED, event); + this.domainEvents.emit(MEDIA_SCAN_FLAGGED, event, mediaFileId); } } }