63 lines
1.6 KiB
TypeScript
63 lines
1.6 KiB
TypeScript
import { Resend } from 'resend'
|
|
|
|
import {
|
|
AbstractNotificationProviderService,
|
|
MedusaError
|
|
} from '@medusajs/framework/utils'
|
|
import { ProviderSendNotificationDTO } from '@medusajs/types'
|
|
|
|
import { emailTemplates } from './email-templates'
|
|
|
|
type ResendOptions = {
|
|
api_key: string
|
|
from: string
|
|
}
|
|
|
|
class ResendNotificationProviderService extends AbstractNotificationProviderService {
|
|
static identifier = 'notification-resend'
|
|
private resendClient: Resend
|
|
private options: ResendOptions
|
|
|
|
constructor(_, options: ResendOptions) {
|
|
super()
|
|
this.validateModuleOptions(options)
|
|
this.resendClient = new Resend(options.api_key)
|
|
this.options = options
|
|
}
|
|
|
|
validateModuleOptions(options: ResendOptions) {
|
|
for (const key in options) {
|
|
if (!options[key]) {
|
|
throw new MedusaError(
|
|
MedusaError.Types.INVALID_DATA,
|
|
`No ${key} was provided in the ${ResendNotificationProviderService.identifier} options. Please add one.`
|
|
)
|
|
}
|
|
}
|
|
}
|
|
|
|
async send(notification: ProviderSendNotificationDTO) {
|
|
const { data, error } = await this.resendClient.emails.send({
|
|
from: notification.from?.trim() || this.options.from,
|
|
to: notification.to,
|
|
subject: notification.content?.subject as string,
|
|
react: emailTemplates[notification.template](notification.data)
|
|
})
|
|
|
|
if (error) {
|
|
throw new MedusaError(MedusaError.Types.UNEXPECTED_STATE, error.message)
|
|
}
|
|
|
|
if (!data) {
|
|
throw new MedusaError(
|
|
MedusaError.Types.UNEXPECTED_STATE,
|
|
'No data returned by resend client'
|
|
)
|
|
}
|
|
|
|
return data
|
|
}
|
|
}
|
|
|
|
export default ResendNotificationProviderService
|