Generated the following references: - `entities` - `file` - `fulfillment` - `inventory` - `js_client` - `medusa` - `medusa_config` - `medusa_react` - `modules` - `notification` - `payment` - `price_selection` - `pricing` - `product` - `search` - `services` - `stock_location` - `tax` - `tax_calculation` - `types` - `workflows` Co-authored-by: Oli Juhl <59018053+olivermrbl@users.noreply.github.com> Co-authored-by: Shahed Nasser <27354907+shahednasser@users.noreply.github.com>
229 lines
13 KiB
Plaintext
229 lines
13 KiB
Plaintext
---
|
||
displayed_sidebar: core
|
||
---
|
||
|
||
import ParameterTypes from "@site/src/components/ParameterTypes"
|
||
|
||
# INotificationService
|
||
|
||
## Overview
|
||
|
||
:::note[Prerequisites]
|
||
|
||
Before creating a Notification Provider, [install an event bus module](https://docs.medusajs.com/development/events/modules/redis).
|
||
|
||
:::
|
||
|
||
A Notification Provider is a provider that handles sending and resending of notifications.
|
||
|
||
To create a Notification Provider, create a TypeScript or JavaScript file in `src/services`. The name of the file is the name of the provider
|
||
(for example, `sendgrid.ts`). The file must export a class that extends the `AbstractNotificationService` class imported from `@medusajs/medusa`.
|
||
|
||
For example, create the file `src/services/email-sender.ts` with the following content:
|
||
|
||
```ts title="src/services/email-sender.ts"
|
||
import { AbstractNotificationService } from "@medusajs/medusa"
|
||
import { EntityManager } from "typeorm"
|
||
|
||
class EmailSenderService extends AbstractNotificationService {
|
||
protected manager_: EntityManager
|
||
protected transactionManager_: EntityManager
|
||
|
||
sendNotification(
|
||
event: string,
|
||
data: unknown,
|
||
attachmentGenerator: unknown
|
||
): Promise<{
|
||
to: string;
|
||
status: string;
|
||
data: Record<string, unknown>;
|
||
}> {
|
||
throw new Error("Method not implemented.")
|
||
}
|
||
resendNotification(
|
||
notification: unknown,
|
||
config: unknown,
|
||
attachmentGenerator: unknown
|
||
): Promise<{
|
||
to: string;
|
||
status: string;
|
||
data: Record<string, unknown>;
|
||
}> {
|
||
throw new Error("Method not implemented.")
|
||
}
|
||
|
||
}
|
||
|
||
export default EmailSenderService
|
||
```
|
||
|
||
---
|
||
|
||
## Identifier Property
|
||
|
||
The `NotificationProvider` entity has 2 properties: `identifier` and `is_installed`. The value of the `identifier` property in the notification provider
|
||
class is used when the Notification Provider is created in the database.
|
||
|
||
The value of this property is also used later when you want to subscribe the Notification Provider to events in a [Loader](https://docs.medusajs.com/development/loaders/overview).
|
||
|
||
For example:
|
||
|
||
```ts
|
||
class EmailSenderService extends AbstractNotificationService {
|
||
static identifier = "email-sender"
|
||
// ...
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## Properties
|
||
|
||
<ParameterTypes parameters={[{"name":"manager_","type":"`EntityManager`","description":"","optional":false,"defaultValue":"","expandable":false,"children":[]},{"name":"transactionManager_","type":"`undefined` \\| `EntityManager`","description":"","optional":false,"defaultValue":"","expandable":false,"children":[]},{"name":"__container__","type":"`any`","description":"","optional":false,"defaultValue":"","expandable":false,"children":[]},{"name":"__configModule__","type":"`Record<string, unknown>`","description":"","optional":true,"defaultValue":"","expandable":false,"children":[]},{"name":"__moduleDeclaration__","type":"`Record<string, unknown>`","description":"","optional":true,"defaultValue":"","expandable":false,"children":[]}]} sectionTitle="INotificationService"/>
|
||
|
||
___
|
||
|
||
## Accessors
|
||
|
||
### activeManager\_
|
||
|
||
#### Returns
|
||
|
||
<ParameterTypes parameters={[{"name":"EntityManager","type":"`EntityManager`","optional":false,"defaultValue":"","description":"","expandable":false,"children":[]}]} sectionTitle="activeManager_"/>
|
||
|
||
___
|
||
|
||
## Methods
|
||
|
||
### sendNotification
|
||
|
||
When an event is triggered that your Notification Provider is registered as a handler for, the [`NotificationService`](https://docs.medusajs.com/references/services/classes/services.NotificationService)
|
||
in the Medusa backend executes this method of your Notification Provider.
|
||
|
||
In this method, you can perform the necessary operation to send the Notification. For example, you can send an email to the customer when they place an order.
|
||
|
||
#### Example
|
||
|
||
```ts
|
||
class EmailSenderService extends AbstractNotificationService {
|
||
// ...
|
||
async sendNotification(
|
||
event: string,
|
||
data: any,
|
||
attachmentGenerator: unknown
|
||
): Promise<{
|
||
to: string;
|
||
status: string;
|
||
data: Record<string, unknown>;
|
||
}> {
|
||
if (event === "order.placed") {
|
||
// retrieve order
|
||
const order = await this.orderService.retrieve(data.id)
|
||
// TODO send email
|
||
|
||
console.log("Notification sent")
|
||
return {
|
||
to: order.email,
|
||
status: "done",
|
||
data: {
|
||
// any data necessary to send the email
|
||
// for example:
|
||
subject: "You placed a new order!",
|
||
items: order.items,
|
||
},
|
||
}
|
||
}
|
||
}
|
||
// ...
|
||
}
|
||
```
|
||
|
||
#### Parameters
|
||
|
||
<ParameterTypes parameters={[{"name":"event","type":"`string`","description":"The name of the event that was triggered. For example, `order.placed`.","optional":false,"defaultValue":"","expandable":false,"children":[]},{"name":"data","type":"`unknown`","description":"The data payload of the event that was triggered. For example, if the `order.placed` event is triggered,\nthe `eventData` object contains the property `id` which is the ID of the order that was placed. You can refer to the\n[Events reference](https://docs.medusajs.com/development/events/events-list) for information on all events and their payloads.","optional":false,"defaultValue":"","expandable":false,"children":[]},{"name":"attachmentGenerator","type":"`unknown`","description":"If you’ve previously register an attachment generator to the `NotificationService` using the\n[`registerAttachmentGenerator`](https://docs.medusajs.com/references/services/classes/services.NotificationService#registerattachmentgenerator) method,\nyou have access to it here. You can use the `attachmentGenerator` to generate on-demand invoices or other documents. The default value of this parameter is `null`.","optional":false,"defaultValue":"","expandable":false,"children":[]}]} sectionTitle="sendNotification"/>
|
||
|
||
#### Returns
|
||
|
||
<ParameterTypes parameters={[{"name":"Promise","type":"Promise<[ReturnedData](notification.ReturnedData.mdx)>","optional":false,"defaultValue":"","description":"The sending details.","expandable":false,"children":[{"name":"ReturnedData","type":"[ReturnedData](notification.ReturnedData.mdx)","optional":false,"defaultValue":"","description":"The details of a sent or resent notification.","expandable":false,"children":[{"name":"to","type":"`string`","description":"The receiver of the Notification. For example, if you sent an email to the customer then `to` is the email address of the customer.\nIn other cases, it might be a phone number or a username.","optional":false,"defaultValue":"","expandable":false,"children":[]},{"name":"status","type":"`string`","description":"The status of the sent notification. There are no restriction on the returned status.","optional":false,"defaultValue":"","expandable":false,"children":[]},{"name":"data","type":"`Record<string, unknown>`","description":"The data used to send the Notification. For example, if you sent an order confirmation email to the customer, then the `data` object\nmight include the order items or the subject of the email. This `data` is necessary if the notification is resent later as you can use the same data.","optional":false,"defaultValue":"","expandable":false,"children":[]}]}]}]} sectionTitle="sendNotification"/>
|
||
|
||
### resendNotification
|
||
|
||
This method is used to resend notifications, which is typically triggered by the
|
||
[Resend Notification API Route](https://docs.medusajs.com/api/admin#notifications\_postnotificationsnotificationresend).
|
||
|
||
#### Example
|
||
|
||
```ts
|
||
class EmailSenderService extends AbstractNotificationService {
|
||
// ...
|
||
async resendNotification(
|
||
notification: any,
|
||
config: any,
|
||
attachmentGenerator: unknown
|
||
): Promise<{
|
||
to: string;
|
||
status: string;
|
||
data: Record<string, unknown>;
|
||
}> {
|
||
// check if the receiver should be changed
|
||
const to: string = config.to || notification.to
|
||
|
||
// TODO resend the notification using the same data
|
||
// that is saved under notification.data
|
||
|
||
console.log("Notification resent")
|
||
return {
|
||
to,
|
||
status: "done",
|
||
data: notification.data, // make changes to the data
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
#### Parameters
|
||
|
||
<ParameterTypes parameters={[{"name":"notification","type":"`unknown`","description":"The original [Notification record](https://docs.medusajs.com/references/entities/classes/Notification) that was created after you sent the\nnotification with `sendNotification`. It includes the `to` and `data` attributes which are populated originally using the `to` and `data` properties of\nthe object you return in [sendNotification](notification.INotificationService.mdx#sendnotification).","optional":false,"defaultValue":"","expandable":false,"children":[]},{"name":"config","type":"`unknown`","description":"The new configuration used to resend the notification. The [Resend Notification API Route](https://docs.medusajs.com/api/admin#notifications\\_postnotificationsnotificationresend),\nallows you to pass a new `to` field. If specified, it will be available in this config object.","optional":false,"defaultValue":"","expandable":false,"children":[]},{"name":"attachmentGenerator","type":"`unknown`","description":"f you’ve previously register an attachment generator to the `NotificationService` using the\n[`registerAttachmentGenerator`](https://docs.medusajs.com/references/services/classes/services.NotificationService#registerattachmentgenerator) method,\nyou have access to it here. You can use the `attachmentGenerator` to generate on-demand invoices or other documents. The default value of this parameter is `null`.","optional":false,"defaultValue":"","expandable":false,"children":[]}]} sectionTitle="resendNotification"/>
|
||
|
||
#### Returns
|
||
|
||
<ParameterTypes parameters={[{"name":"Promise","type":"Promise<[ReturnedData](notification.ReturnedData.mdx)>","optional":false,"defaultValue":"","description":"The resend details.","expandable":false,"children":[{"name":"ReturnedData","type":"[ReturnedData](notification.ReturnedData.mdx)","optional":false,"defaultValue":"","description":"The details of a sent or resent notification.","expandable":false,"children":[{"name":"to","type":"`string`","description":"The receiver of the Notification. For example, if you sent an email to the customer then `to` is the email address of the customer.\nIn other cases, it might be a phone number or a username.","optional":false,"defaultValue":"","expandable":false,"children":[]},{"name":"status","type":"`string`","description":"The status of the sent notification. There are no restriction on the returned status.","optional":false,"defaultValue":"","expandable":false,"children":[]},{"name":"data","type":"`Record<string, unknown>`","description":"The data used to send the Notification. For example, if you sent an order confirmation email to the customer, then the `data` object\nmight include the order items or the subject of the email. This `data` is necessary if the notification is resent later as you can use the same data.","optional":false,"defaultValue":"","expandable":false,"children":[]}]}]}]} sectionTitle="resendNotification"/>
|
||
|
||
### withTransaction
|
||
|
||
#### Parameters
|
||
|
||
<ParameterTypes parameters={[{"name":"transactionManager","type":"`EntityManager`","description":"","optional":true,"defaultValue":"","expandable":false,"children":[]}]} sectionTitle="withTransaction"/>
|
||
|
||
#### Returns
|
||
|
||
<ParameterTypes parameters={[{"name":"this","type":"`this`","optional":false,"defaultValue":"","description":"","expandable":false,"children":[]}]} sectionTitle="withTransaction"/>
|
||
|
||
### shouldRetryTransaction\_
|
||
|
||
#### Parameters
|
||
|
||
<ParameterTypes parameters={[{"name":"err","type":"`Record<string, unknown>` \\| `object`","description":"","optional":false,"defaultValue":"","expandable":false,"children":[]}]} sectionTitle="shouldRetryTransaction_"/>
|
||
|
||
#### Returns
|
||
|
||
<ParameterTypes parameters={[{"name":"boolean","type":"`boolean`","optional":false,"defaultValue":"","description":"","expandable":false,"children":[]}]} sectionTitle="shouldRetryTransaction_"/>
|
||
|
||
### atomicPhase\_
|
||
|
||
Wraps some work within a transactional block. If the service already has
|
||
a transaction manager attached this will be reused, otherwise a new
|
||
transaction manager is created.
|
||
|
||
#### Type Parameters
|
||
|
||
<ParameterTypes parameters={[{"name":"TResult","type":"`object`","description":"","optional":false,"defaultValue":"","expandable":false,"children":[]},{"name":"TError","type":"`object`","description":"","optional":false,"defaultValue":"","expandable":false,"children":[]}]} sectionTitle="atomicPhase_"/>
|
||
|
||
#### Parameters
|
||
|
||
<ParameterTypes parameters={[{"name":"work","type":"(`transactionManager`: `EntityManager`) => Promise<TResult>","description":"the transactional work to be done","optional":false,"defaultValue":"","expandable":false,"children":[]},{"name":"isolationOrErrorHandler","type":"`IsolationLevel` \\| (`error`: TError) => Promise<void \\| TResult>","description":"the isolation level to be used for the work.","optional":true,"defaultValue":"","expandable":false,"children":[]},{"name":"maybeErrorHandlerOrDontFail","type":"(`error`: TError) => Promise<void \\| TResult>","description":"Potential error handler","optional":true,"defaultValue":"","expandable":false,"children":[]}]} sectionTitle="atomicPhase_"/>
|
||
|
||
#### Returns
|
||
|
||
<ParameterTypes parameters={[{"name":"Promise","type":"Promise<TResult>","optional":false,"defaultValue":"","description":"the result of the transactional work","expandable":false,"children":[{"name":"TResult","type":"TResult","optional":false,"defaultValue":"","description":"","expandable":false,"children":[]}]}]} sectionTitle="atomicPhase_"/>
|