This commit is contained in:
2021-12-04 11:30:42 +01:00
parent 1d51a8463e
commit f56e3e7bff
10 changed files with 589 additions and 35 deletions

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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)
}

View File

@@ -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)