80 lines
2.3 KiB
Go
80 lines
2.3 KiB
Go
package fileserver
|
|
|
|
import (
|
|
"context"
|
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonfile/fileblockstore"
|
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonfile/fileproto"
|
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonfile/fileproto/fileprotoerr"
|
|
blocks "github.com/ipfs/go-block-format"
|
|
"github.com/ipfs/go-cid"
|
|
)
|
|
|
|
type rpcHandler struct {
|
|
store fileblockstore.BlockStore
|
|
}
|
|
|
|
func (r *rpcHandler) GetBlocks(stream fileproto.DRPCFile_GetBlocksStream) error {
|
|
for {
|
|
req, err := stream.Recv()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
resp := &fileproto.GetBlockResponse{
|
|
Cid: req.Cid,
|
|
}
|
|
c, err := cid.Cast(req.Cid)
|
|
if err != nil {
|
|
resp.Code = fileproto.CIDError_CIDErrorUnexpected
|
|
} else {
|
|
b, err := r.store.Get(fileblockstore.CtxWithSpaceId(stream.Context(), req.SpaceId), c)
|
|
if err != nil {
|
|
if err == fileblockstore.ErrCIDNotFound {
|
|
resp.Code = fileproto.CIDError_CIDErrorNotFound
|
|
} else {
|
|
resp.Code = fileproto.CIDError_CIDErrorUnexpected
|
|
}
|
|
} else {
|
|
resp.Data = b.RawData()
|
|
}
|
|
}
|
|
if err = stream.Send(resp); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
}
|
|
|
|
func (r *rpcHandler) PushBlock(ctx context.Context, req *fileproto.PushBlockRequest) (*fileproto.PushBlockResponse, error) {
|
|
c, err := cid.Cast(req.Cid)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
b, err := blocks.NewBlockWithCid(req.Data, c)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if err = r.store.Add(fileblockstore.CtxWithSpaceId(ctx, req.SpaceId), []blocks.Block{b}); err != nil {
|
|
return nil, fileprotoerr.ErrUnexpected
|
|
}
|
|
return &fileproto.PushBlockResponse{}, nil
|
|
}
|
|
|
|
func (r *rpcHandler) DeleteBlocks(ctx context.Context, req *fileproto.DeleteBlocksRequest) (*fileproto.DeleteBlocksResponse, error) {
|
|
for _, cd := range req.Cid {
|
|
c, err := cid.Cast(cd)
|
|
if err == nil {
|
|
if err = r.store.Delete(fileblockstore.CtxWithSpaceId(ctx, req.SpaceId), c); err != nil {
|
|
// TODO: log
|
|
}
|
|
}
|
|
}
|
|
return &fileproto.DeleteBlocksResponse{}, nil
|
|
}
|
|
|
|
func (r *rpcHandler) Check(ctx context.Context, request *fileproto.CheckRequest) (*fileproto.CheckResponse, error) {
|
|
resp := &fileproto.CheckResponse{}
|
|
if withSpaceIds, ok := r.store.(fileblockstore.BlockStoreSpaceIds); ok {
|
|
resp.SpaceIds = withSpaceIds.SpaceIds()
|
|
}
|
|
return resp, nil
|
|
}
|