go-ssb-room/web/handlers/admin/invites.go

130 lines
3.2 KiB
Go
Raw Normal View History

2021-03-03 12:58:06 +00:00
package admin
import (
"errors"
2021-03-04 10:12:37 +00:00
"fmt"
2021-03-03 12:58:06 +00:00
"net/http"
"strconv"
2021-03-03 12:58:06 +00:00
"github.com/gorilla/csrf"
2021-03-03 12:58:06 +00:00
"go.mindeco.de/http/render"
2021-03-10 15:44:46 +00:00
"github.com/ssb-ngi-pointer/go-ssb-room/roomdb"
"github.com/ssb-ngi-pointer/go-ssb-room/web"
weberrors "github.com/ssb-ngi-pointer/go-ssb-room/web/errors"
2021-03-22 14:25:00 +00:00
"github.com/ssb-ngi-pointer/go-ssb-room/web/members"
"github.com/ssb-ngi-pointer/go-ssb-room/web/router"
2021-03-03 12:58:06 +00:00
)
type invitesHandler struct {
2021-03-03 12:58:06 +00:00
r *render.Renderer
2021-03-19 09:43:46 +00:00
db roomdb.InvitesService
domainName string
2021-03-03 12:58:06 +00:00
}
func (h invitesHandler) overview(rw http.ResponseWriter, req *http.Request) (interface{}, error) {
2021-03-03 12:58:06 +00:00
lst, err := h.db.List(req.Context())
if err != nil {
return nil, err
}
// Reverse the slice to provide recent-to-oldest results
for i, j := 0, len(lst)-1; i < j; i, j = i+1, j-1 {
lst[i], lst[j] = lst[j], lst[i]
}
2021-03-04 09:32:39 +00:00
pageData, err := paginate(lst, len(lst), req.URL.Query())
2021-03-03 12:58:06 +00:00
if err != nil {
2021-03-04 09:32:39 +00:00
return nil, err
2021-03-03 12:58:06 +00:00
}
2021-03-04 09:32:39 +00:00
pageData[csrf.TemplateTag] = csrf.TemplateField(req)
return pageData, nil
2021-03-03 12:58:06 +00:00
}
2021-03-04 10:12:37 +00:00
func (h invitesHandler) create(w http.ResponseWriter, req *http.Request) (interface{}, error) {
2021-03-04 10:12:37 +00:00
if req.Method != "POST" {
// TODO: proper error type
return nil, fmt.Errorf("bad request")
2021-03-04 10:12:37 +00:00
}
if err := req.ParseForm(); err != nil {
// TODO: proper error type
return nil, fmt.Errorf("bad request: %w", err)
2021-03-04 10:12:37 +00:00
}
2021-03-22 14:25:00 +00:00
member := members.FromContext(req.Context())
if member == nil {
return nil, fmt.Errorf("warning: no user session for elevated access request")
}
2021-03-04 10:12:37 +00:00
token, err := h.db.Create(req.Context(), member.ID)
2021-03-04 10:12:37 +00:00
if err != nil {
return nil, err
}
urlTo := web.NewURLTo(router.CompleteApp())
facadeURL := urlTo(router.CompleteInviteFacade, "token", token)
facadeURL.Host = h.domainName
facadeURL.Scheme = "https"
return map[string]interface{}{
"FacadeURL": facadeURL.String(),
}, nil
}
func (h invitesHandler) revokeConfirm(rw http.ResponseWriter, req *http.Request) (interface{}, error) {
id, err := strconv.ParseInt(req.URL.Query().Get("id"), 10, 64)
if err != nil {
err = weberrors.ErrBadRequest{Where: "ID", Details: err}
return nil, err
}
invite, err := h.db.GetByID(req.Context(), id)
if err != nil {
2021-03-10 15:44:46 +00:00
if errors.Is(err, roomdb.ErrNotFound) {
return nil, weberrors.ErrNotFound{What: "invite"}
}
return nil, err
}
return map[string]interface{}{
"Invite": invite,
csrf.TemplateTag: csrf.TemplateField(req),
}, nil
}
const redirectToInvites = "/admin/invites"
func (h invitesHandler) revoke(rw http.ResponseWriter, req *http.Request) {
err := req.ParseForm()
if err != nil {
err = weberrors.ErrBadRequest{Where: "Form data", Details: err}
// TODO "flash" errors
http.Redirect(rw, req, redirectToInvites, http.StatusFound)
2021-03-04 10:12:37 +00:00
return
}
id, err := strconv.ParseInt(req.FormValue("id"), 10, 64)
if err != nil {
err = weberrors.ErrBadRequest{Where: "ID", Details: err}
// TODO "flash" errors
http.Redirect(rw, req, redirectToInvites, http.StatusFound)
return
}
status := http.StatusFound
err = h.db.Revoke(req.Context(), id)
if err != nil {
2021-03-10 15:44:46 +00:00
if !errors.Is(err, roomdb.ErrNotFound) {
// TODO "flash" errors
h.r.Error(rw, req, http.StatusInternalServerError, err)
return
}
status = http.StatusNotFound
}
2021-03-04 10:12:37 +00:00
http.Redirect(rw, req, redirectToInvites, status)
2021-03-04 10:12:37 +00:00
}