Search for a command to run...
После того как администратор магазина настроил интеграцию, потребитель читает её опции в рантайме. Часто потребителем оказывается тот же пакет, что объявил интеграцию (например, платёжный провайдер, читающий собственные учётные данные), но это может быть и любой другой код: API-роут, подписчик или запланированная задача.
Какой API использовать, зависит от того, где выполняется ваш код.
Платёжный или логистический провайдер выполняется внутри изолированного контейнера своего модуля, поэтому не может резолвить модуль интеграций напрямую. Он использует , который запускает воркфлоу, дотягивающийся до контейнера приложения. Код, у которого контейнер уже есть, резолвит модуль и вызывает напрямую, без воркфлоу.
Используйте хелпер из провайдера, который не может достучаться до модуля интеграций напрямую.
Передайте идентификатор, который объявляет ваша интеграция, и тип-параметр для типизированных опций. Например:
providers/payment-acme/services/acme-payment.ts1import { resolveIntegrationOptions } from "@gorgo/medusa-integration"2import type { AcmeOptions } from "../../../integration-acme/service"34// внутри любого метода провайдера5const options = await resolveIntegrationOptions<AcmeOptions>({6 identifier: "acme"7})
Возвращённый типизирован как , уже расшифрован и провалидирован.
Для провайдера, который поддерживает несколько инстансов, передайте . Обычно это собственный id регистрации вашего провайдера. Опустите его или передайте для инстанса по умолчанию:
providers/payment-acme/services/acme-payment.ts1import { resolveIntegrationOptions } from "@gorgo/medusa-integration"2import type { AcmeOptions } from "../../../integration-acme/service"34// внутри любого метода провайдера5const options = await resolveIntegrationOptions<AcmeOptions>({6 identifier: "acme",7 instance_id: this.instanceId_,8})
По умолчанию хелпер бросает , если интеграция не настроена, выключена или не заполнена:
1// бросит исключение, если интеграцией ещё нельзя пользоваться2const options = await resolveIntegrationOptions<AcmeOptions>({3 identifier: "acme"4})
Передайте , чтобы вместо этого получить и обработать отсутствие настройки самостоятельно:
1const options = await resolveIntegrationOptions<AcmeOptions>(2 { identifier: "acme" },3 { optional: true }4)56if (!options) {7 // ещё не настроена: пропустите, используйте запасной вариант или верните понятную ошибку8}
Когда у вашего кода уже есть контейнер, резолвите модуль и вызовите напрямую. Это подходит для API-роутов, подписчиков, запланированных задач и лоадеров, и никакой воркфлоу не задействуется. Например, в API-роуте:
api/admin/acme-payment/route.ts1import { INTEGRATION_MODULE, IntegrationModuleService } from "@gorgo/medusa-integration"2import type { MedusaRequest, MedusaResponse } from "@medusajs/framework/http"34export async function GET(req: MedusaRequest, res: MedusaResponse) {5 const integration: IntegrationModuleService = req.scope.resolve(INTEGRATION_MODULE)67 const resolved = await integration.getResolvedOptions("acme")8 if (!resolved) {9 return res.status(503).send("Acme is not configured")10 }1112 const options = resolved.options as AcmeOptions13 const { provider_id, category, is_enabled } = resolved.meta14}
возвращает . Значение представляет собой , где содержит , и . Результат означает, что интеграция не настроена, выключена или не заполнена.
Когда вы собираете собственный воркфлоу, используйте экспортируемый шаг вместо хелпера:
workflows/create-acme.ts1import { createWorkflow, WorkflowResponse } from "@medusajs/framework/workflows-sdk"2import { getResolvedIntegrationOptionsStep } from "@gorgo/medusa-integration"34export const createAcmeWorkflow = createWorkflow("create-acme", () => {5 const resolved = getResolvedIntegrationOptionsStep({6 identifier: "acme"7 })8 return new WorkflowResponse(resolved)9})
Также экспортируется самостоятельный . Именно его хелпер запускает внутри себя.
Резолвнутые опции не совпадают с сырыми хранимыми значениями. При каждом резолве модуль делает три вещи:
Если интеграция не настроена, выключена или не заполнена, она резолвится в . В этом случае хелпер бросает исключение или возвращает при . Частичные черновики никогда не попадают в рантайм.
Резолвнутые опции ненадолго кэшируются в памяти, чтобы на горячих путях не перечитывать и не расшифровывать их при каждом вызове. Кэш инвалидируется при любом изменении интеграции (сохранении, включении, выключении или удалении), поэтому потребители подхватывают новую конфигурацию без редеплоя.