Как можно создать пользовательскую конечную точку в Medusa

Medusa — это коммерческая платформа без головы с открытым исходным кодом, созданная с использованием Node.js. Ее цель — обеспечить разработчиков отличным опытом и безграничными возможностями настройки.

Ядром Medusa является безголовый сервер. Он предоставляет набор API, которые два других компонента, администратор и витрина, могут использовать для подключения к серверу и доступа к данным или манипулирования ими.

В этом руководстве вы узнаете, как создать пользовательские конечные точки на сервере Medusa для витрины и администратора.

Предварительные условия

Это руководство предполагает, что у вас уже установлен сервер Medusa. Если это не так, вы можете воспользоваться руководством по быстрому запуску, чтобы начать работу за несколько минут.

Обзор

Пользовательские конечные точки находятся в каталоге src/api в вашем бэкенде Medusa. Чтобы определить новую конечную точку, вы можете добавить файл index.js в каталог src/api. Этот файл должен экспортировать функцию, которая возвращает маршрутизатор Express.

Ваша конечная точка может находиться по любому пути.

Конечная точка витрины магазина

По соглашениям Medusa, все REST API Storefront имеют префикс /store. Например, /store/products позволяет вам получить продукты для отображения их на витрине вашего магазина.

Конечная точка администратора

Согласно принятым в Medusa правилам, все REST API для администраторов имеют префикс /admin. Например, /admin/products позволяет получить продукты, чтобы отобразить их на вашей витрине.

Реализация

Чтобы создать новую конечную точку, начните с создания нового файла в src/api под названием index.js. В базовом формате index.js должен выглядеть примерно так:

import { Router } from "express"

export default () => {
  const router = Router()

  router.get("/hello", (req, res) => {
    res.json({
      message: "Welcome to Your Store!",
    })
  })

  return router
}
Вход в полноэкранный режим Выйти из полноэкранного режима

Эта конечная точка доступна по пути /hello. Если вы хотите создать конечную точку для витрины магазина и следовать соглашениям Medusa, вы можете префикснуть путь с /store:

