90 lines
2.5 KiB
TypeScript
90 lines
2.5 KiB
TypeScript
import {
|
|
EmailProviders,
|
|
type EmailProviderTypes,
|
|
type EmailServiceProvider,
|
|
type EmailPayload,
|
|
} from "./src/data";
|
|
import { ERROR_CODES, type Result } from "@pkg/result";
|
|
import { getError } from "@pkg/logger";
|
|
import { ResendEmailSvcProvider } from "./src/resend.provider";
|
|
|
|
export class EmailService {
|
|
private provider: EmailServiceProvider | null = null;
|
|
|
|
initialize(apiKey: string): Result<boolean> {
|
|
try {
|
|
this.provider = this.createProvider(EmailProviders.Resend, { apiKey });
|
|
return this.provider.initialize();
|
|
} catch (e) {
|
|
return {
|
|
error: getError(
|
|
{
|
|
code: ERROR_CODES.INTERNAL_SERVER_ERROR,
|
|
message: "Failed to initialize email provider",
|
|
userHint: "Please check email configuration",
|
|
detail: "Error creating email provider",
|
|
},
|
|
e,
|
|
),
|
|
};
|
|
}
|
|
}
|
|
|
|
private createProvider(
|
|
type: EmailProviderTypes,
|
|
config: { apiKey: string },
|
|
): EmailServiceProvider {
|
|
switch (type) {
|
|
case EmailProviders.Resend:
|
|
return new ResendEmailSvcProvider(config.apiKey);
|
|
default:
|
|
throw new Error(`Unsupported email provider: ${type}`);
|
|
}
|
|
}
|
|
|
|
async sendEmail(
|
|
payload: EmailPayload,
|
|
config: { apiKey: string },
|
|
): Promise<Result<boolean>> {
|
|
if (!this.provider) {
|
|
const initResult = this.initialize(config.apiKey);
|
|
if (initResult.error) return initResult;
|
|
}
|
|
return await this.provider!.sendEmail(payload);
|
|
}
|
|
|
|
async sendEmailWithReactTemplate(
|
|
payload: {
|
|
to: string;
|
|
subject: string;
|
|
from: string;
|
|
cc?: string[];
|
|
bcc?: string[];
|
|
attachments?: any[];
|
|
template: string;
|
|
templateData: any;
|
|
},
|
|
config: { apiKey: string },
|
|
): Promise<Result<boolean>> {
|
|
if (!this.provider) {
|
|
const initResult = this.initialize(config.apiKey);
|
|
if (initResult.error) return initResult;
|
|
}
|
|
|
|
// This assumes you're using Resend as the provider
|
|
if (this.provider instanceof ResendEmailSvcProvider) {
|
|
return await this.provider.sendEmailWithReact(payload);
|
|
} else {
|
|
return {
|
|
error: getError({
|
|
code: ERROR_CODES.INTERNAL_SERVER_ERROR,
|
|
message:
|
|
"React templates are only supported with the Resend provider",
|
|
userHint: "Please configure Resend as your email provider",
|
|
detail: "Current email provider doesn't support React templates",
|
|
}),
|
|
};
|
|
}
|
|
}
|
|
}
|