WIP node api
This commit is contained in:
parent
9ae5710854
commit
4062a76e21
@ -43,10 +43,7 @@ type SpaceCreatePayload struct {
|
|||||||
ReplicationKey uint64
|
ReplicationKey uint64
|
||||||
}
|
}
|
||||||
|
|
||||||
const (
|
const SpaceTypeDerived = "derived.space"
|
||||||
SpaceTypeDerived = "derived.space"
|
|
||||||
SettingsSyncPeriodSeconds = 10
|
|
||||||
)
|
|
||||||
|
|
||||||
type SpaceDerivePayload struct {
|
type SpaceDerivePayload struct {
|
||||||
SigningKey signingkey.PrivKey
|
SigningKey signingkey.PrivKey
|
||||||
|
|||||||
@ -6,4 +6,8 @@ build:
|
|||||||
go build -v -o ../bin/anytype-node -ldflags "$(FLAGS)" github.com/anytypeio/go-anytype-infrastructure-experiments/node/cmd
|
go build -v -o ../bin/anytype-node -ldflags "$(FLAGS)" github.com/anytypeio/go-anytype-infrastructure-experiments/node/cmd
|
||||||
|
|
||||||
test:
|
test:
|
||||||
go test ./... --cover
|
go test ./... --cover
|
||||||
|
|
||||||
|
proto:
|
||||||
|
@$(eval GOGO_START := GOGO_NO_UNDERSCORE=1 GOGO_EXPORT_ONEOF_INTERFACE=1)
|
||||||
|
$(GOGO_START) protoc --gogofaster_out=:. --go-drpc_out=protolib=github.com/gogo/protobuf:. api/apiproto/protos/*.proto
|
||||||
1415
node/api/apiproto/api.pb.go
Normal file
1415
node/api/apiproto/api.pb.go
Normal file
File diff suppressed because it is too large
Load Diff
193
node/api/apiproto/api_drpc.pb.go
Normal file
193
node/api/apiproto/api_drpc.pb.go
Normal file
@ -0,0 +1,193 @@
|
|||||||
|
// Code generated by protoc-gen-go-drpc. DO NOT EDIT.
|
||||||
|
// protoc-gen-go-drpc version: v0.0.32
|
||||||
|
// source: api/apiproto/protos/api.proto
|
||||||
|
|
||||||
|
package apiproto
|
||||||
|
|
||||||
|
import (
|
||||||
|
bytes "bytes"
|
||||||
|
context "context"
|
||||||
|
errors "errors"
|
||||||
|
jsonpb "github.com/gogo/protobuf/jsonpb"
|
||||||
|
proto "github.com/gogo/protobuf/proto"
|
||||||
|
drpc "storj.io/drpc"
|
||||||
|
drpcerr "storj.io/drpc/drpcerr"
|
||||||
|
)
|
||||||
|
|
||||||
|
type drpcEncoding_File_api_apiproto_protos_api_proto struct{}
|
||||||
|
|
||||||
|
func (drpcEncoding_File_api_apiproto_protos_api_proto) Marshal(msg drpc.Message) ([]byte, error) {
|
||||||
|
return proto.Marshal(msg.(proto.Message))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (drpcEncoding_File_api_apiproto_protos_api_proto) Unmarshal(buf []byte, msg drpc.Message) error {
|
||||||
|
return proto.Unmarshal(buf, msg.(proto.Message))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (drpcEncoding_File_api_apiproto_protos_api_proto) JSONMarshal(msg drpc.Message) ([]byte, error) {
|
||||||
|
var buf bytes.Buffer
|
||||||
|
err := new(jsonpb.Marshaler).Marshal(&buf, msg.(proto.Message))
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return buf.Bytes(), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (drpcEncoding_File_api_apiproto_protos_api_proto) JSONUnmarshal(buf []byte, msg drpc.Message) error {
|
||||||
|
return jsonpb.Unmarshal(bytes.NewReader(buf), msg.(proto.Message))
|
||||||
|
}
|
||||||
|
|
||||||
|
type DRPCNodeApiClient interface {
|
||||||
|
DRPCConn() drpc.Conn
|
||||||
|
|
||||||
|
DumpTree(ctx context.Context, in *DumpTreeRequest) (*DumpTreeResponse, error)
|
||||||
|
AllTrees(ctx context.Context, in *AllTreesRequest) (*AllTreesResponse, error)
|
||||||
|
AllSpaces(ctx context.Context, in *AllSpacesRequest) (*AllSpacesResponse, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
type drpcNodeApiClient struct {
|
||||||
|
cc drpc.Conn
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewDRPCNodeApiClient(cc drpc.Conn) DRPCNodeApiClient {
|
||||||
|
return &drpcNodeApiClient{cc}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *drpcNodeApiClient) DRPCConn() drpc.Conn { return c.cc }
|
||||||
|
|
||||||
|
func (c *drpcNodeApiClient) DumpTree(ctx context.Context, in *DumpTreeRequest) (*DumpTreeResponse, error) {
|
||||||
|
out := new(DumpTreeResponse)
|
||||||
|
err := c.cc.Invoke(ctx, "/api.NodeApi/DumpTree", drpcEncoding_File_api_apiproto_protos_api_proto{}, in, out)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return out, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *drpcNodeApiClient) AllTrees(ctx context.Context, in *AllTreesRequest) (*AllTreesResponse, error) {
|
||||||
|
out := new(AllTreesResponse)
|
||||||
|
err := c.cc.Invoke(ctx, "/api.NodeApi/AllTrees", drpcEncoding_File_api_apiproto_protos_api_proto{}, in, out)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return out, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *drpcNodeApiClient) AllSpaces(ctx context.Context, in *AllSpacesRequest) (*AllSpacesResponse, error) {
|
||||||
|
out := new(AllSpacesResponse)
|
||||||
|
err := c.cc.Invoke(ctx, "/api.NodeApi/AllSpaces", drpcEncoding_File_api_apiproto_protos_api_proto{}, in, out)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return out, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type DRPCNodeApiServer interface {
|
||||||
|
DumpTree(context.Context, *DumpTreeRequest) (*DumpTreeResponse, error)
|
||||||
|
AllTrees(context.Context, *AllTreesRequest) (*AllTreesResponse, error)
|
||||||
|
AllSpaces(context.Context, *AllSpacesRequest) (*AllSpacesResponse, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
type DRPCNodeApiUnimplementedServer struct{}
|
||||||
|
|
||||||
|
func (s *DRPCNodeApiUnimplementedServer) DumpTree(context.Context, *DumpTreeRequest) (*DumpTreeResponse, error) {
|
||||||
|
return nil, drpcerr.WithCode(errors.New("Unimplemented"), drpcerr.Unimplemented)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *DRPCNodeApiUnimplementedServer) AllTrees(context.Context, *AllTreesRequest) (*AllTreesResponse, error) {
|
||||||
|
return nil, drpcerr.WithCode(errors.New("Unimplemented"), drpcerr.Unimplemented)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *DRPCNodeApiUnimplementedServer) AllSpaces(context.Context, *AllSpacesRequest) (*AllSpacesResponse, error) {
|
||||||
|
return nil, drpcerr.WithCode(errors.New("Unimplemented"), drpcerr.Unimplemented)
|
||||||
|
}
|
||||||
|
|
||||||
|
type DRPCNodeApiDescription struct{}
|
||||||
|
|
||||||
|
func (DRPCNodeApiDescription) NumMethods() int { return 3 }
|
||||||
|
|
||||||
|
func (DRPCNodeApiDescription) Method(n int) (string, drpc.Encoding, drpc.Receiver, interface{}, bool) {
|
||||||
|
switch n {
|
||||||
|
case 0:
|
||||||
|
return "/api.NodeApi/DumpTree", drpcEncoding_File_api_apiproto_protos_api_proto{},
|
||||||
|
func(srv interface{}, ctx context.Context, in1, in2 interface{}) (drpc.Message, error) {
|
||||||
|
return srv.(DRPCNodeApiServer).
|
||||||
|
DumpTree(
|
||||||
|
ctx,
|
||||||
|
in1.(*DumpTreeRequest),
|
||||||
|
)
|
||||||
|
}, DRPCNodeApiServer.DumpTree, true
|
||||||
|
case 1:
|
||||||
|
return "/api.NodeApi/AllTrees", drpcEncoding_File_api_apiproto_protos_api_proto{},
|
||||||
|
func(srv interface{}, ctx context.Context, in1, in2 interface{}) (drpc.Message, error) {
|
||||||
|
return srv.(DRPCNodeApiServer).
|
||||||
|
AllTrees(
|
||||||
|
ctx,
|
||||||
|
in1.(*AllTreesRequest),
|
||||||
|
)
|
||||||
|
}, DRPCNodeApiServer.AllTrees, true
|
||||||
|
case 2:
|
||||||
|
return "/api.NodeApi/AllSpaces", drpcEncoding_File_api_apiproto_protos_api_proto{},
|
||||||
|
func(srv interface{}, ctx context.Context, in1, in2 interface{}) (drpc.Message, error) {
|
||||||
|
return srv.(DRPCNodeApiServer).
|
||||||
|
AllSpaces(
|
||||||
|
ctx,
|
||||||
|
in1.(*AllSpacesRequest),
|
||||||
|
)
|
||||||
|
}, DRPCNodeApiServer.AllSpaces, true
|
||||||
|
default:
|
||||||
|
return "", nil, nil, nil, false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func DRPCRegisterNodeApi(mux drpc.Mux, impl DRPCNodeApiServer) error {
|
||||||
|
return mux.Register(impl, DRPCNodeApiDescription{})
|
||||||
|
}
|
||||||
|
|
||||||
|
type DRPCNodeApi_DumpTreeStream interface {
|
||||||
|
drpc.Stream
|
||||||
|
SendAndClose(*DumpTreeResponse) error
|
||||||
|
}
|
||||||
|
|
||||||
|
type drpcNodeApi_DumpTreeStream struct {
|
||||||
|
drpc.Stream
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *drpcNodeApi_DumpTreeStream) SendAndClose(m *DumpTreeResponse) error {
|
||||||
|
if err := x.MsgSend(m, drpcEncoding_File_api_apiproto_protos_api_proto{}); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return x.CloseSend()
|
||||||
|
}
|
||||||
|
|
||||||
|
type DRPCNodeApi_AllTreesStream interface {
|
||||||
|
drpc.Stream
|
||||||
|
SendAndClose(*AllTreesResponse) error
|
||||||
|
}
|
||||||
|
|
||||||
|
type drpcNodeApi_AllTreesStream struct {
|
||||||
|
drpc.Stream
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *drpcNodeApi_AllTreesStream) SendAndClose(m *AllTreesResponse) error {
|
||||||
|
if err := x.MsgSend(m, drpcEncoding_File_api_apiproto_protos_api_proto{}); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return x.CloseSend()
|
||||||
|
}
|
||||||
|
|
||||||
|
type DRPCNodeApi_AllSpacesStream interface {
|
||||||
|
drpc.Stream
|
||||||
|
SendAndClose(*AllSpacesResponse) error
|
||||||
|
}
|
||||||
|
|
||||||
|
type drpcNodeApi_AllSpacesStream struct {
|
||||||
|
drpc.Stream
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *drpcNodeApi_AllSpacesStream) SendAndClose(m *AllSpacesResponse) error {
|
||||||
|
if err := x.MsgSend(m, drpcEncoding_File_api_apiproto_protos_api_proto{}); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return x.CloseSend()
|
||||||
|
}
|
||||||
39
node/api/apiproto/protos/api.proto
Normal file
39
node/api/apiproto/protos/api.proto
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
syntax = "proto3";
|
||||||
|
package api;
|
||||||
|
|
||||||
|
option go_package = "api/apiproto";
|
||||||
|
|
||||||
|
service NodeApi {
|
||||||
|
rpc DumpTree(DumpTreeRequest) returns(DumpTreeResponse);
|
||||||
|
rpc AllTrees(AllTreesRequest) returns(AllTreesResponse);
|
||||||
|
rpc AllSpaces(AllSpacesRequest) returns(AllSpacesResponse);
|
||||||
|
}
|
||||||
|
|
||||||
|
message DumpTreeRequest {
|
||||||
|
string spaceId = 1;
|
||||||
|
string documentId = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
message DumpTreeResponse {
|
||||||
|
string dump = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
message AllTreesRequest {
|
||||||
|
string spaceId = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
message Tree {
|
||||||
|
string id = 1;
|
||||||
|
repeated string heads = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
message AllTreesResponse {
|
||||||
|
repeated Tree trees = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
message AllSpacesRequest {
|
||||||
|
}
|
||||||
|
|
||||||
|
message AllSpacesResponse {
|
||||||
|
repeated string spaceIds = 1;
|
||||||
|
}
|
||||||
56
node/api/rpchandler.go
Normal file
56
node/api/rpchandler.go
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
package api
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/treegetter"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/node/api/apiproto"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/node/nodespace"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/node/storage"
|
||||||
|
)
|
||||||
|
|
||||||
|
type rpcHandler struct {
|
||||||
|
treeCache treegetter.TreeGetter
|
||||||
|
spaceService nodespace.Service
|
||||||
|
storageService storage.NodeStorage
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *rpcHandler) DumpTree(ctx context.Context, request *apiproto.DumpTreeRequest) (resp *apiproto.DumpTreeResponse, err error) {
|
||||||
|
tree, err := r.treeCache.GetTree(context.Background(), request.SpaceId, request.DocumentId)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
dump, err := tree.DebugDump()
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
resp = &apiproto.DumpTreeResponse{
|
||||||
|
Dump: dump,
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *rpcHandler) AllTrees(ctx context.Context, request *apiproto.AllTreesRequest) (resp *apiproto.AllTreesResponse, err error) {
|
||||||
|
space, err := r.spaceService.GetSpace(ctx, request.SpaceId)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
heads := space.DebugAllHeads()
|
||||||
|
var trees []*apiproto.Tree
|
||||||
|
for _, head := range heads {
|
||||||
|
trees = append(trees, &apiproto.Tree{
|
||||||
|
Id: head.Id,
|
||||||
|
Heads: head.Heads,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
resp = &apiproto.AllTreesResponse{Trees: trees}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *rpcHandler) AllSpaces(ctx context.Context, request *apiproto.AllSpacesRequest) (resp *apiproto.AllSpacesResponse, err error) {
|
||||||
|
ids, err := r.storageService.AllSpaceIds()
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
resp = &apiproto.AllSpacesResponse{SpaceIds: ids}
|
||||||
|
return
|
||||||
|
}
|
||||||
69
node/api/service.go
Normal file
69
node/api/service.go
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
package api
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/treegetter"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/config"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/rpc/server"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/secure"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/node/api/apiproto"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/node/nodespace"
|
||||||
|
nodestorage "github.com/anytypeio/go-anytype-infrastructure-experiments/node/storage"
|
||||||
|
"storj.io/drpc"
|
||||||
|
)
|
||||||
|
|
||||||
|
const CName = "api.service"
|
||||||
|
|
||||||
|
var log = logger.NewNamed(CName)
|
||||||
|
|
||||||
|
func New() Service {
|
||||||
|
return &service{BaseDrpcServer: server.NewBaseDrpcServer()}
|
||||||
|
}
|
||||||
|
|
||||||
|
type Service interface {
|
||||||
|
app.ComponentRunnable
|
||||||
|
drpc.Mux
|
||||||
|
}
|
||||||
|
|
||||||
|
type service struct {
|
||||||
|
transport secure.Service
|
||||||
|
cfg *config.Config
|
||||||
|
treeCache treegetter.TreeGetter
|
||||||
|
spaceService nodespace.Service
|
||||||
|
storageService nodestorage.NodeStorage
|
||||||
|
*server.BaseDrpcServer
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *service) Init(a *app.App) (err error) {
|
||||||
|
s.treeCache = a.MustComponent(treegetter.CName).(treegetter.TreeGetter)
|
||||||
|
s.spaceService = a.MustComponent(nodespace.CName).(nodespace.Service)
|
||||||
|
s.storageService = a.MustComponent(storage.CName).(nodestorage.NodeStorage)
|
||||||
|
s.cfg = a.MustComponent(config.CName).(*config.Config)
|
||||||
|
s.transport = a.MustComponent(secure.CName).(secure.Service)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *service) Name() (name string) {
|
||||||
|
return CName
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *service) Run(ctx context.Context) (err error) {
|
||||||
|
err = s.BaseDrpcServer.Run(
|
||||||
|
ctx,
|
||||||
|
s.cfg.APIServer.ListenAddrs,
|
||||||
|
func(handler drpc.Handler) drpc.Handler {
|
||||||
|
return handler
|
||||||
|
},
|
||||||
|
s.transport.BasicListener)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
return apiproto.DRPCRegisterNodeApi(s, &rpcHandler{s.treeCache, s.spaceService, s.storageService})
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *service) Close(ctx context.Context) (err error) {
|
||||||
|
return s.BaseDrpcServer.Close(ctx)
|
||||||
|
}
|
||||||
@ -15,6 +15,7 @@ import (
|
|||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/secure"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/secure"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/node/account"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/node/account"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/node/api"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/node/nodespace"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/node/nodespace"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/node/nodespace/nodecache"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/node/nodespace/nodecache"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/node/storage"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/node/storage"
|
||||||
@ -101,5 +102,6 @@ func Bootstrap(a *app.App) {
|
|||||||
Register(pool.New()).
|
Register(pool.New()).
|
||||||
Register(nodespace.New()).
|
Register(nodespace.New()).
|
||||||
Register(commonspace.New()).
|
Register(commonspace.New()).
|
||||||
Register(server.New())
|
Register(server.New()).
|
||||||
|
Register(api.New())
|
||||||
}
|
}
|
||||||
|
|||||||
@ -4,13 +4,19 @@ import (
|
|||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/config"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/config"
|
||||||
|
"os"
|
||||||
)
|
)
|
||||||
|
|
||||||
type storageService struct {
|
type storageService struct {
|
||||||
rootPath string
|
rootPath string
|
||||||
}
|
}
|
||||||
|
|
||||||
func New() storage.SpaceStorageProvider {
|
type NodeStorage interface {
|
||||||
|
storage.SpaceStorageProvider
|
||||||
|
AllSpaceIds() (ids []string, err error)
|
||||||
|
}
|
||||||
|
|
||||||
|
func New() NodeStorage {
|
||||||
return &storageService{}
|
return &storageService{}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -31,3 +37,16 @@ func (s *storageService) SpaceStorage(id string) (storage.SpaceStorage, error) {
|
|||||||
func (s *storageService) CreateSpaceStorage(payload storage.SpaceStorageCreatePayload) (storage.SpaceStorage, error) {
|
func (s *storageService) CreateSpaceStorage(payload storage.SpaceStorageCreatePayload) (storage.SpaceStorage, error) {
|
||||||
return createSpaceStorage(s.rootPath, payload)
|
return createSpaceStorage(s.rootPath, payload)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *storageService) AllSpaceIds() (ids []string, err error) {
|
||||||
|
var files []string
|
||||||
|
fileInfo, err := os.ReadDir(s.rootPath)
|
||||||
|
if err != nil {
|
||||||
|
return files, err
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, file := range fileInfo {
|
||||||
|
files = append(files, file.Name())
|
||||||
|
}
|
||||||
|
return files, nil
|
||||||
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user