Something went wrong. Try again.
A fork of the Cocoon PDS but being made more distributed. forked from willdot.net/cocoon
Something went wrong. Try again.
1.4 kB · 54 lines
Go
at test
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455package server
import ( "bytes"
"github.com/bluesky-social/indigo/carstore" "github.com/haileyok/cocoon/internal/helpers" "github.com/haileyok/cocoon/models" "github.com/ipfs/go-cid" cbor "github.com/ipfs/go-ipld-cbor" "github.com/ipld/go-car" "github.com/labstack/echo/v4")
func (s *Server) handleSyncGetRecord(e echo.Context) error { ctx := e.Request().Context() logger := s.logger.With("name", "handleSyncGetRecord")
did := e.QueryParam("did") collection := e.QueryParam("collection") rkey := e.QueryParam("rkey")
var urepo models.Repo if err := s.db.Raw(ctx, "SELECT * FROM repos WHERE did = ?", nil, did).Scan(&urepo).Error; err != nil { logger.Error("error getting repo", "error", err) return helpers.ServerError(e, nil) }
root, blocks, err := s.repoman.getRecordProof(ctx, urepo, collection, rkey) if err != nil { return err }
buf := new(bytes.Buffer)
hb, err := cbor.DumpObject(&car.CarHeader{ Roots: []cid.Cid{root}, Version: 1, })
if _, err := carstore.LdWrite(buf, hb); err != nil { logger.Error("error writing to car", "error", err) return helpers.ServerError(e, nil) }
for _, blk := range blocks { if _, err := carstore.LdWrite(buf, blk.Cid().Bytes(), blk.RawData()); err != nil { logger.Error("error writing to car", "error", err) return helpers.ServerError(e, nil) } }
return e.Stream(200, "application/vnd.ipld.car", bytes.NewReader(buf.Bytes()))}