This commit is contained in:
@@ -7,13 +7,13 @@ import (
|
||||
|
||||
type File struct {
|
||||
ID string `json:"id"`
|
||||
OriginalFilename string `json:"original_filename"`
|
||||
MaxViews uint `json:"max_views"`
|
||||
ExpiresOn time.Time `json:"expires_on"`
|
||||
OriginalFilename string `json:"originalFilename"`
|
||||
MaxViews uint `json:"maxViews"`
|
||||
ExpiresOn time.Time `json:"expiresOn"`
|
||||
|
||||
Body io.ReadCloser
|
||||
|
||||
FileSize int64 `json:"file_size"`
|
||||
FileSize int64 `json:"fileSize"`
|
||||
}
|
||||
|
||||
type FileStore interface {
|
||||
|
@@ -34,6 +34,7 @@ func (s *FSFileStore) Store(f *File) error {
|
||||
}
|
||||
|
||||
path := filepath.Join(s.dir, f.ID)
|
||||
|
||||
dst, err := os.Create(path)
|
||||
if err != nil {
|
||||
return err
|
||||
@@ -44,12 +45,15 @@ func (s *FSFileStore) Store(f *File) error {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
s.metadata[f.ID] = metadata
|
||||
s.metadata[f.ID].FileSize = n
|
||||
|
||||
if err := s.writeMetadata(); err != nil {
|
||||
delete(s.metadata, f.ID)
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -60,11 +64,14 @@ func (s *FSFileStore) Get(id string) (*File, error) {
|
||||
}
|
||||
|
||||
path := filepath.Join(s.dir, id)
|
||||
|
||||
f, err := os.Open(path)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
metadata.Body = f
|
||||
|
||||
return metadata, nil
|
||||
}
|
||||
|
||||
@@ -73,20 +80,24 @@ func (s *FSFileStore) Delete(id string) error {
|
||||
if err := os.Remove(path); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
delete(s.metadata, id)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *FSFileStore) List() ([]string, error) {
|
||||
var results []string
|
||||
results := make([]string, 0, len(s.metadata))
|
||||
for k := range s.metadata {
|
||||
results = append(results, k)
|
||||
}
|
||||
|
||||
return results, nil
|
||||
}
|
||||
|
||||
func (s *FSFileStore) writeMetadata() error {
|
||||
path := filepath.Join(s.dir, "metadata.json")
|
||||
|
||||
f, err := os.Create(path)
|
||||
if err != nil {
|
||||
return err
|
||||
@@ -97,11 +108,13 @@ func (s *FSFileStore) writeMetadata() error {
|
||||
if err := encoder.Encode(s.metadata); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *FSFileStore) readMetadata() error {
|
||||
path := filepath.Join(s.dir, "metadata.json")
|
||||
|
||||
f, err := os.Open(path)
|
||||
if err != nil {
|
||||
// TODO: Handle errors better
|
||||
@@ -113,5 +126,6 @@ func (s *FSFileStore) readMetadata() error {
|
||||
if err := decoder.Decode(&s.metadata); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
@@ -29,7 +29,6 @@ func NewMemoryFileStore() *MemoryFileStore {
|
||||
}
|
||||
|
||||
func (s *MemoryFileStore) Store(f *File) error {
|
||||
|
||||
data := &fileData{
|
||||
ID: f.ID,
|
||||
MaxViews: f.MaxViews,
|
||||
@@ -45,6 +44,7 @@ func (s *MemoryFileStore) Store(f *File) error {
|
||||
defer s.lock.Unlock()
|
||||
|
||||
s.data[f.ID] = data
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -56,6 +56,7 @@ func (s *MemoryFileStore) Get(id string) (*File, error) {
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("no such item")
|
||||
}
|
||||
|
||||
f := &File{
|
||||
ID: fd.ID,
|
||||
MaxViews: fd.MaxViews,
|
||||
@@ -70,17 +71,21 @@ func (s *MemoryFileStore) Get(id string) (*File, error) {
|
||||
func (s *MemoryFileStore) Delete(id string) error {
|
||||
s.lock.Lock()
|
||||
defer s.lock.Unlock()
|
||||
|
||||
delete(s.data, id)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *MemoryFileStore) List() ([]string, error) {
|
||||
var ids []string
|
||||
ids := make([]string, 0, len(s.data))
|
||||
|
||||
s.lock.RLock()
|
||||
defer s.lock.RUnlock()
|
||||
|
||||
for id := range s.data {
|
||||
ids = append(ids, id)
|
||||
}
|
||||
|
||||
return ids, nil
|
||||
}
|
||||
|
Reference in New Issue
Block a user