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 ComAtprotoRepoPutRecordInput 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 logger := s.logger.With("name", "handlePutRecord")
22
23 repo := e.Get("repo").(*models.RepoActor)
24
25 var req ComAtprotoRepoPutRecordInput
26 if err := e.Bind(&req); err != nil {
27 logger.Error("error binding", "error", err)
28 return helpers.ServerError(e, nil)
29 }
30
31 if err := e.Validate(req); err != nil {
32 logger.Error("error validating", "error", err)
33 return helpers.InputError(e, nil)
34 }
35
36 if repo.Repo.Did != req.Repo {
37 logger.Warn("mismatched repo/auth")
38 return helpers.InputError(e, nil)
39 }
40
41 optype := OpTypeCreate
42 if req.SwapRecord != nil {
43 optype = OpTypeUpdate
44 }
45
46 results, err := s.repoman.applyWrites(ctx, repo.Repo, []Op{
47 {
48 Type: optype,
49 Collection: req.Collection,
50 Rkey: &req.Rkey,
51 Validate: req.Validate,
52 Record: &req.Record,
53 SwapRecord: req.SwapRecord,
54 },
55 }, req.SwapCommit)
56 if err != nil {
57 logger.Error("error applying writes", "error", err)
58 return helpers.ServerError(e, nil)
59 }
60
61 results[0].Type = nil
62
63 return e.JSON(200, results[0])
64}