Add list
This commit is contained in:
@@ -9,6 +9,8 @@ import (
|
||||
"google.golang.org/protobuf/proto"
|
||||
)
|
||||
|
||||
var _ FileStore = &BoltStore{}
|
||||
|
||||
type BoltStore struct {
|
||||
db *bolt.DB
|
||||
}
|
||||
@@ -88,3 +90,24 @@ func (s *BoltStore) DeleteFile(id string) error {
|
||||
return bkt.Delete([]byte(id))
|
||||
})
|
||||
}
|
||||
|
||||
func (s *BoltStore) ListFiles() ([]*pb.ListFilesResponse_ListFileInfo, error) {
|
||||
var response []*pb.ListFilesResponse_ListFileInfo
|
||||
err := s.db.View(func(t *bolt.Tx) error {
|
||||
bkt := t.Bucket(bktKey)
|
||||
return bkt.ForEach(func(k, v []byte) error {
|
||||
var f pb.File
|
||||
err := proto.Unmarshal(v, &f)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
response = append(response, &pb.ListFilesResponse_ListFileInfo{FileId: f.FileId, Metadata: f.Metadata})
|
||||
return nil
|
||||
})
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return response, nil
|
||||
}
|
||||
|
@@ -3,6 +3,7 @@ package store
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io/fs"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"path/filepath"
|
||||
@@ -92,3 +93,37 @@ func (s *FileSystemStore) DeleteFile(id string) error {
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *FileSystemStore) ListFiles() ([]*pb.ListFilesResponse_ListFileInfo, error) {
|
||||
root := os.DirFS(s.dir)
|
||||
var response []*pb.ListFilesResponse_ListFileInfo
|
||||
err := fs.WalkDir(root, ".", func(path string, d fs.DirEntry, err error) error {
|
||||
id := filepath.Base(path)
|
||||
|
||||
// Check that it matches length of uuid
|
||||
if len(id) != 36 {
|
||||
return nil
|
||||
}
|
||||
|
||||
if _, err := uuid.Parse(id); err == nil {
|
||||
// Is valid uuid, try to open metadata-file
|
||||
f, err := root.Open(fmt.Sprintf("%s.metadata", path))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer f.Close()
|
||||
|
||||
var fm pb.File_Metadata
|
||||
decoder := json.NewDecoder(f)
|
||||
if err := decoder.Decode(&fm); err != nil {
|
||||
return err
|
||||
}
|
||||
response = append(response, &pb.ListFilesResponse_ListFileInfo{FileId: id, Metadata: &fm})
|
||||
}
|
||||
return nil
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return response, nil
|
||||
}
|
||||
|
@@ -51,3 +51,16 @@ func (s *MemoryFileStore) DeleteFile(id string) error {
|
||||
delete(s.files, id)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *MemoryFileStore) ListFiles() ([]*pb.ListFilesResponse_ListFileInfo, error) {
|
||||
s.filesLock.RLock()
|
||||
defer s.filesLock.RUnlock()
|
||||
|
||||
var response []*pb.ListFilesResponse_ListFileInfo
|
||||
|
||||
for _, f := range s.files {
|
||||
response = append(response, &pb.ListFilesResponse_ListFileInfo{FileId: f.FileId, Metadata: f.Metadata})
|
||||
}
|
||||
|
||||
return response, nil
|
||||
}
|
||||
|
@@ -12,4 +12,5 @@ type FileStore interface {
|
||||
GetFile(id string) (*pb.File, error)
|
||||
StoreFile(file *pb.File) (string, error)
|
||||
DeleteFile(id string) error
|
||||
ListFiles() ([]*pb.ListFilesResponse_ListFileInfo, error)
|
||||
}
|
||||
|
@@ -26,6 +26,19 @@ func doFileStoreTest(s store.FileStore, t *testing.T) {
|
||||
t.Fatalf("Unable to store file: %s", err)
|
||||
}
|
||||
|
||||
// List
|
||||
list, err := s.ListFiles()
|
||||
if err != nil {
|
||||
t.Fatalf("error listing files: %s", err)
|
||||
}
|
||||
if len(list) != 1 {
|
||||
t.Fatalf("List returned unexpected amount. Got %d want %d", len(list), 1)
|
||||
}
|
||||
|
||||
if list[0].FileId != id {
|
||||
t.Fatalf("List contains wrong id")
|
||||
}
|
||||
|
||||
retrieved, err := s.GetFile(id)
|
||||
if err != nil {
|
||||
t.Fatalf("Unable to get file: %s", err)
|
||||
|
Reference in New Issue
Block a user