diff --git a/backend/app/rest/api/rest_private.go b/backend/app/rest/api/rest_private.go index 83036242..05e22d8e 100644 --- a/backend/app/rest/api/rest_private.go +++ b/backend/app/rest/api/rest_private.go @@ -568,14 +568,14 @@ func (s *private) savePictureCtrl(w http.ResponseWriter, r *http.Request) { return } - file, header, err := r.FormFile("file") + file, _, err := r.FormFile("file") if err != nil { rest.SendErrorJSON(w, r, http.StatusInternalServerError, err, "can't get image file from the request", rest.ErrInternal) return } defer func() { _ = file.Close() }() - id, err := s.imageService.Save(header.Filename, user.ID, file) + id, err := s.imageService.Save(user.ID, file) if err != nil { rest.SendErrorJSON(w, r, http.StatusBadRequest, err, "can't save image", rest.ErrInternal) return diff --git a/backend/app/store/image/bolt_store.go b/backend/app/store/image/bolt_store.go index f1d13a1c..209907fd 100644 --- a/backend/app/store/image/bolt_store.go +++ b/backend/app/store/image/bolt_store.go @@ -86,7 +86,7 @@ func (b *Bolt) SaveWithID(id string, r io.Reader) (string, error) { } // Save data from reader to staging bucket in DB -func (b *Bolt) Save(_ string, userID string, r io.Reader) (id string, err error) { +func (b *Bolt) Save(userID string, r io.Reader) (id string, err error) { id = path.Join(userID, guid()) return b.SaveWithID(id, r) } diff --git a/backend/app/store/image/bolt_store_test.go b/backend/app/store/image/bolt_store_test.go index 27e01fed..5f1a8210 100644 --- a/backend/app/store/image/bolt_store_test.go +++ b/backend/app/store/image/bolt_store_test.go @@ -18,7 +18,7 @@ func TestBoltStore_SaveCommit(t *testing.T) { svc, teardown := prepareBoltImageStorageTest(t) defer teardown() - id, err := svc.Save("file1.png", "user1", gopherPNG()) + id, err := svc.Save("user1", gopherPNG()) assert.NoError(t, err) assert.Contains(t, id, "user1") t.Log(id) @@ -48,7 +48,7 @@ func TestBoltStore_LoadAfterSave(t *testing.T) { svc, teardown := prepareBoltImageStorageTest(t) defer teardown() - id, err := svc.Save("file1.png", "user1", gopherPNG()) + id, err := svc.Save("user1", gopherPNG()) assert.NoError(t, err) assert.Contains(t, id, "user1") t.Log(id) @@ -66,7 +66,7 @@ func TestBoltStore_Cleanup(t *testing.T) { defer teardown() save := func(file string, user string) (id string) { - id, err := svc.Save(file, user, gopherPNG()) + id, err := svc.Save(user, gopherPNG()) require.NoError(t, err) checkBoltImgData(t, svc.db, imagesStagedBktName, id, func(data []byte) error { diff --git a/backend/app/store/image/fs_store.go b/backend/app/store/image/fs_store.go index 80377d6b..878ee892 100644 --- a/backend/app/store/image/fs_store.go +++ b/backend/app/store/image/fs_store.go @@ -58,15 +58,11 @@ func (f *FileSystem) SaveWithID(id string, r io.Reader) (string, error) { return id, nil } -// Save data from a reader for given file name to local FS, staging directory. Returns id as user/uuid +// Save data from a reader to local FS, staging directory. Returns id as user/uuid // Files partitioned across multiple subdirectories, and the final path includes part, i.e. /location/user1/03/123-4567 -func (f *FileSystem) Save(fileName string, userID string, r io.Reader) (id string, err error) { +func (f *FileSystem) Save(userID string, r io.Reader) (id string, err error) { tempId := path.Join(userID, guid()) // make id as user/uuid - id, err = f.SaveWithID(tempId, r) - if err != nil { - err = errors.Wrapf(err, "can't save image file %s", fileName) - } - return id, err + return f.SaveWithID(tempId, r) } // Commit file stored in staging location by moving it to permanent location diff --git a/backend/app/store/image/fs_store_test.go b/backend/app/store/image/fs_store_test.go index d2077d81..8b7908bc 100644 --- a/backend/app/store/image/fs_store_test.go +++ b/backend/app/store/image/fs_store_test.go @@ -44,7 +44,7 @@ func TestFsStore_Save(t *testing.T) { svc, teardown := prepareImageTest(t) defer teardown() - id, err := svc.Save("file1.png", "user1", gopherPNG()) + id, err := svc.Save("user1", gopherPNG()) assert.NoError(t, err) assert.Contains(t, id, "user1/") t.Log(id) @@ -61,7 +61,7 @@ func TestFsStore_SaveWithResize(t *testing.T) { defer teardown() svc.MaxWidth, svc.MaxHeight = 32, 32 - id, err := svc.Save("file1.png", "user1", gopherPNG()) + id, err := svc.Save("user1", gopherPNG()) assert.NoError(t, err) assert.Contains(t, id, "user1/") t.Log(id) @@ -82,7 +82,7 @@ func TestFsStore_SaveWithResizeJpeg(t *testing.T) { fh, err := os.Open("testdata/circles.jpg") defer func() { assert.NoError(t, fh.Close()) }() assert.NoError(t, err) - id, err := svc.Save("circles.jpg", "user1", fh) + id, err := svc.Save("user1", fh) assert.NoError(t, err) assert.Contains(t, id, "user1/") t.Log(id) @@ -103,7 +103,7 @@ func TestFsStore_SaveNoResizeJpeg(t *testing.T) { fh, err := os.Open("testdata/circles.jpg") defer func() { assert.NoError(t, fh.Close()) }() assert.NoError(t, err) - id, err := svc.Save("circles.jpg", "user1", fh) + id, err := svc.Save("user1", fh) assert.NoError(t, err) assert.Contains(t, id, "user1/") t.Log(id) @@ -119,7 +119,7 @@ func TestFsStore_WrongFormat(t *testing.T) { svc, teardown := prepareImageTest(t) defer teardown() - _, err := svc.Save("file1.png", "user1", strings.NewReader("blah blah bad image")) + _, err := svc.Save("user1", strings.NewReader("blah blah bad image")) assert.Error(t, err) } @@ -127,7 +127,7 @@ func TestFsStore_SaveAndCommit(t *testing.T) { svc, teardown := prepareImageTest(t) defer teardown() - id, err := svc.Save("file1.png", "user1", gopherPNG()) + id, err := svc.Save("user1", gopherPNG()) require.NoError(t, err) err = svc.Commit(id) require.NoError(t, err) @@ -147,7 +147,7 @@ func TestFsStore_SaveTooLarge(t *testing.T) { svc, teardown := prepareImageTest(t) defer teardown() svc.MaxSize = 2000 - _, err := svc.Save("blah_ff1.png", "user2", io.MultiReader(gopherPNG(), gopherPNG())) + _, err := svc.Save("user2", io.MultiReader(gopherPNG(), gopherPNG())) assert.Error(t, err) assert.Contains(t, err.Error(), "is too large") } @@ -157,7 +157,7 @@ func TestFsStore_LoadAfterSave(t *testing.T) { svc, teardown := prepareImageTest(t) defer teardown() - id, err := svc.Save("blah_ff1.png", "user1", gopherPNG()) + id, err := svc.Save("user1", gopherPNG()) assert.NoError(t, err) t.Log(id) @@ -173,7 +173,7 @@ func TestFsStore_LoadAfterCommit(t *testing.T) { svc, teardown := prepareImageTest(t) defer teardown() - id, err := svc.Save("blah_ff1.png", "user1", gopherPNG()) + id, err := svc.Save("user1", gopherPNG()) assert.NoError(t, err) t.Log(id) err = svc.Commit(id) @@ -235,7 +235,7 @@ func TestFsStore_Cleanup(t *testing.T) { defer teardown() save := func(file string, user string) (path string) { - id, err := svc.Save(file, user, gopherPNG()) + id, err := svc.Save(user, gopherPNG()) require.NoError(t, err) img := svc.location(svc.Staging, id) data, err := ioutil.ReadFile(img) diff --git a/backend/app/store/image/image.go b/backend/app/store/image/image.go index 7a55e5f6..7cb2e7ae 100644 --- a/backend/app/store/image/image.go +++ b/backend/app/store/image/image.go @@ -47,10 +47,10 @@ type Service struct { // Store defines interface for saving and loading pictures. // Declares two-stage save with Commit. Save stores to staging area and Commit moves to the final location type Store interface { - Save(fileName string, userID string, r io.Reader) (id string, err error) // get name and reader and returns ID of stored (staging) image - SaveWithID(id string, r io.Reader) (string, error) // store image for passed id to staging - Load(id string) ([]byte, error) // load image by ID. Caller has to close the reader. - SizeLimit() int // max image size + Save(userID string, r io.Reader) (id string, err error) // get name and reader and returns ID of stored (staging) image + SaveWithID(id string, r io.Reader) (string, error) // store image for passed id to staging + Load(id string) ([]byte, error) // load image by ID. Caller has to close the reader. + SizeLimit() int // max image size Commit(id string) error // move image from staging to permanent Cleanup(ctx context.Context, ttl time.Duration) error // run removal loop for old images on staging diff --git a/backend/app/store/image/image_mock.go b/backend/app/store/image/image_mock.go index 8c23293c..9c3090fd 100644 --- a/backend/app/store/image/image_mock.go +++ b/backend/app/store/image/image_mock.go @@ -63,20 +63,20 @@ func (_m *MockStore) Load(id string) ([]byte, error) { return r0, r1 } -// Save provides a mock function with given fields: fileName, userID, r -func (_m *MockStore) Save(fileName string, userID string, r io.Reader) (string, error) { - ret := _m.Called(fileName, userID, r) +// Save provides a mock function with given fields: userID, r +func (_m *MockStore) Save(userID string, r io.Reader) (string, error) { + ret := _m.Called(userID, r) var r0 string - if rf, ok := ret.Get(0).(func(string, string, io.Reader) string); ok { - r0 = rf(fileName, userID, r) + if rf, ok := ret.Get(0).(func(string, io.Reader) string); ok { + r0 = rf(userID, r) } else { r0 = ret.Get(0).(string) } var r1 error - if rf, ok := ret.Get(1).(func(string, string, io.Reader) error); ok { - r1 = rf(fileName, userID, r) + if rf, ok := ret.Get(1).(func(string, io.Reader) error); ok { + r1 = rf(userID, r) } else { r1 = ret.Error(1) }