GoBlog/webmentionAdmin.go

142 lines
3.4 KiB
Go
Raw Permalink Normal View History

2021-02-17 15:07:42 +00:00
package main
import (
"fmt"
"net/http"
"net/url"
2021-02-17 15:07:42 +00:00
"reflect"
"strconv"
2022-03-16 07:28:03 +00:00
"sync"
2021-02-17 15:07:42 +00:00
2021-03-03 17:19:55 +00:00
"github.com/go-chi/chi/v5"
"github.com/vcraescu/go-paginator/v2"
2021-02-17 15:07:42 +00:00
)
type webmentionPaginationAdapter struct {
2022-03-16 07:28:03 +00:00
config *webmentionsRequestConfig
nums int64
getNums sync.Once
db *database
2021-02-17 15:07:42 +00:00
}
2023-02-27 17:08:20 +00:00
var _ paginator.Adapter = (*webmentionPaginationAdapter)(nil)
2021-02-17 15:07:42 +00:00
func (p *webmentionPaginationAdapter) Nums() (int64, error) {
2022-03-16 07:28:03 +00:00
p.getNums.Do(func() {
p.nums = int64(noError(p.db.countWebmentions(p.config)))
2022-03-16 07:28:03 +00:00
})
2021-02-17 15:07:42 +00:00
return p.nums, nil
}
2022-03-16 07:28:03 +00:00
func (p *webmentionPaginationAdapter) Slice(offset, length int, data any) error {
2021-02-17 15:07:42 +00:00
modifiedConfig := *p.config
modifiedConfig.offset = offset
modifiedConfig.limit = length
wms, err := p.db.getWebmentions(&modifiedConfig)
2021-02-17 15:07:42 +00:00
reflect.ValueOf(data).Elem().Set(reflect.ValueOf(&wms).Elem())
return err
}
func (a *goBlog) webmentionAdmin(w http.ResponseWriter, r *http.Request) {
var status webmentionStatus = ""
switch webmentionStatus(r.URL.Query().Get("status")) {
case webmentionStatusVerified:
status = webmentionStatusVerified
case webmentionStatusApproved:
status = webmentionStatusApproved
}
sourcelike := r.URL.Query().Get("source")
p := paginator.New(&webmentionPaginationAdapter{config: &webmentionsRequestConfig{
status: status,
sourcelike: sourcelike,
}, db: a.db}, 5)
2022-02-26 19:38:52 +00:00
p.SetPage(stringToInt(chi.URLParam(r, "page")))
2021-02-17 15:07:42 +00:00
var mentions []*mention
err := p.Results(&mentions)
if err != nil {
a.serveError(w, r, err.Error(), http.StatusInternalServerError)
2021-02-17 15:07:42 +00:00
return
}
// Navigation
var hasPrev, hasNext bool
var prevPage, currentPage, nextPage int
var prevPath, currentPath, nextPath string
2021-02-17 15:07:42 +00:00
hasPrev, _ = p.HasPrev()
if hasPrev {
prevPage, _ = p.PrevPage()
} else {
prevPage, _ = p.Page()
}
if prevPage < 2 {
prevPath = webmentionPath
} else {
prevPath = fmt.Sprintf("%s/page/%d", webmentionPath, prevPage)
}
currentPage, _ = p.Page()
currentPath = fmt.Sprintf("%s/page/%d", webmentionPath, currentPage)
2021-02-17 15:07:42 +00:00
hasNext, _ = p.HasNext()
if hasNext {
nextPage, _ = p.NextPage()
} else {
nextPage, _ = p.Page()
}
nextPath = fmt.Sprintf("%s/page/%d", webmentionPath, nextPage)
// Query
query := ""
params := url.Values{}
if status != "" {
params.Add("status", string(status))
}
if sourcelike != "" {
params.Add("source", sourcelike)
}
if len(params) > 0 {
query = "?" + params.Encode()
}
2021-02-17 15:07:42 +00:00
// Render
a.render(w, r, a.renderWebmentionAdmin, &renderData{
Data: &webmentionRenderData{
mentions: mentions,
hasPrev: hasPrev,
hasNext: hasNext,
prev: prevPath + query,
current: currentPath + query,
next: nextPath + query,
2021-02-17 15:07:42 +00:00
},
})
}
func (a *goBlog) webmentionAdminAction(w http.ResponseWriter, r *http.Request) {
action := chi.URLParam(r, "action")
if action != "delete" && action != "approve" && action != "reverify" {
a.serveError(w, r, "Invalid action", http.StatusBadRequest)
2021-02-17 15:07:42 +00:00
return
}
id, err := strconv.Atoi(r.FormValue("mentionid"))
if err != nil {
a.serveError(w, r, err.Error(), http.StatusBadRequest)
2021-02-17 15:07:42 +00:00
return
}
switch action {
case "delete":
err = a.db.deleteWebmentionId(id)
case "approve":
err = a.db.approveWebmentionId(id)
case "reverify":
err = a.reverifyWebmentionId(id)
}
2021-02-17 15:07:42 +00:00
if err != nil {
a.serveError(w, r, err.Error(), http.StatusInternalServerError)
2021-02-17 15:07:42 +00:00
return
}
if action == "delete" || action == "approve" {
a.cache.purge()
}
redirectTo := r.FormValue("redir")
if redirectTo == "" {
redirectTo = "."
}
http.Redirect(w, r, redirectTo, http.StatusFound)
}