release gate / check (push) Failing after 6m36s
Implement Notion-like upgrade phase 4: append-only page revisions with restore-as-a-new-version; recoverable bookmark/page/collection deletions whose restores never resurrect public flags or shares; owner-scoped JSON export; and explicit, revocable read-only collection sharing with owner-only mutations and no transitive third-party bookmark leaks. Add migration 009, API/docs, integration coverage, and page/collections/trash UI.
29 lines
1011 B
Go
29 lines
1011 B
Go
package handlers
|
|
|
|
import (
|
|
"github.com/andrew/go-computer/internal/db"
|
|
"net/http"
|
|
)
|
|
|
|
func unshare(w http.ResponseWriter, r *http.Request, parent, join, key string) {
|
|
id := r.PathValue("id")
|
|
if _, e := owned(r, database(r), parent, id, "ownerId"); e != nil {
|
|
respond(w, 0, nil, e)
|
|
return
|
|
}
|
|
_, e := database(r).ExecContext(r.Context(), `DELETE FROM `+db.Quote(join)+` WHERE `+db.Quote(key)+`=$1 AND "userId"=$2`, id, r.PathValue("userId"))
|
|
respond(w, 200, OK{true}, e)
|
|
}
|
|
func HandleBookmarkUnshare(w http.ResponseWriter, r *http.Request) {
|
|
unshare(w, r, "Bookmark", "BookmarkShare", "bookmarkId")
|
|
}
|
|
func HandleTagUnshare(w http.ResponseWriter, r *http.Request) {
|
|
unshare(w, r, "Tag", "TagShare", "tagId")
|
|
}
|
|
func HandleCollectionUnshare(w http.ResponseWriter, r *http.Request) {
|
|
unshare(w, r, "Collection", "CollectionShare", "collectionId")
|
|
}
|
|
func HandleSharedDateDelete(w http.ResponseWriter, r *http.Request) {
|
|
respond(w, 200, OK{true}, remove(r, "SharedDate", r.PathValue("id"), "creatorId"))
|
|
}
|