Ворклог по задаче "Добавить механику веб-страниц"

10 июл. 2026 г., 17:34:10

Система кастомных 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 и с автоматической интеграцией во все существующие компоненты.

10.07.2026