iT邦幫忙

2025 iThome 鐵人賽

DAY 14
0
Modern Web

Medusa.js 石化我的心系列 第 23

Day23 進階實作 - 使用 Notification 與 Subscribers 觸發通知

  • 分享至 

  • xImage
  •  

對於我們的需求,我們已經大略完成了,從建立需求 -> 給予配單 -> 同意配單

但是如果過程中沒有提醒或通知,商家怎麼去知道有需求單了,客戶怎麼知道有回覆了,該不會還要每一天都去檢查吧。

所以今天我們就串接 Notification 模組到系統,然後用event事件觸發方式,進而實作。

MedusaJS 合作插件

Notification(通知) 模組 是 MedusaJS 的 infrastructure(建設層)
如果大家不理解,為何要分成一般Module(模組)infrastructure(建設層)
我的簡單理解是,建設層主要分類是有助於系統的架構、方便與速度等等的歸類。
(我的主張,事情不用想得太難!!!)

所以關於Notification(通知)不只是可以用來對客戶、對管理員,如果系統出現該警覺的事件,也可以通知維護的工程師。

通知的方式有千千百百種,比如信箱、簡訊、Line、Slack 等等都有,自己串接客製化都可以。但 MedusaJS 已經 有實作官方認證的插件,我們來介紹有哪些,用哪些方法通知的:

📊 SendGrid / MailChimp / Resend / Slack / Twilio SMS 功能比較

工具 定位 主要功能 適合對象 價格模式 常見用途
SendGrid Email API / Transactional Email 系統郵件寄送、SMTP relay、模板、追蹤報告 開發者、電商、SaaS 免費(100封/天),付費依寄送量計費 註冊驗證信、訂單通知信
MailChimp Email Marketing(行銷) 電子報、行銷自動化、分眾名單、設計工具 行銷人員、中小企業 免費(最多500聯絡人),付費依名單人數/月 電子報、促銷信、客戶維繫
Resend 開發者導向 Email API 簡單 API 寄信、React/JSX 模板、即時測試 新創團隊、前端工程師 免費(最多3000封/月),付費依寄送量計費 開發測試信件、快速串接寄信
Slack 團隊協作 / 即時通訊 頻道、私訊、Bot、Webhook通知 軟體團隊、公司組織 免費(訊息保留限制),付費依用戶/月 內部溝通、系統錯誤通知
Twilio SMS SMS / 通訊 API 發送簡訊、語音、WhatsApp訊息 全球企業、需要OTP驗證的系統 按量付費(如台灣每則簡訊約 $0.05~$0.07 USD) OTP驗證碼、出貨通知簡訊

實作就來串接 SendGrid

在使用 SendGrid 之前,有三個必要條件:

有了上面數據之後,我們到先去 Dynamic Template 建立信件的模板

https://ithelp.ithome.com.tw/upload/images/20251008/20178157smsA0HxZwR.png

好了,我們可以開始串接信件模板了!!

第一步:增加設定

medusa-config.ts加入使用SendGrid設定值

module.exports = defineConfig({
  // ...
  modules: [
    {
      resolve: "@medusajs/medusa/notification",
      options: {
        providers: [
          // ...
          {
            resolve: "@medusajs/medusa/notification-sendgrid",
            id: "sendgrid",
            options: {
              channels: ["email"],
              api_key: process.env.SENDGRID_API_KEY,
              from: process.env.SENDGRID_FROM,
            },
          },
        ],
      },
    },
  ],
})

第二步:環境變數

API KEY 以及 專門送信箱帳號 填入環境變數

SENDGRID_API_KEY=<YOUR_SENDGRID_API_KEY>
SENDGRID_FROM=<YOUR_SENDGRID_FROM>

第三步:建立事件監聽及使用Notification函式


import type {
SubscriberArgs,
SubscriberConfig,
} from "@medusajs/framework"

import { Modules } from "@medusajs/framework/utils"

  
//建立事件
export default async function demandCreateHandler({
	event,
	container
}: SubscriberArgs<{ id: string }>) {

const notificationModuleService = container.resolve(Modules.NOTIFICATION)

const DemandId = event.data.id
console.log(`The demand of custome supplement ${DemandId} was created`)


//通知函數
await notificationModuleService.createNotifications({
	to: "xxxx@gmail.com",
	channel: "email",
	template: "d-dfe4475ce135482a8fed5b9d1c3ef2eb",
	data: {
		demandId:DemandId,
		replay:"以建立"
		},

	})

}

  
//建立事件名稱
export const config: SubscriberConfig = {
event: "demand.created",
}

第四步:發送事件

回到我們需求創建的workflow(工作流程),除了上次建立需求單新增至資料庫,今天要在多一個發送事件。

export const createDemandWorkflow = createWorkflow(
	"create-demand",
	(input: CreateDemandWorkflowInput) => {
		const demand = createDemandStep(input)

  

		//發送事件提醒有人創建了需求
		emitEventStep({
		eventName: "demand.created",
		data: {
			id: demand.id
		},
		})
	return new WorkflowResponse(demand)

	}

)

下集預告

下集我會到大家導讀一下官方說明說怎麼去加入第三方金流當作模組。


上一篇
Day22 進階實作 - 自製儀表板
下一篇
Day24 進階導讀 - 了解怎麼 製作第三方付款模組
系列文
Medusa.js 石化我的心24
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言