An atproto PDS written in Go
at v0.5.1 1.3 kB view raw
1package server 2 3import ( 4 "bytes" 5 6 "github.com/bluesky-social/indigo/carstore" 7 "github.com/haileyok/cocoon/internal/helpers" 8 "github.com/haileyok/cocoon/models" 9 "github.com/ipfs/go-cid" 10 cbor "github.com/ipfs/go-ipld-cbor" 11 "github.com/ipld/go-car" 12 "github.com/labstack/echo/v4" 13) 14 15func (s *Server) handleSyncGetRecord(e echo.Context) error { 16 did := e.QueryParam("did") 17 collection := e.QueryParam("collection") 18 rkey := e.QueryParam("rkey") 19 20 var urepo models.Repo 21 if err := s.db.Raw("SELECT * FROM repos WHERE did = ?", nil, did).Scan(&urepo).Error; err != nil { 22 s.logger.Error("error getting repo", "error", err) 23 return helpers.ServerError(e, nil) 24 } 25 26 root, blocks, err := s.repoman.getRecordProof(urepo, collection, rkey) 27 if err != nil { 28 return err 29 } 30 31 buf := new(bytes.Buffer) 32 33 hb, err := cbor.DumpObject(&car.CarHeader{ 34 Roots: []cid.Cid{root}, 35 Version: 1, 36 }) 37 38 if _, err := carstore.LdWrite(buf, hb); err != nil { 39 s.logger.Error("error writing to car", "error", err) 40 return helpers.ServerError(e, nil) 41 } 42 43 for _, blk := range blocks { 44 if _, err := carstore.LdWrite(buf, blk.Cid().Bytes(), blk.RawData()); err != nil { 45 s.logger.Error("error writing to car", "error", err) 46 return helpers.ServerError(e, nil) 47 } 48 } 49 50 return e.Stream(200, "application/vnd.ipld.car", bytes.NewReader(buf.Bytes())) 51}