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

56 lines
4.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ✨ Собрать каркас приложения и раздать его из бинарника
- **Тип:** feature
- **Категория:** Очередь — Каркас идёт сразу за контрактом: на нём стоят все экраны, а сам он ждёт готовой формы ответов
- **Зачем:** Экранов нет и собирать их нечем: ни сборки фронтенда, ни раздачи статики в проекте не существует.
Каркас готовит экраны — загрузку, рубеж записи, чтение текста и список, — но сам
по себе пользователю ничего не даёт. Видимое от него одно: приложение
открывается и достаёт данные с живого сервера, а не отдаёт пустую страницу.
Фреймворк выбран 2026-08-11 — Vue 3 с роутером пятой версии и сборкой Vite
([ADR](../../docs/adr/ADR-2026-08-11-spa-on-vue.md)); правила кода приложения
лежат в [conventions/web-ui.md](../../docs/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](../../docs/adr/ADR-2026-08-11-spa-on-vue.md) 2026-08-11 — заново это
решение не принимается. Во что слой Node обходится образу по времени и по весу,
не замерялось: замер делает эта задача.