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}