import type { GpsUpdateDto } from "../../dtos/index.js"; import type { NotificationCacheRepository } from "../../repositories/notification-cache.repository.js"; import { NotificationType, notificationPayloads, positionTriggers, } from "../../../data/mocks/notification-types.mock.js"; import { users } from "../../../data/mocks/users.mock.js"; export interface EvaluatedNotification { userId: number; type: NotificationType; title: string; body: string; } export class EvaluateNotificationUseCase { constructor(private readonly cache: NotificationCacheRepository) {} async execute(gps: GpsUpdateDto): Promise { const targets = users.filter((u) => u.routeId === gps.routeId); if (targets.length === 0) return []; const type = this.resolveType(gps); if (!type) return []; const payload = notificationPayloads[type]; const result: EvaluatedNotification[] = []; for (const user of targets) { const key = `${user.id}-${gps.routeId}-${type}`; if (await this.cache.wasSent(key)) continue; await this.cache.markSent(key); result.push({ userId: user.id, type, title: payload.title, body: payload.body, }); } return result; } private resolveType(gps: GpsUpdateDto): NotificationType | null { if (gps.status === "FALLA") { return NotificationType.MECHANICAL_FAILURE; } if (gps.positionId !== undefined && positionTriggers[gps.positionId]) { return positionTriggers[gps.positionId] ?? null; } return null; } }