An atproto PDS written in Go
at hailey/tidy 1.7 kB view raw
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 ComAtprotoRepoCreateRecordRequest struct { 10 Repo string `json:"repo" validate:"required,atproto-did"` 11 Collection string `json:"collection" validate:"required,atproto-nsid"` 12 Rkey *string `json:"rkey,omitempty"` 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) handleCreateRecord(e echo.Context) error { 20 ctx := e.Request().Context() 21 22 repo := e.Get("repo").(*models.RepoActor) 23 24 var req ComAtprotoRepoCreateRecordRequest 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}