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 ComAtprotoRepoApplyWritesRequest struct {
10 Repo string `json:"repo" validate:"required,atproto-did"`
11 Validate *bool `json:"bool,omitempty"`
12 Writes []ComAtprotoRepoApplyWritesItem `json:"writes"`
13 SwapCommit *string `json:"swapCommit"`
14}
15
16type ComAtprotoRepoApplyWritesItem struct {
17 Type string `json:"$type"`
18 Collection string `json:"collection"`
19 Rkey string `json:"rkey"`
20 Value *MarshalableMap `json:"value,omitempty"`
21}
22
23func (s *Server) handleApplyWrites(e echo.Context) error {
24 repo := e.Get("repo").(*models.RepoActor)
25
26 var req ComAtprotoRepoApplyWritesRequest
27 if err := e.Bind(&req); err != nil {
28 s.logger.Error("error binding", "error", err)
29 return helpers.ServerError(e, nil)
30 }
31
32 if err := e.Validate(req); err != nil {
33 s.logger.Error("error validating", "error", err)
34 return helpers.InputError(e, nil)
35 }
36
37 if repo.Repo.Did != req.Repo {
38 s.logger.Warn("mismatched repo/auth")
39 return helpers.InputError(e, nil)
40 }
41
42 ops := []Op{}
43 for _, item := range req.Writes {
44 ops = append(ops, Op{
45 Type: OpType(item.Type),
46 Collection: item.Collection,
47 Rkey: &item.Rkey,
48 Record: item.Value,
49 })
50 }
51
52 if err := s.repoman.applyWrites(repo.Repo, ops, req.SwapCommit); err != nil {
53 s.logger.Error("error applying writes", "error", err)
54 return helpers.ServerError(e, nil)
55 }
56
57 return nil
58}