import { KavenegarService } from "@fraybabak/kavenegar_nest"; import { Injectable, Logger } from "@nestjs/common"; import { isKavenegarSuccess, KavenegarNormalized, normalizeKavenegarBody, safeJsonStringify, unwrapKavenegarTransportError, } from "./kavenegar-response"; import { SmsProviderException, SmsTransportException, } from "./sms-provider.exception"; export interface SendMessage { message: string; // sender: string; receptor: string; } export interface VerifyLookUpMessage { template: string; token: string; token2?: string; token3?: string; receptor: string; } @Injectable() export class SmsManagerService { private readonly logger = new Logger(SmsManagerService.name); constructor(private readonly sender: KavenegarService) {} async sendMessage(data: SendMessage) { try { const body = await this.sender.Send({ sender: "10008663", ...data, }); if (!isKavenegarSuccess(body)) { const normalized = normalizeKavenegarBody(body); this.logProviderRejection("send", data.receptor, undefined, normalized); throw new SmsProviderException("send", { receptor: data.receptor, providerBody: body, normalized, }); } this.logger.log( `Kavenegar Send ok receptor=${data.receptor} status=200`, ); return body; } catch (e) { if (e instanceof SmsProviderException) throw e; const detail = safeJsonStringify(unwrapKavenegarTransportError(e)); this.logger.error( `Kavenegar Send transport error receptor=${data.receptor} detail=${detail}`, ); throw new SmsTransportException("send", { receptor: data.receptor }, e); } } async verifyLookUp(data: VerifyLookUpMessage) { try { const body = await this.sender.verifyLookup(data); if (!isKavenegarSuccess(body)) { const normalized = normalizeKavenegarBody(body); this.logProviderRejection( "verifyLookUp", data.receptor, data.template, normalized, ); throw new SmsProviderException("verifyLookup", { receptor: data.receptor, template: data.template, providerBody: body, normalized, }); } this.logger.log( `Kavenegar verifyLookUp ok receptor=${data.receptor} template=${data.template} status=200`, ); return body; } catch (e) { if (e instanceof SmsProviderException) throw e; const detail = safeJsonStringify(unwrapKavenegarTransportError(e)); this.logger.error( `Kavenegar verifyLookUp transport error receptor=${data.receptor} template=${data.template} detail=${detail}`, ); throw new SmsTransportException( "verifyLookup", { receptor: data.receptor, template: data.template }, e, ); } } private logProviderRejection( op: "send" | "verifyLookUp", receptor: string, template: string | undefined, normalized: KavenegarNormalized, ) { const t = template != null && template !== "" ? ` template=${template}` : ""; this.logger.warn( `Kavenegar ${op} rejected receptor=${receptor}${t} providerStatus=${normalized.httpLikeStatus ?? "unknown"} providerMessage=${normalized.message ?? "n/a"} body=${normalized.raw}`, ); } }