Сайт ↗
Разделы документации
Концепции · 0.8.1

Собственная логика и интерфейс в custom-зонах

Как дополнять backend, списки и формы, продолжая обновлять типовую часть приложения генератором.

На этой странице

Используйте модель и собственный код параллельно: стандартные поля, связи и доступ настраивайте в UI, проверки оплаты, интеграции и особые компоненты пишите в custom. Эти файлы сохраняются при повторной генерации. Сохранение файла, однако, не означает, что его код автоматически останется совместимым с любой новой моделью.

Что можно настроить без кода

В Content у поля есть Presentation: Markdown, Multiline, Email, URL и другие готовые способы ввода. List behavior управляет поддерживаемыми поиском, фильтрацией и сортировкой. Record editor у сущности выбирает правую панель или отдельную страницу.

Если подходящая настройка есть, сохраните модель и выполните Generate. Если нужны свои правила или экран, используйте точки расширения. Go и React пишутся в редакторе исходников: Generator UI не редактирует произвольный custom-код.

Как дополнить список или форму

В каталоге сущности есть два файла:

  • custom/extension.tsx — полная замена страниц и ранее предусмотренные обработчики расширений.
  • custom/ui-extension.tsx — дополнения стандартных списка и формы по контракту generated/ui-extension.tsx.

Для списка доступны columns — новые колонки, cells — своё отображение ячеек, rowActions — действия со строкой и status — состояние. Идентификаторы новых колонок не должны совпадать со сгенерированными и зарезервированными служебными именами. Собственная колонка не получает серверную сортировку и фильтрацию автоматически.

Расширение textFields предназначено для обычных видимых редактируемых string и text. Компонент получает inputProps. Сохраните name, required, disabled, значение и связи с подписью и ошибкой: форма продолжает передавать данные через FormData. Если вы оборачиваете стандартный элемент, выведите defaultControl ровно один раз и сохраните формат значения.

Это расширение не заменяет все виды полей. Для readonly, сгенерированных идентификаторов, отношений, дат и enum действуют отдельные правила. Изображения расширяются через imageFields, который передаёт типизированные ссылки и состояние обработки.

Когда заменять страницу целиком

Полная замена имеет приоритет над точечными дополнениями. Она подходит для собственного сценария, но тогда вы отвечаете за чтение и сохранение данных, пагинацию, ошибки и доступность. Для одной новой колонки или элемента формы обычно достаточно небольшого расширения: остальная стандартная страница продолжит обновляться генератором.

Если колонке нужны внешние данные, загружайте их одной ограниченной партией для ID текущей страницы. Сопоставляйте записи по идентификатору. Отсутствующий результат не равен нулевой сумме. Показывайте загрузку, ошибку и повтор запроса; не применяйте ответ для прежней страницы к новой.

Как подключить серверную логику

В backend/internal/custom/app/composition.go функция Configure позволяет подключить зависимости и определить завершение работы собственных клиентов. Переданный общий пул БД не нужно закрывать: он принадлежит приложению. Контекст Configure действует при запуске; для запросов используйте их собственные контексты.

Типизированные точки расширения подключают обработчики операций без правки сгенерированного кода запуска. У прежнего механизма публичных маршрутов и нового механизма композиции разные способы передачи зависимостей. Не связывайте их глобальными переменными и не правьте сгенерированную сборку зависимостей. Для отдельного публичного API явно задайте свой сервис и время жизни подключений.

Для обычной выдачи контента могут подойти штатный external API и правила чтения. Например, сайт Admingen получает данные без собственного custom-маршрута.

Как добавить зависимость

cd admin
npm install clsx
npm run build

Это пример установки обычного пакета в приложение. Файлы зависимостей сохраняются, но генератор продолжает проверять обязательные зависимости и настройки. Сам Generate ничего не устанавливает.

Поддерживаемые плагины Vite, псевдонимы путей и параметры сборки задавайте в admin/custom/vite.ts. Он не разрешает произвольно менять tsconfig и не запускает плагины в изолированной безопасной среде.

После добавления поля в модель проверьте собственный редактор: он должен сохранять полный актуальный объект, в том числе поля, ещё неизвестные его коду. Это не защищает автоматически от одновременного редактирования разными пользователями. Проверьте сборку, миграцию и фактическое сохранение данных.

Если вы заменяете хранилище аутентификации

Для обычных custom-обработчиков свой репозиторий аутентификации не требуется. Но если вы реализовали внутренний интерфейс Repository, метод RotateRefresh должен выполнить все переданные проверки RefreshSessionGuard.

Они выполняются в той же транзакции после проверки учётных данных и сессии, но до отметки refresh-токена использованным. Эти проверки нельзя переносить в браузер. После обновления генератора сверьте сгенерированный контракт и проверьте обновление и отзыв сессии.

Как продолжать генерацию

В Generate просматривайте изменения модели и файлов, в History — предыдущие результаты. Правила владения объясняют, какие файлы обновляет генератор и какие сохраняются за вашей командой.