Files
Bridge-and-Join-s/internal/lkgateway/devbanner.go
T
zuevav b4b4788035 Баннер режима разработки в шапке с личным выключателем
Пока лицензия разрешает режим разработки, в шапке висит баннер; нажатие выключает режим визуально для этого пользователя и включает обратно. В шаблонах .DevMode заменён на devOn.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q4YVo4UMopqT5DzicqpPjL
2026-09-18 11:18:27 +03:00

58 lines
2.2 KiB
Go

package lkgateway
// devbanner.go — баннер режима разработки в шапке.
//
// Режим разработки разрешает сервер лицензий (dev_until в ключе). Пока он разрешён, в
// шапке висит баннер; нажатие на него выключает режим визуально для этого пользователя
// (служебные разделы прячутся, имитации не показываются) и включает обратно. Это личная
// настройка сотрудника, а не состояние системы: лицензия по-прежнему разрешает режим.
// Когда лицензия режим не разрешает, баннера нет и выключатель ни на что не влияет.
import (
"net/http"
"sync"
)
// devOff — пользователи, выключившие режим разработки у себя (по логину; без
// авторизации — пустой логин). Хранится в памяти: после перезапуска режим снова включён.
var devOff = struct {
mu sync.Mutex
m map[string]bool
}{m: map[string]bool{}}
func devUserKey(u *User) string {
if u == nil {
return ""
}
return u.Login
}
// devOnFor — режим разработки действует для пользователя: разрешён лицензией и не выключен им.
func devOnFor(u *User) bool {
if !devMode(globalRC) {
return false
}
devOff.mu.Lock()
defer devOff.mu.Unlock()
return !devOff.m[devUserKey(u)]
}
// devToggle — POST /admin/dev-toggle: переключить режим у себя и вернуться на ту же страницу.
func devToggle(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodPost {
http.Error(w, "method", http.StatusMethodNotAllowed)
return
}
if devMode(globalRC) {
key := devUserKey(currentUser(w))
devOff.mu.Lock()
devOff.m[key] = !devOff.m[key]
devOff.mu.Unlock()
}
dest := safeReturnPath(r.FormValue("return_to"))
if dest == "" {
dest = "/admin"
}
http.Redirect(w, r, dest, http.StatusSeeOther)
}