iT邦幫忙

2025 iThome 鐵人賽

DAY 14
0
Modern Web

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

Day19 進階實作 - WorkFlow

  • 分享至 

  • xImage
  •  

我們的客製化模組在前面兩天已經建構的差不多了,有了 MODEL(資料模型)Link(關聯)支撐著儲存與資料型態,還有了service(服務)幫助我們包裝輸出。

今天我們要製作WorkFlow(流程)來幫助對於後端系統被呼叫做一項特定的任務時,所進行一連串的動作 EX:查詢、運算等等,來完成任務。

然後今天就會以 Day17 規劃流程第一步,建立需求單,使用者先簡單建立需求單。

建立步驟

一個完整的workflow可以包含很多的步驟,每一個步驟都被創建在src/workflows
的資料夾當中。

每一個步驟都是由createstep起頭設定,這個函數是包含在 MedusaJS WorkFlow SDK當中。

createstep依照順序接受以下參數:

  1. 唯一的名稱。
  2. 主要步驟,主要是一個函數,填寫您在此步驟要做的事情,主要會接受兩種參數,你的輸入以及containercontainer主要目的就是透過它來解析 (resolve) 並使用這些 核心模組與自訂模組的的服務。
  3. 補償步驟,該步驟會在workflow(工作流程)中某一步驟發生錯誤時,每一個步驟都會進行補償,可以讓流程發生錯誤時,數據還是保持狀態。

以下是我做出創建保健食品需求步驟 的範例 。
主要接受兩個參數使用者ID以及需求內容並呼叫service儲存。

//引入步驟與回應
import {
	createStep,
	StepResponse,
} from "@medusajs/framework/workflows-sdk"
//引入 Service、Module等等
import { SUPPLEMENT_MODULE } from "../../modules/supplements"
import SupplementModuleService from "../../modules/supplements/service"
import { Modules } from "@medusajs/framework/utils"

  
//引入需要建立 workflow 的函數
import {
	createWorkflow,
	WorkflowResponse,
} from "@medusajs/framework/workflows-sdk"

//引入事件觸發器,日後會說明....
import {
emitEventStep,
} from "@medusajs/medusa/core-flows"
import { container } from "@medusajs/framework"

//定義創建時需要的輸入型別
export type CreateSupplementDemandStepInput = {
user_id:string //使用者id
requirement: string //需求
}

//建立步驟
export const createDemandStep = createStep(
"create-demand-step",//步驟名稱

//第一個函數是正常步驟
async (input:CreateSupplementDemandStepInput, { container }) => {
	//透過container 解析模組
	const supplementModuleService: SupplementModuleService =  container.resolve(
	SUPPLEMENT_MODULE
)


//將需求送入資料庫
const demand = await supplementModuleService.createSupplements({requirement:input.requirement})

//建立關聯
const link = container.resolve("link")
await link.create([{
	[Modules.CUSTOMER]:{
	customer_id: input.user_id
	},
	[SUPPLEMENT_MODULE]:{
	supplement_id: demand.id
	}
}])  

return new StepResponse(demand, demand.id)
},


//補償函數
async (id: string, { container }) => {

const supplementModuleService: SupplementModuleService = container.resolve(
	SUPPLEMENT_MODULE
)
await supplementModuleService.deleteSupplements(id)

})

創建流程

接下來就是你所創建的步驟進行流程。在未來API端點接受要求時,我們就可以呼叫workflow(工作流程)進行一系列動作,甚至出現錯誤還可以進行補償。

MedusaJS 創建workflow(工作流程)也是需要 createWorkflow函數來定義,主要接受兩個參數:

  • 總流程獨特的名稱。
  • 總流程函式。

以下是我創建流程的範例(雖然只有一個step...)

//...接續上面的流程

//設定輸入的型別介面
type CreateDemandWorkflowInput = {
	user_id:string
	requirement: string
}

  
//創建流程
export const createDemandWorkflow = createWorkflow(
"create-demand",
(input: CreateDemandWorkflowInput) => {
	
	//第一個流程。
	const demand = createDemandStep(input)
    
	//發送事件。
	emitEventStep({
	eventName: "demand.created",
	data: {
	id: demand.id
	},
	})

return new WorkflowResponse(demand)

})

今日小解析

今天小小了解與創建 客製化MedusaJSworkflow(流程)是什麼?

他就是對於 既有模組、客製化模組、運算操作等等建立流程,在有需求被呼叫時候,可以流程化的循序遵循完成任務。

甚至還有補償函數當workflow(流程)某一步驟出錯時候,讓每一個步驟執行各自的補償函數保護或者還原資料。

官方網站上還有其他更加深入的使用方式,各位了解後也可以去官網上看更深度的。

明天預告

明天我們就來創建我們的 API


上一篇
Day18 進階實作 - 關聯
下一篇
Day20 進階實作 - 客製化 API 建立
系列文
Medusa.js 石化我的心21
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言