mirror of
https://github.com/immich-app/immich.git
synced 2025-01-04 02:46:47 +01:00
b2f2be3485
* refactor: library scanning fix tests remove offline files step cleanup library service improve tests cleanup tests add db migration fix e2e cleanup openapi fix tests fix tests update docs update docs update mobile code fix formatting don't remove assets from library with invalid import path use trash for offline files add migration simplify scan endpoint cleanup library panel fix library tests e2e lint fix e2e trash e2e fix lint add asset trash tests add more tests ensure thumbs are generated cleanup svelte cleanup queue names fix tests fix lint add warning due to trash fix trash tests fix lint fix tests Admin message for offline asset fix comments Update web/src/lib/components/asset-viewer/asset-viewer-nav-bar.svelte Co-authored-by: Daniel Dietzler <36593685+danieldietzler@users.noreply.github.com> add permission to library scan endpoint revert asset interface sort add trash reason to shared link stub improve path view in offline update docs improve trash performance fix comments remove stray comment * refactor: add back isOffline and remove trashReason from asset, change sync job flow * chore(server): drop coverage to 80% for functions * chore: rebase and generated files --------- Co-authored-by: Zack Pollard <zackpollard@ymail.com>
92 lines
2.6 KiB
Dart
92 lines
2.6 KiB
Dart
import 'dart:typed_data';
|
|
|
|
import 'package:collection/collection.dart';
|
|
import 'package:immich_mobile/entities/asset.entity.dart';
|
|
import 'package:immich_mobile/entities/user.entity.dart';
|
|
|
|
extension ListExtension<E> on List<E> {
|
|
List<E> uniqueConsecutive({
|
|
int Function(E a, E b)? compare,
|
|
void Function(E a, E b)? onDuplicate,
|
|
}) {
|
|
compare ??= (E a, E b) => a == b ? 0 : 1;
|
|
int i = 1, j = 1;
|
|
for (; i < length; i++) {
|
|
if (compare(this[i - 1], this[i]) != 0) {
|
|
if (i != j) {
|
|
this[j] = this[i];
|
|
}
|
|
j++;
|
|
} else if (onDuplicate != null) {
|
|
onDuplicate(this[i - 1], this[i]);
|
|
}
|
|
}
|
|
length = length == 0 ? 0 : j;
|
|
return this;
|
|
}
|
|
|
|
ListSlice<E> nestedSlice(int start, int end) {
|
|
if (this is ListSlice) {
|
|
final ListSlice<E> self = this as ListSlice<E>;
|
|
return ListSlice<E>(self.source, self.start + start, self.start + end);
|
|
}
|
|
return ListSlice<E>(this, start, end);
|
|
}
|
|
}
|
|
|
|
extension IntListExtension on Iterable<int> {
|
|
Int64List toInt64List() {
|
|
final list = Int64List(length);
|
|
list.setAll(0, this);
|
|
return list;
|
|
}
|
|
}
|
|
|
|
extension AssetListExtension on Iterable<Asset> {
|
|
/// Returns the assets that are already available in the Immich server
|
|
Iterable<Asset> remoteOnly({
|
|
void Function()? errorCallback,
|
|
}) {
|
|
final bool onlyRemote = every((e) => e.isRemote);
|
|
if (!onlyRemote) {
|
|
if (errorCallback != null) errorCallback();
|
|
return where((a) => a.isRemote);
|
|
}
|
|
return this;
|
|
}
|
|
|
|
/// Returns the assets that are owned by the user passed to the [owner] param
|
|
/// If [owner] is null, an empty list is returned
|
|
Iterable<Asset> ownedOnly(
|
|
User? owner, {
|
|
void Function()? errorCallback,
|
|
}) {
|
|
if (owner == null) return [];
|
|
final userId = owner.isarId;
|
|
final bool onlyOwned = every((e) => e.ownerId == userId);
|
|
if (!onlyOwned) {
|
|
if (errorCallback != null) errorCallback();
|
|
return where((a) => a.ownerId == userId);
|
|
}
|
|
return this;
|
|
}
|
|
|
|
/// Filters out offline assets and returns those that are still accessible by the Immich server
|
|
/// TODO: isOffline is removed from Immich, so this method is not useful anymore
|
|
Iterable<Asset> nonOfflineOnly({
|
|
void Function()? errorCallback,
|
|
}) {
|
|
final bool onlyLive = every((e) => false);
|
|
if (!onlyLive) {
|
|
if (errorCallback != null) errorCallback();
|
|
return where((a) => false);
|
|
}
|
|
return this;
|
|
}
|
|
}
|
|
|
|
extension SortedByProperty<T> on Iterable<T> {
|
|
Iterable<T> sortedByField(Comparable Function(T e) key) {
|
|
return sorted((a, b) => key(a).compareTo(key(b)));
|
|
}
|
|
}
|