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}