69 lines
2.1 KiB
TypeScript
Raw Normal View History

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<void> {
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,
};
}
);
}
}