Проект под NDA, поэтому ниже, к сожалению, только инженерная часть без интерфейса, клиента и предметной области.
Это полноценная CRM в рамках аутсорс-заказа, которую мы делаем вдвоём — бэкенд-разработчик и я, весь фронт на мне. Справочники со связями многие-ко-многим, матрица прав с drag-select как в Excel, генерация договоров в `.docx` и `.pdf` по хранимым записям, командная палитра на Ctrl+K с настраиваемыми сочетаниями, парсер отчётов, журнал активности, дашборд с графиками, токенная аутентификация с ролевой моделью, тёмная тема и синхронизация состояния таблиц с URL: фильтры и сортировка выдерживают перезагрузку и шаринг ссылки.
Первые полгода проект почти не двигался. Стек был React с Inertia, из-за чего фронт целиком зависел от бэкенда, а фиксированного контракта, на который можно опереться, не было — требования уточнялись обсуждениями в команде и с заказчиком по ходу. Почти всё делалось не по одному разу. В результате, чтобы продолжать работу, мы разделили проект на SPA и отдельный API, после этого фронт пошёл своим темпом.
Контракт всё равно продолжал меняться: на одном из этапов его переписали трижды за две недели. Поэтому маппинг живёт отдельным слоем DTO, который я собирал по роутам, схеме базы и логам запросов, а рядом стоит мок на FastAPI, повторяющий настоящий API вместе с его несогласованностями, — так фронтенд не простаивает в ожидании живого стенда. Пагинации на бэкенде не было, поэтому пагинация и сортировка сделаны на клиенте, с переключением на серверный режим одним флагом, когда она появится.
Слой, который приводит нестабильные ответы к тому, на что фронт может опереться, я покрыл юнит-тестами, а проект держу под strict-тайпчеком и линтерами.