1package server
2
3import (
4 "github.com/haileyok/cocoon/internal/helpers"
5 "github.com/haileyok/cocoon/models"
6 "github.com/labstack/echo/v4"
7)
8
9type ComAtprotoRepoDeleteRecordInput struct {
10 Repo string `json:"repo" validate:"required,atproto-did"`
11 Collection string `json:"collection" validate:"required,atproto-nsid"`
12 Rkey string `json:"rkey" validate:"required,atproto-rkey"`
13 SwapRecord *string `json:"swapRecord"`
14 SwapCommit *string `json:"swapCommit"`
15}
16
17func (s *Server) handleDeleteRecord(e echo.Context) error {
18 ctx := e.Request().Context()
19 logger := s.logger.With("name", "handleDeleteRecord")
20
21 repo := e.Get("repo").(*models.RepoActor)
22
23 var req ComAtprotoRepoDeleteRecordInput
24 if err := e.Bind(&req); err != nil {
25 logger.Error("error binding", "error", err)
26 return helpers.ServerError(e, nil)
27 }
28
29 if err := e.Validate(req); err != nil {
30 logger.Error("error validating", "error", err)
31 return helpers.InputError(e, nil)
32 }
33
34 if repo.Repo.Did != req.Repo {
35 logger.Warn("mismatched repo/auth")
36 return helpers.InputError(e, nil)
37 }
38
39 results, err := s.repoman.applyWrites(ctx, repo.Repo, []Op{
40 {
41 Type: OpTypeDelete,
42 Collection: req.Collection,
43 Rkey: &req.Rkey,
44 SwapRecord: req.SwapRecord,
45 },
46 }, req.SwapCommit)
47 if err != nil {
48 logger.Error("error applying writes", "error", err)
49 return helpers.ServerError(e, nil)
50 }
51
52 results[0].Type = nil
53 results[0].Uri = nil
54 results[0].Cid = nil
55 results[0].ValidationStatus = nil
56
57 return e.JSON(200, results[0])
58}