import { Injectable, Inject, BadRequestException } from "@nestjs/common"; import { Logger } from "nestjs-pino"; import { FreebitOrchestratorService } from "@bff/integrations/freebit/services/freebit-orchestrator.service"; import { SimValidationService } from "./sim-validation.service"; import { getErrorMessage } from "@bff/core/utils/error.util"; import type { SimCancelRequest } from "@customer-portal/domain/sim"; import { SimScheduleService } from "./sim-schedule.service"; import { SimActionRunnerService } from "./sim-action-runner.service"; @Injectable() export class SimCancellationService { constructor( private readonly freebitService: FreebitOrchestratorService, private readonly simValidation: SimValidationService, private readonly simSchedule: SimScheduleService, private readonly simActionRunner: SimActionRunnerService, @Inject(Logger) private readonly logger: Logger ) {} /** * Cancel SIM service */ async cancelSim( userId: string, subscriptionId: number, request: SimCancelRequest = {} ): Promise { let account = ""; await this.simActionRunner.run( "Cancel SIM", { baseContext: { userId, subscriptionId, scheduledAt: request.scheduledAt, }, enrichSuccess: result => ({ account: result.account, runDate: result.runDate, }), enrichError: () => ({ account, }), }, async () => { const validation = await this.simValidation.validateSimSubscription(userId, subscriptionId); account = validation.account; const scheduleResolution = this.simSchedule.resolveScheduledDate(request.scheduledAt); await this.freebitService.cancelSim(account, scheduleResolution.date); this.logger.log(`Successfully cancelled SIM for subscription ${subscriptionId}`, { userId, subscriptionId, account, runDate: scheduleResolution.date, }); return { account, runDate: scheduleResolution.date, }; } ); } }