180 lines
4.6 KiB
TypeScript
180 lines
4.6 KiB
TypeScript
|
|
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, unknown> | string;
|
||
|
|
json?: Record<string, unknown> | string;
|
||
|
|
result: Record<string, unknown> | 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<void> {
|
||
|
|
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<void> {
|
||
|
|
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"}`;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|