Files
gitea-mobile/internal/handlers/settings.go
T
agent-company eeea1b6475 chore: extract inline settings template to internal/templates/settings.html
Move the large inline HTML template from settings.go into a separate
file at internal/templates/settings.html, matching the project convention
used by all other handlers. The template is now loaded at render time
via template.ParseFiles, consistent with dashboard, issues, etc.

Closes leeworks-agents/gitea-mobile#126

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-28 13:06:25 +00:00

108 lines
2.7 KiB
Go

package handlers
import (
"html/template"
"log/slog"
"net/http"
"strings"
"gitea.leeworks.dev/0xwheatyz/gitea-mobile/internal/auth"
"gitea.leeworks.dev/0xwheatyz/gitea-mobile/internal/middleware"
)
const settingsTemplatePath = "internal/templates/settings.html"
// SettingsHandler handles GET and POST requests for the settings page.
type SettingsHandler struct {
SessionSecret string
SecureCookies bool
}
type settingsData struct {
HasToken bool
Message string
MessageType string // "success", "error", "info"
}
// ServeHTTP handles the settings page.
func (h *SettingsHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
switch r.Method {
case http.MethodGet:
h.handleGet(w, r)
case http.MethodPost:
h.handlePost(w, r)
default:
http.Error(w, "method not allowed", http.StatusMethodNotAllowed)
}
}
func (h *SettingsHandler) handleGet(w http.ResponseWriter, r *http.Request) {
hasToken := false
if token := middleware.TokenFromContext(r.Context()); token != "" {
hasToken = true
} else if _, err := auth.GetToken(r, h.SessionSecret); err == nil {
hasToken = true
}
data := settingsData{HasToken: hasToken}
h.renderSettings(w, data)
}
func (h *SettingsHandler) handlePost(w http.ResponseWriter, r *http.Request) {
if err := r.ParseForm(); err != nil {
h.renderWithMessage(w, r, "Failed to parse form.", "error")
return
}
action := r.FormValue("action")
switch action {
case "logout":
auth.ClearTokenCookie(w, h.SecureCookies)
h.renderWithMessage(w, r, "Token removed successfully.", "success")
return
case "save":
token := strings.TrimSpace(r.FormValue("token"))
if token == "" {
h.renderWithMessage(w, r, "Token cannot be empty.", "error")
return
}
auth.SetTokenCookie(w, token, h.SessionSecret, h.SecureCookies)
// After saving, redirect to dashboard.
http.Redirect(w, r, "/", http.StatusSeeOther)
return
default:
h.renderWithMessage(w, r, "Unknown action.", "error")
}
}
func (h *SettingsHandler) renderWithMessage(w http.ResponseWriter, r *http.Request, msg, msgType string) {
hasToken := false
if _, err := auth.GetToken(r, h.SessionSecret); err == nil {
hasToken = true
}
data := settingsData{
HasToken: hasToken,
Message: msg,
MessageType: msgType,
}
h.renderSettings(w, data)
}
func (h *SettingsHandler) renderSettings(w http.ResponseWriter, data settingsData) {
tmpl, err := template.ParseFiles(settingsTemplatePath)
if err != nil {
slog.Error("failed to parse settings template", "error", err)
http.Error(w, "template error", http.StatusInternalServerError)
return
}
w.Header().Set("Content-Type", "text/html; charset=utf-8")
if err := tmpl.Execute(w, data); err != nil {
slog.Error("failed to execute settings template", "error", err)
}
}