Files

79 lines
1.9 KiB
Go

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)
}
}