Какой сущностью в доменной модели является заявка на отчет?

«Какой сущностью в доменной модели является заявка на отчет?» — вопрос из категории Other, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Заявка на отчет (ReportRequest) — это агрегат или корневая сущность (Entity) в контексте сервиса отчетности. Она инкапсулирует состояние и данные всего запроса на генерацию отчета.

Типичные атрибуты:

  • id (UUID или Long) — уникальный идентификатор.
  • type (Enum) — тип формируемого отчета (PDF, Excel, CSV).
  • status (Enum) — состояние жизненного цикла: CREATED, PROCESSING, COMPLETED, FAILED.
  • parameters (JSON или Value Object) — критерии выборки данных (фильтры, диапазон дат).
  • resultUrl или resultFileId — ссылка на сгенерированный артефакт.
  • createdAt, updatedAt — метки времени.

Пример модели на Java с JPA:

@Entity
@Table(name = "report_requests")
public class ReportRequest {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Enumerated(EnumType.STRING)
    private ReportType type;

    @Enumerated(EnumType.STRING)
    private ReportStatus status = ReportStatus.CREATED;

    @Column(columnDefinition = "jsonb") // Для PostgreSQL
    private String parameters;

    private String resultObjectKey; // Ключ в S3/MinIO

    // Геттеры, сеттеры, бизнес-метод для запуска обработки
    public void startProcessing() {
        this.status = ReportStatus.PROCESSING;
    }
}

Почему агрегат? Заявка управляет своим инвариантом (например, нельзя завершить не начатую заявку) и может координировать работу внутренних объектов. Часто интегрируется с очередями (Kafka/RabbitMQ) для асинхронной обработки тяжелых отчетов.