Files
medusa-store/docs/content/development/events/create-subscriber.md
Shahed Nasser 1decaa27c7 docs: publish restructure (#3496)
* docs: added features and guides overview page

* added image

* added version 2

* added version 3

* added version 4

* docs: implemented new color scheme

* docs: redesigned sidebar (#3193)

* docs: redesigned navbar for restructure (#3199)

* docs: redesigned footer (#3209)

* docs: redesigned cards (#3230)

* docs: redesigned admonitions (#3231)

* docs: redesign announcement bar (#3236)

* docs: redesigned large cards (#3239)

* docs: redesigned code blocks (#3253)

* docs: redesigned search modal and page (#3264)

* docs: redesigned doc footer (#3268)

* docs: added new sidebars + refactored css and assets (#3279)

* docs: redesigned api reference sidebar

* docs: refactored css

* docs: added code tabs transition

* docs: added new sidebars

* removed unused assets

* remove unusued assets

* Fix deploy errors

* fix incorrect link

* docs: fixed code responsivity + missing icons (#3283)

* docs: changed icons (#3296)

* docs: design fixes to the sidebar (#3297)

* redesign fixes

* docs: small design fixes

* docs: several design fixes after restructure (#3299)

* docs: bordered icon fixes

* docs: desgin fixes

* fixes to code blocks and sidebar scroll

* design adjustments

* docs: restructured homepage (#3305)

* docs: restructured homepage

* design fixes

* fixed core concepts icon

* docs: added core concepts page (#3318)

* docs: restructured homepage

* design fixes

* docs: added core concepts page

* changed text of different components

* docs: added architecture link

* added missing prop for user guide

* docs: added regions overview page (#3327)

* docs: added regions overview

* moved region pages to new structure

* docs: fixed description of regions architecture page

* small changes

* small fix

* docs: added customers overview page (#3331)

* docs: added regions overview

* moved region pages to new structure

* docs: fixed description of regions architecture page

* small changes

* small fix

* docs: added customers overview page

* fix link

* resolve link issues

* docs: updated regions architecture image

* docs: second-iteration fixes (#3347)

* docs: redesigned document

* design fixes

* docs: added products overview page (#3354)

* docs: added carts overview page (#3363)

* docs: added orders overview (#3364)

* docs: added orders overview

* added links in overview

* docs: added vercel redirects

* docs: added soon badge for cards (#3389)

* docs: resolved feedback changes + organized troubleshooting pages (#3409)

* docs: resolved feedback changes

* added extra line

* docs: changed icons for restructure (#3421)

* docs: added taxes overview page (#3422)

* docs: added taxes overview page

* docs: fix sidebar label

* added link to taxes overview page

* fixed link

* docs: fixed sidebar scroll (#3429)

* docs: added discounts overview (#3432)

* docs: added discounts overview

* fixed links

* docs: added gift cards overview (#3433)

* docs: added price lists overview page (#3440)

* docs: added price lists overview page

* fixed links

* docs: added sales channels overview page (#3441)

* docs: added sales overview page

* fixed links

* docs: added users overview (#3443)

* docs: fixed sidebar border height (#3444)

* docs: fixed sidebar border height

* fixed svg markup

* docs: added possible solutions to feedback component (#3449)

* docs: added several overview pages + restructured files (#3463)

* docs: added several overview pages

* fixed links

* docs: added feature flags + PAK overview pages (#3464)

* docs: added feature flags + PAK overview pages

* fixed links

* fix link

* fix link

* fixed links colors

* docs: added strategies overview page (#3468)

* docs: automated upgrade guide (#3470)

* docs: automated upgrade guide

* fixed vercel redirect

* docs: restructured files in docs codebase (#3475)

* docs: restructured files

* docs: fixed eslint exception

* docs: finished restructure loose-ends (#3493)

* fixed uses of backend

* docs: finished loose ends

* eslint fixes

* fixed links

* merged master

* added update instructions for v1.7.12
2023-03-16 17:03:10 +02:00

3.1 KiB
Raw Blame History

description, addHowToData
description addHowToData
Learn how to create a subscriber in Medusa. You can use subscribers to implement functionalities like sending an order confirmation email. true

How to Create a Subscriber

In this document, youll learn how to create a Subscriber in Medusa that listens to events to perform an action.

Prerequisites

Medusa's event system works by pushing data to a Queue that each handler then gets notified of. The queuing system is based on Redis, so it's required for subscribers to work.

You can learn how to install Redis and configure it with Medusa before you get started.


Implementation

A subscriber is a TypeScript or JavaScript file that is created under src/subscribers. Its file name, by convension, should be the class name of the subscriber without the word Subscriber. For example, if the subscriber is HelloSubscriber, the file name should be hello.ts.

After creating the file under src/subscribers, in the constructor of your subscriber, listen to events using eventBusService.subscribe , where eventBusService is a service injected into your subscribers constructor.

The eventBusService.subscribe method receives the name of the event as a first parameter and as a second parameter a method in your subscriber that will handle this event.

For example, here is the OrderNotifierSubscriber class created in src/subscribers/orderNotifier.ts:

class OrderNotifierSubscriber {
  constructor({ eventBusService }) {
    eventBusService.subscribe("order.placed", this.handleOrder)
  }

  handleOrder = async (data) => {
    console.log("New Order: " + data.id)
  }
}

export default OrderNotifierSubscriber

This subscriber registers the method handleOrder as one of the handlers of the order.placed event. The method handleOrder will be executed every time an order is placed. It receives the order ID in the data parameter. You can then use the orders details to perform any kind of task you need.

:::note

The data object won't contain other order data. Only the ID of the order. You can retrieve the order information using the orderService.

:::


Using Services in Subscribers

You can access any service through the dependencies injected to your subscribers constructor.

For example:

class OrderNotifierSubscriber {
  constructor({ productService, eventBusService }) {
      this.productService = productService

      eventBusService.subscribe(
        "order.placed", 
        this.handleOrder
      )
  }
  // ...
}

You can then use this.productService anywhere in your subscribers methods. For example:

class OrderNotifierSubscriber {
  // ...
  handleOrder = async (data) => {
    // ...
    const product = this.productService.list()
  }
}

:::note

When using attributes defined in the subscriber, such as the productService in the example above, you must use an arrow function to declare the method. Otherwise, the attribute will be undefined when used.

:::


See Also