приложение собрано каркасом и вшито в бинарник

- заведён каталог web/ — Vue 3, роутер пятой версии, сборка Vite; собранное
  вшивается через go:embed и раздаётся корневым маршрутом: разметка на
  неизвестном пути вне корней сервиса, отказ контракта внутри корня
- перечень корней сервиса стал единой точкой и порождает регистрацию маршрутов,
  а не описывает её; журнал раздачи пишет исход и длину пути, но не сам путь
- шаг front зовёт Node контейнером docker — Biome, юнит-тесты Vue и сборка
  входят в гейт, а в Dockerfile появилась ступень приложения
This commit is contained in:
av
2026-08-15 18:51:05 +03:00
parent c6ffda9aac
commit 663021f712
46 changed files with 5958 additions and 43 deletions
+9 -3
View File
@@ -93,8 +93,14 @@ func (h *AuthHandler) Register(r *router.Router[*core.RequestEvent]) {
// своим, и перехватить его можно только слоем.
r.Bind(BlockSessionRefresh())
r.GET("/auth/login", h.Login)
r.GET("/auth/callback", h.Callback)
// Адреса вешаются группой корня, а не литералами: корень объявлен единой
// точкой адресного пространства, и порознь записанный он разошёлся бы с ней
// молча — раздача приложения начала бы отдавать разметку на возврат от
// провайдера, без единой ошибки в журнале.
auth := r.Group(AuthRoot)
auth.GET("/login", h.Login)
auth.GET("/callback", h.Callback)
// Выход берёт POST намеренно: по GET его срабатывание уносится переходом по
// чужой ссылке.
//
@@ -102,7 +108,7 @@ func (h *AuthHandler) Register(r *router.Router[*core.RequestEvent]) {
// обесценивать, — он убрал бы куку и отчитался успехом, оставив унесённое
// значение годным. Требования сессии при этом нет: выход без неё убирает
// куку и молчит.
r.POST("/auth/logout", h.Logout).Bind(SessionFromCookie())
auth.POST("/logout", h.Logout).Bind(SessionFromCookie())
}
// Login уводит человека к провайдеру, запомнив состояние и проверочный код