package handlers
import (
"html/template"
"net/http"
"strings"
"gitea.leeworks.dev/0xwheatyz/gitea-mobile/internal/auth"
"gitea.leeworks.dev/0xwheatyz/gitea-mobile/internal/middleware"
)
var settingsTemplate = template.Must(template.New("settings").Parse(`
Settings — Gitea Mobile
Settings
{{if .Message}}
{{.Message}}
{{end}}
{{if .HasToken}}
Status: Connected
A Gitea API token is configured.
{{end}}
{{if .HasToken}}
Back to Dashboard
{{end}}
`))
// 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}
w.Header().Set("Content-Type", "text/html; charset=utf-8")
settingsTemplate.Execute(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,
}
w.Header().Set("Content-Type", "text/html; charset=utf-8")
settingsTemplate.Execute(w, data)
}