Files
vpwg/Go/internal/web/handlers/admin_configs.go
T

115 lines
2.8 KiB
Go

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