edit.go

 1package pages
 2
 3import (
 4	"fmt"
 5	"net/http"
 6
 7	"git.kilimanjaro.io/rtw/document"
 8	"git.kilimanjaro.io/rtw/httperr"
 9	"git.kilimanjaro.io/rtw/pkg/abac"
10	"git.kilimanjaro.io/rtw/pkg/id"
11	"git.kilimanjaro.io/rtw/pkg/log"
12	"git.kilimanjaro.io/rtw/user"
13)
14
15type editHandler struct {
16	us *user.Service
17	ds *document.Service
18	eh *httperr.Handler
19}
20
21func NewEditHandler(us *user.Service, ds *document.Service, eh *httperr.Handler) http.Handler {
22	return editHandler{us, ds, eh}
23}
24
25type InitData struct {
26	user.User
27	Readonly bool `json:"readonly"`
28}
29
30func (h editHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
31	l := log.FromContext(r.Context())
32	userInfo, ok := h.us.HasValidSession(r)
33	if !ok {
34		l.Error("edit page: a session is required")
35		h.eh.Handle(http.StatusInternalServerError, w, r, fmt.Errorf("edit page: a session is required"))
36		return
37	}
38	docID := r.PathValue("docID")
39	if docID == "" {
40		// create new document, assign admin permissions to this user
41		resourceID := id.New()
42		docID := resourceID.Compact()
43		if err := h.ds.NewDocumentWithID(resourceID, docID); err != nil {
44			l.Error("edit page: error inserting new document", "error", err)
45			h.eh.Handle(http.StatusInternalServerError, w, r, err)
46			return
47		}
48		if err := h.us.SetDocumentPermission(resourceID, userInfo.ID, abac.Admin); err != nil {
49			l.Error("edit page: error setting document permission", "error", err)
50			h.eh.Handle(http.StatusInternalServerError, w, r, err)
51			return
52		}
53		// redirect back to handler with valid docID
54		h.eh.Redirect(fmt.Sprintf("/edit/%s", docID), w, r)
55		return
56	}
57	resourceID, ok, err := h.ds.DocumentExists(docID)
58	if err != nil || !ok {
59		l.Error("edit page: error checking document exists", "error", err, "doc_exists", ok)
60		h.eh.Handle(http.StatusNotFound, w, r, err)
61		return
62	}
63	has, err := h.us.GetDocumentPermission(resourceID, userInfo.ID)
64	if err != nil {
65		l.Error("edit page: error getting document permission", "error", err)
66		h.eh.Handle(http.StatusInternalServerError, w, r, err)
67		return
68	}
69	user, err := h.us.GetUserByID(userInfo.ID)
70	if err != nil {
71		l.Error("edit page: error getting user info", "error", err)
72		h.eh.Handle(http.StatusInternalServerError, w, r, err)
73		return
74	}
75	initData := InitData{
76		User:     user,
77		Readonly: !abac.Has(has, abac.Write),
78	}
79	Edit(initData).Render(r.Context(), w)
80
81}