any-sync/filenode/fileserver/rpchandler.go
2022-12-23 21:23:44 +03:00

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
}