package handlers import ( "net/http" "net/url" "amnezia-share/internal/models" "amnezia-share/internal/web" ) type configRow struct { models.ShareCreation LinkID int LinkToken string } type adminConfigsView struct { adminLayout Rows []configRow LinkIDFilter int ServerIDFilter int Truncated bool } const adminConfigsMax = 300 // AdminConfigsGet lists guest-created panel connections (optionally scoped to // one link or server) with a delete action (admin/server_configs.php). func AdminConfigsGet(a *web.App) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { ctx := r.Context() ok, errText := flashFromQuery(r) view := adminConfigsView{ adminLayout: newAdminLayout(a, r, "configs"), LinkIDFilter: queryInt(r, "link_id", 0), ServerIDFilter: queryInt(r, "server_id", 0), } view.OK, view.Error = ok, errText add := func(linkID int, token string, creations []models.ShareCreation) { for _, c := range creations { if view.ServerIDFilter > 0 && c.ServerID != view.ServerIDFilter { continue } if len(view.Rows) >= adminConfigsMax { view.Truncated = true return } view.Rows = append(view.Rows, configRow{ShareCreation: c, LinkID: linkID, LinkToken: token}) } } if view.LinkIDFilter > 0 { if link, err := a.Share.LinkByID(ctx, view.LinkIDFilter); err == nil && link != nil { creations, _ := a.Share.ListCreationsForLink(ctx, link.ID) add(link.ID, link.Token, creations) } } else { links, err := a.Share.ListLinks(ctx, 1, 50, "") if err != nil { view.Error = err.Error() } for _, l := range links { creations, _ := a.Share.ListCreationsForLink(ctx, l.ID) add(l.ID, l.Token, creations) if view.Truncated { break } } } a.Render(w, r, "page_admin_configs", view) } } // AdminConfigsPost deletes a single guest connection (from the panel, then the // DB). func AdminConfigsPost(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 "delete_creation": linkID := formInt(r, "link_id", 0) creationID := formInt64(r, "creation_id", 0) err = a.Share.SoftDeleteCreation(ctx, a.Panel, a.Settings, linkID, creationID) if err == nil { okMsg = "Конфигурация удалена." } default: err = errUnknownAction } back := "admin/configs" q := url.Values{} if v := r.FormValue("link_id"); v != "" { q.Set("link_id", v) } if v := r.FormValue("server_id_filter"); v != "" { q.Set("server_id", v) } if len(q) > 0 { back += "?" + q.Encode() } errText := "" if err != nil { errText = err.Error() } redirectWithFlash(w, r, a, back, okMsg, errText) } }