Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | 3x 3x 3x 3x 3x 3x 3x 4x 4x 4x 4x 3x 3x 1x 1x 2x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x | import { Injectable, Logger } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { DataSource, Repository } from 'typeorm';
import { WORK_ORDER_EVENTS, WorkOrderTriage } from '@app/contracts';
import { WorkOrderEventsOutbox } from '../messaging/work-order-events.outbox';
import { WorkOrder } from '../work-orders/work-order.entity';
@Injectable()
export class TriageService {
private readonly logger = new Logger(TriageService.name);
constructor(
@InjectRepository(WorkOrder)
private readonly repository: Repository<WorkOrder>,
private readonly dataSource: DataSource,
private readonly outbox: WorkOrderEventsOutbox,
) {}
async apply(workOrderId: string, triage: WorkOrderTriage): Promise<void> {
const workOrder = await this.repository.findOneBy({ id: workOrderId });
if (!workOrder) {
// The order can be gone by the time the event is consumed; nothing to do.
this.logger.warn(`work order ${workOrderId} not found, dropping triage`);
return;
}
if (workOrder.triagedAt) {
// Duplicate delivery of work-order.created — triage already applied.
this.logger.debug(`work order ${workOrderId} already triaged, skipping`);
return;
}
workOrder.triageCategory = triage.category;
workOrder.triageUrgency = triage.urgency;
workOrder.triageReasoning = triage.reasoning;
workOrder.triagedAt = new Date();
// Same atomic pair as the write path: triage columns and the triaged
// event commit together through the outbox.
await this.dataSource.transaction(async (manager) => {
const saved = await manager.save(workOrder);
await this.outbox.stage(manager, WORK_ORDER_EVENTS.TRIAGED, saved);
});
this.logger.log(
`work order ${workOrderId} triaged as ${triage.category}/${triage.urgency}`,
);
}
}
|