Один e-commerce backend для двух магазинов одежды — Ojuk Bujuk и Alfinur — работающий прямо поверх ERP-базы каждого клиента в MSSQL, с админ-панелями на Nuxt.
Моя роль
Full-stack разработчик: backend, админ-панели и деплой.
Стек
AdonisJS
TypeScript
MSSQL
Socket.IO
Nuxt
PM2
Задача
Товары, цены и скидки магазинов уже хранились в ERP клиента. Отдельный каталог означал бы двойной ввод данных и устаревшие цены.
Архитектура
API (AdonisJS 5, Lucid ORM) читает данные каталога из существующих таблиц ERP и владеет только своими таблицами для пользователей, заказов, избранного и кодов подтверждения. Через канал Socket.IO подключён Android-телефон, который отправляет одноразовые коды и уведомления о заказах по SMS. Админ-панели на Nuxt управляют тем, что показывает витрина. Один и тот же код развёрнут для обоих магазинов.
Ключевые решения
01Таблицы ERP как каталог
Почему
Чтение товаров и цен прямо из ERP полностью убирает синхронизацию — магазин всегда показывает то, что есть в учёте. Приложение добавляет только собственные таблицы.
Компромисс
API связан со схемой ERP, а запросы каталога идут к учётной базе.
02Телефон в роли SMS-шлюза
Почему
Вместо внешнего SMS-провайдера коды и уведомления о заказах отправляет Android-телефон, подключённый через Socket.IO, — через местную мобильную сеть.
Компромисс
Доставка зависит от того, что телефон онлайн и подключён.
03Один код — несколько магазинов
Почему
Оба магазина используют общий backend и шаблон админки; различия вроде атрибутов товаров или вложенных категорий — это возможности одной платформы.
Что я сделал
API на AdonisJS (TypeScript), читающий товары, цены и скидки прямо из таблиц ERP в MSSQL
Регистрация по телефону с одноразовыми кодами; SMS отправляет телефон-шлюз, подключённый через Socket.IO
JWT access- и refresh-токены с отдельными guard-ами для покупателей и администраторов
Заказы создаются в транзакциях, включая анонимные заказы
Админ-панели на Nuxt 2 + Vuetify; CI/CD через GitHub Actions, деплой по SSH и PM2