Задача Добавить механику веб-страниц
Добавить механику веб-страниц
Сейчас в системе нет системы веб-УРЛов. Роутинг строится на файлах next-js. При этом нужна возможность формировать ЧПУ.
Ворклоги
Система кастомных URL-маршрутов (SiteRoute)
Задача
Реализовать гибкую систему маршрутизации, позволяющую назначать произвольные URL для контента. Вместо технических путей вида /concepts/clxyz123abc — человекочитаемые /статьи/мой-первый-пост.
Архитектурное решение
Выбран подход с fallback-роутингом на уровне Next.js. Все запросы к несуществующим страницам перехватываются единой точкой входа, которая резолвит путь через базу данных.
Почему так:
- Не требует перегенерации статики при добавлении новых маршрутов
- Иерархическая структура через
parentId— можно строить вложенные пути любой глубины - Связь 1:1 с контентом исключает дубликаты и проблемы с каноникализацией
Реализация
База данных — новая модель SiteRoute:
path— полный путь (уникальный индекс)slug— сегмент путиparentId— ссылка на родителя для иерархииkBConceptId— привязка к концепту базы знаний- Составной индекс
parentId + slugгарантирует уникальность slug в рамках родителя
Next.js — fallback rewrite в next.config.js перенаправляет /:path* на /_fallback/[...path].tsx.
Обработчик — получает текущий путь, запрашивает SiteRoute через GraphQL, рендерит соответствующую страницу или отдаёт 404.
Виртуальное поле uri — добавлено в KBConcept на уровне GraphQL-схемы. Возвращает кастомный путь если есть SiteRoute, иначе стандартный /concepts/{id}. Все компоненты ссылок автоматически используют это поле.
Технические детали
- GraphQL резолверы:
siteRoute,siteRoutes,createSiteRoute - Компоненты:
ConceptLink,PostLink,TaskLink,WorkLogLink - SEO-заголовки: canonical URL формируется из
uri - Preload данных на сервере для SSR
Результат
Движок haih-agent получил полноценную систему ЧПУ с поддержкой иерархии, без ограничений на структуру URL и с автоматической интеграцией во все существующие компоненты.