stashing code
This commit is contained in:
89
packages/email/index.ts
Normal file
89
packages/email/index.ts
Normal file
@@ -0,0 +1,89 @@
|
||||
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",
|
||||
}),
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user