Command Palette

Search for a command to run...

Чтение опций

После того как администратор магазина настроил интеграцию, потребитель читает её опции в рантайме. Часто потребителем оказывается тот же пакет, что объявил интеграцию (например, платёжный провайдер, читающий собственные учётные данные), но это может быть и любой другой код: API-роут, подписчик или запланированная задача.

То, что вы получаете обратно, уже резолвнуто: опции расшифрованы, провалидированы и с применёнными значениями по умолчанию. Подробности см. в разделе Что значит «резолвнуто».

Два способа чтения

Какой API использовать, зависит от того, где выполняется ваш код.

Где выполняется кодКак читать
Провайдер в изолированном контейнере модуля или сервис модуля
Код с контейнером приложения или запроса (API-роуты, подписчики, запланированные задачи, лоадеры)
Шаг внутри вашего воркфлоу

Платёжный или логистический провайдер выполняется внутри изолированного контейнера своего модуля, поэтому не может резолвить модуль интеграций напрямую. Он использует , который запускает воркфлоу, дотягивающийся до контейнера приложения. Код, у которого контейнер уже есть, резолвит модуль и вызывает напрямую, без воркфлоу.

Хелпер

Используйте хелпер из провайдера, который не может достучаться до модуля интеграций напрямую.

Базовое использование

Передайте идентификатор, который объявляет ваша интеграция, и тип-параметр для типизированных опций. Например:

providers/payment-acme/services/acme-payment.ts
1import { resolveIntegrationOptions } from "@gorgo/medusa-integration"
2import type { AcmeOptions } from "../../../integration-acme/service"
3
4// внутри любого метода провайдера
5const options = await resolveIntegrationOptions<AcmeOptions>({
6 identifier: "acme"
7})

Возвращённый типизирован как , уже расшифрован и провалидирован.

Обращение к конкретному инстансу

Для провайдера, который поддерживает несколько инстансов, передайте . Обычно это собственный id регистрации вашего провайдера. Опустите его или передайте для инстанса по умолчанию:

providers/payment-acme/services/acme-payment.ts
1import { resolveIntegrationOptions } from "@gorgo/medusa-integration"
2import type { AcmeOptions } from "../../../integration-acme/service"
3
4// внутри любого метода провайдера
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)
5
6if (!options) {
7 // ещё не настроена: пропустите, используйте запасной вариант или верните понятную ошибку
8}

Метод сервиса

Когда у вашего кода уже есть контейнер, резолвите модуль и вызовите напрямую. Это подходит для API-роутов, подписчиков, запланированных задач и лоадеров, и никакой воркфлоу не задействуется. Например, в API-роуте:

api/admin/acme-payment/route.ts
1import { INTEGRATION_MODULE, IntegrationModuleService } from "@gorgo/medusa-integration"
2import type { MedusaRequest, MedusaResponse } from "@medusajs/framework/http"
3
4export async function GET(req: MedusaRequest, res: MedusaResponse) {
5 const integration: IntegrationModuleService = req.scope.resolve(INTEGRATION_MODULE)
6
7 const resolved = await integration.getResolvedOptions("acme")
8 if (!resolved) {
9 return res.status(503).send("Acme is not configured")
10 }
11
12 const options = resolved.options as AcmeOptions
13 const { provider_id, category, is_enabled } = resolved.meta
14}

возвращает . Значение представляет собой , где содержит , и . Результат означает, что интеграция не настроена, выключена или не заполнена.

Резолв внутри воркфлоу

Когда вы собираете собственный воркфлоу, используйте экспортируемый шаг вместо хелпера:

workflows/create-acme.ts
1import { createWorkflow, WorkflowResponse } from "@medusajs/framework/workflows-sdk"
2import { getResolvedIntegrationOptionsStep } from "@gorgo/medusa-integration"
3
4export const createAcmeWorkflow = createWorkflow("create-acme", () => {
5 const resolved = getResolvedIntegrationOptionsStep({
6 identifier: "acme"
7 })
8 return new WorkflowResponse(resolved)
9})

Также экспортируется самостоятельный . Именно его хелпер запускает внутри себя.

Что значит «резолвнуто»

Резолвнутые опции не совпадают с сырыми хранимыми значениями. При каждом резолве модуль делает три вещи:

  • расшифровывает секретные поля,
  • подтверждает, что интеграция включена и заполнена, то есть проходит полную валидацию,
  • применяет значения по умолчанию из дескриптора для опций, которые администратор так и не задал.

Если интеграция не настроена, выключена или не заполнена, она резолвится в . В этом случае хелпер бросает исключение или возвращает при . Частичные черновики никогда не попадают в рантайм.

Кэширование и актуальность

Резолвнутые опции ненадолго кэшируются в памяти, чтобы на горячих путях не перечитывать и не расшифровывать их при каждом вызове. Кэш инвалидируется при любом изменении интеграции (сохранении, включении, выключении или удалении), поэтому потребители подхватывают новую конфигурацию без редеплоя.

Материалы

Изменено 31 июля 2026 г.·Редактировать страницу