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 ComAtprotoRepoPutRecordRequest 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 Validate *bool `json:"bool,omitempty"`
14 Record MarshalableMap `json:"record" validate:"required"`
15 SwapRecord *string `json:"swapRecord"`
16 SwapCommit *string `json:"swapCommit"`
17}
18
19func (s *Server) handlePutRecord(e echo.Context) error {
20 ctx := e.Request().Context()
21
22 repo := e.Get("repo").(*models.RepoActor)
23
24 var req ComAtprotoRepoPutRecordRequest
25 if err := e.Bind(&req); err != nil {
26 s.logger.Error("error binding", "error", err)
27 return helpers.ServerError(e, nil)
28 }
29
30 if err := e.Validate(req); err != nil {
31 s.logger.Error("error validating", "error", err)
32 return helpers.InputError(e, nil)
33 }
34
35 if repo.Repo.Did != req.Repo {
36 s.logger.Warn("mismatched repo/auth")
37 return helpers.InputError(e, nil)
38 }
39
40 optype := OpTypeCreate
41 if req.SwapRecord != nil {
42 optype = OpTypeUpdate
43 }
44
45 results, err := s.repoman.applyWrites(ctx, repo.Repo, []Op{
46 {
47 Type: optype,
48 Collection: req.Collection,
49 Rkey: &req.Rkey,
50 Validate: req.Validate,
51 Record: &req.Record,
52 SwapRecord: req.SwapRecord,
53 },
54 }, req.SwapCommit)
55 if err != nil {
56 s.logger.Error("error applying writes", "error", err)
57 return helpers.ServerError(e, nil)
58 }
59
60 results[0].Type = nil
61
62 return e.JSON(200, results[0])
63}