我們的客製化模組在前面兩天已經建構的差不多了,有了 MODEL(資料模型)
與Link(關聯)
支撐著儲存與資料型態,還有了service(服務)
幫助我們包裝輸出。
今天我們要製作WorkFlow(流程)
來幫助對於後端系統被呼叫做一項特定的任務時,所進行一連串的動作 EX:查詢、運算等等,來完成任務。
然後今天就會以 Day17 規劃流程第一步,建立需求單,使用者先簡單建立需求單。
一個完整的workflow
可以包含很多的步驟,每一個步驟都被創建在src/workflows
的資料夾當中。
每一個步驟都是由createstep
起頭設定,這個函數是包含在 MedusaJS WorkFlow SDK
當中。
createstep
依照順序接受以下參數:
container
,container
主要目的就是透過它來解析 (resolve) 並使用這些 核心模組與自訂模組的的服務。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)
})
今天小小了解與創建 客製化MedusaJS
的workflow(流程)
是什麼?
他就是對於 既有模組、客製化模組、運算操作等等建立流程,在有需求被呼叫時候,可以流程化的循序遵循完成任務。
甚至還有補償函數當workflow(流程)
某一步驟出錯時候,讓每一個步驟執行各自的補償函數保護或者還原資料。
官方網站上還有其他更加深入的使用方式,各位了解後也可以去官網上看更深度的。
明天我們就來創建我們的 API
。