import { Injectable, Inject } from "@nestjs/common"; import { Logger } from "nestjs-pino"; import { EmailService } from "@bff/infra/email/email.service"; import { getErrorMessage } from "@bff/core/utils/error.util"; const ADMIN_EMAIL = "info@asolutions.co.jp"; export interface ApiCallLog { url: string; senddata?: Record | string; json?: Record | string; result: Record | string; } @Injectable() export class SimApiNotificationService { constructor( @Inject(Logger) private readonly logger: Logger, private readonly email: EmailService ) {} /** * Send API results notification email to admin */ async sendApiResultsEmail( subject: string, apiCalls: ApiCallLog[], additionalInfo?: string ): Promise { try { const lines: string[] = []; for (const call of apiCalls) { lines.push(`url: ${call.url}`); lines.push(""); if (call.senddata) { const senddataStr = typeof call.senddata === "string" ? call.senddata : JSON.stringify(call.senddata, null, 2); lines.push(`senddata: ${senddataStr}`); lines.push(""); } if (call.json) { const jsonStr = typeof call.json === "string" ? call.json : JSON.stringify(call.json, null, 2); lines.push(`json: ${jsonStr}`); lines.push(""); } const resultStr = typeof call.result === "string" ? call.result : JSON.stringify(call.result, null, 2); lines.push(`result: ${resultStr}`); lines.push(""); lines.push("---"); lines.push(""); } if (additionalInfo) { lines.push(additionalInfo); } await this.email.sendEmail({ to: ADMIN_EMAIL, from: ADMIN_EMAIL, subject, text: lines.join("\n"), }); this.logger.log("Sent API results notification email", { subject, to: ADMIN_EMAIL, callCount: apiCalls.length, }); } catch (err) { this.logger.warn("Failed to send API results notification email", { subject, error: getErrorMessage(err), }); } } /** * Send customer notification email */ async sendCustomerEmail( to: string, subject: string, body: string ): Promise { try { await this.email.sendEmail({ to, from: ADMIN_EMAIL, subject, text: body, }); this.logger.log("Sent customer notification email", { subject, to, }); } catch (err) { this.logger.warn("Failed to send customer notification email", { subject, to, error: getErrorMessage(err), }); } } /** * Build eSIM reissue customer email body */ buildEsimReissueEmail(customerName: string, simNumber: string, newEid: string): string { return `Dear ${customerName}, This is to confirm that your request to re-issue the SIM card ${simNumber} to the EID=${newEid} has been accepted. Please download the SIM plan, then follow the instructions to install the APN profile. eSIM plan download: https://www.asolutions.co.jp/uploads/pdf/esim.pdf APN profile instructions: https://www.asolutions.co.jp/sim-card/ With best regards, Assist Solutions Customer Support TEL: 0120-660-470 (Mon-Fri / 10AM-6PM) Email: ${ADMIN_EMAIL}`; } /** * Build physical SIM reissue customer email body */ buildPhysicalSimReissueEmail(customerName: string, simNumber: string): string { return `Dear ${customerName}, This is to confirm that your request to re-issue the SIM card ${simNumber} as a physical SIM has been accepted. You will be contacted by us again as soon as details about the shipping schedule can be disclosed (typically in 3-5 business days). With best regards, Assist Solutions Customer Support TEL: 0120-660-470 (Mon-Fri / 10AM-6PM) Email: ${ADMIN_EMAIL}`; } /** * Build cancellation notification email body for admin */ buildCancellationAdminEmail(params: { customerName: string; simNumber: string; serialNumber?: string; cancellationMonth: string; registeredEmail: string; otherEmail?: string; comments?: string; }): string { return `The following SONIXNET SIM cancellation has been requested. Customer name: ${params.customerName} SIM #: ${params.simNumber} Serial #: ${params.serialNumber || "N/A"} Cancellation month: ${params.cancellationMonth} Registered email address: ${params.registeredEmail} Other email address: ${params.otherEmail || "N/A"} Comments: ${params.comments || "N/A"}`; } }