Розробка кастомного сервісу Medusa.js

Наша компанія займається розробкою, підтримкою та обслуговуванням сайтів будь-якої складності. Від простих односторінкових сайтів до масштабних кластерних систем, побудованих на мікро сервісах. Досвід розробників підтверджено сертифікатами від вендорів.

Розробка та обслуговування будь-яких видів сайтів:

Інформаційні сайти або веб-програми
Сайти візитки, landing page, корпоративні сайти, онлайн каталоги, квіз, промо-сайти, блоги, ресурси новин, інформаційні портали, форуми, агрегатори
Сайти або веб-програми електронної комерції
Інтернет-магазини, B2B-портали, маркетплейси, онлайн-обмінники, кешбек-сайти, біржі, дропшиппінг-платформи, парсери товарів
Веб-програми для управління бізнес-процесами
CRM-системи, ERP-системи, корпоративні портали, системи управління виробництвом, парсери інформації
Сайти або веб-програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, конструктори сайтів, портали надання електронних послуг, відеохостинги, тематичні портали

Це лише деякі з технічних типів сайтів, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Пропоновані послуги
Показано 1 з 1 послугУсі 2065 послуг
Розробка кастомного сервісу Medusa.js
Середня
~3-5 робочих днів
Часті питання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1171
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    874
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1094
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    831
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851

Розробка кастомного сервісу Medusa.js

У Medusa 2.x сервіс — це TypeScript-клас, зареєстрований в IoC-контейнері та доступний через container.resolve(). Кастомні сервіси можуть інкапсулювати бізнес-логіку, інтегрувати зовнішні API, оркеструвати кілька вбудованих модулів та використовуватися в Workflows, Subscribers, API-роутах.

Типи сервісів

Тип Використання Реєстрація
Module Service CRUD для модульних сутностей Module() декоратор
Custom Service Бізнес-логіка, оркестрація src/modules/*/service.ts
Workflow Step Повторно-використовуюча step-логіка createStep()
Provider Service Платіж, доставка, файли Extends Abstract клас

Кастомний сервіс

type LoyaltyServiceDeps = {
  logger: Logger;
};

export default class LoyaltyService {
  protected logger: Logger;

  constructor({ logger }: LoyaltyServiceDeps) {
    this.logger = logger;
  }

  async getCustomerPoints(customerId: string): Promise<number> {
    const db = // отримати connection через MikroORM
    const result = await db.query<{ total: number }>(
      `SELECT COALESCE(SUM(points), 0) as total
       FROM loyalty_points
       WHERE customer_id = $1 AND expires_at > NOW()`,
      [customerId]
    );
    return result[0]?.total ?? 0;
  }

  async addPoints(data: LoyaltyPoint): Promise<void> {
    this.logger.info(`Adding ${data.points} points to customer ${data.customerId}`);
    await db.query(
      `INSERT INTO loyalty_points (customer_id, points, reason, order_id, expires_at)
       VALUES ($1, $2, $3, $4, NOW() + INTERVAL '1 year')`,
      [data.customerId, data.points, data.reason, data.orderId ?? null]
    );
  }
}

Реєстрація

export const LOYALTY_MODULE = 'loyaltyModuleService';

export default Module(LOYALTY_MODULE, {
  service: LoyaltyService,
});

Використання в Workflow

const addLoyaltyPointsStep = createStep(
  'add-loyalty-points',
  async (input, context) => {
    const loyaltyService: LoyaltyService = context.container.resolve(LOYALTY_MODULE);
    const pointsToAdd = Math.floor(input.orderTotal / 100);
    await loyaltyService.addPoints({
      customerId: input.customerId,
      points: pointsToAdd,
      reason: 'order_completed',
    });
    return new StepResponse({ pointsAdded: pointsToAdd });
  }
);

Використання в API-роуті

export const GET = async (req: MedusaRequest, res: MedusaResponse) => {
  const session = req.session as { customer_id?: string };
  if (!session.customer_id) return res.status(401).json({ message: 'Не авторизовано' });

  const loyaltyService: LoyaltyService = req.scope.resolve(LOYALTY_MODULE);
  const points = await loyaltyService.getCustomerPoints(session.customer_id);

  res.json({ points, customer_id: session.customer_id });
};

Терміни розробки

  • Простий сервіс (отримання/запис даних, 1–2 операції): 1–2 дні
  • Сервіс з інтеграцією зовнішнього API, retry логікою, тестами: 3–5 днів
  • Складний сервіс (loyalty-програма, B2B pricing, кастомний інвентар): 1–3 тижні