- File model + migration: file metadata, content lives in object storage - IFileStorage port with local disk and S3-compatible (RustFS/MinIO) adapters - POST /files, GET /files/:id/download, DELETE /files/:id - MIME sniffed from content; only safe images served inline, nosniff header - FileOwnerRegistry: owner modules register to grant visibility and keep their files from GC; FileGcService removes orphaned files hourly - TransformResponseInterceptor passes StreamableFile through Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
17 lines
498 B
TypeScript
17 lines
498 B
TypeScript
import { StoredFile } from '../../domain/entities/stored-file.entity.js';
|
|
import { FileDto } from '../dto/file.dto.js';
|
|
|
|
export class FileApplicationMapper {
|
|
/** storageKey — деталь хранилища, наружу не отдаём */
|
|
static toDto(file: StoredFile): FileDto {
|
|
return {
|
|
id: file.id as string,
|
|
fileName: file.fileName,
|
|
mimeType: file.mimeType,
|
|
size: file.size,
|
|
uploaderId: file.uploaderId,
|
|
createdAt: file.createdAt,
|
|
};
|
|
}
|
|
}
|