eeea1b6475
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>
108 lines
2.7 KiB
Go
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)
|
|
}
|
|
}
|