From 5d63a5bcb330ec7a799a7f29480c6054235315f9 Mon Sep 17 00:00:00 2001 From: Ming Ming Date: Sat, 20 Nov 2021 01:03:53 +0800 Subject: [PATCH] Fix sharing files to the file owner --- lib/use_case/add_to_album.dart | 4 ++ lib/use_case/share_album_with_user.dart | 1 + test/use_case/add_to_album_test.dart | 61 +++++++++++++++++++ test/use_case/share_album_with_user_test.dart | 54 ++++++++++++++++ 4 files changed, 120 insertions(+) diff --git a/lib/use_case/add_to_album.dart b/lib/use_case/add_to_album.dart index 75ab35ba..adf83e7e 100644 --- a/lib/use_case/add_to_album.dart +++ b/lib/use_case/add_to_album.dart @@ -83,6 +83,10 @@ class AddToAlbum { .toSet(); final diffShares = albumShares.difference(fileShares); for (final s in diffShares) { + if (s == f.ownerId) { + // skip files already owned by the target user + continue; + } try { await CreateUserShare(shareRepo)(account, f, s.raw); } catch (e, stackTrace) { diff --git a/lib/use_case/share_album_with_user.dart b/lib/use_case/share_album_with_user.dart index 8ae154b0..66009866 100644 --- a/lib/use_case/share_album_with_user.dart +++ b/lib/use_case/share_album_with_user.dart @@ -49,6 +49,7 @@ class ShareAlbumWithUser { final files = AlbumStaticProvider.of(album) .items .whereType() + .where((item) => item.file.ownerId != shareWith) .map((e) => e.file); try { await CreateUserShare(shareRepo)( diff --git a/test/use_case/add_to_album_test.dart b/test/use_case/add_to_album_test.dart index 1e50beda..81a3eba0 100644 --- a/test/use_case/add_to_album_test.dart +++ b/test/use_case/add_to_album_test.dart @@ -24,6 +24,7 @@ void main() { test("file", _addFile); group("shared album (owned)", () { test("file", _addFileToSharedAlbumOwned); + test("file owned by user", _addFileOwnedByUserToSharedAlbumOwned); }); group("shared album (not owned)", () { test("file", _addFileToMultiuserSharedAlbumNotOwned); @@ -166,6 +167,66 @@ Future _addFileToSharedAlbumOwned() async { ); } +/// Add a file owned by user (user1) to a shared album (admin -> user1) +/// +/// Expect: no shares created +Future _addFileOwnedByUserToSharedAlbumOwned() async { + final account = test_util.buildAccount(); + final pref = Pref.scoped(PrefMemoryProvider({ + "isLabEnableSharedAlbum": true, + })); + final albumFile = test_util.buildAlbumFile( + path: test_util.buildAlbumFilePath("test1.json"), + fileId: 0, + ownerId: "admin", + ); + final file = test_util.buildJpegFile( + path: "remote.php/dav/files/admin/test1.jpg", + fileId: 1, + ownerId: "user1", + ); + final appDb = MockAppDb(); + await appDb.use((db) async { + final transaction = db.transaction(AppDb.fileDbStoreName, idbModeReadWrite); + final store = transaction.objectStore(AppDb.fileDbStoreName); + await store.put(AppDbFileDbEntry.fromFile(account, file).toJson(), + AppDbFileDbEntry.toPrimaryKey(account, file)); + }); + final albumRepo = MockAlbumMemoryRepo([ + Album( + lastUpdated: DateTime.utc(2020, 1, 2, 3, 4, 5), + name: "test", + provider: AlbumStaticProvider(items: []), + coverProvider: AlbumAutoCoverProvider(), + sortProvider: const AlbumNullSortProvider(), + shares: [AlbumShare(userId: "user1".toCi())], + albumFile: albumFile, + ), + ]); + final shareRepo = MockShareMemoryRepo([ + test_util.buildShare(id: "0", file: albumFile, shareWith: "user1"), + ]); + + await AddToAlbum(albumRepo, shareRepo, appDb, pref)( + account, + albumRepo.findAlbumByPath(albumFile.path), + [ + AlbumFileItem( + addedBy: "admin".toCi(), + addedAt: DateTime.utc(2020, 1, 2, 3, 4, 5), + file: file, + ), + ], + ); + + expect( + shareRepo.shares, + [ + test_util.buildShare(id: "0", file: albumFile, shareWith: "user1"), + ], + ); +} + /// Add a file to a shared album (user1 -> admin, user2) /// /// Expect: a new share (admin -> user1, user2) is created for the file diff --git a/test/use_case/share_album_with_user_test.dart b/test/use_case/share_album_with_user_test.dart index 3008d49c..b59bfe4f 100644 --- a/test/use_case/share_album_with_user_test.dart +++ b/test/use_case/share_album_with_user_test.dart @@ -18,6 +18,7 @@ void main() { group("ShareAlbumWithUser", () { test("w/o file", _shareWithoutFile); test("w/ file", _shareWithFile); + test("w/ file owned by user", _shareWithFileOwnedByUser); test("shared album", _shareSharedAlbum); }); } @@ -113,6 +114,59 @@ Future _shareWithFile() async { ); } +/// Share an album with files owned by user (user1) to that user (user1) +/// +/// Expect: share (admin -> user1) added to album's shares list; +/// new shares (admin -> user1) are created for the album json +Future _shareWithFileOwnedByUser() async { + final account = test_util.buildAccount(); + final albumFile = test_util.buildAlbumFile( + path: test_util.buildAlbumFilePath("test1.json"), + fileId: 0, + ); + final file1 = test_util.buildJpegFile( + path: "remote.php/dav/files/admin/test1.jpg", + fileId: 1, + lastModified: DateTime.utc(2020, 1, 2, 3, 4, 5), + ownerId: "user1" + ); + final fileItem1 = AlbumFileItem( + file: file1, + addedBy: "admin".toCi(), + addedAt: DateTime.utc(2020, 1, 2, 3, 4, 5), + ); + final albumRepo = MockAlbumMemoryRepo([ + Album( + lastUpdated: DateTime.utc(2020, 1, 2, 3, 4, 5), + name: "test", + provider: AlbumStaticProvider( + items: [fileItem1], + latestItemTime: file1.lastModified, + ), + coverProvider: AlbumAutoCoverProvider(coverFile: file1), + sortProvider: const AlbumNullSortProvider(), + albumFile: albumFile, + ), + ]); + final shareRepo = MockShareMemoryRepo(); + + await ShareAlbumWithUser(shareRepo, albumRepo)( + account, + albumRepo.findAlbumByPath(albumFile.path), + test_util.buildSharee(shareWith: "user1".toCi()), + ); + expect( + albumRepo.findAlbumByPath(albumFile.path).shares, + [AlbumShare(userId: "user1".toCi())], + ); + expect( + shareRepo.shares, + [ + test_util.buildShare(id: "0", file: albumFile, shareWith: "user1"), + ], + ); +} + /// Share a shared album (admin -> user1) with a user (user2) /// /// Expect: share (admin -> user2) added to album's shares list;