Как мы за три месяца привели в порядок бэкенд на NestJS и добавили версионирование API и программу вознаграждений через СБП
Клиент развивает социальную сеть для iOS и Android. Пользователи делятся фото и видео, ставят лайки, пишут комментарии, переписываются в мессенджере и публикуют анонсы своих мероприятий. Главная особенность в QR-кодах: код привязывается к аккаунту и к контенту, его можно оформить по-своему и даже заказать одежду со своим QR-кодом. Фотографии размечает модуль ИИ, его делает отдельная команда.
В феврале 2023 года аудит нашёл проблемы в кодовой базе бэкенда, и заказчик позвал Фортех на рефакторинг. Мы подключились к бэкенд-команде проекта. В ней было три разработчика на Node.js, рядом работали iOS- и Android-разработчики, два QA-инженера и менеджер проекта. Работа шла спринтами: ежедневные созвоны внутри команды, еженедельная встреча с аналитиками, тестирование каждой задачи, выкладка релизов через CI/CD.
Параллельно с рефакторингом бизнес ждал новые функции:
Мобильные приложения нельзя обновить у всех пользователей одновременно. Пока часть аудитории сидит на старой версии, бэкенд обязан отвечать ей по старым правилам.
Выплаты идут через систему быстрых платежей. Значит, в программе может участвовать только номер телефона, к которому привязан хотя бы один банк с поддержкой СБП.
Программа вознаграждений затрагивала всё сразу: структуру базы, основной API, админ-панель и оба мобильных клиента. Её нельзя было сделать в одном углу кода.
Рефакторинг шёл на живом продукте, без заморозки новых задач.
Версионирование API. Сначала команда сделала рабочие прототипы трёх подходов: версия в префиксе URL, версия в заголовке запроса и отдельные сборки бэкенда под каждую версию. Выбрали префикс в URL. По адресу сразу видно, к какой версии относится запрос, версии удобно описывать в Swagger, и такой вариант укладывался в ограничения мобильной команды.
Реализовали встроенными средствами NestJS. У каждого контроллера есть менеджер версий: он хранит общую версию контроллера и позволяет задать свою версию отдельному эндпоинту. На уровне сервисов новая логика появляется либо отдельным методом, который контроллер вызывает по своей версии, либо через маппер, который приводит старый ответ к новому формату.
Программа вознаграждений. В базе появились генерация и проверка уникальных кодов приглашения и реферальные ссылки. Для расчёта выплат реализовали индекс весомости контента по формуле бизнес-аналитика: от него зависит уровень вознаграждения. Задачи в cron-планировщике раз в месяц обнуляют служебные данные, чтобы рейтинг активных пользователей считался заново. Верификацию номера телефона переделали под СБП.
Админ-панель. Администраторы сами настраивают параметры программы вознаграждений, выгружают отчёт о приведённых пользователях, выплатах и активности в контенте и отдельно работают с блогерами. Из админки можно выключить любой раздел приложения и указать минимальную версию iOS и Android, с которой приложение продолжит работать.
Ошибки и производительность. Исправили поиск по имени и фамилии, восстановление пароля по номеру телефона, дубли картинок у постов, импортированных из Instagram, сортировку историй при пагинации и пустой список закреплённых постов в «Актуальном». Оптимизировали тяжёлый запрос, который открывал диалог между пользователями.
Версионирование API прошло тестирование вместе с мобильной командой и вышло на основной сервер. Теперь бэкенд выпускает новые функции, не ломая приложение тем, кто ещё не обновился.
Программа вознаграждений прошла тестирование и доработки и была развёрнута в dev-окружении вместе с клиентскими приложениями. Параметры программы администраторы настраивают в админ-панели.
Контракт на рефакторинг завершили за три месяца. К его концу бэкенд ушёл заметно вперёд других команд проекта, а документация по изменённым модулям была актуальной.
Какой способ версионирования API выбрать для мобильного приложения?
На проекте сравнили три рабочих прототипа: версию в URL, в заголовке и отдельные сборки бэкенда. Префикс в URL оказался самым наглядным: версию видно в каждом запросе, она сразу попадает в документацию Swagger.
Как выплачивать пользователям вознаграждение через СБП?
Нужно проверять номер телефона на этапе регистрации в программе: участвовать может только номер, к которому привязан банк с поддержкой СБП. Расчёт выплат лучше вынести в отдельную логику с регулярным пересчётом рейтинга.
Можно ли рефакторить бэкенд, не останавливая разработку новых функций?
Да. На этом проекте рефакторинг модулей шёл в тех же спринтах, что и новые задачи, а документацию обновляли по ходу работы. Каждая задача проходила тестирование у QA-инженеров до релиза.
Сколько длился проект?
Три месяца, с февраля по май 2023 года.

Как бэкенд-разработчик Фортех 1 год и 3 месяца работал в одной из двадцати команд автодилера: интеграции, общий NPM-пакет, новая авторизация и наблюдаемость

Разработка масштабируемого бэкенда на Nest.js и AWS для обработки миллионов SEO-запросов ежедневно.

Внутренняя информационная система колл-центра по вопросам здравоохранения и COVID–19

Как мы с нуля сделали многоязычный сайт на Next.js с оплатой через Stripe, а потом вернулись на проект на второй этап