package handlers import ( "net/http" "strings" "amnezia-share/internal/models" "amnezia-share/internal/web" ) type adminRenewalView struct { adminLayout Codes []models.RenewalCode } // AdminRenewalGet lists renewal codes (admin/renewal_codes.php GET). func AdminRenewalGet(a *web.App) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { ok, errText := flashFromQuery(r) view := adminRenewalView{adminLayout: newAdminLayout(a, r, "renewal")} view.OK, view.Error = ok, errText codes, err := a.Share.ListCodes(r.Context()) if err != nil { view.Error = err.Error() } view.Codes = codes a.Render(w, r, "page_admin_renewal", view) } } // AdminRenewalPost handles renewal code create/delete (admin/renewal_codes.php // POST). func AdminRenewalPost(a *web.App) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { ctx := r.Context() var err error var okMsg string switch r.FormValue("action") { case "create": code := r.FormValue("code") addDays := formInt(r, "add_days", 30) maxUses := formInt(r, "max_uses", 1) target := strings.TrimSpace(r.FormValue("code_target")) note := r.FormValue("note") expiresAt := parseFormDate(r.FormValue("code_expires_at")) var linkID *int if target != "member" { if v := formInt(r, "share_link_id", 0); v > 0 { linkID = &v } } created, cerr := a.Share.CreateRenewalCode(ctx, code, addDays, maxUses, linkID, expiresAt, note, target) err = cerr if err == nil { okMsg = "Код создан: " + created.Code } case "delete": id := formInt(r, "code_id", 0) err = a.Share.DeleteCode(ctx, id) if err == nil { okMsg = "Код удалён." } default: err = errUnknownAction } errText := "" if err != nil { errText = err.Error() } redirectWithFlash(w, r, a, "admin/renewal", okMsg, errText) } }