All files / apps/work-orders-service/src/triage triage.service.ts

100% Statements 28/28
100% Branches 16/16
100% Functions 3/3
100% Lines 26/26

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 493x 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}`,
    );
  }
}