Files
transcriber/tasks/items/spa-skeleton.md
T
av 79ff12548f tasks: спроектирован контракт приложения и переставлена голова очереди
- json-api-for-spa: адреса приложения уехали в своё пространство /app/,
  приём стал POST /app/audiorecords, опрос /api/status/:id убран, заведены
  список, карточка, текст, /app/me и /app/config; имя файла отправителя
  легло своей колонкой рядом с заголовком
- три действия над записью — правка заголовка, возврат в работу и журнал
  событий — собраны задачей audiorecord-actions
- голова очереди: контракт, каркас, экран загрузки, список, действия
- в прежних задачах поправлены адреса, рубежи конвейера и остатки Telegram
2026-08-15 09:06:11 +03:00

4.8 KiB
Raw Blame History

Собрать каркас приложения и раздать его из бинарника

  • Тип: feature
  • Категория: Очередь — Каркас идёт сразу за контрактом: на нём стоят все экраны, а сам он ждёт готовой формы ответов
  • Зачем: Экранов нет и собирать их нечем: ни сборки фронтенда, ни раздачи статики в проекте не существует.

Каркас готовит экраны — загрузку, рубеж записи, чтение текста и список, — но сам по себе пользователю ничего не даёт. Видимое от него одно: приложение открывается и достаёт данные с живого сервера, а не отдаёт пустую страницу.

Фреймворк выбран 2026-08-11 — Vue 3 с роутером пятой версии и сборкой Vite (ADR); правила кода приложения лежат в conventions/web-ui.md.

Затрагивает

  • новый каталог фронтенда: исходники, зависимости, конфигурация сборки;
  • роут, отдающий index.html на неизвестный путь вне корней сервиса — /api/ у хранилища, /app/ у приложения, /auth/ у входа, /_/ у панели, плюс /health и /metrics: адреса маршрутов обычные, а не после решётки;
  • Taskfile.yml — шаг сборки статики и его место в task gate и task image;
  • Dockerfile — сборка статики внутри образа, чтобы выкладка не зависела от машины разработчика;
  • раздача статики из бинарника через go:embed и роут под неё;
  • .gitignore — каталог зависимостей и собранная статика;
  • docs/conventions/web-ui.md — переписывается под выбранный фреймворк;
  • docs/architecture.md — новый компонент и новая внешняя зависимость сборки.

Критерии приёмки

  • Статика собирается одной командой и вшивается в бинарник: запущенный бинарник отдаёт приложение без каталога рядом. Оракул — сборка, запуск бинарника из пустого каталога, запрос корня возвращает разметку приложения.
  • Образ собирается на чистой машине без предустановленного окружения фронтенда. Оракул — task image без локально установленных зависимостей фронтенда.
  • Приложение показывает, кто вошёл, и обращается к API живого сервера. Оракул — тест либо ручная проверка на запущенном сервере с сессией.
  • Шаг сборки статики входит в task gate и краснеет при ошибке сборки. Оракул — намеренно сломанный исходник роняет task gate.
  • Обновление страницы на любом маршруте приложения открывает тот же экран, а адрес внутри корня сервиса в приложение не проваливается. Оракул — тест на три запроса: неизвестный путь вне корней отдаёт разметку, неизвестный путь внутри /api/ и внутри /app/ отдаёт ошибку контракта.

Рамки

Экранов, кроме заглушки с именем вошедшего, не делаем — это upload-and-status-screen и records-list-screen. Установку на телефон не делаем — это installable-pwa. Готовый набор компонентов не берём: он не выбран, а способен удвоить собранный файл.

Шаг сборки входит в гейт и в образ решением ADR 2026-08-11 — заново это решение не принимается. Во что слой Node обходится образу по времени и по весу, не замерялось: замер делает эта задача.