Fix sharing files to the file owner

This commit is contained in:
Ming Ming 2021-11-20 01:03:53 +08:00
parent e9f0f12f23
commit 5d63a5bcb3
4 changed files with 120 additions and 0 deletions

View file

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

View file

@ -49,6 +49,7 @@ class ShareAlbumWithUser {
final files = AlbumStaticProvider.of(album)
.items
.whereType<AlbumFileItem>()
.where((item) => item.file.ownerId != shareWith)
.map((e) => e.file);
try {
await CreateUserShare(shareRepo)(

View file

@ -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<void> _addFileToSharedAlbumOwned() async {
);
}
/// Add a file owned by user (user1) to a shared album (admin -> user1)
///
/// Expect: no shares created
Future<void> _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

View file

@ -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<void> _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<void> _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;