Files
Autonomous-Bug-Explorer/src/modules/reporting/application/commands/GenerateReportCommand.ts

51 lines
1.5 KiB
TypeScript

import { UseCase } from '../../../../shared/application/UseCase';
import { Result, Ok, Err } from '../../../../shared/domain/Result';
import { EventBus } from '../../../../shared/application/EventBus';
import { IReportRepository } from '../../domain/ports/IReportRepository';
import { Report, ReportFilters } from '../../domain/entities/Report';
import { ReportFormat } from '../../domain/value-objects/ReportFormat';
export interface GenerateReportRequest {
title: string;
format: 'html' | 'json' | 'pdf';
filters?: ReportFilters;
}
export interface GenerateReportResponse {
reportId: string;
status: string;
}
export class GenerateReportCommand
implements UseCase<GenerateReportRequest, GenerateReportResponse, string>
{
constructor(
private readonly reportRepository: IReportRepository,
private readonly eventBus: EventBus
) {}
async execute(request: GenerateReportRequest): Promise<Result<GenerateReportResponse, string>> {
let format: ReportFormat;
try {
format = ReportFormat.fromString(request.format);
} catch {
return Err(`Invalid format: ${request.format}`);
}
const report = Report.create({
title: request.title,
format,
filters: request.filters ?? {},
});
await this.reportRepository.save(report);
const events = report.clearEvents();
for (const event of events) {
await this.eventBus.publish(event);
}
return Ok({ reportId: report.id.toString(), status: report.status.value });
}
}