mirror of
https://gitlab.com/nkming2/nc-photos.git
synced 2025-02-24 18:38:48 +01:00
Fix sharing files to the file owner
This commit is contained in:
parent
e9f0f12f23
commit
5d63a5bcb3
4 changed files with 120 additions and 0 deletions
|
@ -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) {
|
||||
|
|
|
@ -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)(
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue