feat: allow html content for notifications (#9613)

* feat: allow passing provider specific metadata to notification module

* changed providerContext to snake cased

* rename provider_context to content
This commit is contained in:
Christian
2024-10-18 11:36:22 +02:00
committed by GitHub
parent 2a98be6b65
commit a0b747e117
7 changed files with 121 additions and 2 deletions
@@ -85,6 +85,30 @@ moduleIntegrationTestRunner<INotificationModuleService>({
)
})
it("should send a notification and don't store the content in the database", async () => {
const notification = {
to: "admin@medusa.com",
template: "signup-template",
channel: "email",
data: {},
content: {
html: "<p>Welcome to medusa</p>",
},
}
const result = await service.createNotifications(notification)
const dbEntry = await service.retrieveNotification(result.id)
expect(dbEntry).toEqual(
expect.objectContaining({
provider_id: "test-provider",
external_id: "external_id",
status: NotificationStatus.SUCCESS,
})
)
expect(dbEntry).not.toHaveProperty("content")
})
it("should emit an event when a notification is created", async () => {
const notification = {
to: "admin@medusa.com",
@@ -6,6 +6,7 @@ jest.setTimeout(100000)
describe.skip("Sendgrid notification provider", () => {
let sendgridService: SendgridNotificationService
let emailTemplate = ""
let emailContent = ""
let to = ""
beforeAll(() => {
sendgridService = new SendgridNotificationService(
@@ -19,6 +20,7 @@ describe.skip("Sendgrid notification provider", () => {
)
emailTemplate = process.env.SENDGRID_TEST_TEMPLATE ?? ""
emailContent = `<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html dir="ltr" xmlns="http://www.w3.org/1999/xhtml" xmlns:o="urn:schemas-microsoft-com:office:office"><head><meta charset="UTF-8"></head><body>Welcome to medusa</body></html>`
to = process.env.SENDGRID_TEST_TO ?? ""
})
@@ -35,6 +37,41 @@ describe.skip("Sendgrid notification provider", () => {
expect(resp).toEqual({})
})
it("sends an email with the specified email body", async () => {
const resp = await sendgridService.send({
to,
channel: "email",
template: "signup-template",
content: {
subject: "It's a test",
html: emailContent,
},
data: {
username: "john-doe",
},
})
expect(resp).toEqual({})
})
it("throws an exception if the subject is not present for html content", async () => {
const error = await sendgridService
.send({
to,
template: "signup-template",
channel: "email",
content: { html: emailContent },
data: {
username: "john-doe",
},
})
.catch((e) => e)
expect(error.message).toEqual(
"Failed to send email: 400 - The subject is required. You can get around this requirement if you use a template with a subject defined or if every personalization has a subject defined."
)
})
it("throws an exception if the template does not exist", async () => {
const error = await sendgridService
.send({
@@ -13,6 +13,8 @@ type InjectedDependencies = {
logger: Logger
}
type MailContent = Required<Omit<NotificationTypes.NotificationContent, "text">>
interface SendgridServiceConfig {
apiKey: string
from: string
@@ -59,14 +61,32 @@ export class SendgridNotificationService extends AbstractNotificationProviderSer
const from = notification.from?.trim() || this.config_.from
let mailContent:
| MailContent
| {
templateId: string
}
if ("content" in notification && !!notification.content) {
mailContent = {
subject: notification.content?.subject,
html: notification.content?.html,
} as MailContent
} else {
// we can't mix html and templates for sendgrid
mailContent = {
templateId: notification.template,
}
}
const message: sendgrid.MailDataRequired = {
to: notification.to,
from: from,
templateId: notification.template,
dynamicTemplateData: notification.data as
| { [key: string]: any }
| undefined,
attachments: attachments,
...mailContent,
}
try {