/
viktorphp
/
back-socket
Обзор
Документация
Войти
/
viktorphp
/
back-socket
Код
Запросы
0
Задачи
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/entities/diary/diary-file.entity.ts
101 строка
3 KB
Иванов Виктор Евгеньевич
feature-diary: добавить функционал дневника
11 апр 2026, 11:13
11 апр 2026, 11:13
8167a94
Код
Авторство
О чём код?
import { Entity, Column, PrimaryGeneratedColumn, ManyToOne, CreateDateColumn, JoinColumn, Relation, } from 'typeorm'; // import type — только для TypeScript-типов, стирается в рантайме. // Это разрывает циклическую зависимость: // DiaryEntry -> (обычный import) -> DiaryFile // DiaryFile -> (import type, без рантайм-ссылки) -> DiaryEntry // Сам класс DiaryEntry получаем через require() внутри декоратора — лениво. import type { DiaryEntry } from './diary-entry.entity'; /** * Статусы OCR-распознавания файла. * - none: OCR не запрашивался * - pending: запрос отправлен, ожидаем результата * - done: распознавание завершено успешно * - error: при распознавании возникла ошибка */ export enum OcrStatus { NONE = 'none', PENDING = 'pending', DONE = 'done', ERROR = 'error', } /** * Сущность файла, прикреплённого к записи дневника. * Сам файл хранится в Yandex Object Storage. * В БД хранится только метаинформация и путь к файлу в хранилище. */ @Entity() export class DiaryFile { @PrimaryGeneratedColumn('uuid') id: string; /** * Запись дневника, к которой прикреплён файл. * onDelete: 'CASCADE' — при удалении записи удаляются все её файлы. */ // require() внутри стрелочной функции — ленивая загрузка класса DiaryEntry. // TypeORM вызовет эту функцию только после того, как оба модуля // полностью загрузятся, поэтому циклическая зависимость не возникает. @ManyToOne( () => require('./diary-entry.entity').DiaryEntry, (entry: DiaryEntry) => entry.files, { onDelete: 'CASCADE' }, ) @JoinColumn({ name: 'entryId' }) entry: Relation<DiaryEntry>; @Column() entryId: string; /** Оригинальное имя файла, как его загрузил пользователь */ @Column() originalName: string; /** MIME-тип файла, например: image/jpeg, application/pdf */ @Column() mimeType: string; /** * Ключ (путь) файла в Yandex Object Storage. * Формат: diary/{userId}/{entryId}/{uuid}-{filename} * Используется для получения или удаления файла из хранилища. */ @Column() storageKey: string; /** * Статус OCR-распознавания. * Изменяется асинхронно: none → pending → done/error. */ @Column({ type: 'enum', enum: OcrStatus, default: OcrStatus.NONE, }) ocrStatus: OcrStatus; /** * Текст, распознанный Yandex Vision OCR. * Заполняется асинхронно после запуска OCR. * Хранится отдельно для каждого файла. */ @Column({ type: 'text', nullable: true }) ocrText: string; /** Сообщение об ошибке OCR, если статус = error */ @Column({ type: 'text', nullable: true }) ocrError: string; /** Время загрузки файла */ @CreateDateColumn() createdAt: Date; }