router.get("/store/hello", (req, res) => {
Вход в полноэкранный режим Выход из полноэкранного режима

Аналогично, вы можете создать конечную точку для администратора и следовать соглашениям Medusa, префикснув путь /admin:

router.get("/admin/hello", (req, res) => {
Вход в полноэкранный режим Выход из полноэкранного режима

Обеспечение доступа к конечным точкам из админки

Если вы настраиваете приборную панель администратора или создаете свою собственную, вам необходимо использовать библиотеку cors. Для каждого маршрута необходимо добавить запрос OPTIONS и обрабатывать запросы с помощью библиотеки cors.

Сначала необходимо импортировать конфигурации Medusa вместе с библиотекой cors:

import cors from "cors"
import { projectConfig } from "../../medusa-config"
Войти в полноэкранный режим Выйти из полноэкранного режима

Затем создайте объект, в котором будут храниться конфигурации CORS:

const corsOptions = {
  origin: projectConfig.admin_cors.split(","),
  credentials: true,
}
Войти в полноэкранный режим Выйти из полноэкранного режима

Наконец, для каждого добавленного маршрута создайте запрос OPTIONS:

router.options("/admin/hello", cors(corsOptions))
router.get("/admin/hello", (req, res) => {
  //...
})
Войти в полноэкранный режим Выйти из полноэкранного режима

Несколько конечных точек

Один и тот же файл

Вы можете добавить несколько конечных точек в src/api/index.js:

router.get("/admin/hello", (req, res) => {
  res.json({
    message: "Welcome to Your Store!",
  })
})

router.get("/admin/bye", (req, res) => {
  res.json({
    message: "Come back again!",
  })
})
Войти в полноэкранный режим Выход из полноэкранного режима

Несколько файлов

В качестве альтернативы вы можете добавить несколько файлов для каждой конечной точки или набора конечных точек для удобочитаемости и простоты обслуживания.

Чтобы сделать это с предыдущим примером, сначала создайте файл src/api/hello.js со следующим содержимым:

export default (router) => {
  router.get("/admin/hello", (req, res) => {
    res.json({
      message: "Welcome to Your Store!",
    })
  })
}
Вход в полноэкранный режим Выход из полноэкранного режима

Вы экспортируете функцию, которая получает Express-маршрутизатор в качестве параметра и добавляет к нему конечную точку admin/hello.

Далее создайте файл src/api/bye.js со следующим содержимым:

export default (router) => {
  router.get("/admin/bye", (req, res) => {
    res.json({
      message: "Come back again!",
    })
  })
}
Вход в полноэкранный режим Выход из полноэкранного режима

Снова экспортируется функция, которая получает Express-маршрутизатор в качестве параметра и добавляет к нему конечную точку admin/bye.

Наконец, в src/api/index.js импортируйте эти две функции в начало файла:

import helloRoute from "./hello"
import byeRoute from "./bye"
Войти в полноэкранный режим Выход из полноэкранного режима

и в экспортируемой функции вызовите каждую из функций, передав им маршрутизатор Express:

export default () => {
  const router = Router()

  helloRoute(router)
  byeRoute(router)

  return router
}
Войти в полноэкранный режим Выйти из полноэкранного режима

Использование сервисов

Сервисы в Medusa объединяют набор функциональных возможностей, связанных с моделью, в один класс. Затем вы можете использовать этот класс в любом месте вашего бэкенда. Например, вы можете использовать ProductService для получения продуктов или выполнения таких операций, как создание или обновление продукта.

Вы можете получить любой зарегистрированный сервис в вашей конечной точке с помощью req.scope.resolve, передав ей регистрационное имя сервиса.

Вот пример конечной точки, которая получает количество товаров в вашем магазине:

router.get("/admin/products/count", (req, res) => {
  const productService = req.scope.resolve("productService")

  productService.count().then((count) => {
    res.json({
      count,
    })
  })
})
Вход в полноэкранный режим Выход из полноэкранного режима

У productService есть метод count, который возвращает обещание. Это обещание соответствует количеству продуктов. Вы возвращаете JSON с количеством продуктов.

Защищенные маршруты

Защищенные маршруты — это маршруты, которые должны быть доступны только вошедшим в систему пользователям.

Чтобы сделать маршрут защищенным, сначала импортируйте промежуточное программное обеспечение authenticate:

import authenticate from "@medusajs/medusa/dist/api/middlewares/authenticate"
Войти в полноэкранный режим Выйти из полноэкранного режима

Затем добавьте промежуточное ПО к своему маршруту:

router.get("/store/products/count", authenticate(), (req, res) => {
  //...
})
Войти в полноэкранный режим Выйти из полноэкранного режима

Теперь только аутентифицированные клиенты или пользователи могут получить доступ к этой конечной точке.

Доступ к текущему клиенту

Вы можете получить идентификатор вошедшего клиента, используя req.user:

const id = req.user.customer_id
Вход в полноэкранный режим Выйти из полноэкранного режима

Чтобы получить данные клиента, вы можете использовать customerService:

const id = req.user.customer_id
const customerService = req.scope.resolve("customerService")

const customer = await customerService.retrieve(id)
Войти в полноэкранный режим Выход из полноэкранного режима

Доступ к текущему пользователю

Вы можете получить идентификатор вошедшего пользователя, используя req.user:

const id = req.user.userId
Войти в полноэкранный режим Выйти из полноэкранного режима

Чтобы получить данные пользователя, вы можете использовать userService:

const id = req.user.userId
const userService = req.scope.resolve("userService")

const user = await userService.retrieve(id)
Войти в полноэкранный режим Выход из полноэкранного режима

Параметры маршрута

Маршруты, которые вы создаете, получают 2 параметра. Первый — это абсолютный путь к корневому каталогу, из которого запущен ваш сервер. Второй — объект, содержащий параметры вашего плагина. Если ваш API маршрут не реализован в плагине, то это будет пустой объект.

export default (rootDirectory, pluginOptions) => {
  const router = Router()

  //...
}
Войти в полноэкранный режим Выход из полноэкранного режима

Что дальше?

Конечные точки — это лишь одна из важнейших частей архитектуры Medusa. Вот другие ресурсы, позволяющие узнать больше о сервере Medusa и его настройке:

  • Что такое подписчики и как их создать?
  • Что такое услуги и как их создать?
  • Как создать провайдера платежей?

Если у вас возникнут какие-либо проблемы или вопросы, связанные с Medusa, обращайтесь к команде Medusa через Discord.

Оцените статью
Procodings.ru
Добавить комментарий