mirror of
https://github.com/immich-app/immich.git
synced 2025-12-07 21:30:59 -08:00
Compare commits
1 Commits
v1.137.1
...
drift-auth
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4677ceb03c |
1
mobile/drift_schemas/main/drift_schema_v5.json
generated
Normal file
1
mobile/drift_schemas/main/drift_schema_v5.json
generated
Normal file
File diff suppressed because one or more lines are too long
@@ -1,6 +1,9 @@
|
|||||||
import 'package:immich_mobile/domain/models/store.model.dart';
|
import 'package:immich_mobile/domain/models/store.model.dart';
|
||||||
|
import 'package:immich_mobile/domain/models/user.model.dart';
|
||||||
|
|
||||||
enum Setting<T> {
|
enum Setting<T> {
|
||||||
|
// TODO: Remove UserDto after new store in drift
|
||||||
|
currentUser<UserDto?>(StoreKey.currentUser, null),
|
||||||
tilesPerRow<int>(StoreKey.tilesPerRow, 4),
|
tilesPerRow<int>(StoreKey.tilesPerRow, 4),
|
||||||
groupAssetsBy<int>(StoreKey.groupAssetsBy, 0),
|
groupAssetsBy<int>(StoreKey.groupAssetsBy, 0),
|
||||||
showStorageIndicator<bool>(StoreKey.storageIndicator, true),
|
showStorageIndicator<bool>(StoreKey.storageIndicator, true),
|
||||||
|
|||||||
@@ -1,9 +1,6 @@
|
|||||||
// ignore_for_file: public_member_api_docs, sort_constructors_first
|
|
||||||
import 'dart:convert';
|
|
||||||
|
|
||||||
import 'package:immich_mobile/domain/models/user_metadata.model.dart';
|
import 'package:immich_mobile/domain/models/user_metadata.model.dart';
|
||||||
|
|
||||||
// TODO: Rename to User once Isar is removed
|
// TODO: Remove UserDto once Isar is removed
|
||||||
class UserDto {
|
class UserDto {
|
||||||
final String id;
|
final String id;
|
||||||
final String email;
|
final String email;
|
||||||
@@ -44,19 +41,19 @@ class UserDto {
|
|||||||
@override
|
@override
|
||||||
String toString() {
|
String toString() {
|
||||||
return '''User: {
|
return '''User: {
|
||||||
id: $id,
|
id: $id,
|
||||||
email: $email,
|
email: $email,
|
||||||
name: $name,
|
name: $name,
|
||||||
isAdmin: $isAdmin,
|
isAdmin: $isAdmin,
|
||||||
updatedAt: $updatedAt,
|
updatedAt: $updatedAt,
|
||||||
profileImagePath: ${profileImagePath ?? '<NA>'},
|
profileImagePath: ${profileImagePath ?? '<NA>'},
|
||||||
avatarColor: $avatarColor,
|
avatarColor: $avatarColor,
|
||||||
memoryEnabled: $memoryEnabled,
|
memoryEnabled: $memoryEnabled,
|
||||||
inTimeline: $inTimeline,
|
inTimeline: $inTimeline,
|
||||||
isPartnerSharedBy: $isPartnerSharedBy,
|
isPartnerSharedBy: $isPartnerSharedBy,
|
||||||
isPartnerSharedWith: $isPartnerSharedWith,
|
isPartnerSharedWith: $isPartnerSharedWith,
|
||||||
quotaUsageInBytes: $quotaUsageInBytes,
|
quotaUsageInBytes: $quotaUsageInBytes,
|
||||||
quotaSizeInBytes: $quotaSizeInBytes,
|
quotaSizeInBytes: $quotaSizeInBytes,
|
||||||
}''';
|
}''';
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -127,80 +124,229 @@ quotaSizeInBytes: $quotaSizeInBytes,
|
|||||||
quotaSizeInBytes.hashCode;
|
quotaSizeInBytes.hashCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
class PartnerUserDto {
|
class User {
|
||||||
|
final String id;
|
||||||
|
final String name;
|
||||||
|
final String email;
|
||||||
|
final DateTime? deletedAt;
|
||||||
|
final AvatarColor? avatarColor;
|
||||||
|
|
||||||
|
const User({
|
||||||
|
required this.id,
|
||||||
|
required this.name,
|
||||||
|
required this.email,
|
||||||
|
this.deletedAt,
|
||||||
|
this.avatarColor,
|
||||||
|
});
|
||||||
|
|
||||||
|
User copyWith({
|
||||||
|
String? id,
|
||||||
|
String? name,
|
||||||
|
String? email,
|
||||||
|
DateTime? deletedAt,
|
||||||
|
AvatarColor? avatarColor,
|
||||||
|
}) {
|
||||||
|
return User(
|
||||||
|
id: id ?? this.id,
|
||||||
|
name: name ?? this.name,
|
||||||
|
email: email ?? this.email,
|
||||||
|
deletedAt: deletedAt ?? this.deletedAt,
|
||||||
|
avatarColor: avatarColor ?? this.avatarColor,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
String toString() {
|
||||||
|
return '''User {
|
||||||
|
id: $id,
|
||||||
|
name: $name,
|
||||||
|
email: $email,
|
||||||
|
deletedAt: ${deletedAt ?? "<NA>"},
|
||||||
|
avatarColor: ${avatarColor ?? "<NA>"},
|
||||||
|
}''';
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool operator ==(covariant User other) {
|
||||||
|
if (identical(this, other)) return true;
|
||||||
|
|
||||||
|
return other.id == id &&
|
||||||
|
other.name == name &&
|
||||||
|
other.email == email &&
|
||||||
|
other.deletedAt == deletedAt &&
|
||||||
|
other.avatarColor == avatarColor;
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
int get hashCode {
|
||||||
|
return id.hashCode ^ name.hashCode ^ email.hashCode ^ deletedAt.hashCode ^ avatarColor.hashCode;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class AuthUser {
|
||||||
|
final String id;
|
||||||
|
final String name;
|
||||||
|
final String email;
|
||||||
|
final DateTime? deletedAt;
|
||||||
|
final AvatarColor? avatarColor;
|
||||||
|
final bool isAdmin;
|
||||||
|
final String oauthId;
|
||||||
|
final String? pinCode;
|
||||||
|
final bool hasProfileImage;
|
||||||
|
final DateTime profileChangedAt;
|
||||||
|
final int? quotaSizeInBytes;
|
||||||
|
final int quotaUsageInBytes;
|
||||||
|
final String? storageLabel;
|
||||||
|
|
||||||
|
const AuthUser({
|
||||||
|
required this.id,
|
||||||
|
required this.name,
|
||||||
|
required this.email,
|
||||||
|
this.deletedAt,
|
||||||
|
this.avatarColor,
|
||||||
|
required this.isAdmin,
|
||||||
|
required this.oauthId,
|
||||||
|
this.pinCode,
|
||||||
|
required this.hasProfileImage,
|
||||||
|
required this.profileChangedAt,
|
||||||
|
this.quotaSizeInBytes,
|
||||||
|
required this.quotaUsageInBytes,
|
||||||
|
this.storageLabel,
|
||||||
|
});
|
||||||
|
|
||||||
|
AuthUser copyWith({
|
||||||
|
String? id,
|
||||||
|
String? name,
|
||||||
|
String? email,
|
||||||
|
DateTime? deletedAt,
|
||||||
|
AvatarColor? avatarColor,
|
||||||
|
bool? isAdmin,
|
||||||
|
String? oauthId,
|
||||||
|
String? pinCode,
|
||||||
|
bool? hasProfileImage,
|
||||||
|
DateTime? profileChangedAt,
|
||||||
|
int? quotaSizeInBytes,
|
||||||
|
int? quotaUsageInBytes,
|
||||||
|
String? storageLabel,
|
||||||
|
}) {
|
||||||
|
return AuthUser(
|
||||||
|
id: id ?? this.id,
|
||||||
|
name: name ?? this.name,
|
||||||
|
email: email ?? this.email,
|
||||||
|
deletedAt: deletedAt ?? this.deletedAt,
|
||||||
|
avatarColor: avatarColor ?? this.avatarColor,
|
||||||
|
isAdmin: isAdmin ?? this.isAdmin,
|
||||||
|
oauthId: oauthId ?? this.oauthId,
|
||||||
|
pinCode: pinCode ?? this.pinCode,
|
||||||
|
hasProfileImage: hasProfileImage ?? this.hasProfileImage,
|
||||||
|
profileChangedAt: profileChangedAt ?? this.profileChangedAt,
|
||||||
|
quotaSizeInBytes: quotaSizeInBytes ?? this.quotaSizeInBytes,
|
||||||
|
quotaUsageInBytes: quotaUsageInBytes ?? this.quotaUsageInBytes,
|
||||||
|
storageLabel: storageLabel ?? this.storageLabel,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
String toString() {
|
||||||
|
return '''AuthUser {
|
||||||
|
id: $id,
|
||||||
|
name: $name,
|
||||||
|
email: $email,
|
||||||
|
deletedAt: ${deletedAt ?? "<NA>"},
|
||||||
|
avatarColor: ${avatarColor ?? "<NA>"},
|
||||||
|
isAdmin: $isAdmin,
|
||||||
|
oauthId: $oauthId,
|
||||||
|
pinCode: ${pinCode ?? "<NA>"},
|
||||||
|
hasProfileImage: $hasProfileImage,
|
||||||
|
profileChangedAt: $profileChangedAt,
|
||||||
|
quotaSizeInBytes: ${quotaSizeInBytes ?? "<NA>"},
|
||||||
|
quotaUsageInBytes: $quotaUsageInBytes,
|
||||||
|
storageLabel: ${storageLabel ?? "<NA>"},
|
||||||
|
}''';
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool operator ==(covariant AuthUser other) {
|
||||||
|
if (identical(this, other)) return true;
|
||||||
|
return other.id == id &&
|
||||||
|
other.name == name &&
|
||||||
|
other.email == email &&
|
||||||
|
other.deletedAt == deletedAt &&
|
||||||
|
other.avatarColor == avatarColor &&
|
||||||
|
other.isAdmin == isAdmin &&
|
||||||
|
other.oauthId == oauthId &&
|
||||||
|
other.pinCode == pinCode &&
|
||||||
|
other.hasProfileImage == hasProfileImage &&
|
||||||
|
other.profileChangedAt == profileChangedAt &&
|
||||||
|
other.quotaSizeInBytes == quotaSizeInBytes &&
|
||||||
|
other.quotaUsageInBytes == quotaUsageInBytes &&
|
||||||
|
other.storageLabel == storageLabel;
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
int get hashCode {
|
||||||
|
return id.hashCode ^
|
||||||
|
name.hashCode ^
|
||||||
|
email.hashCode ^
|
||||||
|
deletedAt.hashCode ^
|
||||||
|
avatarColor.hashCode ^
|
||||||
|
isAdmin.hashCode ^
|
||||||
|
oauthId.hashCode ^
|
||||||
|
pinCode.hashCode ^
|
||||||
|
hasProfileImage.hashCode ^
|
||||||
|
profileChangedAt.hashCode ^
|
||||||
|
quotaSizeInBytes.hashCode ^
|
||||||
|
quotaUsageInBytes.hashCode ^
|
||||||
|
storageLabel.hashCode;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class PartnerUser {
|
||||||
final String id;
|
final String id;
|
||||||
final String email;
|
final String email;
|
||||||
final String name;
|
final String name;
|
||||||
final bool inTimeline;
|
final bool inTimeline;
|
||||||
|
|
||||||
final String? profileImagePath;
|
const PartnerUser({
|
||||||
|
|
||||||
const PartnerUserDto({
|
|
||||||
required this.id,
|
required this.id,
|
||||||
required this.email,
|
required this.email,
|
||||||
required this.name,
|
required this.name,
|
||||||
required this.inTimeline,
|
required this.inTimeline,
|
||||||
this.profileImagePath,
|
|
||||||
});
|
});
|
||||||
|
|
||||||
PartnerUserDto copyWith({
|
PartnerUser copyWith({
|
||||||
String? id,
|
String? id,
|
||||||
String? email,
|
String? email,
|
||||||
String? name,
|
String? name,
|
||||||
bool? inTimeline,
|
bool? inTimeline,
|
||||||
String? profileImagePath,
|
|
||||||
}) {
|
}) {
|
||||||
return PartnerUserDto(
|
return PartnerUser(
|
||||||
id: id ?? this.id,
|
id: id ?? this.id,
|
||||||
email: email ?? this.email,
|
email: email ?? this.email,
|
||||||
name: name ?? this.name,
|
name: name ?? this.name,
|
||||||
inTimeline: inTimeline ?? this.inTimeline,
|
inTimeline: inTimeline ?? this.inTimeline,
|
||||||
profileImagePath: profileImagePath ?? this.profileImagePath,
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
Map<String, dynamic> toMap() {
|
|
||||||
return <String, dynamic>{
|
|
||||||
'id': id,
|
|
||||||
'email': email,
|
|
||||||
'name': name,
|
|
||||||
'inTimeline': inTimeline,
|
|
||||||
'profileImagePath': profileImagePath,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
factory PartnerUserDto.fromMap(Map<String, dynamic> map) {
|
|
||||||
return PartnerUserDto(
|
|
||||||
id: map['id'] as String,
|
|
||||||
email: map['email'] as String,
|
|
||||||
name: map['name'] as String,
|
|
||||||
inTimeline: map['inTimeline'] as bool,
|
|
||||||
profileImagePath: map['profileImagePath'] != null ? map['profileImagePath'] as String : null,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
String toJson() => json.encode(toMap());
|
|
||||||
|
|
||||||
factory PartnerUserDto.fromJson(String source) => PartnerUserDto.fromMap(json.decode(source) as Map<String, dynamic>);
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String toString() {
|
String toString() {
|
||||||
return 'PartnerUserDto(id: $id, email: $email, name: $name, inTimeline: $inTimeline, profileImagePath: $profileImagePath)';
|
return '''PartnerUser {
|
||||||
|
id: $id,
|
||||||
|
email: $email,
|
||||||
|
name: $name,
|
||||||
|
inTimeline: $inTimeline,
|
||||||
|
}''';
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
bool operator ==(covariant PartnerUserDto other) {
|
bool operator ==(covariant PartnerUser other) {
|
||||||
if (identical(this, other)) return true;
|
if (identical(this, other)) return true;
|
||||||
|
|
||||||
return other.id == id &&
|
return other.id == id && other.email == email && other.name == name && other.inTimeline == inTimeline;
|
||||||
other.email == email &&
|
|
||||||
other.name == name &&
|
|
||||||
other.inTimeline == inTimeline &&
|
|
||||||
other.profileImagePath == profileImagePath;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
int get hashCode {
|
int get hashCode {
|
||||||
return id.hashCode ^ email.hashCode ^ name.hashCode ^ inTimeline.hashCode ^ profileImagePath.hashCode;
|
return id.hashCode ^ email.hashCode ^ name.hashCode ^ inTimeline.hashCode;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,15 +12,15 @@ class DriftPartnerService {
|
|||||||
this._partnerApiRepository,
|
this._partnerApiRepository,
|
||||||
);
|
);
|
||||||
|
|
||||||
Future<List<PartnerUserDto>> getSharedWith(String userId) {
|
Future<List<PartnerUser>> getSharedWith(String userId) {
|
||||||
return _driftPartnerRepository.getSharedWith(userId);
|
return _driftPartnerRepository.getSharedWith(userId);
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<List<PartnerUserDto>> getSharedBy(String userId) {
|
Future<List<PartnerUser>> getSharedBy(String userId) {
|
||||||
return _driftPartnerRepository.getSharedBy(userId);
|
return _driftPartnerRepository.getSharedBy(userId);
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<List<PartnerUserDto>> getAvailablePartners(
|
Future<List<PartnerUser>> getAvailablePartners(
|
||||||
String currentUserId,
|
String currentUserId,
|
||||||
) async {
|
) async {
|
||||||
final otherUsers = await _driftPartnerRepository.getAvailablePartners(currentUserId);
|
final otherUsers = await _driftPartnerRepository.getAvailablePartners(currentUserId);
|
||||||
|
|||||||
@@ -108,7 +108,7 @@ class RemoteAlbumService {
|
|||||||
return _repository.getDateRange(albumId);
|
return _repository.getDateRange(albumId);
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<List<UserDto>> getSharedUsers(String albumId) {
|
Future<List<User>> getSharedUsers(String albumId) {
|
||||||
return _repository.getSharedUsers(albumId);
|
return _repository.getSharedUsers(albumId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ class SyncStreamService {
|
|||||||
bool get isCancelled => _cancelChecker?.call() ?? false;
|
bool get isCancelled => _cancelChecker?.call() ?? false;
|
||||||
|
|
||||||
Future<void> sync() {
|
Future<void> sync() {
|
||||||
_logger.info("Remote sync request for userr");
|
_logger.info("Remote sync request for user");
|
||||||
DLog.log("Remote sync request for user");
|
DLog.log("Remote sync request for user");
|
||||||
// Start the sync stream and handle events
|
// Start the sync stream and handle events
|
||||||
return _syncApiRepository.streamChanges(_handleEvents);
|
return _syncApiRepository.streamChanges(_handleEvents);
|
||||||
@@ -120,6 +120,8 @@ class SyncStreamService {
|
|||||||
) async {
|
) async {
|
||||||
_logger.fine("Processing sync data for $type of length ${data.length}");
|
_logger.fine("Processing sync data for $type of length ${data.length}");
|
||||||
switch (type) {
|
switch (type) {
|
||||||
|
case SyncEntityType.authUserV1:
|
||||||
|
return _syncStreamRepository.updateAuthUsersV1(data.cast());
|
||||||
case SyncEntityType.userV1:
|
case SyncEntityType.userV1:
|
||||||
return _syncStreamRepository.updateUsersV1(data.cast());
|
return _syncStreamRepository.updateUsersV1(data.cast());
|
||||||
case SyncEntityType.userDeleteV1:
|
case SyncEntityType.userDeleteV1:
|
||||||
|
|||||||
@@ -1,8 +1,10 @@
|
|||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
import 'dart:typed_data';
|
import 'dart:typed_data';
|
||||||
|
|
||||||
|
import 'package:immich_mobile/domain/models/setting.model.dart';
|
||||||
import 'package:immich_mobile/domain/models/store.model.dart';
|
import 'package:immich_mobile/domain/models/store.model.dart';
|
||||||
import 'package:immich_mobile/domain/models/user.model.dart';
|
import 'package:immich_mobile/domain/models/user.model.dart';
|
||||||
|
import 'package:immich_mobile/domain/services/setting.service.dart';
|
||||||
import 'package:immich_mobile/domain/services/store.service.dart';
|
import 'package:immich_mobile/domain/services/store.service.dart';
|
||||||
import 'package:immich_mobile/infrastructure/repositories/user.repository.dart';
|
import 'package:immich_mobile/infrastructure/repositories/user.repository.dart';
|
||||||
import 'package:immich_mobile/infrastructure/repositories/user_api.repository.dart';
|
import 'package:immich_mobile/infrastructure/repositories/user_api.repository.dart';
|
||||||
@@ -66,3 +68,28 @@ class UserService {
|
|||||||
return _isarUserRepository.deleteAll();
|
return _isarUserRepository.deleteAll();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class DriftUserService {
|
||||||
|
final DriftUserRepository _userRepository;
|
||||||
|
final SettingsService _settingsService;
|
||||||
|
|
||||||
|
const DriftUserService(
|
||||||
|
this._userRepository,
|
||||||
|
this._settingsService,
|
||||||
|
);
|
||||||
|
|
||||||
|
Future<User?> getMyUser() {
|
||||||
|
// TODO: Remove UserDto after new store
|
||||||
|
final isarCurrentUser = _settingsService.get(Setting.currentUser);
|
||||||
|
|
||||||
|
if (isarCurrentUser == null) {
|
||||||
|
throw Exception('User must be login');
|
||||||
|
}
|
||||||
|
|
||||||
|
return _userRepository.getById(isarCurrentUser.id);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<List<User>> getAll() {
|
||||||
|
return _userRepository.getAll();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -45,9 +45,9 @@ class Album {
|
|||||||
bool activityEnabled;
|
bool activityEnabled;
|
||||||
@enumerated
|
@enumerated
|
||||||
SortOrder sortOrder;
|
SortOrder sortOrder;
|
||||||
final IsarLink<User> owner = IsarLink<User>();
|
final IsarLink<IsarUser> owner = IsarLink<IsarUser>();
|
||||||
final IsarLink<Asset> thumbnail = IsarLink<Asset>();
|
final IsarLink<Asset> thumbnail = IsarLink<Asset>();
|
||||||
final IsarLinks<User> sharedUsers = IsarLinks<User>();
|
final IsarLinks<IsarUser> sharedUsers = IsarLinks<IsarUser>();
|
||||||
final IsarLinks<Asset> assets = IsarLinks<Asset>();
|
final IsarLinks<Asset> assets = IsarLinks<Asset>();
|
||||||
|
|
||||||
// transient fields
|
// transient fields
|
||||||
@@ -95,8 +95,8 @@ class Album {
|
|||||||
// accessible in an object freshly created (not loaded from DB)
|
// accessible in an object freshly created (not loaded from DB)
|
||||||
|
|
||||||
@ignore
|
@ignore
|
||||||
Iterable<User> get remoteUsers =>
|
Iterable<IsarUser> get remoteUsers =>
|
||||||
sharedUsers.isEmpty ? (sharedUsers as IsarLinksCommon<User>).addedObjects : sharedUsers;
|
sharedUsers.isEmpty ? (sharedUsers as IsarLinksCommon<IsarUser>).addedObjects : sharedUsers;
|
||||||
|
|
||||||
@ignore
|
@ignore
|
||||||
Iterable<Asset> get remoteAssets => assets.isEmpty ? (assets as IsarLinksCommon<Asset>).addedObjects : assets;
|
Iterable<Asset> get remoteAssets => assets.isEmpty ? (assets as IsarLinksCommon<Asset>).addedObjects : assets;
|
||||||
@@ -160,7 +160,7 @@ class Album {
|
|||||||
activityEnabled: dto.isActivityEnabled,
|
activityEnabled: dto.isActivityEnabled,
|
||||||
);
|
);
|
||||||
a.remoteAssetCount = dto.assetCount;
|
a.remoteAssetCount = dto.assetCount;
|
||||||
a.owner.value = await db.users.getById(dto.ownerId);
|
a.owner.value = await db.isarUsers.getById(dto.ownerId);
|
||||||
if (dto.order != null) {
|
if (dto.order != null) {
|
||||||
a.sortOrder = dto.order == AssetOrder.asc ? SortOrder.asc : SortOrder.desc;
|
a.sortOrder = dto.order == AssetOrder.asc ? SortOrder.asc : SortOrder.desc;
|
||||||
}
|
}
|
||||||
@@ -169,7 +169,7 @@ class Album {
|
|||||||
a.thumbnail.value = await db.assets.where().remoteIdEqualTo(dto.albumThumbnailAssetId).findFirst();
|
a.thumbnail.value = await db.assets.where().remoteIdEqualTo(dto.albumThumbnailAssetId).findFirst();
|
||||||
}
|
}
|
||||||
if (dto.albumUsers.isNotEmpty) {
|
if (dto.albumUsers.isNotEmpty) {
|
||||||
final users = await db.users.getAllById(
|
final users = await db.isarUsers.getAllById(
|
||||||
dto.albumUsers.map((e) => e.user.id).toList(growable: false),
|
dto.albumUsers.map((e) => e.user.id).toList(growable: false),
|
||||||
);
|
);
|
||||||
a.sharedUsers.addAll(users.cast());
|
a.sharedUsers.addAll(users.cast());
|
||||||
|
|||||||
13
mobile/lib/entities/album.entity.g.dart
generated
13
mobile/lib/entities/album.entity.g.dart
generated
@@ -116,7 +116,7 @@ const AlbumSchema = CollectionSchema(
|
|||||||
r'owner': LinkSchema(
|
r'owner': LinkSchema(
|
||||||
id: 8272576585804958029,
|
id: 8272576585804958029,
|
||||||
name: r'owner',
|
name: r'owner',
|
||||||
target: r'User',
|
target: r'IsarUser',
|
||||||
single: true,
|
single: true,
|
||||||
),
|
),
|
||||||
r'thumbnail': LinkSchema(
|
r'thumbnail': LinkSchema(
|
||||||
@@ -128,7 +128,7 @@ const AlbumSchema = CollectionSchema(
|
|||||||
r'sharedUsers': LinkSchema(
|
r'sharedUsers': LinkSchema(
|
||||||
id: 8972835302564625434,
|
id: 8972835302564625434,
|
||||||
name: r'sharedUsers',
|
name: r'sharedUsers',
|
||||||
target: r'User',
|
target: r'IsarUser',
|
||||||
single: false,
|
single: false,
|
||||||
),
|
),
|
||||||
r'assets': LinkSchema(
|
r'assets': LinkSchema(
|
||||||
@@ -275,10 +275,10 @@ List<IsarLinkBase<dynamic>> _albumGetLinks(Album object) {
|
|||||||
|
|
||||||
void _albumAttach(IsarCollection<dynamic> col, Id id, Album object) {
|
void _albumAttach(IsarCollection<dynamic> col, Id id, Album object) {
|
||||||
object.id = id;
|
object.id = id;
|
||||||
object.owner.attach(col, col.isar.collection<User>(), r'owner', id);
|
object.owner.attach(col, col.isar.collection<IsarUser>(), r'owner', id);
|
||||||
object.thumbnail.attach(col, col.isar.collection<Asset>(), r'thumbnail', id);
|
object.thumbnail.attach(col, col.isar.collection<Asset>(), r'thumbnail', id);
|
||||||
object.sharedUsers
|
object.sharedUsers
|
||||||
.attach(col, col.isar.collection<User>(), r'sharedUsers', id);
|
.attach(col, col.isar.collection<IsarUser>(), r'sharedUsers', id);
|
||||||
object.assets.attach(col, col.isar.collection<Asset>(), r'assets', id);
|
object.assets.attach(col, col.isar.collection<Asset>(), r'assets', id);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1500,7 +1500,8 @@ extension AlbumQueryFilter on QueryBuilder<Album, Album, QFilterCondition> {
|
|||||||
extension AlbumQueryObject on QueryBuilder<Album, Album, QFilterCondition> {}
|
extension AlbumQueryObject on QueryBuilder<Album, Album, QFilterCondition> {}
|
||||||
|
|
||||||
extension AlbumQueryLinks on QueryBuilder<Album, Album, QFilterCondition> {
|
extension AlbumQueryLinks on QueryBuilder<Album, Album, QFilterCondition> {
|
||||||
QueryBuilder<Album, Album, QAfterFilterCondition> owner(FilterQuery<User> q) {
|
QueryBuilder<Album, Album, QAfterFilterCondition> owner(
|
||||||
|
FilterQuery<IsarUser> q) {
|
||||||
return QueryBuilder.apply(this, (query) {
|
return QueryBuilder.apply(this, (query) {
|
||||||
return query.link(q, r'owner');
|
return query.link(q, r'owner');
|
||||||
});
|
});
|
||||||
@@ -1526,7 +1527,7 @@ extension AlbumQueryLinks on QueryBuilder<Album, Album, QFilterCondition> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
QueryBuilder<Album, Album, QAfterFilterCondition> sharedUsers(
|
QueryBuilder<Album, Album, QAfterFilterCondition> sharedUsers(
|
||||||
FilterQuery<User> q) {
|
FilterQuery<IsarUser> q) {
|
||||||
return QueryBuilder.apply(this, (query) {
|
return QueryBuilder.apply(this, (query) {
|
||||||
return query.link(q, r'sharedUsers');
|
return query.link(q, r'sharedUsers');
|
||||||
});
|
});
|
||||||
|
|||||||
56
mobile/lib/infrastructure/entities/auth_user.entity.dart
Normal file
56
mobile/lib/infrastructure/entities/auth_user.entity.dart
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
import 'package:drift/drift.dart';
|
||||||
|
import 'package:immich_mobile/domain/models/user.model.dart';
|
||||||
|
import 'package:immich_mobile/domain/models/user_metadata.model.dart';
|
||||||
|
import 'package:immich_mobile/infrastructure/entities/auth_user.entity.drift.dart';
|
||||||
|
import 'package:immich_mobile/infrastructure/utils/drift_default.mixin.dart';
|
||||||
|
|
||||||
|
class AuthUserEntity extends Table with DriftDefaultsMixin {
|
||||||
|
const AuthUserEntity();
|
||||||
|
|
||||||
|
TextColumn get id => text()();
|
||||||
|
|
||||||
|
TextColumn get name => text()();
|
||||||
|
|
||||||
|
TextColumn get email => text()();
|
||||||
|
|
||||||
|
DateTimeColumn get deletedAt => dateTime().nullable()();
|
||||||
|
|
||||||
|
IntColumn get avatarColor => intEnum<AvatarColor>().nullable()();
|
||||||
|
|
||||||
|
BoolColumn get isAdmin => boolean().withDefault(const Constant(false))();
|
||||||
|
|
||||||
|
TextColumn get oauthId => text().withDefault(const Constant(''))();
|
||||||
|
|
||||||
|
TextColumn get pinCode => text().nullable()();
|
||||||
|
|
||||||
|
BoolColumn get hasProfileImage => boolean().withDefault(const Constant(false))();
|
||||||
|
|
||||||
|
DateTimeColumn get profileChangedAt => dateTime().withDefault(currentDateAndTime)();
|
||||||
|
|
||||||
|
IntColumn get quotaSizeInBytes => integer().nullable()();
|
||||||
|
|
||||||
|
IntColumn get quotaUsageInBytes => integer().withDefault(const Constant(0))();
|
||||||
|
|
||||||
|
TextColumn get storageLabel => text().nullable()();
|
||||||
|
|
||||||
|
@override
|
||||||
|
Set<Column> get primaryKey => {id};
|
||||||
|
}
|
||||||
|
|
||||||
|
extension AuthUserEntityDataDomainEx on AuthUserEntityData {
|
||||||
|
AuthUser toDto() => AuthUser(
|
||||||
|
id: id,
|
||||||
|
name: name,
|
||||||
|
email: email,
|
||||||
|
deletedAt: deletedAt,
|
||||||
|
avatarColor: avatarColor,
|
||||||
|
isAdmin: isAdmin,
|
||||||
|
oauthId: oauthId,
|
||||||
|
pinCode: pinCode,
|
||||||
|
hasProfileImage: hasProfileImage,
|
||||||
|
profileChangedAt: profileChangedAt,
|
||||||
|
quotaSizeInBytes: quotaSizeInBytes,
|
||||||
|
quotaUsageInBytes: quotaUsageInBytes,
|
||||||
|
storageLabel: storageLabel,
|
||||||
|
);
|
||||||
|
}
|
||||||
951
mobile/lib/infrastructure/entities/auth_user.entity.drift.dart
generated
Normal file
951
mobile/lib/infrastructure/entities/auth_user.entity.drift.dart
generated
Normal file
@@ -0,0 +1,951 @@
|
|||||||
|
// dart format width=80
|
||||||
|
// ignore_for_file: type=lint
|
||||||
|
import 'package:drift/drift.dart' as i0;
|
||||||
|
import 'package:immich_mobile/infrastructure/entities/auth_user.entity.drift.dart'
|
||||||
|
as i1;
|
||||||
|
import 'package:immich_mobile/domain/models/user_metadata.model.dart' as i2;
|
||||||
|
import 'package:immich_mobile/infrastructure/entities/auth_user.entity.dart'
|
||||||
|
as i3;
|
||||||
|
import 'package:drift/src/runtime/query_builder/query_builder.dart' as i4;
|
||||||
|
|
||||||
|
typedef $$AuthUserEntityTableCreateCompanionBuilder = i1.AuthUserEntityCompanion
|
||||||
|
Function({
|
||||||
|
required String id,
|
||||||
|
required String name,
|
||||||
|
required String email,
|
||||||
|
i0.Value<DateTime?> deletedAt,
|
||||||
|
i0.Value<i2.AvatarColor?> avatarColor,
|
||||||
|
i0.Value<bool> isAdmin,
|
||||||
|
i0.Value<String> oauthId,
|
||||||
|
i0.Value<String?> pinCode,
|
||||||
|
i0.Value<bool> hasProfileImage,
|
||||||
|
i0.Value<DateTime> profileChangedAt,
|
||||||
|
i0.Value<int?> quotaSizeInBytes,
|
||||||
|
i0.Value<int> quotaUsageInBytes,
|
||||||
|
i0.Value<String?> storageLabel,
|
||||||
|
});
|
||||||
|
typedef $$AuthUserEntityTableUpdateCompanionBuilder = i1.AuthUserEntityCompanion
|
||||||
|
Function({
|
||||||
|
i0.Value<String> id,
|
||||||
|
i0.Value<String> name,
|
||||||
|
i0.Value<String> email,
|
||||||
|
i0.Value<DateTime?> deletedAt,
|
||||||
|
i0.Value<i2.AvatarColor?> avatarColor,
|
||||||
|
i0.Value<bool> isAdmin,
|
||||||
|
i0.Value<String> oauthId,
|
||||||
|
i0.Value<String?> pinCode,
|
||||||
|
i0.Value<bool> hasProfileImage,
|
||||||
|
i0.Value<DateTime> profileChangedAt,
|
||||||
|
i0.Value<int?> quotaSizeInBytes,
|
||||||
|
i0.Value<int> quotaUsageInBytes,
|
||||||
|
i0.Value<String?> storageLabel,
|
||||||
|
});
|
||||||
|
|
||||||
|
class $$AuthUserEntityTableFilterComposer
|
||||||
|
extends i0.Composer<i0.GeneratedDatabase, i1.$AuthUserEntityTable> {
|
||||||
|
$$AuthUserEntityTableFilterComposer({
|
||||||
|
required super.$db,
|
||||||
|
required super.$table,
|
||||||
|
super.joinBuilder,
|
||||||
|
super.$addJoinBuilderToRootComposer,
|
||||||
|
super.$removeJoinBuilderFromRootComposer,
|
||||||
|
});
|
||||||
|
i0.ColumnFilters<String> get id => $composableBuilder(
|
||||||
|
column: $table.id, builder: (column) => i0.ColumnFilters(column));
|
||||||
|
|
||||||
|
i0.ColumnFilters<String> get name => $composableBuilder(
|
||||||
|
column: $table.name, builder: (column) => i0.ColumnFilters(column));
|
||||||
|
|
||||||
|
i0.ColumnFilters<String> get email => $composableBuilder(
|
||||||
|
column: $table.email, builder: (column) => i0.ColumnFilters(column));
|
||||||
|
|
||||||
|
i0.ColumnFilters<DateTime> get deletedAt => $composableBuilder(
|
||||||
|
column: $table.deletedAt, builder: (column) => i0.ColumnFilters(column));
|
||||||
|
|
||||||
|
i0.ColumnWithTypeConverterFilters<i2.AvatarColor?, i2.AvatarColor, int>
|
||||||
|
get avatarColor => $composableBuilder(
|
||||||
|
column: $table.avatarColor,
|
||||||
|
builder: (column) => i0.ColumnWithTypeConverterFilters(column));
|
||||||
|
|
||||||
|
i0.ColumnFilters<bool> get isAdmin => $composableBuilder(
|
||||||
|
column: $table.isAdmin, builder: (column) => i0.ColumnFilters(column));
|
||||||
|
|
||||||
|
i0.ColumnFilters<String> get oauthId => $composableBuilder(
|
||||||
|
column: $table.oauthId, builder: (column) => i0.ColumnFilters(column));
|
||||||
|
|
||||||
|
i0.ColumnFilters<String> get pinCode => $composableBuilder(
|
||||||
|
column: $table.pinCode, builder: (column) => i0.ColumnFilters(column));
|
||||||
|
|
||||||
|
i0.ColumnFilters<bool> get hasProfileImage => $composableBuilder(
|
||||||
|
column: $table.hasProfileImage,
|
||||||
|
builder: (column) => i0.ColumnFilters(column));
|
||||||
|
|
||||||
|
i0.ColumnFilters<DateTime> get profileChangedAt => $composableBuilder(
|
||||||
|
column: $table.profileChangedAt,
|
||||||
|
builder: (column) => i0.ColumnFilters(column));
|
||||||
|
|
||||||
|
i0.ColumnFilters<int> get quotaSizeInBytes => $composableBuilder(
|
||||||
|
column: $table.quotaSizeInBytes,
|
||||||
|
builder: (column) => i0.ColumnFilters(column));
|
||||||
|
|
||||||
|
i0.ColumnFilters<int> get quotaUsageInBytes => $composableBuilder(
|
||||||
|
column: $table.quotaUsageInBytes,
|
||||||
|
builder: (column) => i0.ColumnFilters(column));
|
||||||
|
|
||||||
|
i0.ColumnFilters<String> get storageLabel => $composableBuilder(
|
||||||
|
column: $table.storageLabel,
|
||||||
|
builder: (column) => i0.ColumnFilters(column));
|
||||||
|
}
|
||||||
|
|
||||||
|
class $$AuthUserEntityTableOrderingComposer
|
||||||
|
extends i0.Composer<i0.GeneratedDatabase, i1.$AuthUserEntityTable> {
|
||||||
|
$$AuthUserEntityTableOrderingComposer({
|
||||||
|
required super.$db,
|
||||||
|
required super.$table,
|
||||||
|
super.joinBuilder,
|
||||||
|
super.$addJoinBuilderToRootComposer,
|
||||||
|
super.$removeJoinBuilderFromRootComposer,
|
||||||
|
});
|
||||||
|
i0.ColumnOrderings<String> get id => $composableBuilder(
|
||||||
|
column: $table.id, builder: (column) => i0.ColumnOrderings(column));
|
||||||
|
|
||||||
|
i0.ColumnOrderings<String> get name => $composableBuilder(
|
||||||
|
column: $table.name, builder: (column) => i0.ColumnOrderings(column));
|
||||||
|
|
||||||
|
i0.ColumnOrderings<String> get email => $composableBuilder(
|
||||||
|
column: $table.email, builder: (column) => i0.ColumnOrderings(column));
|
||||||
|
|
||||||
|
i0.ColumnOrderings<DateTime> get deletedAt => $composableBuilder(
|
||||||
|
column: $table.deletedAt,
|
||||||
|
builder: (column) => i0.ColumnOrderings(column));
|
||||||
|
|
||||||
|
i0.ColumnOrderings<int> get avatarColor => $composableBuilder(
|
||||||
|
column: $table.avatarColor,
|
||||||
|
builder: (column) => i0.ColumnOrderings(column));
|
||||||
|
|
||||||
|
i0.ColumnOrderings<bool> get isAdmin => $composableBuilder(
|
||||||
|
column: $table.isAdmin, builder: (column) => i0.ColumnOrderings(column));
|
||||||
|
|
||||||
|
i0.ColumnOrderings<String> get oauthId => $composableBuilder(
|
||||||
|
column: $table.oauthId, builder: (column) => i0.ColumnOrderings(column));
|
||||||
|
|
||||||
|
i0.ColumnOrderings<String> get pinCode => $composableBuilder(
|
||||||
|
column: $table.pinCode, builder: (column) => i0.ColumnOrderings(column));
|
||||||
|
|
||||||
|
i0.ColumnOrderings<bool> get hasProfileImage => $composableBuilder(
|
||||||
|
column: $table.hasProfileImage,
|
||||||
|
builder: (column) => i0.ColumnOrderings(column));
|
||||||
|
|
||||||
|
i0.ColumnOrderings<DateTime> get profileChangedAt => $composableBuilder(
|
||||||
|
column: $table.profileChangedAt,
|
||||||
|
builder: (column) => i0.ColumnOrderings(column));
|
||||||
|
|
||||||
|
i0.ColumnOrderings<int> get quotaSizeInBytes => $composableBuilder(
|
||||||
|
column: $table.quotaSizeInBytes,
|
||||||
|
builder: (column) => i0.ColumnOrderings(column));
|
||||||
|
|
||||||
|
i0.ColumnOrderings<int> get quotaUsageInBytes => $composableBuilder(
|
||||||
|
column: $table.quotaUsageInBytes,
|
||||||
|
builder: (column) => i0.ColumnOrderings(column));
|
||||||
|
|
||||||
|
i0.ColumnOrderings<String> get storageLabel => $composableBuilder(
|
||||||
|
column: $table.storageLabel,
|
||||||
|
builder: (column) => i0.ColumnOrderings(column));
|
||||||
|
}
|
||||||
|
|
||||||
|
class $$AuthUserEntityTableAnnotationComposer
|
||||||
|
extends i0.Composer<i0.GeneratedDatabase, i1.$AuthUserEntityTable> {
|
||||||
|
$$AuthUserEntityTableAnnotationComposer({
|
||||||
|
required super.$db,
|
||||||
|
required super.$table,
|
||||||
|
super.joinBuilder,
|
||||||
|
super.$addJoinBuilderToRootComposer,
|
||||||
|
super.$removeJoinBuilderFromRootComposer,
|
||||||
|
});
|
||||||
|
i0.GeneratedColumn<String> get id =>
|
||||||
|
$composableBuilder(column: $table.id, builder: (column) => column);
|
||||||
|
|
||||||
|
i0.GeneratedColumn<String> get name =>
|
||||||
|
$composableBuilder(column: $table.name, builder: (column) => column);
|
||||||
|
|
||||||
|
i0.GeneratedColumn<String> get email =>
|
||||||
|
$composableBuilder(column: $table.email, builder: (column) => column);
|
||||||
|
|
||||||
|
i0.GeneratedColumn<DateTime> get deletedAt =>
|
||||||
|
$composableBuilder(column: $table.deletedAt, builder: (column) => column);
|
||||||
|
|
||||||
|
i0.GeneratedColumnWithTypeConverter<i2.AvatarColor?, int> get avatarColor =>
|
||||||
|
$composableBuilder(
|
||||||
|
column: $table.avatarColor, builder: (column) => column);
|
||||||
|
|
||||||
|
i0.GeneratedColumn<bool> get isAdmin =>
|
||||||
|
$composableBuilder(column: $table.isAdmin, builder: (column) => column);
|
||||||
|
|
||||||
|
i0.GeneratedColumn<String> get oauthId =>
|
||||||
|
$composableBuilder(column: $table.oauthId, builder: (column) => column);
|
||||||
|
|
||||||
|
i0.GeneratedColumn<String> get pinCode =>
|
||||||
|
$composableBuilder(column: $table.pinCode, builder: (column) => column);
|
||||||
|
|
||||||
|
i0.GeneratedColumn<bool> get hasProfileImage => $composableBuilder(
|
||||||
|
column: $table.hasProfileImage, builder: (column) => column);
|
||||||
|
|
||||||
|
i0.GeneratedColumn<DateTime> get profileChangedAt => $composableBuilder(
|
||||||
|
column: $table.profileChangedAt, builder: (column) => column);
|
||||||
|
|
||||||
|
i0.GeneratedColumn<int> get quotaSizeInBytes => $composableBuilder(
|
||||||
|
column: $table.quotaSizeInBytes, builder: (column) => column);
|
||||||
|
|
||||||
|
i0.GeneratedColumn<int> get quotaUsageInBytes => $composableBuilder(
|
||||||
|
column: $table.quotaUsageInBytes, builder: (column) => column);
|
||||||
|
|
||||||
|
i0.GeneratedColumn<String> get storageLabel => $composableBuilder(
|
||||||
|
column: $table.storageLabel, builder: (column) => column);
|
||||||
|
}
|
||||||
|
|
||||||
|
class $$AuthUserEntityTableTableManager extends i0.RootTableManager<
|
||||||
|
i0.GeneratedDatabase,
|
||||||
|
i1.$AuthUserEntityTable,
|
||||||
|
i1.AuthUserEntityData,
|
||||||
|
i1.$$AuthUserEntityTableFilterComposer,
|
||||||
|
i1.$$AuthUserEntityTableOrderingComposer,
|
||||||
|
i1.$$AuthUserEntityTableAnnotationComposer,
|
||||||
|
$$AuthUserEntityTableCreateCompanionBuilder,
|
||||||
|
$$AuthUserEntityTableUpdateCompanionBuilder,
|
||||||
|
(
|
||||||
|
i1.AuthUserEntityData,
|
||||||
|
i0.BaseReferences<i0.GeneratedDatabase, i1.$AuthUserEntityTable,
|
||||||
|
i1.AuthUserEntityData>
|
||||||
|
),
|
||||||
|
i1.AuthUserEntityData,
|
||||||
|
i0.PrefetchHooks Function()> {
|
||||||
|
$$AuthUserEntityTableTableManager(
|
||||||
|
i0.GeneratedDatabase db, i1.$AuthUserEntityTable table)
|
||||||
|
: super(i0.TableManagerState(
|
||||||
|
db: db,
|
||||||
|
table: table,
|
||||||
|
createFilteringComposer: () =>
|
||||||
|
i1.$$AuthUserEntityTableFilterComposer($db: db, $table: table),
|
||||||
|
createOrderingComposer: () =>
|
||||||
|
i1.$$AuthUserEntityTableOrderingComposer($db: db, $table: table),
|
||||||
|
createComputedFieldComposer: () => i1
|
||||||
|
.$$AuthUserEntityTableAnnotationComposer($db: db, $table: table),
|
||||||
|
updateCompanionCallback: ({
|
||||||
|
i0.Value<String> id = const i0.Value.absent(),
|
||||||
|
i0.Value<String> name = const i0.Value.absent(),
|
||||||
|
i0.Value<String> email = const i0.Value.absent(),
|
||||||
|
i0.Value<DateTime?> deletedAt = const i0.Value.absent(),
|
||||||
|
i0.Value<i2.AvatarColor?> avatarColor = const i0.Value.absent(),
|
||||||
|
i0.Value<bool> isAdmin = const i0.Value.absent(),
|
||||||
|
i0.Value<String> oauthId = const i0.Value.absent(),
|
||||||
|
i0.Value<String?> pinCode = const i0.Value.absent(),
|
||||||
|
i0.Value<bool> hasProfileImage = const i0.Value.absent(),
|
||||||
|
i0.Value<DateTime> profileChangedAt = const i0.Value.absent(),
|
||||||
|
i0.Value<int?> quotaSizeInBytes = const i0.Value.absent(),
|
||||||
|
i0.Value<int> quotaUsageInBytes = const i0.Value.absent(),
|
||||||
|
i0.Value<String?> storageLabel = const i0.Value.absent(),
|
||||||
|
}) =>
|
||||||
|
i1.AuthUserEntityCompanion(
|
||||||
|
id: id,
|
||||||
|
name: name,
|
||||||
|
email: email,
|
||||||
|
deletedAt: deletedAt,
|
||||||
|
avatarColor: avatarColor,
|
||||||
|
isAdmin: isAdmin,
|
||||||
|
oauthId: oauthId,
|
||||||
|
pinCode: pinCode,
|
||||||
|
hasProfileImage: hasProfileImage,
|
||||||
|
profileChangedAt: profileChangedAt,
|
||||||
|
quotaSizeInBytes: quotaSizeInBytes,
|
||||||
|
quotaUsageInBytes: quotaUsageInBytes,
|
||||||
|
storageLabel: storageLabel,
|
||||||
|
),
|
||||||
|
createCompanionCallback: ({
|
||||||
|
required String id,
|
||||||
|
required String name,
|
||||||
|
required String email,
|
||||||
|
i0.Value<DateTime?> deletedAt = const i0.Value.absent(),
|
||||||
|
i0.Value<i2.AvatarColor?> avatarColor = const i0.Value.absent(),
|
||||||
|
i0.Value<bool> isAdmin = const i0.Value.absent(),
|
||||||
|
i0.Value<String> oauthId = const i0.Value.absent(),
|
||||||
|
i0.Value<String?> pinCode = const i0.Value.absent(),
|
||||||
|
i0.Value<bool> hasProfileImage = const i0.Value.absent(),
|
||||||
|
i0.Value<DateTime> profileChangedAt = const i0.Value.absent(),
|
||||||
|
i0.Value<int?> quotaSizeInBytes = const i0.Value.absent(),
|
||||||
|
i0.Value<int> quotaUsageInBytes = const i0.Value.absent(),
|
||||||
|
i0.Value<String?> storageLabel = const i0.Value.absent(),
|
||||||
|
}) =>
|
||||||
|
i1.AuthUserEntityCompanion.insert(
|
||||||
|
id: id,
|
||||||
|
name: name,
|
||||||
|
email: email,
|
||||||
|
deletedAt: deletedAt,
|
||||||
|
avatarColor: avatarColor,
|
||||||
|
isAdmin: isAdmin,
|
||||||
|
oauthId: oauthId,
|
||||||
|
pinCode: pinCode,
|
||||||
|
hasProfileImage: hasProfileImage,
|
||||||
|
profileChangedAt: profileChangedAt,
|
||||||
|
quotaSizeInBytes: quotaSizeInBytes,
|
||||||
|
quotaUsageInBytes: quotaUsageInBytes,
|
||||||
|
storageLabel: storageLabel,
|
||||||
|
),
|
||||||
|
withReferenceMapper: (p0) => p0
|
||||||
|
.map((e) => (e.readTable(table), i0.BaseReferences(db, table, e)))
|
||||||
|
.toList(),
|
||||||
|
prefetchHooksCallback: null,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef $$AuthUserEntityTableProcessedTableManager = i0.ProcessedTableManager<
|
||||||
|
i0.GeneratedDatabase,
|
||||||
|
i1.$AuthUserEntityTable,
|
||||||
|
i1.AuthUserEntityData,
|
||||||
|
i1.$$AuthUserEntityTableFilterComposer,
|
||||||
|
i1.$$AuthUserEntityTableOrderingComposer,
|
||||||
|
i1.$$AuthUserEntityTableAnnotationComposer,
|
||||||
|
$$AuthUserEntityTableCreateCompanionBuilder,
|
||||||
|
$$AuthUserEntityTableUpdateCompanionBuilder,
|
||||||
|
(
|
||||||
|
i1.AuthUserEntityData,
|
||||||
|
i0.BaseReferences<i0.GeneratedDatabase, i1.$AuthUserEntityTable,
|
||||||
|
i1.AuthUserEntityData>
|
||||||
|
),
|
||||||
|
i1.AuthUserEntityData,
|
||||||
|
i0.PrefetchHooks Function()>;
|
||||||
|
|
||||||
|
class $AuthUserEntityTable extends i3.AuthUserEntity
|
||||||
|
with i0.TableInfo<$AuthUserEntityTable, i1.AuthUserEntityData> {
|
||||||
|
@override
|
||||||
|
final i0.GeneratedDatabase attachedDatabase;
|
||||||
|
final String? _alias;
|
||||||
|
$AuthUserEntityTable(this.attachedDatabase, [this._alias]);
|
||||||
|
static const i0.VerificationMeta _idMeta = const i0.VerificationMeta('id');
|
||||||
|
@override
|
||||||
|
late final i0.GeneratedColumn<String> id = i0.GeneratedColumn<String>(
|
||||||
|
'id', aliasedName, false,
|
||||||
|
type: i0.DriftSqlType.string, requiredDuringInsert: true);
|
||||||
|
static const i0.VerificationMeta _nameMeta =
|
||||||
|
const i0.VerificationMeta('name');
|
||||||
|
@override
|
||||||
|
late final i0.GeneratedColumn<String> name = i0.GeneratedColumn<String>(
|
||||||
|
'name', aliasedName, false,
|
||||||
|
type: i0.DriftSqlType.string, requiredDuringInsert: true);
|
||||||
|
static const i0.VerificationMeta _emailMeta =
|
||||||
|
const i0.VerificationMeta('email');
|
||||||
|
@override
|
||||||
|
late final i0.GeneratedColumn<String> email = i0.GeneratedColumn<String>(
|
||||||
|
'email', aliasedName, false,
|
||||||
|
type: i0.DriftSqlType.string, requiredDuringInsert: true);
|
||||||
|
static const i0.VerificationMeta _deletedAtMeta =
|
||||||
|
const i0.VerificationMeta('deletedAt');
|
||||||
|
@override
|
||||||
|
late final i0.GeneratedColumn<DateTime> deletedAt =
|
||||||
|
i0.GeneratedColumn<DateTime>('deleted_at', aliasedName, true,
|
||||||
|
type: i0.DriftSqlType.dateTime, requiredDuringInsert: false);
|
||||||
|
@override
|
||||||
|
late final i0.GeneratedColumnWithTypeConverter<i2.AvatarColor?, int>
|
||||||
|
avatarColor = i0.GeneratedColumn<int>('avatar_color', aliasedName, true,
|
||||||
|
type: i0.DriftSqlType.int, requiredDuringInsert: false)
|
||||||
|
.withConverter<i2.AvatarColor?>(
|
||||||
|
i1.$AuthUserEntityTable.$converteravatarColorn);
|
||||||
|
static const i0.VerificationMeta _isAdminMeta =
|
||||||
|
const i0.VerificationMeta('isAdmin');
|
||||||
|
@override
|
||||||
|
late final i0.GeneratedColumn<bool> isAdmin = i0.GeneratedColumn<bool>(
|
||||||
|
'is_admin', aliasedName, false,
|
||||||
|
type: i0.DriftSqlType.bool,
|
||||||
|
requiredDuringInsert: false,
|
||||||
|
defaultConstraints:
|
||||||
|
i0.GeneratedColumn.constraintIsAlways('CHECK ("is_admin" IN (0, 1))'),
|
||||||
|
defaultValue: const i4.Constant(false));
|
||||||
|
static const i0.VerificationMeta _oauthIdMeta =
|
||||||
|
const i0.VerificationMeta('oauthId');
|
||||||
|
@override
|
||||||
|
late final i0.GeneratedColumn<String> oauthId = i0.GeneratedColumn<String>(
|
||||||
|
'oauth_id', aliasedName, false,
|
||||||
|
type: i0.DriftSqlType.string,
|
||||||
|
requiredDuringInsert: false,
|
||||||
|
defaultValue: const i4.Constant(''));
|
||||||
|
static const i0.VerificationMeta _pinCodeMeta =
|
||||||
|
const i0.VerificationMeta('pinCode');
|
||||||
|
@override
|
||||||
|
late final i0.GeneratedColumn<String> pinCode = i0.GeneratedColumn<String>(
|
||||||
|
'pin_code', aliasedName, true,
|
||||||
|
type: i0.DriftSqlType.string, requiredDuringInsert: false);
|
||||||
|
static const i0.VerificationMeta _hasProfileImageMeta =
|
||||||
|
const i0.VerificationMeta('hasProfileImage');
|
||||||
|
@override
|
||||||
|
late final i0.GeneratedColumn<bool> hasProfileImage =
|
||||||
|
i0.GeneratedColumn<bool>('has_profile_image', aliasedName, false,
|
||||||
|
type: i0.DriftSqlType.bool,
|
||||||
|
requiredDuringInsert: false,
|
||||||
|
defaultConstraints: i0.GeneratedColumn.constraintIsAlways(
|
||||||
|
'CHECK ("has_profile_image" IN (0, 1))'),
|
||||||
|
defaultValue: const i4.Constant(false));
|
||||||
|
static const i0.VerificationMeta _profileChangedAtMeta =
|
||||||
|
const i0.VerificationMeta('profileChangedAt');
|
||||||
|
@override
|
||||||
|
late final i0.GeneratedColumn<DateTime> profileChangedAt =
|
||||||
|
i0.GeneratedColumn<DateTime>('profile_changed_at', aliasedName, false,
|
||||||
|
type: i0.DriftSqlType.dateTime,
|
||||||
|
requiredDuringInsert: false,
|
||||||
|
defaultValue: i4.currentDateAndTime);
|
||||||
|
static const i0.VerificationMeta _quotaSizeInBytesMeta =
|
||||||
|
const i0.VerificationMeta('quotaSizeInBytes');
|
||||||
|
@override
|
||||||
|
late final i0.GeneratedColumn<int> quotaSizeInBytes = i0.GeneratedColumn<int>(
|
||||||
|
'quota_size_in_bytes', aliasedName, true,
|
||||||
|
type: i0.DriftSqlType.int, requiredDuringInsert: false);
|
||||||
|
static const i0.VerificationMeta _quotaUsageInBytesMeta =
|
||||||
|
const i0.VerificationMeta('quotaUsageInBytes');
|
||||||
|
@override
|
||||||
|
late final i0.GeneratedColumn<int> quotaUsageInBytes =
|
||||||
|
i0.GeneratedColumn<int>('quota_usage_in_bytes', aliasedName, false,
|
||||||
|
type: i0.DriftSqlType.int,
|
||||||
|
requiredDuringInsert: false,
|
||||||
|
defaultValue: const i4.Constant(0));
|
||||||
|
static const i0.VerificationMeta _storageLabelMeta =
|
||||||
|
const i0.VerificationMeta('storageLabel');
|
||||||
|
@override
|
||||||
|
late final i0.GeneratedColumn<String> storageLabel =
|
||||||
|
i0.GeneratedColumn<String>('storage_label', aliasedName, true,
|
||||||
|
type: i0.DriftSqlType.string, requiredDuringInsert: false);
|
||||||
|
@override
|
||||||
|
List<i0.GeneratedColumn> get $columns => [
|
||||||
|
id,
|
||||||
|
name,
|
||||||
|
email,
|
||||||
|
deletedAt,
|
||||||
|
avatarColor,
|
||||||
|
isAdmin,
|
||||||
|
oauthId,
|
||||||
|
pinCode,
|
||||||
|
hasProfileImage,
|
||||||
|
profileChangedAt,
|
||||||
|
quotaSizeInBytes,
|
||||||
|
quotaUsageInBytes,
|
||||||
|
storageLabel
|
||||||
|
];
|
||||||
|
@override
|
||||||
|
String get aliasedName => _alias ?? actualTableName;
|
||||||
|
@override
|
||||||
|
String get actualTableName => $name;
|
||||||
|
static const String $name = 'auth_user_entity';
|
||||||
|
@override
|
||||||
|
i0.VerificationContext validateIntegrity(
|
||||||
|
i0.Insertable<i1.AuthUserEntityData> instance,
|
||||||
|
{bool isInserting = false}) {
|
||||||
|
final context = i0.VerificationContext();
|
||||||
|
final data = instance.toColumns(true);
|
||||||
|
if (data.containsKey('id')) {
|
||||||
|
context.handle(_idMeta, id.isAcceptableOrUnknown(data['id']!, _idMeta));
|
||||||
|
} else if (isInserting) {
|
||||||
|
context.missing(_idMeta);
|
||||||
|
}
|
||||||
|
if (data.containsKey('name')) {
|
||||||
|
context.handle(
|
||||||
|
_nameMeta, name.isAcceptableOrUnknown(data['name']!, _nameMeta));
|
||||||
|
} else if (isInserting) {
|
||||||
|
context.missing(_nameMeta);
|
||||||
|
}
|
||||||
|
if (data.containsKey('email')) {
|
||||||
|
context.handle(
|
||||||
|
_emailMeta, email.isAcceptableOrUnknown(data['email']!, _emailMeta));
|
||||||
|
} else if (isInserting) {
|
||||||
|
context.missing(_emailMeta);
|
||||||
|
}
|
||||||
|
if (data.containsKey('deleted_at')) {
|
||||||
|
context.handle(_deletedAtMeta,
|
||||||
|
deletedAt.isAcceptableOrUnknown(data['deleted_at']!, _deletedAtMeta));
|
||||||
|
}
|
||||||
|
if (data.containsKey('is_admin')) {
|
||||||
|
context.handle(_isAdminMeta,
|
||||||
|
isAdmin.isAcceptableOrUnknown(data['is_admin']!, _isAdminMeta));
|
||||||
|
}
|
||||||
|
if (data.containsKey('oauth_id')) {
|
||||||
|
context.handle(_oauthIdMeta,
|
||||||
|
oauthId.isAcceptableOrUnknown(data['oauth_id']!, _oauthIdMeta));
|
||||||
|
}
|
||||||
|
if (data.containsKey('pin_code')) {
|
||||||
|
context.handle(_pinCodeMeta,
|
||||||
|
pinCode.isAcceptableOrUnknown(data['pin_code']!, _pinCodeMeta));
|
||||||
|
}
|
||||||
|
if (data.containsKey('has_profile_image')) {
|
||||||
|
context.handle(
|
||||||
|
_hasProfileImageMeta,
|
||||||
|
hasProfileImage.isAcceptableOrUnknown(
|
||||||
|
data['has_profile_image']!, _hasProfileImageMeta));
|
||||||
|
}
|
||||||
|
if (data.containsKey('profile_changed_at')) {
|
||||||
|
context.handle(
|
||||||
|
_profileChangedAtMeta,
|
||||||
|
profileChangedAt.isAcceptableOrUnknown(
|
||||||
|
data['profile_changed_at']!, _profileChangedAtMeta));
|
||||||
|
}
|
||||||
|
if (data.containsKey('quota_size_in_bytes')) {
|
||||||
|
context.handle(
|
||||||
|
_quotaSizeInBytesMeta,
|
||||||
|
quotaSizeInBytes.isAcceptableOrUnknown(
|
||||||
|
data['quota_size_in_bytes']!, _quotaSizeInBytesMeta));
|
||||||
|
}
|
||||||
|
if (data.containsKey('quota_usage_in_bytes')) {
|
||||||
|
context.handle(
|
||||||
|
_quotaUsageInBytesMeta,
|
||||||
|
quotaUsageInBytes.isAcceptableOrUnknown(
|
||||||
|
data['quota_usage_in_bytes']!, _quotaUsageInBytesMeta));
|
||||||
|
}
|
||||||
|
if (data.containsKey('storage_label')) {
|
||||||
|
context.handle(
|
||||||
|
_storageLabelMeta,
|
||||||
|
storageLabel.isAcceptableOrUnknown(
|
||||||
|
data['storage_label']!, _storageLabelMeta));
|
||||||
|
}
|
||||||
|
return context;
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Set<i0.GeneratedColumn> get $primaryKey => {id};
|
||||||
|
@override
|
||||||
|
i1.AuthUserEntityData map(Map<String, dynamic> data, {String? tablePrefix}) {
|
||||||
|
final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : '';
|
||||||
|
return i1.AuthUserEntityData(
|
||||||
|
id: attachedDatabase.typeMapping
|
||||||
|
.read(i0.DriftSqlType.string, data['${effectivePrefix}id'])!,
|
||||||
|
name: attachedDatabase.typeMapping
|
||||||
|
.read(i0.DriftSqlType.string, data['${effectivePrefix}name'])!,
|
||||||
|
email: attachedDatabase.typeMapping
|
||||||
|
.read(i0.DriftSqlType.string, data['${effectivePrefix}email'])!,
|
||||||
|
deletedAt: attachedDatabase.typeMapping
|
||||||
|
.read(i0.DriftSqlType.dateTime, data['${effectivePrefix}deleted_at']),
|
||||||
|
avatarColor: i1.$AuthUserEntityTable.$converteravatarColorn.fromSql(
|
||||||
|
attachedDatabase.typeMapping.read(
|
||||||
|
i0.DriftSqlType.int, data['${effectivePrefix}avatar_color'])),
|
||||||
|
isAdmin: attachedDatabase.typeMapping
|
||||||
|
.read(i0.DriftSqlType.bool, data['${effectivePrefix}is_admin'])!,
|
||||||
|
oauthId: attachedDatabase.typeMapping
|
||||||
|
.read(i0.DriftSqlType.string, data['${effectivePrefix}oauth_id'])!,
|
||||||
|
pinCode: attachedDatabase.typeMapping
|
||||||
|
.read(i0.DriftSqlType.string, data['${effectivePrefix}pin_code']),
|
||||||
|
hasProfileImage: attachedDatabase.typeMapping.read(
|
||||||
|
i0.DriftSqlType.bool, data['${effectivePrefix}has_profile_image'])!,
|
||||||
|
profileChangedAt: attachedDatabase.typeMapping.read(
|
||||||
|
i0.DriftSqlType.dateTime,
|
||||||
|
data['${effectivePrefix}profile_changed_at'])!,
|
||||||
|
quotaSizeInBytes: attachedDatabase.typeMapping.read(
|
||||||
|
i0.DriftSqlType.int, data['${effectivePrefix}quota_size_in_bytes']),
|
||||||
|
quotaUsageInBytes: attachedDatabase.typeMapping.read(
|
||||||
|
i0.DriftSqlType.int, data['${effectivePrefix}quota_usage_in_bytes'])!,
|
||||||
|
storageLabel: attachedDatabase.typeMapping.read(
|
||||||
|
i0.DriftSqlType.string, data['${effectivePrefix}storage_label']),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
$AuthUserEntityTable createAlias(String alias) {
|
||||||
|
return $AuthUserEntityTable(attachedDatabase, alias);
|
||||||
|
}
|
||||||
|
|
||||||
|
static i0.JsonTypeConverter2<i2.AvatarColor, int, int> $converteravatarColor =
|
||||||
|
const i0.EnumIndexConverter<i2.AvatarColor>(i2.AvatarColor.values);
|
||||||
|
static i0.JsonTypeConverter2<i2.AvatarColor?, int?, int?>
|
||||||
|
$converteravatarColorn =
|
||||||
|
i0.JsonTypeConverter2.asNullable($converteravatarColor);
|
||||||
|
@override
|
||||||
|
bool get withoutRowId => true;
|
||||||
|
@override
|
||||||
|
bool get isStrict => true;
|
||||||
|
}
|
||||||
|
|
||||||
|
class AuthUserEntityData extends i0.DataClass
|
||||||
|
implements i0.Insertable<i1.AuthUserEntityData> {
|
||||||
|
final String id;
|
||||||
|
final String name;
|
||||||
|
final String email;
|
||||||
|
final DateTime? deletedAt;
|
||||||
|
final i2.AvatarColor? avatarColor;
|
||||||
|
final bool isAdmin;
|
||||||
|
final String oauthId;
|
||||||
|
final String? pinCode;
|
||||||
|
final bool hasProfileImage;
|
||||||
|
final DateTime profileChangedAt;
|
||||||
|
final int? quotaSizeInBytes;
|
||||||
|
final int quotaUsageInBytes;
|
||||||
|
final String? storageLabel;
|
||||||
|
const AuthUserEntityData(
|
||||||
|
{required this.id,
|
||||||
|
required this.name,
|
||||||
|
required this.email,
|
||||||
|
this.deletedAt,
|
||||||
|
this.avatarColor,
|
||||||
|
required this.isAdmin,
|
||||||
|
required this.oauthId,
|
||||||
|
this.pinCode,
|
||||||
|
required this.hasProfileImage,
|
||||||
|
required this.profileChangedAt,
|
||||||
|
this.quotaSizeInBytes,
|
||||||
|
required this.quotaUsageInBytes,
|
||||||
|
this.storageLabel});
|
||||||
|
@override
|
||||||
|
Map<String, i0.Expression> toColumns(bool nullToAbsent) {
|
||||||
|
final map = <String, i0.Expression>{};
|
||||||
|
map['id'] = i0.Variable<String>(id);
|
||||||
|
map['name'] = i0.Variable<String>(name);
|
||||||
|
map['email'] = i0.Variable<String>(email);
|
||||||
|
if (!nullToAbsent || deletedAt != null) {
|
||||||
|
map['deleted_at'] = i0.Variable<DateTime>(deletedAt);
|
||||||
|
}
|
||||||
|
if (!nullToAbsent || avatarColor != null) {
|
||||||
|
map['avatar_color'] = i0.Variable<int>(
|
||||||
|
i1.$AuthUserEntityTable.$converteravatarColorn.toSql(avatarColor));
|
||||||
|
}
|
||||||
|
map['is_admin'] = i0.Variable<bool>(isAdmin);
|
||||||
|
map['oauth_id'] = i0.Variable<String>(oauthId);
|
||||||
|
if (!nullToAbsent || pinCode != null) {
|
||||||
|
map['pin_code'] = i0.Variable<String>(pinCode);
|
||||||
|
}
|
||||||
|
map['has_profile_image'] = i0.Variable<bool>(hasProfileImage);
|
||||||
|
map['profile_changed_at'] = i0.Variable<DateTime>(profileChangedAt);
|
||||||
|
if (!nullToAbsent || quotaSizeInBytes != null) {
|
||||||
|
map['quota_size_in_bytes'] = i0.Variable<int>(quotaSizeInBytes);
|
||||||
|
}
|
||||||
|
map['quota_usage_in_bytes'] = i0.Variable<int>(quotaUsageInBytes);
|
||||||
|
if (!nullToAbsent || storageLabel != null) {
|
||||||
|
map['storage_label'] = i0.Variable<String>(storageLabel);
|
||||||
|
}
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
factory AuthUserEntityData.fromJson(Map<String, dynamic> json,
|
||||||
|
{i0.ValueSerializer? serializer}) {
|
||||||
|
serializer ??= i0.driftRuntimeOptions.defaultSerializer;
|
||||||
|
return AuthUserEntityData(
|
||||||
|
id: serializer.fromJson<String>(json['id']),
|
||||||
|
name: serializer.fromJson<String>(json['name']),
|
||||||
|
email: serializer.fromJson<String>(json['email']),
|
||||||
|
deletedAt: serializer.fromJson<DateTime?>(json['deletedAt']),
|
||||||
|
avatarColor: i1.$AuthUserEntityTable.$converteravatarColorn
|
||||||
|
.fromJson(serializer.fromJson<int?>(json['avatarColor'])),
|
||||||
|
isAdmin: serializer.fromJson<bool>(json['isAdmin']),
|
||||||
|
oauthId: serializer.fromJson<String>(json['oauthId']),
|
||||||
|
pinCode: serializer.fromJson<String?>(json['pinCode']),
|
||||||
|
hasProfileImage: serializer.fromJson<bool>(json['hasProfileImage']),
|
||||||
|
profileChangedAt: serializer.fromJson<DateTime>(json['profileChangedAt']),
|
||||||
|
quotaSizeInBytes: serializer.fromJson<int?>(json['quotaSizeInBytes']),
|
||||||
|
quotaUsageInBytes: serializer.fromJson<int>(json['quotaUsageInBytes']),
|
||||||
|
storageLabel: serializer.fromJson<String?>(json['storageLabel']),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
@override
|
||||||
|
Map<String, dynamic> toJson({i0.ValueSerializer? serializer}) {
|
||||||
|
serializer ??= i0.driftRuntimeOptions.defaultSerializer;
|
||||||
|
return <String, dynamic>{
|
||||||
|
'id': serializer.toJson<String>(id),
|
||||||
|
'name': serializer.toJson<String>(name),
|
||||||
|
'email': serializer.toJson<String>(email),
|
||||||
|
'deletedAt': serializer.toJson<DateTime?>(deletedAt),
|
||||||
|
'avatarColor': serializer.toJson<int?>(
|
||||||
|
i1.$AuthUserEntityTable.$converteravatarColorn.toJson(avatarColor)),
|
||||||
|
'isAdmin': serializer.toJson<bool>(isAdmin),
|
||||||
|
'oauthId': serializer.toJson<String>(oauthId),
|
||||||
|
'pinCode': serializer.toJson<String?>(pinCode),
|
||||||
|
'hasProfileImage': serializer.toJson<bool>(hasProfileImage),
|
||||||
|
'profileChangedAt': serializer.toJson<DateTime>(profileChangedAt),
|
||||||
|
'quotaSizeInBytes': serializer.toJson<int?>(quotaSizeInBytes),
|
||||||
|
'quotaUsageInBytes': serializer.toJson<int>(quotaUsageInBytes),
|
||||||
|
'storageLabel': serializer.toJson<String?>(storageLabel),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
i1.AuthUserEntityData copyWith(
|
||||||
|
{String? id,
|
||||||
|
String? name,
|
||||||
|
String? email,
|
||||||
|
i0.Value<DateTime?> deletedAt = const i0.Value.absent(),
|
||||||
|
i0.Value<i2.AvatarColor?> avatarColor = const i0.Value.absent(),
|
||||||
|
bool? isAdmin,
|
||||||
|
String? oauthId,
|
||||||
|
i0.Value<String?> pinCode = const i0.Value.absent(),
|
||||||
|
bool? hasProfileImage,
|
||||||
|
DateTime? profileChangedAt,
|
||||||
|
i0.Value<int?> quotaSizeInBytes = const i0.Value.absent(),
|
||||||
|
int? quotaUsageInBytes,
|
||||||
|
i0.Value<String?> storageLabel = const i0.Value.absent()}) =>
|
||||||
|
i1.AuthUserEntityData(
|
||||||
|
id: id ?? this.id,
|
||||||
|
name: name ?? this.name,
|
||||||
|
email: email ?? this.email,
|
||||||
|
deletedAt: deletedAt.present ? deletedAt.value : this.deletedAt,
|
||||||
|
avatarColor: avatarColor.present ? avatarColor.value : this.avatarColor,
|
||||||
|
isAdmin: isAdmin ?? this.isAdmin,
|
||||||
|
oauthId: oauthId ?? this.oauthId,
|
||||||
|
pinCode: pinCode.present ? pinCode.value : this.pinCode,
|
||||||
|
hasProfileImage: hasProfileImage ?? this.hasProfileImage,
|
||||||
|
profileChangedAt: profileChangedAt ?? this.profileChangedAt,
|
||||||
|
quotaSizeInBytes: quotaSizeInBytes.present
|
||||||
|
? quotaSizeInBytes.value
|
||||||
|
: this.quotaSizeInBytes,
|
||||||
|
quotaUsageInBytes: quotaUsageInBytes ?? this.quotaUsageInBytes,
|
||||||
|
storageLabel:
|
||||||
|
storageLabel.present ? storageLabel.value : this.storageLabel,
|
||||||
|
);
|
||||||
|
AuthUserEntityData copyWithCompanion(i1.AuthUserEntityCompanion data) {
|
||||||
|
return AuthUserEntityData(
|
||||||
|
id: data.id.present ? data.id.value : this.id,
|
||||||
|
name: data.name.present ? data.name.value : this.name,
|
||||||
|
email: data.email.present ? data.email.value : this.email,
|
||||||
|
deletedAt: data.deletedAt.present ? data.deletedAt.value : this.deletedAt,
|
||||||
|
avatarColor:
|
||||||
|
data.avatarColor.present ? data.avatarColor.value : this.avatarColor,
|
||||||
|
isAdmin: data.isAdmin.present ? data.isAdmin.value : this.isAdmin,
|
||||||
|
oauthId: data.oauthId.present ? data.oauthId.value : this.oauthId,
|
||||||
|
pinCode: data.pinCode.present ? data.pinCode.value : this.pinCode,
|
||||||
|
hasProfileImage: data.hasProfileImage.present
|
||||||
|
? data.hasProfileImage.value
|
||||||
|
: this.hasProfileImage,
|
||||||
|
profileChangedAt: data.profileChangedAt.present
|
||||||
|
? data.profileChangedAt.value
|
||||||
|
: this.profileChangedAt,
|
||||||
|
quotaSizeInBytes: data.quotaSizeInBytes.present
|
||||||
|
? data.quotaSizeInBytes.value
|
||||||
|
: this.quotaSizeInBytes,
|
||||||
|
quotaUsageInBytes: data.quotaUsageInBytes.present
|
||||||
|
? data.quotaUsageInBytes.value
|
||||||
|
: this.quotaUsageInBytes,
|
||||||
|
storageLabel: data.storageLabel.present
|
||||||
|
? data.storageLabel.value
|
||||||
|
: this.storageLabel,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
String toString() {
|
||||||
|
return (StringBuffer('AuthUserEntityData(')
|
||||||
|
..write('id: $id, ')
|
||||||
|
..write('name: $name, ')
|
||||||
|
..write('email: $email, ')
|
||||||
|
..write('deletedAt: $deletedAt, ')
|
||||||
|
..write('avatarColor: $avatarColor, ')
|
||||||
|
..write('isAdmin: $isAdmin, ')
|
||||||
|
..write('oauthId: $oauthId, ')
|
||||||
|
..write('pinCode: $pinCode, ')
|
||||||
|
..write('hasProfileImage: $hasProfileImage, ')
|
||||||
|
..write('profileChangedAt: $profileChangedAt, ')
|
||||||
|
..write('quotaSizeInBytes: $quotaSizeInBytes, ')
|
||||||
|
..write('quotaUsageInBytes: $quotaUsageInBytes, ')
|
||||||
|
..write('storageLabel: $storageLabel')
|
||||||
|
..write(')'))
|
||||||
|
.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
int get hashCode => Object.hash(
|
||||||
|
id,
|
||||||
|
name,
|
||||||
|
email,
|
||||||
|
deletedAt,
|
||||||
|
avatarColor,
|
||||||
|
isAdmin,
|
||||||
|
oauthId,
|
||||||
|
pinCode,
|
||||||
|
hasProfileImage,
|
||||||
|
profileChangedAt,
|
||||||
|
quotaSizeInBytes,
|
||||||
|
quotaUsageInBytes,
|
||||||
|
storageLabel);
|
||||||
|
@override
|
||||||
|
bool operator ==(Object other) =>
|
||||||
|
identical(this, other) ||
|
||||||
|
(other is i1.AuthUserEntityData &&
|
||||||
|
other.id == this.id &&
|
||||||
|
other.name == this.name &&
|
||||||
|
other.email == this.email &&
|
||||||
|
other.deletedAt == this.deletedAt &&
|
||||||
|
other.avatarColor == this.avatarColor &&
|
||||||
|
other.isAdmin == this.isAdmin &&
|
||||||
|
other.oauthId == this.oauthId &&
|
||||||
|
other.pinCode == this.pinCode &&
|
||||||
|
other.hasProfileImage == this.hasProfileImage &&
|
||||||
|
other.profileChangedAt == this.profileChangedAt &&
|
||||||
|
other.quotaSizeInBytes == this.quotaSizeInBytes &&
|
||||||
|
other.quotaUsageInBytes == this.quotaUsageInBytes &&
|
||||||
|
other.storageLabel == this.storageLabel);
|
||||||
|
}
|
||||||
|
|
||||||
|
class AuthUserEntityCompanion
|
||||||
|
extends i0.UpdateCompanion<i1.AuthUserEntityData> {
|
||||||
|
final i0.Value<String> id;
|
||||||
|
final i0.Value<String> name;
|
||||||
|
final i0.Value<String> email;
|
||||||
|
final i0.Value<DateTime?> deletedAt;
|
||||||
|
final i0.Value<i2.AvatarColor?> avatarColor;
|
||||||
|
final i0.Value<bool> isAdmin;
|
||||||
|
final i0.Value<String> oauthId;
|
||||||
|
final i0.Value<String?> pinCode;
|
||||||
|
final i0.Value<bool> hasProfileImage;
|
||||||
|
final i0.Value<DateTime> profileChangedAt;
|
||||||
|
final i0.Value<int?> quotaSizeInBytes;
|
||||||
|
final i0.Value<int> quotaUsageInBytes;
|
||||||
|
final i0.Value<String?> storageLabel;
|
||||||
|
const AuthUserEntityCompanion({
|
||||||
|
this.id = const i0.Value.absent(),
|
||||||
|
this.name = const i0.Value.absent(),
|
||||||
|
this.email = const i0.Value.absent(),
|
||||||
|
this.deletedAt = const i0.Value.absent(),
|
||||||
|
this.avatarColor = const i0.Value.absent(),
|
||||||
|
this.isAdmin = const i0.Value.absent(),
|
||||||
|
this.oauthId = const i0.Value.absent(),
|
||||||
|
this.pinCode = const i0.Value.absent(),
|
||||||
|
this.hasProfileImage = const i0.Value.absent(),
|
||||||
|
this.profileChangedAt = const i0.Value.absent(),
|
||||||
|
this.quotaSizeInBytes = const i0.Value.absent(),
|
||||||
|
this.quotaUsageInBytes = const i0.Value.absent(),
|
||||||
|
this.storageLabel = const i0.Value.absent(),
|
||||||
|
});
|
||||||
|
AuthUserEntityCompanion.insert({
|
||||||
|
required String id,
|
||||||
|
required String name,
|
||||||
|
required String email,
|
||||||
|
this.deletedAt = const i0.Value.absent(),
|
||||||
|
this.avatarColor = const i0.Value.absent(),
|
||||||
|
this.isAdmin = const i0.Value.absent(),
|
||||||
|
this.oauthId = const i0.Value.absent(),
|
||||||
|
this.pinCode = const i0.Value.absent(),
|
||||||
|
this.hasProfileImage = const i0.Value.absent(),
|
||||||
|
this.profileChangedAt = const i0.Value.absent(),
|
||||||
|
this.quotaSizeInBytes = const i0.Value.absent(),
|
||||||
|
this.quotaUsageInBytes = const i0.Value.absent(),
|
||||||
|
this.storageLabel = const i0.Value.absent(),
|
||||||
|
}) : id = i0.Value(id),
|
||||||
|
name = i0.Value(name),
|
||||||
|
email = i0.Value(email);
|
||||||
|
static i0.Insertable<i1.AuthUserEntityData> custom({
|
||||||
|
i0.Expression<String>? id,
|
||||||
|
i0.Expression<String>? name,
|
||||||
|
i0.Expression<String>? email,
|
||||||
|
i0.Expression<DateTime>? deletedAt,
|
||||||
|
i0.Expression<int>? avatarColor,
|
||||||
|
i0.Expression<bool>? isAdmin,
|
||||||
|
i0.Expression<String>? oauthId,
|
||||||
|
i0.Expression<String>? pinCode,
|
||||||
|
i0.Expression<bool>? hasProfileImage,
|
||||||
|
i0.Expression<DateTime>? profileChangedAt,
|
||||||
|
i0.Expression<int>? quotaSizeInBytes,
|
||||||
|
i0.Expression<int>? quotaUsageInBytes,
|
||||||
|
i0.Expression<String>? storageLabel,
|
||||||
|
}) {
|
||||||
|
return i0.RawValuesInsertable({
|
||||||
|
if (id != null) 'id': id,
|
||||||
|
if (name != null) 'name': name,
|
||||||
|
if (email != null) 'email': email,
|
||||||
|
if (deletedAt != null) 'deleted_at': deletedAt,
|
||||||
|
if (avatarColor != null) 'avatar_color': avatarColor,
|
||||||
|
if (isAdmin != null) 'is_admin': isAdmin,
|
||||||
|
if (oauthId != null) 'oauth_id': oauthId,
|
||||||
|
if (pinCode != null) 'pin_code': pinCode,
|
||||||
|
if (hasProfileImage != null) 'has_profile_image': hasProfileImage,
|
||||||
|
if (profileChangedAt != null) 'profile_changed_at': profileChangedAt,
|
||||||
|
if (quotaSizeInBytes != null) 'quota_size_in_bytes': quotaSizeInBytes,
|
||||||
|
if (quotaUsageInBytes != null) 'quota_usage_in_bytes': quotaUsageInBytes,
|
||||||
|
if (storageLabel != null) 'storage_label': storageLabel,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
i1.AuthUserEntityCompanion copyWith(
|
||||||
|
{i0.Value<String>? id,
|
||||||
|
i0.Value<String>? name,
|
||||||
|
i0.Value<String>? email,
|
||||||
|
i0.Value<DateTime?>? deletedAt,
|
||||||
|
i0.Value<i2.AvatarColor?>? avatarColor,
|
||||||
|
i0.Value<bool>? isAdmin,
|
||||||
|
i0.Value<String>? oauthId,
|
||||||
|
i0.Value<String?>? pinCode,
|
||||||
|
i0.Value<bool>? hasProfileImage,
|
||||||
|
i0.Value<DateTime>? profileChangedAt,
|
||||||
|
i0.Value<int?>? quotaSizeInBytes,
|
||||||
|
i0.Value<int>? quotaUsageInBytes,
|
||||||
|
i0.Value<String?>? storageLabel}) {
|
||||||
|
return i1.AuthUserEntityCompanion(
|
||||||
|
id: id ?? this.id,
|
||||||
|
name: name ?? this.name,
|
||||||
|
email: email ?? this.email,
|
||||||
|
deletedAt: deletedAt ?? this.deletedAt,
|
||||||
|
avatarColor: avatarColor ?? this.avatarColor,
|
||||||
|
isAdmin: isAdmin ?? this.isAdmin,
|
||||||
|
oauthId: oauthId ?? this.oauthId,
|
||||||
|
pinCode: pinCode ?? this.pinCode,
|
||||||
|
hasProfileImage: hasProfileImage ?? this.hasProfileImage,
|
||||||
|
profileChangedAt: profileChangedAt ?? this.profileChangedAt,
|
||||||
|
quotaSizeInBytes: quotaSizeInBytes ?? this.quotaSizeInBytes,
|
||||||
|
quotaUsageInBytes: quotaUsageInBytes ?? this.quotaUsageInBytes,
|
||||||
|
storageLabel: storageLabel ?? this.storageLabel,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Map<String, i0.Expression> toColumns(bool nullToAbsent) {
|
||||||
|
final map = <String, i0.Expression>{};
|
||||||
|
if (id.present) {
|
||||||
|
map['id'] = i0.Variable<String>(id.value);
|
||||||
|
}
|
||||||
|
if (name.present) {
|
||||||
|
map['name'] = i0.Variable<String>(name.value);
|
||||||
|
}
|
||||||
|
if (email.present) {
|
||||||
|
map['email'] = i0.Variable<String>(email.value);
|
||||||
|
}
|
||||||
|
if (deletedAt.present) {
|
||||||
|
map['deleted_at'] = i0.Variable<DateTime>(deletedAt.value);
|
||||||
|
}
|
||||||
|
if (avatarColor.present) {
|
||||||
|
map['avatar_color'] = i0.Variable<int>(i1
|
||||||
|
.$AuthUserEntityTable.$converteravatarColorn
|
||||||
|
.toSql(avatarColor.value));
|
||||||
|
}
|
||||||
|
if (isAdmin.present) {
|
||||||
|
map['is_admin'] = i0.Variable<bool>(isAdmin.value);
|
||||||
|
}
|
||||||
|
if (oauthId.present) {
|
||||||
|
map['oauth_id'] = i0.Variable<String>(oauthId.value);
|
||||||
|
}
|
||||||
|
if (pinCode.present) {
|
||||||
|
map['pin_code'] = i0.Variable<String>(pinCode.value);
|
||||||
|
}
|
||||||
|
if (hasProfileImage.present) {
|
||||||
|
map['has_profile_image'] = i0.Variable<bool>(hasProfileImage.value);
|
||||||
|
}
|
||||||
|
if (profileChangedAt.present) {
|
||||||
|
map['profile_changed_at'] = i0.Variable<DateTime>(profileChangedAt.value);
|
||||||
|
}
|
||||||
|
if (quotaSizeInBytes.present) {
|
||||||
|
map['quota_size_in_bytes'] = i0.Variable<int>(quotaSizeInBytes.value);
|
||||||
|
}
|
||||||
|
if (quotaUsageInBytes.present) {
|
||||||
|
map['quota_usage_in_bytes'] = i0.Variable<int>(quotaUsageInBytes.value);
|
||||||
|
}
|
||||||
|
if (storageLabel.present) {
|
||||||
|
map['storage_label'] = i0.Variable<String>(storageLabel.value);
|
||||||
|
}
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
String toString() {
|
||||||
|
return (StringBuffer('AuthUserEntityCompanion(')
|
||||||
|
..write('id: $id, ')
|
||||||
|
..write('name: $name, ')
|
||||||
|
..write('email: $email, ')
|
||||||
|
..write('deletedAt: $deletedAt, ')
|
||||||
|
..write('avatarColor: $avatarColor, ')
|
||||||
|
..write('isAdmin: $isAdmin, ')
|
||||||
|
..write('oauthId: $oauthId, ')
|
||||||
|
..write('pinCode: $pinCode, ')
|
||||||
|
..write('hasProfileImage: $hasProfileImage, ')
|
||||||
|
..write('profileChangedAt: $profileChangedAt, ')
|
||||||
|
..write('quotaSizeInBytes: $quotaSizeInBytes, ')
|
||||||
|
..write('quotaUsageInBytes: $quotaUsageInBytes, ')
|
||||||
|
..write('storageLabel: $storageLabel')
|
||||||
|
..write(')'))
|
||||||
|
.toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,14 +1,16 @@
|
|||||||
import 'package:drift/drift.dart' hide Index;
|
import 'package:drift/drift.dart' hide Index;
|
||||||
import 'package:immich_mobile/domain/models/user.model.dart';
|
import 'package:immich_mobile/domain/models/user.model.dart';
|
||||||
import 'package:immich_mobile/domain/models/user_metadata.model.dart';
|
import 'package:immich_mobile/domain/models/user_metadata.model.dart';
|
||||||
|
import 'package:immich_mobile/infrastructure/entities/user.entity.drift.dart';
|
||||||
import 'package:immich_mobile/infrastructure/utils/drift_default.mixin.dart';
|
import 'package:immich_mobile/infrastructure/utils/drift_default.mixin.dart';
|
||||||
import 'package:immich_mobile/utils/hash.dart';
|
import 'package:immich_mobile/utils/hash.dart';
|
||||||
import 'package:isar/isar.dart';
|
import 'package:isar/isar.dart';
|
||||||
|
|
||||||
part 'user.entity.g.dart';
|
part 'user.entity.g.dart';
|
||||||
|
|
||||||
|
// TODO: Remove User once Isar is removed
|
||||||
@Collection(inheritance: false)
|
@Collection(inheritance: false)
|
||||||
class User {
|
class IsarUser {
|
||||||
Id get isarId => fastHash(id);
|
Id get isarId => fastHash(id);
|
||||||
@Index(unique: true, replace: false, type: IndexType.hash)
|
@Index(unique: true, replace: false, type: IndexType.hash)
|
||||||
final String id;
|
final String id;
|
||||||
@@ -26,7 +28,7 @@ class User {
|
|||||||
final int quotaUsageInBytes;
|
final int quotaUsageInBytes;
|
||||||
final int quotaSizeInBytes;
|
final int quotaSizeInBytes;
|
||||||
|
|
||||||
const User({
|
const IsarUser({
|
||||||
required this.id,
|
required this.id,
|
||||||
required this.updatedAt,
|
required this.updatedAt,
|
||||||
required this.email,
|
required this.email,
|
||||||
@@ -42,7 +44,7 @@ class User {
|
|||||||
this.quotaSizeInBytes = 0,
|
this.quotaSizeInBytes = 0,
|
||||||
});
|
});
|
||||||
|
|
||||||
static User fromDto(UserDto dto) => User(
|
static IsarUser fromDto(UserDto dto) => IsarUser(
|
||||||
id: dto.id,
|
id: dto.id,
|
||||||
updatedAt: dto.updatedAt,
|
updatedAt: dto.updatedAt,
|
||||||
email: dto.email,
|
email: dto.email,
|
||||||
@@ -79,15 +81,25 @@ class UserEntity extends Table with DriftDefaultsMixin {
|
|||||||
const UserEntity();
|
const UserEntity();
|
||||||
|
|
||||||
TextColumn get id => text()();
|
TextColumn get id => text()();
|
||||||
|
|
||||||
TextColumn get name => text()();
|
TextColumn get name => text()();
|
||||||
BoolColumn get isAdmin => boolean().withDefault(const Constant(false))();
|
|
||||||
TextColumn get email => text()();
|
TextColumn get email => text()();
|
||||||
TextColumn get profileImagePath => text().nullable()();
|
|
||||||
DateTimeColumn get updatedAt => dateTime().withDefault(currentDateAndTime)();
|
DateTimeColumn get deletedAt => dateTime().nullable()();
|
||||||
// Quota
|
|
||||||
IntColumn get quotaSizeInBytes => integer().nullable()();
|
IntColumn get avatarColor => intEnum<AvatarColor>().nullable()();
|
||||||
IntColumn get quotaUsageInBytes => integer().withDefault(const Constant(0))();
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Set<Column> get primaryKey => {id};
|
Set<Column> get primaryKey => {id};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extension UserEntityDataDomainEx on UserEntityData {
|
||||||
|
User toDto() => User(
|
||||||
|
id: id,
|
||||||
|
name: name,
|
||||||
|
email: email,
|
||||||
|
deletedAt: deletedAt,
|
||||||
|
avatarColor: avatarColor,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|||||||
@@ -3,30 +3,24 @@
|
|||||||
import 'package:drift/drift.dart' as i0;
|
import 'package:drift/drift.dart' as i0;
|
||||||
import 'package:immich_mobile/infrastructure/entities/user.entity.drift.dart'
|
import 'package:immich_mobile/infrastructure/entities/user.entity.drift.dart'
|
||||||
as i1;
|
as i1;
|
||||||
import 'package:immich_mobile/infrastructure/entities/user.entity.dart' as i2;
|
import 'package:immich_mobile/domain/models/user_metadata.model.dart' as i2;
|
||||||
import 'package:drift/src/runtime/query_builder/query_builder.dart' as i3;
|
import 'package:immich_mobile/infrastructure/entities/user.entity.dart' as i3;
|
||||||
|
|
||||||
typedef $$UserEntityTableCreateCompanionBuilder = i1.UserEntityCompanion
|
typedef $$UserEntityTableCreateCompanionBuilder = i1.UserEntityCompanion
|
||||||
Function({
|
Function({
|
||||||
required String id,
|
required String id,
|
||||||
required String name,
|
required String name,
|
||||||
i0.Value<bool> isAdmin,
|
|
||||||
required String email,
|
required String email,
|
||||||
i0.Value<String?> profileImagePath,
|
i0.Value<DateTime?> deletedAt,
|
||||||
i0.Value<DateTime> updatedAt,
|
i0.Value<i2.AvatarColor?> avatarColor,
|
||||||
i0.Value<int?> quotaSizeInBytes,
|
|
||||||
i0.Value<int> quotaUsageInBytes,
|
|
||||||
});
|
});
|
||||||
typedef $$UserEntityTableUpdateCompanionBuilder = i1.UserEntityCompanion
|
typedef $$UserEntityTableUpdateCompanionBuilder = i1.UserEntityCompanion
|
||||||
Function({
|
Function({
|
||||||
i0.Value<String> id,
|
i0.Value<String> id,
|
||||||
i0.Value<String> name,
|
i0.Value<String> name,
|
||||||
i0.Value<bool> isAdmin,
|
|
||||||
i0.Value<String> email,
|
i0.Value<String> email,
|
||||||
i0.Value<String?> profileImagePath,
|
i0.Value<DateTime?> deletedAt,
|
||||||
i0.Value<DateTime> updatedAt,
|
i0.Value<i2.AvatarColor?> avatarColor,
|
||||||
i0.Value<int?> quotaSizeInBytes,
|
|
||||||
i0.Value<int> quotaUsageInBytes,
|
|
||||||
});
|
});
|
||||||
|
|
||||||
class $$UserEntityTableFilterComposer
|
class $$UserEntityTableFilterComposer
|
||||||
@@ -44,26 +38,16 @@ class $$UserEntityTableFilterComposer
|
|||||||
i0.ColumnFilters<String> get name => $composableBuilder(
|
i0.ColumnFilters<String> get name => $composableBuilder(
|
||||||
column: $table.name, builder: (column) => i0.ColumnFilters(column));
|
column: $table.name, builder: (column) => i0.ColumnFilters(column));
|
||||||
|
|
||||||
i0.ColumnFilters<bool> get isAdmin => $composableBuilder(
|
|
||||||
column: $table.isAdmin, builder: (column) => i0.ColumnFilters(column));
|
|
||||||
|
|
||||||
i0.ColumnFilters<String> get email => $composableBuilder(
|
i0.ColumnFilters<String> get email => $composableBuilder(
|
||||||
column: $table.email, builder: (column) => i0.ColumnFilters(column));
|
column: $table.email, builder: (column) => i0.ColumnFilters(column));
|
||||||
|
|
||||||
i0.ColumnFilters<String> get profileImagePath => $composableBuilder(
|
i0.ColumnFilters<DateTime> get deletedAt => $composableBuilder(
|
||||||
column: $table.profileImagePath,
|
column: $table.deletedAt, builder: (column) => i0.ColumnFilters(column));
|
||||||
builder: (column) => i0.ColumnFilters(column));
|
|
||||||
|
|
||||||
i0.ColumnFilters<DateTime> get updatedAt => $composableBuilder(
|
i0.ColumnWithTypeConverterFilters<i2.AvatarColor?, i2.AvatarColor, int>
|
||||||
column: $table.updatedAt, builder: (column) => i0.ColumnFilters(column));
|
get avatarColor => $composableBuilder(
|
||||||
|
column: $table.avatarColor,
|
||||||
i0.ColumnFilters<int> get quotaSizeInBytes => $composableBuilder(
|
builder: (column) => i0.ColumnWithTypeConverterFilters(column));
|
||||||
column: $table.quotaSizeInBytes,
|
|
||||||
builder: (column) => i0.ColumnFilters(column));
|
|
||||||
|
|
||||||
i0.ColumnFilters<int> get quotaUsageInBytes => $composableBuilder(
|
|
||||||
column: $table.quotaUsageInBytes,
|
|
||||||
builder: (column) => i0.ColumnFilters(column));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class $$UserEntityTableOrderingComposer
|
class $$UserEntityTableOrderingComposer
|
||||||
@@ -81,26 +65,15 @@ class $$UserEntityTableOrderingComposer
|
|||||||
i0.ColumnOrderings<String> get name => $composableBuilder(
|
i0.ColumnOrderings<String> get name => $composableBuilder(
|
||||||
column: $table.name, builder: (column) => i0.ColumnOrderings(column));
|
column: $table.name, builder: (column) => i0.ColumnOrderings(column));
|
||||||
|
|
||||||
i0.ColumnOrderings<bool> get isAdmin => $composableBuilder(
|
|
||||||
column: $table.isAdmin, builder: (column) => i0.ColumnOrderings(column));
|
|
||||||
|
|
||||||
i0.ColumnOrderings<String> get email => $composableBuilder(
|
i0.ColumnOrderings<String> get email => $composableBuilder(
|
||||||
column: $table.email, builder: (column) => i0.ColumnOrderings(column));
|
column: $table.email, builder: (column) => i0.ColumnOrderings(column));
|
||||||
|
|
||||||
i0.ColumnOrderings<String> get profileImagePath => $composableBuilder(
|
i0.ColumnOrderings<DateTime> get deletedAt => $composableBuilder(
|
||||||
column: $table.profileImagePath,
|
column: $table.deletedAt,
|
||||||
builder: (column) => i0.ColumnOrderings(column));
|
builder: (column) => i0.ColumnOrderings(column));
|
||||||
|
|
||||||
i0.ColumnOrderings<DateTime> get updatedAt => $composableBuilder(
|
i0.ColumnOrderings<int> get avatarColor => $composableBuilder(
|
||||||
column: $table.updatedAt,
|
column: $table.avatarColor,
|
||||||
builder: (column) => i0.ColumnOrderings(column));
|
|
||||||
|
|
||||||
i0.ColumnOrderings<int> get quotaSizeInBytes => $composableBuilder(
|
|
||||||
column: $table.quotaSizeInBytes,
|
|
||||||
builder: (column) => i0.ColumnOrderings(column));
|
|
||||||
|
|
||||||
i0.ColumnOrderings<int> get quotaUsageInBytes => $composableBuilder(
|
|
||||||
column: $table.quotaUsageInBytes,
|
|
||||||
builder: (column) => i0.ColumnOrderings(column));
|
builder: (column) => i0.ColumnOrderings(column));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -119,23 +92,15 @@ class $$UserEntityTableAnnotationComposer
|
|||||||
i0.GeneratedColumn<String> get name =>
|
i0.GeneratedColumn<String> get name =>
|
||||||
$composableBuilder(column: $table.name, builder: (column) => column);
|
$composableBuilder(column: $table.name, builder: (column) => column);
|
||||||
|
|
||||||
i0.GeneratedColumn<bool> get isAdmin =>
|
|
||||||
$composableBuilder(column: $table.isAdmin, builder: (column) => column);
|
|
||||||
|
|
||||||
i0.GeneratedColumn<String> get email =>
|
i0.GeneratedColumn<String> get email =>
|
||||||
$composableBuilder(column: $table.email, builder: (column) => column);
|
$composableBuilder(column: $table.email, builder: (column) => column);
|
||||||
|
|
||||||
i0.GeneratedColumn<String> get profileImagePath => $composableBuilder(
|
i0.GeneratedColumn<DateTime> get deletedAt =>
|
||||||
column: $table.profileImagePath, builder: (column) => column);
|
$composableBuilder(column: $table.deletedAt, builder: (column) => column);
|
||||||
|
|
||||||
i0.GeneratedColumn<DateTime> get updatedAt =>
|
i0.GeneratedColumnWithTypeConverter<i2.AvatarColor?, int> get avatarColor =>
|
||||||
$composableBuilder(column: $table.updatedAt, builder: (column) => column);
|
$composableBuilder(
|
||||||
|
column: $table.avatarColor, builder: (column) => column);
|
||||||
i0.GeneratedColumn<int> get quotaSizeInBytes => $composableBuilder(
|
|
||||||
column: $table.quotaSizeInBytes, builder: (column) => column);
|
|
||||||
|
|
||||||
i0.GeneratedColumn<int> get quotaUsageInBytes => $composableBuilder(
|
|
||||||
column: $table.quotaUsageInBytes, builder: (column) => column);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class $$UserEntityTableTableManager extends i0.RootTableManager<
|
class $$UserEntityTableTableManager extends i0.RootTableManager<
|
||||||
@@ -168,42 +133,30 @@ class $$UserEntityTableTableManager extends i0.RootTableManager<
|
|||||||
updateCompanionCallback: ({
|
updateCompanionCallback: ({
|
||||||
i0.Value<String> id = const i0.Value.absent(),
|
i0.Value<String> id = const i0.Value.absent(),
|
||||||
i0.Value<String> name = const i0.Value.absent(),
|
i0.Value<String> name = const i0.Value.absent(),
|
||||||
i0.Value<bool> isAdmin = const i0.Value.absent(),
|
|
||||||
i0.Value<String> email = const i0.Value.absent(),
|
i0.Value<String> email = const i0.Value.absent(),
|
||||||
i0.Value<String?> profileImagePath = const i0.Value.absent(),
|
i0.Value<DateTime?> deletedAt = const i0.Value.absent(),
|
||||||
i0.Value<DateTime> updatedAt = const i0.Value.absent(),
|
i0.Value<i2.AvatarColor?> avatarColor = const i0.Value.absent(),
|
||||||
i0.Value<int?> quotaSizeInBytes = const i0.Value.absent(),
|
|
||||||
i0.Value<int> quotaUsageInBytes = const i0.Value.absent(),
|
|
||||||
}) =>
|
}) =>
|
||||||
i1.UserEntityCompanion(
|
i1.UserEntityCompanion(
|
||||||
id: id,
|
id: id,
|
||||||
name: name,
|
name: name,
|
||||||
isAdmin: isAdmin,
|
|
||||||
email: email,
|
email: email,
|
||||||
profileImagePath: profileImagePath,
|
deletedAt: deletedAt,
|
||||||
updatedAt: updatedAt,
|
avatarColor: avatarColor,
|
||||||
quotaSizeInBytes: quotaSizeInBytes,
|
|
||||||
quotaUsageInBytes: quotaUsageInBytes,
|
|
||||||
),
|
),
|
||||||
createCompanionCallback: ({
|
createCompanionCallback: ({
|
||||||
required String id,
|
required String id,
|
||||||
required String name,
|
required String name,
|
||||||
i0.Value<bool> isAdmin = const i0.Value.absent(),
|
|
||||||
required String email,
|
required String email,
|
||||||
i0.Value<String?> profileImagePath = const i0.Value.absent(),
|
i0.Value<DateTime?> deletedAt = const i0.Value.absent(),
|
||||||
i0.Value<DateTime> updatedAt = const i0.Value.absent(),
|
i0.Value<i2.AvatarColor?> avatarColor = const i0.Value.absent(),
|
||||||
i0.Value<int?> quotaSizeInBytes = const i0.Value.absent(),
|
|
||||||
i0.Value<int> quotaUsageInBytes = const i0.Value.absent(),
|
|
||||||
}) =>
|
}) =>
|
||||||
i1.UserEntityCompanion.insert(
|
i1.UserEntityCompanion.insert(
|
||||||
id: id,
|
id: id,
|
||||||
name: name,
|
name: name,
|
||||||
isAdmin: isAdmin,
|
|
||||||
email: email,
|
email: email,
|
||||||
profileImagePath: profileImagePath,
|
deletedAt: deletedAt,
|
||||||
updatedAt: updatedAt,
|
avatarColor: avatarColor,
|
||||||
quotaSizeInBytes: quotaSizeInBytes,
|
|
||||||
quotaUsageInBytes: quotaUsageInBytes,
|
|
||||||
),
|
),
|
||||||
withReferenceMapper: (p0) => p0
|
withReferenceMapper: (p0) => p0
|
||||||
.map((e) => (e.readTable(table), i0.BaseReferences(db, table, e)))
|
.map((e) => (e.readTable(table), i0.BaseReferences(db, table, e)))
|
||||||
@@ -229,7 +182,7 @@ typedef $$UserEntityTableProcessedTableManager = i0.ProcessedTableManager<
|
|||||||
i1.UserEntityData,
|
i1.UserEntityData,
|
||||||
i0.PrefetchHooks Function()>;
|
i0.PrefetchHooks Function()>;
|
||||||
|
|
||||||
class $UserEntityTable extends i2.UserEntity
|
class $UserEntityTable extends i3.UserEntity
|
||||||
with i0.TableInfo<$UserEntityTable, i1.UserEntityData> {
|
with i0.TableInfo<$UserEntityTable, i1.UserEntityData> {
|
||||||
@override
|
@override
|
||||||
final i0.GeneratedDatabase attachedDatabase;
|
final i0.GeneratedDatabase attachedDatabase;
|
||||||
@@ -246,61 +199,27 @@ class $UserEntityTable extends i2.UserEntity
|
|||||||
late final i0.GeneratedColumn<String> name = i0.GeneratedColumn<String>(
|
late final i0.GeneratedColumn<String> name = i0.GeneratedColumn<String>(
|
||||||
'name', aliasedName, false,
|
'name', aliasedName, false,
|
||||||
type: i0.DriftSqlType.string, requiredDuringInsert: true);
|
type: i0.DriftSqlType.string, requiredDuringInsert: true);
|
||||||
static const i0.VerificationMeta _isAdminMeta =
|
|
||||||
const i0.VerificationMeta('isAdmin');
|
|
||||||
@override
|
|
||||||
late final i0.GeneratedColumn<bool> isAdmin = i0.GeneratedColumn<bool>(
|
|
||||||
'is_admin', aliasedName, false,
|
|
||||||
type: i0.DriftSqlType.bool,
|
|
||||||
requiredDuringInsert: false,
|
|
||||||
defaultConstraints:
|
|
||||||
i0.GeneratedColumn.constraintIsAlways('CHECK ("is_admin" IN (0, 1))'),
|
|
||||||
defaultValue: const i3.Constant(false));
|
|
||||||
static const i0.VerificationMeta _emailMeta =
|
static const i0.VerificationMeta _emailMeta =
|
||||||
const i0.VerificationMeta('email');
|
const i0.VerificationMeta('email');
|
||||||
@override
|
@override
|
||||||
late final i0.GeneratedColumn<String> email = i0.GeneratedColumn<String>(
|
late final i0.GeneratedColumn<String> email = i0.GeneratedColumn<String>(
|
||||||
'email', aliasedName, false,
|
'email', aliasedName, false,
|
||||||
type: i0.DriftSqlType.string, requiredDuringInsert: true);
|
type: i0.DriftSqlType.string, requiredDuringInsert: true);
|
||||||
static const i0.VerificationMeta _profileImagePathMeta =
|
static const i0.VerificationMeta _deletedAtMeta =
|
||||||
const i0.VerificationMeta('profileImagePath');
|
const i0.VerificationMeta('deletedAt');
|
||||||
@override
|
@override
|
||||||
late final i0.GeneratedColumn<String> profileImagePath =
|
late final i0.GeneratedColumn<DateTime> deletedAt =
|
||||||
i0.GeneratedColumn<String>('profile_image_path', aliasedName, true,
|
i0.GeneratedColumn<DateTime>('deleted_at', aliasedName, true,
|
||||||
type: i0.DriftSqlType.string, requiredDuringInsert: false);
|
type: i0.DriftSqlType.dateTime, requiredDuringInsert: false);
|
||||||
static const i0.VerificationMeta _updatedAtMeta =
|
|
||||||
const i0.VerificationMeta('updatedAt');
|
|
||||||
@override
|
@override
|
||||||
late final i0.GeneratedColumn<DateTime> updatedAt =
|
late final i0.GeneratedColumnWithTypeConverter<i2.AvatarColor?, int>
|
||||||
i0.GeneratedColumn<DateTime>('updated_at', aliasedName, false,
|
avatarColor = i0.GeneratedColumn<int>('avatar_color', aliasedName, true,
|
||||||
type: i0.DriftSqlType.dateTime,
|
type: i0.DriftSqlType.int, requiredDuringInsert: false)
|
||||||
requiredDuringInsert: false,
|
.withConverter<i2.AvatarColor?>(
|
||||||
defaultValue: i3.currentDateAndTime);
|
i1.$UserEntityTable.$converteravatarColorn);
|
||||||
static const i0.VerificationMeta _quotaSizeInBytesMeta =
|
|
||||||
const i0.VerificationMeta('quotaSizeInBytes');
|
|
||||||
@override
|
@override
|
||||||
late final i0.GeneratedColumn<int> quotaSizeInBytes = i0.GeneratedColumn<int>(
|
List<i0.GeneratedColumn> get $columns =>
|
||||||
'quota_size_in_bytes', aliasedName, true,
|
[id, name, email, deletedAt, avatarColor];
|
||||||
type: i0.DriftSqlType.int, requiredDuringInsert: false);
|
|
||||||
static const i0.VerificationMeta _quotaUsageInBytesMeta =
|
|
||||||
const i0.VerificationMeta('quotaUsageInBytes');
|
|
||||||
@override
|
|
||||||
late final i0.GeneratedColumn<int> quotaUsageInBytes =
|
|
||||||
i0.GeneratedColumn<int>('quota_usage_in_bytes', aliasedName, false,
|
|
||||||
type: i0.DriftSqlType.int,
|
|
||||||
requiredDuringInsert: false,
|
|
||||||
defaultValue: const i3.Constant(0));
|
|
||||||
@override
|
|
||||||
List<i0.GeneratedColumn> get $columns => [
|
|
||||||
id,
|
|
||||||
name,
|
|
||||||
isAdmin,
|
|
||||||
email,
|
|
||||||
profileImagePath,
|
|
||||||
updatedAt,
|
|
||||||
quotaSizeInBytes,
|
|
||||||
quotaUsageInBytes
|
|
||||||
];
|
|
||||||
@override
|
@override
|
||||||
String get aliasedName => _alias ?? actualTableName;
|
String get aliasedName => _alias ?? actualTableName;
|
||||||
@override
|
@override
|
||||||
@@ -323,37 +242,15 @@ class $UserEntityTable extends i2.UserEntity
|
|||||||
} else if (isInserting) {
|
} else if (isInserting) {
|
||||||
context.missing(_nameMeta);
|
context.missing(_nameMeta);
|
||||||
}
|
}
|
||||||
if (data.containsKey('is_admin')) {
|
|
||||||
context.handle(_isAdminMeta,
|
|
||||||
isAdmin.isAcceptableOrUnknown(data['is_admin']!, _isAdminMeta));
|
|
||||||
}
|
|
||||||
if (data.containsKey('email')) {
|
if (data.containsKey('email')) {
|
||||||
context.handle(
|
context.handle(
|
||||||
_emailMeta, email.isAcceptableOrUnknown(data['email']!, _emailMeta));
|
_emailMeta, email.isAcceptableOrUnknown(data['email']!, _emailMeta));
|
||||||
} else if (isInserting) {
|
} else if (isInserting) {
|
||||||
context.missing(_emailMeta);
|
context.missing(_emailMeta);
|
||||||
}
|
}
|
||||||
if (data.containsKey('profile_image_path')) {
|
if (data.containsKey('deleted_at')) {
|
||||||
context.handle(
|
context.handle(_deletedAtMeta,
|
||||||
_profileImagePathMeta,
|
deletedAt.isAcceptableOrUnknown(data['deleted_at']!, _deletedAtMeta));
|
||||||
profileImagePath.isAcceptableOrUnknown(
|
|
||||||
data['profile_image_path']!, _profileImagePathMeta));
|
|
||||||
}
|
|
||||||
if (data.containsKey('updated_at')) {
|
|
||||||
context.handle(_updatedAtMeta,
|
|
||||||
updatedAt.isAcceptableOrUnknown(data['updated_at']!, _updatedAtMeta));
|
|
||||||
}
|
|
||||||
if (data.containsKey('quota_size_in_bytes')) {
|
|
||||||
context.handle(
|
|
||||||
_quotaSizeInBytesMeta,
|
|
||||||
quotaSizeInBytes.isAcceptableOrUnknown(
|
|
||||||
data['quota_size_in_bytes']!, _quotaSizeInBytesMeta));
|
|
||||||
}
|
|
||||||
if (data.containsKey('quota_usage_in_bytes')) {
|
|
||||||
context.handle(
|
|
||||||
_quotaUsageInBytesMeta,
|
|
||||||
quotaUsageInBytes.isAcceptableOrUnknown(
|
|
||||||
data['quota_usage_in_bytes']!, _quotaUsageInBytesMeta));
|
|
||||||
}
|
}
|
||||||
return context;
|
return context;
|
||||||
}
|
}
|
||||||
@@ -368,18 +265,13 @@ class $UserEntityTable extends i2.UserEntity
|
|||||||
.read(i0.DriftSqlType.string, data['${effectivePrefix}id'])!,
|
.read(i0.DriftSqlType.string, data['${effectivePrefix}id'])!,
|
||||||
name: attachedDatabase.typeMapping
|
name: attachedDatabase.typeMapping
|
||||||
.read(i0.DriftSqlType.string, data['${effectivePrefix}name'])!,
|
.read(i0.DriftSqlType.string, data['${effectivePrefix}name'])!,
|
||||||
isAdmin: attachedDatabase.typeMapping
|
|
||||||
.read(i0.DriftSqlType.bool, data['${effectivePrefix}is_admin'])!,
|
|
||||||
email: attachedDatabase.typeMapping
|
email: attachedDatabase.typeMapping
|
||||||
.read(i0.DriftSqlType.string, data['${effectivePrefix}email'])!,
|
.read(i0.DriftSqlType.string, data['${effectivePrefix}email'])!,
|
||||||
profileImagePath: attachedDatabase.typeMapping.read(
|
deletedAt: attachedDatabase.typeMapping
|
||||||
i0.DriftSqlType.string, data['${effectivePrefix}profile_image_path']),
|
.read(i0.DriftSqlType.dateTime, data['${effectivePrefix}deleted_at']),
|
||||||
updatedAt: attachedDatabase.typeMapping.read(
|
avatarColor: i1.$UserEntityTable.$converteravatarColorn.fromSql(
|
||||||
i0.DriftSqlType.dateTime, data['${effectivePrefix}updated_at'])!,
|
attachedDatabase.typeMapping.read(
|
||||||
quotaSizeInBytes: attachedDatabase.typeMapping.read(
|
i0.DriftSqlType.int, data['${effectivePrefix}avatar_color'])),
|
||||||
i0.DriftSqlType.int, data['${effectivePrefix}quota_size_in_bytes']),
|
|
||||||
quotaUsageInBytes: attachedDatabase.typeMapping.read(
|
|
||||||
i0.DriftSqlType.int, data['${effectivePrefix}quota_usage_in_bytes'])!,
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -388,6 +280,11 @@ class $UserEntityTable extends i2.UserEntity
|
|||||||
return $UserEntityTable(attachedDatabase, alias);
|
return $UserEntityTable(attachedDatabase, alias);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static i0.JsonTypeConverter2<i2.AvatarColor, int, int> $converteravatarColor =
|
||||||
|
const i0.EnumIndexConverter<i2.AvatarColor>(i2.AvatarColor.values);
|
||||||
|
static i0.JsonTypeConverter2<i2.AvatarColor?, int?, int?>
|
||||||
|
$converteravatarColorn =
|
||||||
|
i0.JsonTypeConverter2.asNullable($converteravatarColor);
|
||||||
@override
|
@override
|
||||||
bool get withoutRowId => true;
|
bool get withoutRowId => true;
|
||||||
@override
|
@override
|
||||||
@@ -398,36 +295,28 @@ class UserEntityData extends i0.DataClass
|
|||||||
implements i0.Insertable<i1.UserEntityData> {
|
implements i0.Insertable<i1.UserEntityData> {
|
||||||
final String id;
|
final String id;
|
||||||
final String name;
|
final String name;
|
||||||
final bool isAdmin;
|
|
||||||
final String email;
|
final String email;
|
||||||
final String? profileImagePath;
|
final DateTime? deletedAt;
|
||||||
final DateTime updatedAt;
|
final i2.AvatarColor? avatarColor;
|
||||||
final int? quotaSizeInBytes;
|
|
||||||
final int quotaUsageInBytes;
|
|
||||||
const UserEntityData(
|
const UserEntityData(
|
||||||
{required this.id,
|
{required this.id,
|
||||||
required this.name,
|
required this.name,
|
||||||
required this.isAdmin,
|
|
||||||
required this.email,
|
required this.email,
|
||||||
this.profileImagePath,
|
this.deletedAt,
|
||||||
required this.updatedAt,
|
this.avatarColor});
|
||||||
this.quotaSizeInBytes,
|
|
||||||
required this.quotaUsageInBytes});
|
|
||||||
@override
|
@override
|
||||||
Map<String, i0.Expression> toColumns(bool nullToAbsent) {
|
Map<String, i0.Expression> toColumns(bool nullToAbsent) {
|
||||||
final map = <String, i0.Expression>{};
|
final map = <String, i0.Expression>{};
|
||||||
map['id'] = i0.Variable<String>(id);
|
map['id'] = i0.Variable<String>(id);
|
||||||
map['name'] = i0.Variable<String>(name);
|
map['name'] = i0.Variable<String>(name);
|
||||||
map['is_admin'] = i0.Variable<bool>(isAdmin);
|
|
||||||
map['email'] = i0.Variable<String>(email);
|
map['email'] = i0.Variable<String>(email);
|
||||||
if (!nullToAbsent || profileImagePath != null) {
|
if (!nullToAbsent || deletedAt != null) {
|
||||||
map['profile_image_path'] = i0.Variable<String>(profileImagePath);
|
map['deleted_at'] = i0.Variable<DateTime>(deletedAt);
|
||||||
}
|
}
|
||||||
map['updated_at'] = i0.Variable<DateTime>(updatedAt);
|
if (!nullToAbsent || avatarColor != null) {
|
||||||
if (!nullToAbsent || quotaSizeInBytes != null) {
|
map['avatar_color'] = i0.Variable<int>(
|
||||||
map['quota_size_in_bytes'] = i0.Variable<int>(quotaSizeInBytes);
|
i1.$UserEntityTable.$converteravatarColorn.toSql(avatarColor));
|
||||||
}
|
}
|
||||||
map['quota_usage_in_bytes'] = i0.Variable<int>(quotaUsageInBytes);
|
|
||||||
return map;
|
return map;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -437,12 +326,10 @@ class UserEntityData extends i0.DataClass
|
|||||||
return UserEntityData(
|
return UserEntityData(
|
||||||
id: serializer.fromJson<String>(json['id']),
|
id: serializer.fromJson<String>(json['id']),
|
||||||
name: serializer.fromJson<String>(json['name']),
|
name: serializer.fromJson<String>(json['name']),
|
||||||
isAdmin: serializer.fromJson<bool>(json['isAdmin']),
|
|
||||||
email: serializer.fromJson<String>(json['email']),
|
email: serializer.fromJson<String>(json['email']),
|
||||||
profileImagePath: serializer.fromJson<String?>(json['profileImagePath']),
|
deletedAt: serializer.fromJson<DateTime?>(json['deletedAt']),
|
||||||
updatedAt: serializer.fromJson<DateTime>(json['updatedAt']),
|
avatarColor: i1.$UserEntityTable.$converteravatarColorn
|
||||||
quotaSizeInBytes: serializer.fromJson<int?>(json['quotaSizeInBytes']),
|
.fromJson(serializer.fromJson<int?>(json['avatarColor'])),
|
||||||
quotaUsageInBytes: serializer.fromJson<int>(json['quotaUsageInBytes']),
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@override
|
@override
|
||||||
@@ -451,54 +338,34 @@ class UserEntityData extends i0.DataClass
|
|||||||
return <String, dynamic>{
|
return <String, dynamic>{
|
||||||
'id': serializer.toJson<String>(id),
|
'id': serializer.toJson<String>(id),
|
||||||
'name': serializer.toJson<String>(name),
|
'name': serializer.toJson<String>(name),
|
||||||
'isAdmin': serializer.toJson<bool>(isAdmin),
|
|
||||||
'email': serializer.toJson<String>(email),
|
'email': serializer.toJson<String>(email),
|
||||||
'profileImagePath': serializer.toJson<String?>(profileImagePath),
|
'deletedAt': serializer.toJson<DateTime?>(deletedAt),
|
||||||
'updatedAt': serializer.toJson<DateTime>(updatedAt),
|
'avatarColor': serializer.toJson<int?>(
|
||||||
'quotaSizeInBytes': serializer.toJson<int?>(quotaSizeInBytes),
|
i1.$UserEntityTable.$converteravatarColorn.toJson(avatarColor)),
|
||||||
'quotaUsageInBytes': serializer.toJson<int>(quotaUsageInBytes),
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
i1.UserEntityData copyWith(
|
i1.UserEntityData copyWith(
|
||||||
{String? id,
|
{String? id,
|
||||||
String? name,
|
String? name,
|
||||||
bool? isAdmin,
|
|
||||||
String? email,
|
String? email,
|
||||||
i0.Value<String?> profileImagePath = const i0.Value.absent(),
|
i0.Value<DateTime?> deletedAt = const i0.Value.absent(),
|
||||||
DateTime? updatedAt,
|
i0.Value<i2.AvatarColor?> avatarColor = const i0.Value.absent()}) =>
|
||||||
i0.Value<int?> quotaSizeInBytes = const i0.Value.absent(),
|
|
||||||
int? quotaUsageInBytes}) =>
|
|
||||||
i1.UserEntityData(
|
i1.UserEntityData(
|
||||||
id: id ?? this.id,
|
id: id ?? this.id,
|
||||||
name: name ?? this.name,
|
name: name ?? this.name,
|
||||||
isAdmin: isAdmin ?? this.isAdmin,
|
|
||||||
email: email ?? this.email,
|
email: email ?? this.email,
|
||||||
profileImagePath: profileImagePath.present
|
deletedAt: deletedAt.present ? deletedAt.value : this.deletedAt,
|
||||||
? profileImagePath.value
|
avatarColor: avatarColor.present ? avatarColor.value : this.avatarColor,
|
||||||
: this.profileImagePath,
|
|
||||||
updatedAt: updatedAt ?? this.updatedAt,
|
|
||||||
quotaSizeInBytes: quotaSizeInBytes.present
|
|
||||||
? quotaSizeInBytes.value
|
|
||||||
: this.quotaSizeInBytes,
|
|
||||||
quotaUsageInBytes: quotaUsageInBytes ?? this.quotaUsageInBytes,
|
|
||||||
);
|
);
|
||||||
UserEntityData copyWithCompanion(i1.UserEntityCompanion data) {
|
UserEntityData copyWithCompanion(i1.UserEntityCompanion data) {
|
||||||
return UserEntityData(
|
return UserEntityData(
|
||||||
id: data.id.present ? data.id.value : this.id,
|
id: data.id.present ? data.id.value : this.id,
|
||||||
name: data.name.present ? data.name.value : this.name,
|
name: data.name.present ? data.name.value : this.name,
|
||||||
isAdmin: data.isAdmin.present ? data.isAdmin.value : this.isAdmin,
|
|
||||||
email: data.email.present ? data.email.value : this.email,
|
email: data.email.present ? data.email.value : this.email,
|
||||||
profileImagePath: data.profileImagePath.present
|
deletedAt: data.deletedAt.present ? data.deletedAt.value : this.deletedAt,
|
||||||
? data.profileImagePath.value
|
avatarColor:
|
||||||
: this.profileImagePath,
|
data.avatarColor.present ? data.avatarColor.value : this.avatarColor,
|
||||||
updatedAt: data.updatedAt.present ? data.updatedAt.value : this.updatedAt,
|
|
||||||
quotaSizeInBytes: data.quotaSizeInBytes.present
|
|
||||||
? data.quotaSizeInBytes.value
|
|
||||||
: this.quotaSizeInBytes,
|
|
||||||
quotaUsageInBytes: data.quotaUsageInBytes.present
|
|
||||||
? data.quotaUsageInBytes.value
|
|
||||||
: this.quotaUsageInBytes,
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -507,104 +374,76 @@ class UserEntityData extends i0.DataClass
|
|||||||
return (StringBuffer('UserEntityData(')
|
return (StringBuffer('UserEntityData(')
|
||||||
..write('id: $id, ')
|
..write('id: $id, ')
|
||||||
..write('name: $name, ')
|
..write('name: $name, ')
|
||||||
..write('isAdmin: $isAdmin, ')
|
|
||||||
..write('email: $email, ')
|
..write('email: $email, ')
|
||||||
..write('profileImagePath: $profileImagePath, ')
|
..write('deletedAt: $deletedAt, ')
|
||||||
..write('updatedAt: $updatedAt, ')
|
..write('avatarColor: $avatarColor')
|
||||||
..write('quotaSizeInBytes: $quotaSizeInBytes, ')
|
|
||||||
..write('quotaUsageInBytes: $quotaUsageInBytes')
|
|
||||||
..write(')'))
|
..write(')'))
|
||||||
.toString();
|
.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
int get hashCode => Object.hash(id, name, isAdmin, email, profileImagePath,
|
int get hashCode => Object.hash(id, name, email, deletedAt, avatarColor);
|
||||||
updatedAt, quotaSizeInBytes, quotaUsageInBytes);
|
|
||||||
@override
|
@override
|
||||||
bool operator ==(Object other) =>
|
bool operator ==(Object other) =>
|
||||||
identical(this, other) ||
|
identical(this, other) ||
|
||||||
(other is i1.UserEntityData &&
|
(other is i1.UserEntityData &&
|
||||||
other.id == this.id &&
|
other.id == this.id &&
|
||||||
other.name == this.name &&
|
other.name == this.name &&
|
||||||
other.isAdmin == this.isAdmin &&
|
|
||||||
other.email == this.email &&
|
other.email == this.email &&
|
||||||
other.profileImagePath == this.profileImagePath &&
|
other.deletedAt == this.deletedAt &&
|
||||||
other.updatedAt == this.updatedAt &&
|
other.avatarColor == this.avatarColor);
|
||||||
other.quotaSizeInBytes == this.quotaSizeInBytes &&
|
|
||||||
other.quotaUsageInBytes == this.quotaUsageInBytes);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class UserEntityCompanion extends i0.UpdateCompanion<i1.UserEntityData> {
|
class UserEntityCompanion extends i0.UpdateCompanion<i1.UserEntityData> {
|
||||||
final i0.Value<String> id;
|
final i0.Value<String> id;
|
||||||
final i0.Value<String> name;
|
final i0.Value<String> name;
|
||||||
final i0.Value<bool> isAdmin;
|
|
||||||
final i0.Value<String> email;
|
final i0.Value<String> email;
|
||||||
final i0.Value<String?> profileImagePath;
|
final i0.Value<DateTime?> deletedAt;
|
||||||
final i0.Value<DateTime> updatedAt;
|
final i0.Value<i2.AvatarColor?> avatarColor;
|
||||||
final i0.Value<int?> quotaSizeInBytes;
|
|
||||||
final i0.Value<int> quotaUsageInBytes;
|
|
||||||
const UserEntityCompanion({
|
const UserEntityCompanion({
|
||||||
this.id = const i0.Value.absent(),
|
this.id = const i0.Value.absent(),
|
||||||
this.name = const i0.Value.absent(),
|
this.name = const i0.Value.absent(),
|
||||||
this.isAdmin = const i0.Value.absent(),
|
|
||||||
this.email = const i0.Value.absent(),
|
this.email = const i0.Value.absent(),
|
||||||
this.profileImagePath = const i0.Value.absent(),
|
this.deletedAt = const i0.Value.absent(),
|
||||||
this.updatedAt = const i0.Value.absent(),
|
this.avatarColor = const i0.Value.absent(),
|
||||||
this.quotaSizeInBytes = const i0.Value.absent(),
|
|
||||||
this.quotaUsageInBytes = const i0.Value.absent(),
|
|
||||||
});
|
});
|
||||||
UserEntityCompanion.insert({
|
UserEntityCompanion.insert({
|
||||||
required String id,
|
required String id,
|
||||||
required String name,
|
required String name,
|
||||||
this.isAdmin = const i0.Value.absent(),
|
|
||||||
required String email,
|
required String email,
|
||||||
this.profileImagePath = const i0.Value.absent(),
|
this.deletedAt = const i0.Value.absent(),
|
||||||
this.updatedAt = const i0.Value.absent(),
|
this.avatarColor = const i0.Value.absent(),
|
||||||
this.quotaSizeInBytes = const i0.Value.absent(),
|
|
||||||
this.quotaUsageInBytes = const i0.Value.absent(),
|
|
||||||
}) : id = i0.Value(id),
|
}) : id = i0.Value(id),
|
||||||
name = i0.Value(name),
|
name = i0.Value(name),
|
||||||
email = i0.Value(email);
|
email = i0.Value(email);
|
||||||
static i0.Insertable<i1.UserEntityData> custom({
|
static i0.Insertable<i1.UserEntityData> custom({
|
||||||
i0.Expression<String>? id,
|
i0.Expression<String>? id,
|
||||||
i0.Expression<String>? name,
|
i0.Expression<String>? name,
|
||||||
i0.Expression<bool>? isAdmin,
|
|
||||||
i0.Expression<String>? email,
|
i0.Expression<String>? email,
|
||||||
i0.Expression<String>? profileImagePath,
|
i0.Expression<DateTime>? deletedAt,
|
||||||
i0.Expression<DateTime>? updatedAt,
|
i0.Expression<int>? avatarColor,
|
||||||
i0.Expression<int>? quotaSizeInBytes,
|
|
||||||
i0.Expression<int>? quotaUsageInBytes,
|
|
||||||
}) {
|
}) {
|
||||||
return i0.RawValuesInsertable({
|
return i0.RawValuesInsertable({
|
||||||
if (id != null) 'id': id,
|
if (id != null) 'id': id,
|
||||||
if (name != null) 'name': name,
|
if (name != null) 'name': name,
|
||||||
if (isAdmin != null) 'is_admin': isAdmin,
|
|
||||||
if (email != null) 'email': email,
|
if (email != null) 'email': email,
|
||||||
if (profileImagePath != null) 'profile_image_path': profileImagePath,
|
if (deletedAt != null) 'deleted_at': deletedAt,
|
||||||
if (updatedAt != null) 'updated_at': updatedAt,
|
if (avatarColor != null) 'avatar_color': avatarColor,
|
||||||
if (quotaSizeInBytes != null) 'quota_size_in_bytes': quotaSizeInBytes,
|
|
||||||
if (quotaUsageInBytes != null) 'quota_usage_in_bytes': quotaUsageInBytes,
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
i1.UserEntityCompanion copyWith(
|
i1.UserEntityCompanion copyWith(
|
||||||
{i0.Value<String>? id,
|
{i0.Value<String>? id,
|
||||||
i0.Value<String>? name,
|
i0.Value<String>? name,
|
||||||
i0.Value<bool>? isAdmin,
|
|
||||||
i0.Value<String>? email,
|
i0.Value<String>? email,
|
||||||
i0.Value<String?>? profileImagePath,
|
i0.Value<DateTime?>? deletedAt,
|
||||||
i0.Value<DateTime>? updatedAt,
|
i0.Value<i2.AvatarColor?>? avatarColor}) {
|
||||||
i0.Value<int?>? quotaSizeInBytes,
|
|
||||||
i0.Value<int>? quotaUsageInBytes}) {
|
|
||||||
return i1.UserEntityCompanion(
|
return i1.UserEntityCompanion(
|
||||||
id: id ?? this.id,
|
id: id ?? this.id,
|
||||||
name: name ?? this.name,
|
name: name ?? this.name,
|
||||||
isAdmin: isAdmin ?? this.isAdmin,
|
|
||||||
email: email ?? this.email,
|
email: email ?? this.email,
|
||||||
profileImagePath: profileImagePath ?? this.profileImagePath,
|
deletedAt: deletedAt ?? this.deletedAt,
|
||||||
updatedAt: updatedAt ?? this.updatedAt,
|
avatarColor: avatarColor ?? this.avatarColor,
|
||||||
quotaSizeInBytes: quotaSizeInBytes ?? this.quotaSizeInBytes,
|
|
||||||
quotaUsageInBytes: quotaUsageInBytes ?? this.quotaUsageInBytes,
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -617,23 +456,15 @@ class UserEntityCompanion extends i0.UpdateCompanion<i1.UserEntityData> {
|
|||||||
if (name.present) {
|
if (name.present) {
|
||||||
map['name'] = i0.Variable<String>(name.value);
|
map['name'] = i0.Variable<String>(name.value);
|
||||||
}
|
}
|
||||||
if (isAdmin.present) {
|
|
||||||
map['is_admin'] = i0.Variable<bool>(isAdmin.value);
|
|
||||||
}
|
|
||||||
if (email.present) {
|
if (email.present) {
|
||||||
map['email'] = i0.Variable<String>(email.value);
|
map['email'] = i0.Variable<String>(email.value);
|
||||||
}
|
}
|
||||||
if (profileImagePath.present) {
|
if (deletedAt.present) {
|
||||||
map['profile_image_path'] = i0.Variable<String>(profileImagePath.value);
|
map['deleted_at'] = i0.Variable<DateTime>(deletedAt.value);
|
||||||
}
|
}
|
||||||
if (updatedAt.present) {
|
if (avatarColor.present) {
|
||||||
map['updated_at'] = i0.Variable<DateTime>(updatedAt.value);
|
map['avatar_color'] = i0.Variable<int>(
|
||||||
}
|
i1.$UserEntityTable.$converteravatarColorn.toSql(avatarColor.value));
|
||||||
if (quotaSizeInBytes.present) {
|
|
||||||
map['quota_size_in_bytes'] = i0.Variable<int>(quotaSizeInBytes.value);
|
|
||||||
}
|
|
||||||
if (quotaUsageInBytes.present) {
|
|
||||||
map['quota_usage_in_bytes'] = i0.Variable<int>(quotaUsageInBytes.value);
|
|
||||||
}
|
}
|
||||||
return map;
|
return map;
|
||||||
}
|
}
|
||||||
@@ -643,12 +474,9 @@ class UserEntityCompanion extends i0.UpdateCompanion<i1.UserEntityData> {
|
|||||||
return (StringBuffer('UserEntityCompanion(')
|
return (StringBuffer('UserEntityCompanion(')
|
||||||
..write('id: $id, ')
|
..write('id: $id, ')
|
||||||
..write('name: $name, ')
|
..write('name: $name, ')
|
||||||
..write('isAdmin: $isAdmin, ')
|
|
||||||
..write('email: $email, ')
|
..write('email: $email, ')
|
||||||
..write('profileImagePath: $profileImagePath, ')
|
..write('deletedAt: $deletedAt, ')
|
||||||
..write('updatedAt: $updatedAt, ')
|
..write('avatarColor: $avatarColor')
|
||||||
..write('quotaSizeInBytes: $quotaSizeInBytes, ')
|
|
||||||
..write('quotaUsageInBytes: $quotaUsageInBytes')
|
|
||||||
..write(')'))
|
..write(')'))
|
||||||
.toString();
|
.toString();
|
||||||
}
|
}
|
||||||
|
|||||||
677
mobile/lib/infrastructure/entities/user.entity.g.dart
generated
677
mobile/lib/infrastructure/entities/user.entity.g.dart
generated
File diff suppressed because it is too large
Load Diff
@@ -4,8 +4,9 @@ import 'package:drift/drift.dart';
|
|||||||
import 'package:drift_flutter/drift_flutter.dart';
|
import 'package:drift_flutter/drift_flutter.dart';
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:immich_mobile/domain/interfaces/db.interface.dart';
|
import 'package:immich_mobile/domain/interfaces/db.interface.dart';
|
||||||
import 'package:immich_mobile/infrastructure/entities/asset_face.entity.dart';
|
import 'package:immich_mobile/infrastructure/entities/auth_user.entity.dart';
|
||||||
import 'package:immich_mobile/infrastructure/entities/exif.entity.dart';
|
import 'package:immich_mobile/infrastructure/entities/exif.entity.dart';
|
||||||
|
import 'package:immich_mobile/infrastructure/entities/asset_face.entity.dart';
|
||||||
import 'package:immich_mobile/infrastructure/entities/local_album.entity.dart';
|
import 'package:immich_mobile/infrastructure/entities/local_album.entity.dart';
|
||||||
import 'package:immich_mobile/infrastructure/entities/local_album_asset.entity.dart';
|
import 'package:immich_mobile/infrastructure/entities/local_album_asset.entity.dart';
|
||||||
import 'package:immich_mobile/infrastructure/entities/local_asset.entity.dart';
|
import 'package:immich_mobile/infrastructure/entities/local_asset.entity.dart';
|
||||||
@@ -43,6 +44,7 @@ class IsarDatabaseRepository implements IDatabaseRepository {
|
|||||||
@DriftDatabase(
|
@DriftDatabase(
|
||||||
tables: [
|
tables: [
|
||||||
UserEntity,
|
UserEntity,
|
||||||
|
AuthUserEntity,
|
||||||
UserMetadataEntity,
|
UserMetadataEntity,
|
||||||
PartnerEntity,
|
PartnerEntity,
|
||||||
LocalAlbumEntity,
|
LocalAlbumEntity,
|
||||||
@@ -74,7 +76,7 @@ class Drift extends $Drift implements IDatabaseRepository {
|
|||||||
);
|
);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
int get schemaVersion => 4;
|
int get schemaVersion => 5;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
MigrationStrategy get migration => MigrationStrategy(
|
MigrationStrategy get migration => MigrationStrategy(
|
||||||
@@ -102,6 +104,12 @@ class Drift extends $Drift implements IDatabaseRepository {
|
|||||||
// asset_face_entity is added
|
// asset_face_entity is added
|
||||||
await m.create(v4.assetFaceEntity);
|
await m.create(v4.assetFaceEntity);
|
||||||
},
|
},
|
||||||
|
from4To5: (m, v5) async {
|
||||||
|
// Some column got moved from user_entity to auth_user_entity
|
||||||
|
await m.alterTable(TableMigration(v5.userEntity));
|
||||||
|
// auth_user_entity is added
|
||||||
|
await m.create(v5.authUserEntity);
|
||||||
|
},
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -13,29 +13,31 @@ import 'package:immich_mobile/infrastructure/entities/local_album.entity.drift.d
|
|||||||
as i5;
|
as i5;
|
||||||
import 'package:immich_mobile/infrastructure/entities/local_album_asset.entity.drift.dart'
|
import 'package:immich_mobile/infrastructure/entities/local_album_asset.entity.drift.dart'
|
||||||
as i6;
|
as i6;
|
||||||
import 'package:immich_mobile/infrastructure/entities/user_metadata.entity.drift.dart'
|
import 'package:immich_mobile/infrastructure/entities/auth_user.entity.drift.dart'
|
||||||
as i7;
|
as i7;
|
||||||
import 'package:immich_mobile/infrastructure/entities/partner.entity.drift.dart'
|
import 'package:immich_mobile/infrastructure/entities/user_metadata.entity.drift.dart'
|
||||||
as i8;
|
as i8;
|
||||||
import 'package:immich_mobile/infrastructure/entities/exif.entity.drift.dart'
|
import 'package:immich_mobile/infrastructure/entities/partner.entity.drift.dart'
|
||||||
as i9;
|
as i9;
|
||||||
import 'package:immich_mobile/infrastructure/entities/remote_album.entity.drift.dart'
|
import 'package:immich_mobile/infrastructure/entities/exif.entity.drift.dart'
|
||||||
as i10;
|
as i10;
|
||||||
import 'package:immich_mobile/infrastructure/entities/remote_album_asset.entity.drift.dart'
|
import 'package:immich_mobile/infrastructure/entities/remote_album.entity.drift.dart'
|
||||||
as i11;
|
as i11;
|
||||||
import 'package:immich_mobile/infrastructure/entities/remote_album_user.entity.drift.dart'
|
import 'package:immich_mobile/infrastructure/entities/remote_album_asset.entity.drift.dart'
|
||||||
as i12;
|
as i12;
|
||||||
import 'package:immich_mobile/infrastructure/entities/memory.entity.drift.dart'
|
import 'package:immich_mobile/infrastructure/entities/remote_album_user.entity.drift.dart'
|
||||||
as i13;
|
as i13;
|
||||||
import 'package:immich_mobile/infrastructure/entities/memory_asset.entity.drift.dart'
|
import 'package:immich_mobile/infrastructure/entities/memory.entity.drift.dart'
|
||||||
as i14;
|
as i14;
|
||||||
import 'package:immich_mobile/infrastructure/entities/person.entity.drift.dart'
|
import 'package:immich_mobile/infrastructure/entities/memory_asset.entity.drift.dart'
|
||||||
as i15;
|
as i15;
|
||||||
import 'package:immich_mobile/infrastructure/entities/asset_face.entity.drift.dart'
|
import 'package:immich_mobile/infrastructure/entities/person.entity.drift.dart'
|
||||||
as i16;
|
as i16;
|
||||||
import 'package:immich_mobile/infrastructure/entities/merged_asset.drift.dart'
|
import 'package:immich_mobile/infrastructure/entities/asset_face.entity.drift.dart'
|
||||||
as i17;
|
as i17;
|
||||||
import 'package:drift/internal/modular.dart' as i18;
|
import 'package:immich_mobile/infrastructure/entities/merged_asset.drift.dart'
|
||||||
|
as i18;
|
||||||
|
import 'package:drift/internal/modular.dart' as i19;
|
||||||
|
|
||||||
abstract class $Drift extends i0.GeneratedDatabase {
|
abstract class $Drift extends i0.GeneratedDatabase {
|
||||||
$Drift(i0.QueryExecutor e) : super(e);
|
$Drift(i0.QueryExecutor e) : super(e);
|
||||||
@@ -50,26 +52,28 @@ abstract class $Drift extends i0.GeneratedDatabase {
|
|||||||
i5.$LocalAlbumEntityTable(this);
|
i5.$LocalAlbumEntityTable(this);
|
||||||
late final i6.$LocalAlbumAssetEntityTable localAlbumAssetEntity =
|
late final i6.$LocalAlbumAssetEntityTable localAlbumAssetEntity =
|
||||||
i6.$LocalAlbumAssetEntityTable(this);
|
i6.$LocalAlbumAssetEntityTable(this);
|
||||||
late final i7.$UserMetadataEntityTable userMetadataEntity =
|
late final i7.$AuthUserEntityTable authUserEntity =
|
||||||
i7.$UserMetadataEntityTable(this);
|
i7.$AuthUserEntityTable(this);
|
||||||
late final i8.$PartnerEntityTable partnerEntity =
|
late final i8.$UserMetadataEntityTable userMetadataEntity =
|
||||||
i8.$PartnerEntityTable(this);
|
i8.$UserMetadataEntityTable(this);
|
||||||
late final i9.$RemoteExifEntityTable remoteExifEntity =
|
late final i9.$PartnerEntityTable partnerEntity =
|
||||||
i9.$RemoteExifEntityTable(this);
|
i9.$PartnerEntityTable(this);
|
||||||
late final i10.$RemoteAlbumEntityTable remoteAlbumEntity =
|
late final i10.$RemoteExifEntityTable remoteExifEntity =
|
||||||
i10.$RemoteAlbumEntityTable(this);
|
i10.$RemoteExifEntityTable(this);
|
||||||
late final i11.$RemoteAlbumAssetEntityTable remoteAlbumAssetEntity =
|
late final i11.$RemoteAlbumEntityTable remoteAlbumEntity =
|
||||||
i11.$RemoteAlbumAssetEntityTable(this);
|
i11.$RemoteAlbumEntityTable(this);
|
||||||
late final i12.$RemoteAlbumUserEntityTable remoteAlbumUserEntity =
|
late final i12.$RemoteAlbumAssetEntityTable remoteAlbumAssetEntity =
|
||||||
i12.$RemoteAlbumUserEntityTable(this);
|
i12.$RemoteAlbumAssetEntityTable(this);
|
||||||
late final i13.$MemoryEntityTable memoryEntity = i13.$MemoryEntityTable(this);
|
late final i13.$RemoteAlbumUserEntityTable remoteAlbumUserEntity =
|
||||||
late final i14.$MemoryAssetEntityTable memoryAssetEntity =
|
i13.$RemoteAlbumUserEntityTable(this);
|
||||||
i14.$MemoryAssetEntityTable(this);
|
late final i14.$MemoryEntityTable memoryEntity = i14.$MemoryEntityTable(this);
|
||||||
late final i15.$PersonEntityTable personEntity = i15.$PersonEntityTable(this);
|
late final i15.$MemoryAssetEntityTable memoryAssetEntity =
|
||||||
late final i16.$AssetFaceEntityTable assetFaceEntity =
|
i15.$MemoryAssetEntityTable(this);
|
||||||
i16.$AssetFaceEntityTable(this);
|
late final i16.$PersonEntityTable personEntity = i16.$PersonEntityTable(this);
|
||||||
i17.MergedAssetDrift get mergedAssetDrift => i18.ReadDatabaseContainer(this)
|
late final i17.$AssetFaceEntityTable assetFaceEntity =
|
||||||
.accessor<i17.MergedAssetDrift>(i17.MergedAssetDrift.new);
|
i17.$AssetFaceEntityTable(this);
|
||||||
|
i18.MergedAssetDrift get mergedAssetDrift => i19.ReadDatabaseContainer(this)
|
||||||
|
.accessor<i18.MergedAssetDrift>(i18.MergedAssetDrift.new);
|
||||||
@override
|
@override
|
||||||
Iterable<i0.TableInfo<i0.Table, Object?>> get allTables =>
|
Iterable<i0.TableInfo<i0.Table, Object?>> get allTables =>
|
||||||
allSchemaEntities.whereType<i0.TableInfo<i0.Table, Object?>>();
|
allSchemaEntities.whereType<i0.TableInfo<i0.Table, Object?>>();
|
||||||
@@ -84,6 +88,7 @@ abstract class $Drift extends i0.GeneratedDatabase {
|
|||||||
i4.idxLocalAssetChecksum,
|
i4.idxLocalAssetChecksum,
|
||||||
i2.uQRemoteAssetOwnerChecksum,
|
i2.uQRemoteAssetOwnerChecksum,
|
||||||
i2.idxRemoteAssetChecksum,
|
i2.idxRemoteAssetChecksum,
|
||||||
|
authUserEntity,
|
||||||
userMetadataEntity,
|
userMetadataEntity,
|
||||||
partnerEntity,
|
partnerEntity,
|
||||||
remoteExifEntity,
|
remoteExifEntity,
|
||||||
@@ -268,25 +273,27 @@ class $DriftManager {
|
|||||||
i5.$$LocalAlbumEntityTableTableManager(_db, _db.localAlbumEntity);
|
i5.$$LocalAlbumEntityTableTableManager(_db, _db.localAlbumEntity);
|
||||||
i6.$$LocalAlbumAssetEntityTableTableManager get localAlbumAssetEntity => i6
|
i6.$$LocalAlbumAssetEntityTableTableManager get localAlbumAssetEntity => i6
|
||||||
.$$LocalAlbumAssetEntityTableTableManager(_db, _db.localAlbumAssetEntity);
|
.$$LocalAlbumAssetEntityTableTableManager(_db, _db.localAlbumAssetEntity);
|
||||||
i7.$$UserMetadataEntityTableTableManager get userMetadataEntity =>
|
i7.$$AuthUserEntityTableTableManager get authUserEntity =>
|
||||||
i7.$$UserMetadataEntityTableTableManager(_db, _db.userMetadataEntity);
|
i7.$$AuthUserEntityTableTableManager(_db, _db.authUserEntity);
|
||||||
i8.$$PartnerEntityTableTableManager get partnerEntity =>
|
i8.$$UserMetadataEntityTableTableManager get userMetadataEntity =>
|
||||||
i8.$$PartnerEntityTableTableManager(_db, _db.partnerEntity);
|
i8.$$UserMetadataEntityTableTableManager(_db, _db.userMetadataEntity);
|
||||||
i9.$$RemoteExifEntityTableTableManager get remoteExifEntity =>
|
i9.$$PartnerEntityTableTableManager get partnerEntity =>
|
||||||
i9.$$RemoteExifEntityTableTableManager(_db, _db.remoteExifEntity);
|
i9.$$PartnerEntityTableTableManager(_db, _db.partnerEntity);
|
||||||
i10.$$RemoteAlbumEntityTableTableManager get remoteAlbumEntity =>
|
i10.$$RemoteExifEntityTableTableManager get remoteExifEntity =>
|
||||||
i10.$$RemoteAlbumEntityTableTableManager(_db, _db.remoteAlbumEntity);
|
i10.$$RemoteExifEntityTableTableManager(_db, _db.remoteExifEntity);
|
||||||
i11.$$RemoteAlbumAssetEntityTableTableManager get remoteAlbumAssetEntity =>
|
i11.$$RemoteAlbumEntityTableTableManager get remoteAlbumEntity =>
|
||||||
i11.$$RemoteAlbumAssetEntityTableTableManager(
|
i11.$$RemoteAlbumEntityTableTableManager(_db, _db.remoteAlbumEntity);
|
||||||
|
i12.$$RemoteAlbumAssetEntityTableTableManager get remoteAlbumAssetEntity =>
|
||||||
|
i12.$$RemoteAlbumAssetEntityTableTableManager(
|
||||||
_db, _db.remoteAlbumAssetEntity);
|
_db, _db.remoteAlbumAssetEntity);
|
||||||
i12.$$RemoteAlbumUserEntityTableTableManager get remoteAlbumUserEntity => i12
|
i13.$$RemoteAlbumUserEntityTableTableManager get remoteAlbumUserEntity => i13
|
||||||
.$$RemoteAlbumUserEntityTableTableManager(_db, _db.remoteAlbumUserEntity);
|
.$$RemoteAlbumUserEntityTableTableManager(_db, _db.remoteAlbumUserEntity);
|
||||||
i13.$$MemoryEntityTableTableManager get memoryEntity =>
|
i14.$$MemoryEntityTableTableManager get memoryEntity =>
|
||||||
i13.$$MemoryEntityTableTableManager(_db, _db.memoryEntity);
|
i14.$$MemoryEntityTableTableManager(_db, _db.memoryEntity);
|
||||||
i14.$$MemoryAssetEntityTableTableManager get memoryAssetEntity =>
|
i15.$$MemoryAssetEntityTableTableManager get memoryAssetEntity =>
|
||||||
i14.$$MemoryAssetEntityTableTableManager(_db, _db.memoryAssetEntity);
|
i15.$$MemoryAssetEntityTableTableManager(_db, _db.memoryAssetEntity);
|
||||||
i15.$$PersonEntityTableTableManager get personEntity =>
|
i16.$$PersonEntityTableTableManager get personEntity =>
|
||||||
i15.$$PersonEntityTableTableManager(_db, _db.personEntity);
|
i16.$$PersonEntityTableTableManager(_db, _db.personEntity);
|
||||||
i16.$$AssetFaceEntityTableTableManager get assetFaceEntity =>
|
i17.$$AssetFaceEntityTableTableManager get assetFaceEntity =>
|
||||||
i16.$$AssetFaceEntityTableTableManager(_db, _db.assetFaceEntity);
|
i17.$$AssetFaceEntityTableTableManager(_db, _db.assetFaceEntity);
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -7,7 +7,7 @@ class DriftPartnerRepository extends DriftDatabaseRepository {
|
|||||||
final Drift _db;
|
final Drift _db;
|
||||||
const DriftPartnerRepository(this._db) : super(_db);
|
const DriftPartnerRepository(this._db) : super(_db);
|
||||||
|
|
||||||
Future<List<PartnerUserDto>> getPartners(String userId) {
|
Future<List<PartnerUser>> getPartners(String userId) {
|
||||||
final query = _db.select(_db.partnerEntity).join([
|
final query = _db.select(_db.partnerEntity).join([
|
||||||
innerJoin(
|
innerJoin(
|
||||||
_db.userEntity,
|
_db.userEntity,
|
||||||
@@ -21,7 +21,7 @@ class DriftPartnerRepository extends DriftDatabaseRepository {
|
|||||||
return query.map((row) {
|
return query.map((row) {
|
||||||
final user = row.readTable(_db.userEntity);
|
final user = row.readTable(_db.userEntity);
|
||||||
final partner = row.readTable(_db.partnerEntity);
|
final partner = row.readTable(_db.partnerEntity);
|
||||||
return PartnerUserDto(
|
return PartnerUser(
|
||||||
id: user.id,
|
id: user.id,
|
||||||
email: user.email,
|
email: user.email,
|
||||||
name: user.name,
|
name: user.name,
|
||||||
@@ -31,11 +31,11 @@ class DriftPartnerRepository extends DriftDatabaseRepository {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Get users who we can share our library with
|
// Get users who we can share our library with
|
||||||
Future<List<PartnerUserDto>> getAvailablePartners(String currentUserId) {
|
Future<List<PartnerUser>> getAvailablePartners(String currentUserId) {
|
||||||
final query = _db.select(_db.userEntity)..where((row) => row.id.equals(currentUserId).not());
|
final query = _db.select(_db.userEntity)..where((row) => row.id.equals(currentUserId).not());
|
||||||
|
|
||||||
return query.map((user) {
|
return query.map((user) {
|
||||||
return PartnerUserDto(
|
return PartnerUser(
|
||||||
id: user.id,
|
id: user.id,
|
||||||
email: user.email,
|
email: user.email,
|
||||||
name: user.name,
|
name: user.name,
|
||||||
@@ -45,7 +45,7 @@ class DriftPartnerRepository extends DriftDatabaseRepository {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Get users who are sharing their photos WITH the current user
|
// Get users who are sharing their photos WITH the current user
|
||||||
Future<List<PartnerUserDto>> getSharedWith(String partnerId) {
|
Future<List<PartnerUser>> getSharedWith(String partnerId) {
|
||||||
final query = _db.select(_db.partnerEntity).join([
|
final query = _db.select(_db.partnerEntity).join([
|
||||||
innerJoin(
|
innerJoin(
|
||||||
_db.userEntity,
|
_db.userEntity,
|
||||||
@@ -59,7 +59,7 @@ class DriftPartnerRepository extends DriftDatabaseRepository {
|
|||||||
return query.map((row) {
|
return query.map((row) {
|
||||||
final user = row.readTable(_db.userEntity);
|
final user = row.readTable(_db.userEntity);
|
||||||
final partner = row.readTable(_db.partnerEntity);
|
final partner = row.readTable(_db.partnerEntity);
|
||||||
return PartnerUserDto(
|
return PartnerUser(
|
||||||
id: user.id,
|
id: user.id,
|
||||||
email: user.email,
|
email: user.email,
|
||||||
name: user.name,
|
name: user.name,
|
||||||
@@ -69,7 +69,7 @@ class DriftPartnerRepository extends DriftDatabaseRepository {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Get users who the current user is sharing their photos TO
|
// Get users who the current user is sharing their photos TO
|
||||||
Future<List<PartnerUserDto>> getSharedBy(String userId) {
|
Future<List<PartnerUser>> getSharedBy(String userId) {
|
||||||
final query = _db.select(_db.partnerEntity).join([
|
final query = _db.select(_db.partnerEntity).join([
|
||||||
innerJoin(
|
innerJoin(
|
||||||
_db.userEntity,
|
_db.userEntity,
|
||||||
@@ -83,7 +83,7 @@ class DriftPartnerRepository extends DriftDatabaseRepository {
|
|||||||
return query.map((row) {
|
return query.map((row) {
|
||||||
final user = row.readTable(_db.userEntity);
|
final user = row.readTable(_db.userEntity);
|
||||||
final partner = row.readTable(_db.partnerEntity);
|
final partner = row.readTable(_db.partnerEntity);
|
||||||
return PartnerUserDto(
|
return PartnerUser(
|
||||||
id: user.id,
|
id: user.id,
|
||||||
email: user.email,
|
email: user.email,
|
||||||
name: user.name,
|
name: user.name,
|
||||||
@@ -106,7 +106,7 @@ class DriftPartnerRepository extends DriftDatabaseRepository {
|
|||||||
return allPartnerIds;
|
return allPartnerIds;
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<PartnerUserDto?> getPartner(String partnerId, String userId) {
|
Future<PartnerUser?> getPartner(String partnerId, String userId) {
|
||||||
final query = _db.select(_db.partnerEntity).join([
|
final query = _db.select(_db.partnerEntity).join([
|
||||||
innerJoin(
|
innerJoin(
|
||||||
_db.userEntity,
|
_db.userEntity,
|
||||||
@@ -120,7 +120,7 @@ class DriftPartnerRepository extends DriftDatabaseRepository {
|
|||||||
return query.map((row) {
|
return query.map((row) {
|
||||||
final user = row.readTable(_db.userEntity);
|
final user = row.readTable(_db.userEntity);
|
||||||
final partner = row.readTable(_db.partnerEntity);
|
final partner = row.readTable(_db.partnerEntity);
|
||||||
return PartnerUserDto(
|
return PartnerUser(
|
||||||
id: user.id,
|
id: user.id,
|
||||||
email: user.email,
|
email: user.email,
|
||||||
name: user.name,
|
name: user.name,
|
||||||
@@ -129,7 +129,7 @@ class DriftPartnerRepository extends DriftDatabaseRepository {
|
|||||||
}).getSingleOrNull();
|
}).getSingleOrNull();
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<bool> toggleShowInTimeline(PartnerUserDto partner, String userId) {
|
Future<bool> toggleShowInTimeline(PartnerUser partner, String userId) {
|
||||||
return _db.partnerEntity.update().replace(
|
return _db.partnerEntity.update().replace(
|
||||||
PartnerEntityCompanion(
|
PartnerEntityCompanion(
|
||||||
sharedById: Value(partner.id),
|
sharedById: Value(partner.id),
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import 'package:immich_mobile/infrastructure/entities/remote_album.entity.drift.
|
|||||||
import 'package:immich_mobile/infrastructure/entities/remote_album_asset.entity.drift.dart';
|
import 'package:immich_mobile/infrastructure/entities/remote_album_asset.entity.drift.dart';
|
||||||
import 'package:immich_mobile/infrastructure/entities/remote_album_user.entity.drift.dart';
|
import 'package:immich_mobile/infrastructure/entities/remote_album_user.entity.drift.dart';
|
||||||
import 'package:immich_mobile/infrastructure/entities/remote_asset.entity.dart';
|
import 'package:immich_mobile/infrastructure/entities/remote_asset.entity.dart';
|
||||||
|
import 'package:immich_mobile/infrastructure/entities/user.entity.dart';
|
||||||
import 'package:immich_mobile/infrastructure/repositories/db.repository.dart';
|
import 'package:immich_mobile/infrastructure/repositories/db.repository.dart';
|
||||||
|
|
||||||
enum SortRemoteAlbumsBy { id, updatedAt }
|
enum SortRemoteAlbumsBy { id, updatedAt }
|
||||||
@@ -40,8 +41,7 @@ class DriftRemoteAlbumRepository extends DriftDatabaseRepository {
|
|||||||
]);
|
]);
|
||||||
query
|
query
|
||||||
..where(_db.remoteAssetEntity.deletedAt.isNull())
|
..where(_db.remoteAssetEntity.deletedAt.isNull())
|
||||||
..addColumns([assetCount])
|
..addColumns([assetCount, _db.userEntity.name])
|
||||||
..addColumns([_db.userEntity.name])
|
|
||||||
..groupBy([_db.remoteAlbumEntity.id]);
|
..groupBy([_db.remoteAlbumEntity.id]);
|
||||||
|
|
||||||
if (sortBy.isNotEmpty) {
|
if (sortBy.isNotEmpty) {
|
||||||
@@ -147,34 +147,18 @@ class DriftRemoteAlbumRepository extends DriftDatabaseRepository {
|
|||||||
}).getSingle();
|
}).getSingle();
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<List<UserDto>> getSharedUsers(String albumId) async {
|
Future<List<User>> getSharedUsers(String albumId) async {
|
||||||
final albumUserRows =
|
final query = _db.remoteAlbumUserEntity.selectOnly()
|
||||||
await (_db.select(_db.remoteAlbumUserEntity)..where((row) => row.albumId.equals(albumId))).get();
|
..join([
|
||||||
|
innerJoin(
|
||||||
|
_db.userEntity,
|
||||||
|
_db.userEntity.id.equalsExp(_db.remoteAlbumUserEntity.userId),
|
||||||
|
useColumns: true,
|
||||||
|
),
|
||||||
|
])
|
||||||
|
..where(_db.remoteAlbumUserEntity.albumId.equals(albumId));
|
||||||
|
|
||||||
if (albumUserRows.isEmpty) {
|
return query.map((row) => row.readTable(_db.userEntity).toDto()).get();
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
final userIds = albumUserRows.map((row) => row.userId);
|
|
||||||
|
|
||||||
return (_db.select(_db.userEntity)..where((row) => row.id.isIn(userIds)))
|
|
||||||
.map(
|
|
||||||
(user) => UserDto(
|
|
||||||
id: user.id,
|
|
||||||
email: user.email,
|
|
||||||
name: user.name,
|
|
||||||
profileImagePath: user.profileImagePath?.isEmpty == true ? null : user.profileImagePath,
|
|
||||||
isAdmin: user.isAdmin,
|
|
||||||
updatedAt: user.updatedAt,
|
|
||||||
quotaSizeInBytes: user.quotaSizeInBytes ?? 0,
|
|
||||||
quotaUsageInBytes: user.quotaUsageInBytes,
|
|
||||||
memoryEnabled: true,
|
|
||||||
inTimeline: false,
|
|
||||||
isPartnerSharedBy: false,
|
|
||||||
isPartnerSharedWith: false,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
.get();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<List<RemoteAsset>> getAssets(String albumId) {
|
Future<List<RemoteAsset>> getAssets(String albumId) {
|
||||||
|
|||||||
@@ -41,6 +41,7 @@ class SyncApiRepository {
|
|||||||
request.body = jsonEncode(
|
request.body = jsonEncode(
|
||||||
SyncStreamDto(
|
SyncStreamDto(
|
||||||
types: [
|
types: [
|
||||||
|
SyncRequestType.authUsersV1,
|
||||||
SyncRequestType.usersV1,
|
SyncRequestType.usersV1,
|
||||||
SyncRequestType.assetsV1,
|
SyncRequestType.assetsV1,
|
||||||
SyncRequestType.assetExifsV1,
|
SyncRequestType.assetExifsV1,
|
||||||
@@ -138,6 +139,7 @@ class SyncApiRepository {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const _kResponseMap = <SyncEntityType, Function(Object)>{
|
const _kResponseMap = <SyncEntityType, Function(Object)>{
|
||||||
|
SyncEntityType.authUserV1: SyncAuthUserV1.fromJson,
|
||||||
SyncEntityType.userV1: SyncUserV1.fromJson,
|
SyncEntityType.userV1: SyncUserV1.fromJson,
|
||||||
SyncEntityType.userDeleteV1: SyncUserDeleteV1.fromJson,
|
SyncEntityType.userDeleteV1: SyncUserDeleteV1.fromJson,
|
||||||
SyncEntityType.partnerV1: SyncPartnerV1.fromJson,
|
SyncEntityType.partnerV1: SyncPartnerV1.fromJson,
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import 'package:immich_mobile/domain/models/asset/base_asset.model.dart';
|
|||||||
import 'package:immich_mobile/domain/models/memory.model.dart';
|
import 'package:immich_mobile/domain/models/memory.model.dart';
|
||||||
import 'package:immich_mobile/domain/models/user_metadata.model.dart';
|
import 'package:immich_mobile/domain/models/user_metadata.model.dart';
|
||||||
import 'package:immich_mobile/infrastructure/entities/asset_face.entity.drift.dart';
|
import 'package:immich_mobile/infrastructure/entities/asset_face.entity.drift.dart';
|
||||||
|
import 'package:immich_mobile/infrastructure/entities/auth_user.entity.drift.dart';
|
||||||
import 'package:immich_mobile/infrastructure/entities/exif.entity.drift.dart';
|
import 'package:immich_mobile/infrastructure/entities/exif.entity.drift.dart';
|
||||||
import 'package:immich_mobile/infrastructure/entities/memory.entity.drift.dart';
|
import 'package:immich_mobile/infrastructure/entities/memory.entity.drift.dart';
|
||||||
import 'package:immich_mobile/infrastructure/entities/memory_asset.entity.drift.dart';
|
import 'package:immich_mobile/infrastructure/entities/memory_asset.entity.drift.dart';
|
||||||
@@ -29,6 +30,38 @@ class SyncStreamRepository extends DriftDatabaseRepository {
|
|||||||
|
|
||||||
SyncStreamRepository(super.db) : _db = db;
|
SyncStreamRepository(super.db) : _db = db;
|
||||||
|
|
||||||
|
Future<void> updateAuthUsersV1(Iterable<SyncAuthUserV1> data) async {
|
||||||
|
try {
|
||||||
|
await _db.batch((batch) {
|
||||||
|
for (final authUser in data) {
|
||||||
|
final companion = AuthUserEntityCompanion(
|
||||||
|
name: Value(authUser.name),
|
||||||
|
email: Value(authUser.email),
|
||||||
|
deletedAt: Value(authUser.deletedAt),
|
||||||
|
avatarColor: Value(authUser.avatarColor?.toAvatarColor()),
|
||||||
|
isAdmin: Value(authUser.isAdmin),
|
||||||
|
oauthId: Value(authUser.oauthId),
|
||||||
|
pinCode: Value(authUser.pinCode),
|
||||||
|
hasProfileImage: Value(authUser.hasProfileImage),
|
||||||
|
profileChangedAt: Value(authUser.profileChangedAt),
|
||||||
|
quotaSizeInBytes: Value(authUser.quotaSizeInBytes),
|
||||||
|
quotaUsageInBytes: Value(authUser.quotaUsageInBytes),
|
||||||
|
storageLabel: Value(authUser.storageLabel),
|
||||||
|
);
|
||||||
|
|
||||||
|
batch.insert(
|
||||||
|
_db.authUserEntity,
|
||||||
|
companion.copyWith(id: Value(authUser.id)),
|
||||||
|
onConflict: DoUpdate((_) => companion),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} catch (error, stack) {
|
||||||
|
_logger.severe('Error: SyncAuthUserV1', error, stack);
|
||||||
|
rethrow;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Future<void> deleteUsersV1(Iterable<SyncUserDeleteV1> data) async {
|
Future<void> deleteUsersV1(Iterable<SyncUserDeleteV1> data) async {
|
||||||
try {
|
try {
|
||||||
await _db.userEntity.deleteWhere((row) => row.id.isIn(data.map((e) => e.userId)));
|
await _db.userEntity.deleteWhere((row) => row.id.isIn(data.map((e) => e.userId)));
|
||||||
@@ -45,6 +78,8 @@ class SyncStreamRepository extends DriftDatabaseRepository {
|
|||||||
final companion = UserEntityCompanion(
|
final companion = UserEntityCompanion(
|
||||||
name: Value(user.name),
|
name: Value(user.name),
|
||||||
email: Value(user.email),
|
email: Value(user.email),
|
||||||
|
deletedAt: Value(user.deletedAt),
|
||||||
|
avatarColor: Value(user.avatarColor?.toAvatarColor()),
|
||||||
);
|
);
|
||||||
|
|
||||||
batch.insert(
|
batch.insert(
|
||||||
@@ -604,6 +639,22 @@ class SyncStreamRepository extends DriftDatabaseRepository {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extension on UserAvatarColor {
|
||||||
|
AvatarColor toAvatarColor() => switch (this) {
|
||||||
|
UserAvatarColor.amber => AvatarColor.amber,
|
||||||
|
UserAvatarColor.blue => AvatarColor.blue,
|
||||||
|
UserAvatarColor.gray => AvatarColor.gray,
|
||||||
|
UserAvatarColor.green => AvatarColor.green,
|
||||||
|
UserAvatarColor.orange => AvatarColor.orange,
|
||||||
|
UserAvatarColor.pink => AvatarColor.pink,
|
||||||
|
UserAvatarColor.primary => AvatarColor.primary,
|
||||||
|
UserAvatarColor.purple => AvatarColor.purple,
|
||||||
|
UserAvatarColor.red => AvatarColor.red,
|
||||||
|
UserAvatarColor.yellow => AvatarColor.yellow,
|
||||||
|
_ => throw Exception('Unknown AvatarColor value: $this'),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
extension on AssetTypeEnum {
|
extension on AssetTypeEnum {
|
||||||
AssetType toAssetType() => switch (this) {
|
AssetType toAssetType() => switch (this) {
|
||||||
AssetTypeEnum.IMAGE => AssetType.image,
|
AssetTypeEnum.IMAGE => AssetType.image,
|
||||||
|
|||||||
@@ -263,7 +263,7 @@ class DriftTimelineRepository extends DriftDatabaseRepository {
|
|||||||
required int offset,
|
required int offset,
|
||||||
required int count,
|
required int count,
|
||||||
}) async {
|
}) async {
|
||||||
final albumData = await (_db.remoteAlbumEntity.select()..where((row) => row.id.equals(albumId))).getSingleOrNull();
|
final albumData = await _db.managers.remoteAlbumEntity.filter((row) => row.id.equals(albumId)).getSingleOrNull();
|
||||||
|
|
||||||
// If album doesn't exist (was deleted), return empty list
|
// If album doesn't exist (was deleted), return empty list
|
||||||
if (albumData == null) {
|
if (albumData == null) {
|
||||||
|
|||||||
@@ -10,18 +10,18 @@ class IsarUserRepository extends IsarDatabaseRepository {
|
|||||||
|
|
||||||
Future<void> delete(List<String> ids) async {
|
Future<void> delete(List<String> ids) async {
|
||||||
await transaction(() async {
|
await transaction(() async {
|
||||||
await _db.users.deleteAllById(ids);
|
await _db.isarUsers.deleteAllById(ids);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> deleteAll() async {
|
Future<void> deleteAll() async {
|
||||||
await transaction(() async {
|
await transaction(() async {
|
||||||
await _db.users.clear();
|
await _db.isarUsers.clear();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<List<UserDto>> getAll({SortUserBy? sortBy}) async {
|
Future<List<UserDto>> getAll({SortUserBy? sortBy}) async {
|
||||||
return (await _db.users
|
return (await _db.isarUsers
|
||||||
.where()
|
.where()
|
||||||
.optional(
|
.optional(
|
||||||
sortBy != null,
|
sortBy != null,
|
||||||
@@ -35,31 +35,44 @@ class IsarUserRepository extends IsarDatabaseRepository {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Future<UserDto?> getByUserId(String id) async {
|
Future<UserDto?> getByUserId(String id) async {
|
||||||
return (await _db.users.getById(id))?.toDto();
|
return (await _db.isarUsers.getById(id))?.toDto();
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<List<UserDto?>> getByUserIds(List<String> ids) async {
|
Future<List<UserDto?>> getByUserIds(List<String> ids) async {
|
||||||
return (await _db.users.getAllById(ids)).map((u) => u?.toDto()).toList();
|
return (await _db.isarUsers.getAllById(ids)).map((u) => u?.toDto()).toList();
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<bool> insert(UserDto user) async {
|
Future<bool> insert(UserDto user) async {
|
||||||
await transaction(() async {
|
await transaction(() async {
|
||||||
await _db.users.put(entity.User.fromDto(user));
|
await _db.isarUsers.put(entity.IsarUser.fromDto(user));
|
||||||
});
|
});
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<UserDto> update(UserDto user) async {
|
Future<UserDto> update(UserDto user) async {
|
||||||
await transaction(() async {
|
await transaction(() async {
|
||||||
await _db.users.put(entity.User.fromDto(user));
|
await _db.isarUsers.put(entity.IsarUser.fromDto(user));
|
||||||
});
|
});
|
||||||
return user;
|
return user;
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<bool> updateAll(List<UserDto> users) async {
|
Future<bool> updateAll(List<UserDto> users) async {
|
||||||
await transaction(() async {
|
await transaction(() async {
|
||||||
await _db.users.putAll(users.map(entity.User.fromDto).toList());
|
await _db.isarUsers.putAll(users.map(entity.IsarUser.fromDto).toList());
|
||||||
});
|
});
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class DriftUserRepository extends DriftDatabaseRepository {
|
||||||
|
final Drift _db;
|
||||||
|
const DriftUserRepository(this._db) : super(_db);
|
||||||
|
|
||||||
|
Future<List<User>> getAll() {
|
||||||
|
return _db.managers.userEntity.orderBy((row) => row.id.asc()).map((row) => row.toDto()).get();
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<User?> getById(String id) {
|
||||||
|
return _db.managers.userEntity.filter((row) => row.id.equals(id)).map((row) => row.toDto()).getSingleOrNull();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ class AlbumOptionsPage extends HookConsumerWidget {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
await ref.read(albumProvider.notifier).removeUser(album, user);
|
await ref.read(albumProvider.notifier).removeUser(album, user);
|
||||||
album.sharedUsers.remove(entity.User.fromDto(user));
|
album.sharedUsers.remove(entity.IsarUser.fromDto(user));
|
||||||
sharedUsers.value = album.sharedUsers.map((u) => u.toDto()).toList();
|
sharedUsers.value = album.sharedUsers.map((u) => u.toDto()).toList();
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
showErrorMessage();
|
showErrorMessage();
|
||||||
|
|||||||
@@ -29,13 +29,13 @@ class DriftPartnerPage extends HookConsumerWidget {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
final selectedUser = await showDialog<PartnerUserDto>(
|
final selectedUser = await showDialog<PartnerUser>(
|
||||||
context: context,
|
context: context,
|
||||||
builder: (context) {
|
builder: (context) {
|
||||||
return SimpleDialog(
|
return SimpleDialog(
|
||||||
title: const Text("partner_page_select_partner").tr(),
|
title: const Text("partner_page_select_partner").tr(),
|
||||||
children: [
|
children: [
|
||||||
for (PartnerUserDto partner in potentialPartners)
|
for (PartnerUser partner in potentialPartners)
|
||||||
SimpleDialogOption(
|
SimpleDialogOption(
|
||||||
onPressed: () => context.pop(partner),
|
onPressed: () => context.pop(partner),
|
||||||
child: Row(
|
child: Row(
|
||||||
@@ -57,7 +57,7 @@ class DriftPartnerPage extends HookConsumerWidget {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
onDeleteUser(PartnerUserDto partner) {
|
onDeleteUser(PartnerUser partner) {
|
||||||
return showDialog(
|
return showDialog(
|
||||||
context: context,
|
context: context,
|
||||||
builder: (BuildContext context) {
|
builder: (BuildContext context) {
|
||||||
@@ -95,7 +95,7 @@ class DriftPartnerPage extends HookConsumerWidget {
|
|||||||
|
|
||||||
class _SharedToPartnerList extends ConsumerWidget {
|
class _SharedToPartnerList extends ConsumerWidget {
|
||||||
final VoidCallback onAddPartner;
|
final VoidCallback onAddPartner;
|
||||||
final Function(PartnerUserDto partner) onDeletePartner;
|
final Function(PartnerUser partner) onDeletePartner;
|
||||||
|
|
||||||
const _SharedToPartnerList({
|
const _SharedToPartnerList({
|
||||||
required this.onAddPartner,
|
required this.onAddPartner,
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import 'package:easy_localization/easy_localization.dart';
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||||
import 'package:immich_mobile/domain/models/asset/base_asset.model.dart';
|
import 'package:immich_mobile/domain/models/asset/base_asset.model.dart';
|
||||||
|
import 'package:immich_mobile/domain/models/user.model.dart';
|
||||||
import 'package:immich_mobile/extensions/build_context_extensions.dart';
|
import 'package:immich_mobile/extensions/build_context_extensions.dart';
|
||||||
import 'package:immich_mobile/extensions/theme_extensions.dart';
|
import 'package:immich_mobile/extensions/theme_extensions.dart';
|
||||||
import 'package:immich_mobile/presentation/pages/dev/dev_logger.dart';
|
import 'package:immich_mobile/presentation/pages/dev/dev_logger.dart';
|
||||||
@@ -13,7 +14,7 @@ import 'package:immich_mobile/providers/background_sync.provider.dart';
|
|||||||
import 'package:immich_mobile/providers/infrastructure/asset.provider.dart';
|
import 'package:immich_mobile/providers/infrastructure/asset.provider.dart';
|
||||||
import 'package:immich_mobile/providers/infrastructure/db.provider.dart';
|
import 'package:immich_mobile/providers/infrastructure/db.provider.dart';
|
||||||
import 'package:immich_mobile/providers/infrastructure/platform.provider.dart';
|
import 'package:immich_mobile/providers/infrastructure/platform.provider.dart';
|
||||||
import 'package:immich_mobile/providers/user.provider.dart';
|
import 'package:immich_mobile/providers/infrastructure/user.provider.dart';
|
||||||
import 'package:immich_mobile/routing/router.dart';
|
import 'package:immich_mobile/routing/router.dart';
|
||||||
|
|
||||||
final _features = [
|
final _features = [
|
||||||
@@ -26,12 +27,14 @@ final _features = [
|
|||||||
name: 'Selection Mode Timeline',
|
name: 'Selection Mode Timeline',
|
||||||
icon: Icons.developer_mode_rounded,
|
icon: Icons.developer_mode_rounded,
|
||||||
onTap: (ctx, ref) async {
|
onTap: (ctx, ref) async {
|
||||||
final user = ref.watch(currentUserProvider);
|
User? user;
|
||||||
|
ref.watch(currentUserNotifierProvider).whenData((asyncUser) => user = asyncUser);
|
||||||
|
|
||||||
if (user == null) {
|
if (user == null) {
|
||||||
return Future.value();
|
return Future.value();
|
||||||
}
|
}
|
||||||
|
|
||||||
final assets = await ref.read(remoteAssetRepositoryProvider).getSome(user.id);
|
final assets = await ref.read(remoteAssetRepositoryProvider).getSome(user!.id);
|
||||||
|
|
||||||
final selectedAssets = await ctx.pushRoute<Set<BaseAsset>>(
|
final selectedAssets = await ctx.pushRoute<Set<BaseAsset>>(
|
||||||
DriftAssetSelectionTimelineRoute(
|
DriftAssetSelectionTimelineRoute(
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import 'package:easy_localization/easy_localization.dart';
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||||
import 'package:immich_mobile/domain/models/album/album.model.dart';
|
import 'package:immich_mobile/domain/models/album/album.model.dart';
|
||||||
|
import 'package:immich_mobile/extensions/asyncvalue_extensions.dart';
|
||||||
import 'package:immich_mobile/extensions/build_context_extensions.dart';
|
import 'package:immich_mobile/extensions/build_context_extensions.dart';
|
||||||
import 'package:immich_mobile/extensions/theme_extensions.dart';
|
import 'package:immich_mobile/extensions/theme_extensions.dart';
|
||||||
import 'package:immich_mobile/extensions/translate_extensions.dart';
|
import 'package:immich_mobile/extensions/translate_extensions.dart';
|
||||||
@@ -14,7 +15,7 @@ import 'package:immich_mobile/pages/common/large_leading_tile.dart';
|
|||||||
import 'package:immich_mobile/presentation/widgets/images/thumbnail.widget.dart';
|
import 'package:immich_mobile/presentation/widgets/images/thumbnail.widget.dart';
|
||||||
import 'package:immich_mobile/providers/infrastructure/album.provider.dart';
|
import 'package:immich_mobile/providers/infrastructure/album.provider.dart';
|
||||||
import 'package:immich_mobile/providers/infrastructure/current_album.provider.dart';
|
import 'package:immich_mobile/providers/infrastructure/current_album.provider.dart';
|
||||||
import 'package:immich_mobile/providers/user.provider.dart';
|
import 'package:immich_mobile/providers/infrastructure/user.provider.dart';
|
||||||
import 'package:immich_mobile/routing/router.dart';
|
import 'package:immich_mobile/routing/router.dart';
|
||||||
import 'package:immich_mobile/utils/remote_album.utils.dart';
|
import 'package:immich_mobile/utils/remote_album.utils.dart';
|
||||||
import 'package:immich_mobile/widgets/common/immich_sliver_app_bar.dart';
|
import 'package:immich_mobile/widgets/common/immich_sliver_app_bar.dart';
|
||||||
@@ -49,8 +50,9 @@ class _DriftAlbumsPageState extends ConsumerState<DriftAlbumsPage> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void onSearch(String searchTerm, QuickFilterMode sortMode) {
|
void onSearch(String searchTerm, QuickFilterMode sortMode) {
|
||||||
final userId = ref.watch(currentUserProvider)?.id;
|
ref.watch(currentUserNotifierProvider).whenData(
|
||||||
ref.read(remoteAlbumProvider.notifier).searchAlbums(searchTerm, userId, sortMode);
|
(user) => ref.read(remoteAlbumProvider.notifier).searchAlbums(searchTerm, user?.id, sortMode),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> onRefresh() async {
|
Future<void> onRefresh() async {
|
||||||
@@ -88,7 +90,7 @@ class _DriftAlbumsPageState extends ConsumerState<DriftAlbumsPage> {
|
|||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final albums = ref.watch(remoteAlbumProvider.select((s) => s.filteredAlbums));
|
final albums = ref.watch(remoteAlbumProvider.select((s) => s.filteredAlbums));
|
||||||
|
|
||||||
final userId = ref.watch(currentUserProvider)?.id;
|
final user = ref.watch(currentUserNotifierProvider);
|
||||||
|
|
||||||
return RefreshIndicator(
|
return RefreshIndicator(
|
||||||
onRefresh: onRefresh,
|
onRefresh: onRefresh,
|
||||||
@@ -129,15 +131,17 @@ class _DriftAlbumsPageState extends ConsumerState<DriftAlbumsPage> {
|
|||||||
isGrid: isGrid,
|
isGrid: isGrid,
|
||||||
onToggleViewMode: toggleViewMode,
|
onToggleViewMode: toggleViewMode,
|
||||||
),
|
),
|
||||||
isGrid
|
user.widgetWhen(
|
||||||
? _AlbumGrid(
|
onData: (user) => isGrid
|
||||||
albums: albums,
|
? _AlbumGrid(
|
||||||
userId: userId,
|
albums: albums,
|
||||||
)
|
userId: user?.id,
|
||||||
: _AlbumList(
|
)
|
||||||
albums: albums,
|
: _AlbumList(
|
||||||
userId: userId,
|
albums: albums,
|
||||||
),
|
userId: user?.id,
|
||||||
|
),
|
||||||
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -1,11 +1,12 @@
|
|||||||
import 'package:auto_route/auto_route.dart';
|
import 'package:auto_route/auto_route.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||||
|
import 'package:immich_mobile/domain/models/user.model.dart';
|
||||||
import 'package:immich_mobile/extensions/translate_extensions.dart';
|
import 'package:immich_mobile/extensions/translate_extensions.dart';
|
||||||
import 'package:immich_mobile/presentation/widgets/bottom_sheet/archive_bottom_sheet.widget.dart';
|
import 'package:immich_mobile/presentation/widgets/bottom_sheet/archive_bottom_sheet.widget.dart';
|
||||||
import 'package:immich_mobile/presentation/widgets/timeline/timeline.widget.dart';
|
import 'package:immich_mobile/presentation/widgets/timeline/timeline.widget.dart';
|
||||||
import 'package:immich_mobile/providers/infrastructure/timeline.provider.dart';
|
import 'package:immich_mobile/providers/infrastructure/timeline.provider.dart';
|
||||||
import 'package:immich_mobile/providers/user.provider.dart';
|
import 'package:immich_mobile/providers/infrastructure/user.provider.dart';
|
||||||
import 'package:immich_mobile/widgets/common/mesmerizing_sliver_app_bar.dart';
|
import 'package:immich_mobile/widgets/common/mesmerizing_sliver_app_bar.dart';
|
||||||
|
|
||||||
@RoutePage()
|
@RoutePage()
|
||||||
@@ -18,12 +19,14 @@ class DriftArchivePage extends StatelessWidget {
|
|||||||
overrides: [
|
overrides: [
|
||||||
timelineServiceProvider.overrideWith(
|
timelineServiceProvider.overrideWith(
|
||||||
(ref) {
|
(ref) {
|
||||||
final user = ref.watch(currentUserProvider);
|
User? user;
|
||||||
|
ref.watch(currentUserNotifierProvider).whenData((asyncUser) => user = asyncUser);
|
||||||
|
|
||||||
if (user == null) {
|
if (user == null) {
|
||||||
throw Exception('User must be logged in to access archive');
|
throw Exception('User must be logged in to access archive');
|
||||||
}
|
}
|
||||||
|
|
||||||
final timelineService = ref.watch(timelineFactoryProvider).archive(user.id);
|
final timelineService = ref.watch(timelineFactoryProvider).archive(user!.id);
|
||||||
ref.onDispose(timelineService.dispose);
|
ref.onDispose(timelineService.dispose);
|
||||||
return timelineService;
|
return timelineService;
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -2,10 +2,11 @@ import 'package:auto_route/auto_route.dart';
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||||
import 'package:immich_mobile/domain/models/asset/base_asset.model.dart';
|
import 'package:immich_mobile/domain/models/asset/base_asset.model.dart';
|
||||||
|
import 'package:immich_mobile/domain/models/user.model.dart';
|
||||||
import 'package:immich_mobile/presentation/widgets/timeline/timeline.widget.dart';
|
import 'package:immich_mobile/presentation/widgets/timeline/timeline.widget.dart';
|
||||||
import 'package:immich_mobile/providers/infrastructure/timeline.provider.dart';
|
import 'package:immich_mobile/providers/infrastructure/timeline.provider.dart';
|
||||||
import 'package:immich_mobile/providers/timeline/multiselect.provider.dart';
|
import 'package:immich_mobile/providers/timeline/multiselect.provider.dart';
|
||||||
import 'package:immich_mobile/providers/user.provider.dart';
|
import 'package:immich_mobile/providers/infrastructure/user.provider.dart';
|
||||||
|
|
||||||
@RoutePage()
|
@RoutePage()
|
||||||
class DriftAssetSelectionTimelinePage extends ConsumerWidget {
|
class DriftAssetSelectionTimelinePage extends ConsumerWidget {
|
||||||
@@ -30,14 +31,16 @@ class DriftAssetSelectionTimelinePage extends ConsumerWidget {
|
|||||||
),
|
),
|
||||||
timelineServiceProvider.overrideWith(
|
timelineServiceProvider.overrideWith(
|
||||||
(ref) {
|
(ref) {
|
||||||
final user = ref.watch(currentUserProvider);
|
User? user;
|
||||||
|
ref.watch(currentUserNotifierProvider).whenData((asyncUser) => user = asyncUser);
|
||||||
|
|
||||||
if (user == null) {
|
if (user == null) {
|
||||||
throw Exception(
|
throw Exception(
|
||||||
'User must be logged in to access asset selection timeline',
|
'User must be logged in to access asset selection timeline',
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
final timelineService = ref.watch(timelineFactoryProvider).remoteAssets(user.id);
|
final timelineService = ref.watch(timelineFactoryProvider).remoteAssets(user!.id);
|
||||||
ref.onDispose(timelineService.dispose);
|
ref.onDispose(timelineService.dispose);
|
||||||
return timelineService;
|
return timelineService;
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1,11 +1,12 @@
|
|||||||
import 'package:auto_route/auto_route.dart';
|
import 'package:auto_route/auto_route.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||||
|
import 'package:immich_mobile/domain/models/user.model.dart';
|
||||||
import 'package:immich_mobile/extensions/translate_extensions.dart';
|
import 'package:immich_mobile/extensions/translate_extensions.dart';
|
||||||
import 'package:immich_mobile/presentation/widgets/bottom_sheet/favorite_bottom_sheet.widget.dart';
|
import 'package:immich_mobile/presentation/widgets/bottom_sheet/favorite_bottom_sheet.widget.dart';
|
||||||
import 'package:immich_mobile/presentation/widgets/timeline/timeline.widget.dart';
|
import 'package:immich_mobile/presentation/widgets/timeline/timeline.widget.dart';
|
||||||
import 'package:immich_mobile/providers/infrastructure/timeline.provider.dart';
|
import 'package:immich_mobile/providers/infrastructure/timeline.provider.dart';
|
||||||
import 'package:immich_mobile/providers/user.provider.dart';
|
import 'package:immich_mobile/providers/infrastructure/user.provider.dart';
|
||||||
import 'package:immich_mobile/widgets/common/mesmerizing_sliver_app_bar.dart';
|
import 'package:immich_mobile/widgets/common/mesmerizing_sliver_app_bar.dart';
|
||||||
|
|
||||||
@RoutePage()
|
@RoutePage()
|
||||||
@@ -18,12 +19,14 @@ class DriftFavoritePage extends StatelessWidget {
|
|||||||
overrides: [
|
overrides: [
|
||||||
timelineServiceProvider.overrideWith(
|
timelineServiceProvider.overrideWith(
|
||||||
(ref) {
|
(ref) {
|
||||||
final user = ref.watch(currentUserProvider);
|
User? user;
|
||||||
|
ref.watch(currentUserNotifierProvider).whenData((asyncUser) => user = asyncUser);
|
||||||
|
|
||||||
if (user == null) {
|
if (user == null) {
|
||||||
throw Exception('User must be logged in to access favorite');
|
throw Exception('User must be logged in to access favorite');
|
||||||
}
|
}
|
||||||
|
|
||||||
final timelineService = ref.watch(timelineFactoryProvider).favorite(user.id);
|
final timelineService = ref.watch(timelineFactoryProvider).favorite(user!.id);
|
||||||
ref.onDispose(timelineService.dispose);
|
ref.onDispose(timelineService.dispose);
|
||||||
return timelineService;
|
return timelineService;
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -475,7 +475,7 @@ class _QuickAccessButtonList extends ConsumerWidget {
|
|||||||
class _PartnerList extends StatelessWidget {
|
class _PartnerList extends StatelessWidget {
|
||||||
const _PartnerList({required this.partners});
|
const _PartnerList({required this.partners});
|
||||||
|
|
||||||
final List<PartnerUserDto> partners;
|
final List<PartnerUser> partners;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
|
|||||||
@@ -1,12 +1,13 @@
|
|||||||
import 'package:auto_route/auto_route.dart';
|
import 'package:auto_route/auto_route.dart';
|
||||||
import 'package:flutter/widgets.dart';
|
import 'package:flutter/widgets.dart';
|
||||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||||
|
import 'package:immich_mobile/domain/models/user.model.dart';
|
||||||
import 'package:immich_mobile/extensions/translate_extensions.dart';
|
import 'package:immich_mobile/extensions/translate_extensions.dart';
|
||||||
import 'package:immich_mobile/presentation/widgets/bottom_sheet/locked_folder_bottom_sheet.widget.dart';
|
import 'package:immich_mobile/presentation/widgets/bottom_sheet/locked_folder_bottom_sheet.widget.dart';
|
||||||
import 'package:immich_mobile/presentation/widgets/timeline/timeline.widget.dart';
|
import 'package:immich_mobile/presentation/widgets/timeline/timeline.widget.dart';
|
||||||
import 'package:immich_mobile/providers/auth.provider.dart';
|
import 'package:immich_mobile/providers/auth.provider.dart';
|
||||||
import 'package:immich_mobile/providers/infrastructure/timeline.provider.dart';
|
import 'package:immich_mobile/providers/infrastructure/timeline.provider.dart';
|
||||||
import 'package:immich_mobile/providers/user.provider.dart';
|
import 'package:immich_mobile/providers/infrastructure/user.provider.dart';
|
||||||
import 'package:immich_mobile/widgets/common/mesmerizing_sliver_app_bar.dart';
|
import 'package:immich_mobile/widgets/common/mesmerizing_sliver_app_bar.dart';
|
||||||
|
|
||||||
@RoutePage()
|
@RoutePage()
|
||||||
@@ -47,12 +48,14 @@ class _DriftLockedFolderPageState extends ConsumerState<DriftLockedFolderPage> w
|
|||||||
overrides: [
|
overrides: [
|
||||||
timelineServiceProvider.overrideWith(
|
timelineServiceProvider.overrideWith(
|
||||||
(ref) {
|
(ref) {
|
||||||
final user = ref.watch(currentUserProvider);
|
User? user;
|
||||||
|
ref.watch(currentUserNotifierProvider).whenData((asyncUser) => user = asyncUser);
|
||||||
|
|
||||||
if (user == null) {
|
if (user == null) {
|
||||||
throw Exception('User must be logged in to access locked folder');
|
throw Exception('User must be logged in to access locked folder');
|
||||||
}
|
}
|
||||||
|
|
||||||
final timelineService = ref.watch(timelineFactoryProvider).lockedFolder(user.id);
|
final timelineService = ref.watch(timelineFactoryProvider).lockedFolder(user!.id);
|
||||||
ref.onDispose(timelineService.dispose);
|
ref.onDispose(timelineService.dispose);
|
||||||
return timelineService;
|
return timelineService;
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -7,13 +7,12 @@ import 'package:immich_mobile/presentation/widgets/bottom_sheet/partner_detail_b
|
|||||||
import 'package:immich_mobile/presentation/widgets/timeline/timeline.widget.dart';
|
import 'package:immich_mobile/presentation/widgets/timeline/timeline.widget.dart';
|
||||||
import 'package:immich_mobile/providers/infrastructure/timeline.provider.dart';
|
import 'package:immich_mobile/providers/infrastructure/timeline.provider.dart';
|
||||||
import 'package:immich_mobile/providers/infrastructure/user.provider.dart';
|
import 'package:immich_mobile/providers/infrastructure/user.provider.dart';
|
||||||
import 'package:immich_mobile/providers/user.provider.dart';
|
|
||||||
import 'package:immich_mobile/widgets/common/immich_toast.dart';
|
import 'package:immich_mobile/widgets/common/immich_toast.dart';
|
||||||
import 'package:immich_mobile/widgets/common/mesmerizing_sliver_app_bar.dart';
|
import 'package:immich_mobile/widgets/common/mesmerizing_sliver_app_bar.dart';
|
||||||
|
|
||||||
@RoutePage()
|
@RoutePage()
|
||||||
class DriftPartnerDetailPage extends StatelessWidget {
|
class DriftPartnerDetailPage extends StatelessWidget {
|
||||||
final PartnerUserDto partner;
|
final PartnerUser partner;
|
||||||
|
|
||||||
const DriftPartnerDetailPage({
|
const DriftPartnerDetailPage({
|
||||||
super.key,
|
super.key,
|
||||||
@@ -46,7 +45,7 @@ class DriftPartnerDetailPage extends StatelessWidget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class _InfoBox extends ConsumerStatefulWidget {
|
class _InfoBox extends ConsumerStatefulWidget {
|
||||||
final PartnerUserDto partner;
|
final PartnerUser partner;
|
||||||
|
|
||||||
const _InfoBox({
|
const _InfoBox({
|
||||||
required this.partner,
|
required this.partner,
|
||||||
@@ -66,7 +65,9 @@ class _InfoBoxState extends ConsumerState<_InfoBox> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_toggleInTimeline() async {
|
_toggleInTimeline() async {
|
||||||
final user = ref.read(currentUserProvider);
|
User? user;
|
||||||
|
ref.watch(currentUserNotifierProvider).whenData((asyncUser) => user = asyncUser);
|
||||||
|
|
||||||
if (user == null) {
|
if (user == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -74,7 +75,7 @@ class _InfoBoxState extends ConsumerState<_InfoBox> {
|
|||||||
try {
|
try {
|
||||||
await ref.read(partnerUsersProvider.notifier).toggleShowInTimeline(
|
await ref.read(partnerUsersProvider.notifier).toggleShowInTimeline(
|
||||||
widget.partner.id,
|
widget.partner.id,
|
||||||
user.id,
|
user!.id,
|
||||||
);
|
);
|
||||||
|
|
||||||
setState(() {
|
setState(() {
|
||||||
|
|||||||
@@ -1,10 +1,11 @@
|
|||||||
import 'package:auto_route/auto_route.dart';
|
import 'package:auto_route/auto_route.dart';
|
||||||
import 'package:flutter/widgets.dart';
|
import 'package:flutter/widgets.dart';
|
||||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||||
|
import 'package:immich_mobile/domain/models/user.model.dart';
|
||||||
import 'package:immich_mobile/extensions/translate_extensions.dart';
|
import 'package:immich_mobile/extensions/translate_extensions.dart';
|
||||||
import 'package:immich_mobile/presentation/widgets/timeline/timeline.widget.dart';
|
import 'package:immich_mobile/presentation/widgets/timeline/timeline.widget.dart';
|
||||||
import 'package:immich_mobile/providers/infrastructure/timeline.provider.dart';
|
import 'package:immich_mobile/providers/infrastructure/timeline.provider.dart';
|
||||||
import 'package:immich_mobile/providers/user.provider.dart';
|
import 'package:immich_mobile/providers/infrastructure/user.provider.dart';
|
||||||
import 'package:immich_mobile/widgets/common/mesmerizing_sliver_app_bar.dart';
|
import 'package:immich_mobile/widgets/common/mesmerizing_sliver_app_bar.dart';
|
||||||
|
|
||||||
@RoutePage()
|
@RoutePage()
|
||||||
@@ -17,14 +18,16 @@ class DriftRecentlyTakenPage extends StatelessWidget {
|
|||||||
overrides: [
|
overrides: [
|
||||||
timelineServiceProvider.overrideWith(
|
timelineServiceProvider.overrideWith(
|
||||||
(ref) {
|
(ref) {
|
||||||
final user = ref.watch(currentUserProvider);
|
User? user;
|
||||||
|
ref.watch(currentUserNotifierProvider).whenData((asyncUser) => user = asyncUser);
|
||||||
|
|
||||||
if (user == null) {
|
if (user == null) {
|
||||||
throw Exception(
|
throw Exception(
|
||||||
'User must be logged in to access recently taken',
|
'User must be logged in to access recently taken',
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
final timelineService = ref.watch(timelineFactoryProvider).remoteAssets(user.id);
|
final timelineService = ref.watch(timelineFactoryProvider).remoteAssets(user!.id);
|
||||||
ref.onDispose(timelineService.dispose);
|
ref.onDispose(timelineService.dispose);
|
||||||
return timelineService;
|
return timelineService;
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import 'package:flutter/services.dart';
|
|||||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||||
import 'package:immich_mobile/domain/models/album/album.model.dart';
|
import 'package:immich_mobile/domain/models/album/album.model.dart';
|
||||||
import 'package:immich_mobile/domain/models/asset/base_asset.model.dart';
|
import 'package:immich_mobile/domain/models/asset/base_asset.model.dart';
|
||||||
|
import 'package:immich_mobile/domain/models/user.model.dart';
|
||||||
import 'package:immich_mobile/extensions/build_context_extensions.dart';
|
import 'package:immich_mobile/extensions/build_context_extensions.dart';
|
||||||
import 'package:immich_mobile/extensions/translate_extensions.dart';
|
import 'package:immich_mobile/extensions/translate_extensions.dart';
|
||||||
import 'package:immich_mobile/presentation/widgets/bottom_sheet/remote_album_bottom_sheet.widget.dart';
|
import 'package:immich_mobile/presentation/widgets/bottom_sheet/remote_album_bottom_sheet.widget.dart';
|
||||||
@@ -12,7 +13,7 @@ import 'package:immich_mobile/presentation/widgets/timeline/timeline.widget.dart
|
|||||||
import 'package:immich_mobile/providers/infrastructure/album.provider.dart';
|
import 'package:immich_mobile/providers/infrastructure/album.provider.dart';
|
||||||
import 'package:immich_mobile/providers/infrastructure/remote_album.provider.dart';
|
import 'package:immich_mobile/providers/infrastructure/remote_album.provider.dart';
|
||||||
import 'package:immich_mobile/providers/infrastructure/timeline.provider.dart';
|
import 'package:immich_mobile/providers/infrastructure/timeline.provider.dart';
|
||||||
import 'package:immich_mobile/providers/user.provider.dart';
|
import 'package:immich_mobile/providers/infrastructure/user.provider.dart';
|
||||||
import 'package:immich_mobile/routing/router.dart';
|
import 'package:immich_mobile/routing/router.dart';
|
||||||
import 'package:immich_mobile/widgets/common/immich_toast.dart';
|
import 'package:immich_mobile/widgets/common/immich_toast.dart';
|
||||||
import 'package:immich_mobile/widgets/common/remote_album_sliver_app_bar.dart';
|
import 'package:immich_mobile/widgets/common/remote_album_sliver_app_bar.dart';
|
||||||
@@ -186,8 +187,9 @@ class _RemoteAlbumPageState extends ConsumerState<RemoteAlbumPage> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void showOptionSheet(BuildContext context) {
|
void showOptionSheet(BuildContext context) {
|
||||||
final user = ref.watch(currentUserProvider);
|
User? user;
|
||||||
final isOwner = user != null ? user.id == widget.album.ownerId : false;
|
ref.watch(currentUserNotifierProvider).whenData((asyncUser) => user = asyncUser);
|
||||||
|
final isOwner = user != null ? user!.id == widget.album.ownerId : false;
|
||||||
|
|
||||||
showModalBottomSheet(
|
showModalBottomSheet(
|
||||||
context: context,
|
context: context,
|
||||||
|
|||||||
@@ -1,12 +1,13 @@
|
|||||||
import 'package:auto_route/auto_route.dart';
|
import 'package:auto_route/auto_route.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||||
|
import 'package:immich_mobile/domain/models/user.model.dart';
|
||||||
import 'package:immich_mobile/extensions/translate_extensions.dart';
|
import 'package:immich_mobile/extensions/translate_extensions.dart';
|
||||||
import 'package:immich_mobile/presentation/widgets/bottom_sheet/trash_bottom_sheet.widget.dart';
|
import 'package:immich_mobile/presentation/widgets/bottom_sheet/trash_bottom_sheet.widget.dart';
|
||||||
import 'package:immich_mobile/presentation/widgets/timeline/timeline.widget.dart';
|
import 'package:immich_mobile/presentation/widgets/timeline/timeline.widget.dart';
|
||||||
import 'package:immich_mobile/providers/infrastructure/timeline.provider.dart';
|
import 'package:immich_mobile/providers/infrastructure/timeline.provider.dart';
|
||||||
import 'package:immich_mobile/providers/server_info.provider.dart';
|
import 'package:immich_mobile/providers/server_info.provider.dart';
|
||||||
import 'package:immich_mobile/providers/user.provider.dart';
|
import 'package:immich_mobile/providers/infrastructure/user.provider.dart';
|
||||||
|
|
||||||
@RoutePage()
|
@RoutePage()
|
||||||
class DriftTrashPage extends StatelessWidget {
|
class DriftTrashPage extends StatelessWidget {
|
||||||
@@ -18,12 +19,14 @@ class DriftTrashPage extends StatelessWidget {
|
|||||||
overrides: [
|
overrides: [
|
||||||
timelineServiceProvider.overrideWith(
|
timelineServiceProvider.overrideWith(
|
||||||
(ref) {
|
(ref) {
|
||||||
final user = ref.watch(currentUserProvider);
|
User? user;
|
||||||
|
ref.watch(currentUserNotifierProvider).whenData((asyncUser) => user = asyncUser);
|
||||||
|
|
||||||
if (user == null) {
|
if (user == null) {
|
||||||
throw Exception('User must be logged in to access trash');
|
throw Exception('User must be logged in to access trash');
|
||||||
}
|
}
|
||||||
|
|
||||||
final timelineService = ref.watch(timelineFactoryProvider).trash(user.id);
|
final timelineService = ref.watch(timelineFactoryProvider).trash(user!.id);
|
||||||
ref.onDispose(timelineService.dispose);
|
ref.onDispose(timelineService.dispose);
|
||||||
return timelineService;
|
return timelineService;
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -5,40 +5,21 @@ import 'package:flutter_hooks/flutter_hooks.dart';
|
|||||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||||
import 'package:immich_mobile/domain/models/user.model.dart';
|
import 'package:immich_mobile/domain/models/user.model.dart';
|
||||||
import 'package:immich_mobile/domain/models/album/album.model.dart';
|
import 'package:immich_mobile/domain/models/album/album.model.dart';
|
||||||
import 'package:immich_mobile/domain/models/user_metadata.model.dart';
|
|
||||||
import 'package:immich_mobile/extensions/asyncvalue_extensions.dart';
|
import 'package:immich_mobile/extensions/asyncvalue_extensions.dart';
|
||||||
import 'package:immich_mobile/extensions/build_context_extensions.dart';
|
import 'package:immich_mobile/extensions/build_context_extensions.dart';
|
||||||
|
import 'package:immich_mobile/infrastructure/entities/user.entity.dart';
|
||||||
import 'package:immich_mobile/providers/infrastructure/db.provider.dart';
|
import 'package:immich_mobile/providers/infrastructure/db.provider.dart';
|
||||||
import 'package:immich_mobile/providers/infrastructure/remote_album.provider.dart';
|
import 'package:immich_mobile/providers/infrastructure/remote_album.provider.dart';
|
||||||
import 'package:immich_mobile/providers/user.provider.dart';
|
import 'package:immich_mobile/providers/infrastructure/user.provider.dart';
|
||||||
import 'package:immich_mobile/widgets/common/user_circle_avatar.dart';
|
import 'package:immich_mobile/widgets/common/drift_user_circle_avatar.dart';
|
||||||
|
|
||||||
// TODO: Refactor this provider when we have user provider/service/repository pattern in place
|
// TODO: Refactor this provider when we have user provider/service/repository pattern in place
|
||||||
final driftUsersProvider = FutureProvider.autoDispose<List<UserDto>>((ref) async {
|
final driftUsersProvider = FutureProvider.autoDispose<List<User>>((ref) async {
|
||||||
final drift = ref.watch(driftProvider);
|
final drift = ref.watch(driftProvider);
|
||||||
final currentUser = ref.watch(currentUserProvider);
|
User? currentUser;
|
||||||
|
ref.watch(currentUserNotifierProvider).whenData((asyncUser) => currentUser = asyncUser);
|
||||||
|
|
||||||
final userEntities = await drift.managers.userEntity.get();
|
final users = await drift.managers.userEntity.map((row) => row.toDto()).get();
|
||||||
|
|
||||||
final users = userEntities
|
|
||||||
.map(
|
|
||||||
(entity) => UserDto(
|
|
||||||
id: entity.id,
|
|
||||||
name: entity.name,
|
|
||||||
email: entity.email,
|
|
||||||
isAdmin: entity.isAdmin,
|
|
||||||
profileImagePath: entity.profileImagePath,
|
|
||||||
updatedAt: entity.updatedAt,
|
|
||||||
quotaSizeInBytes: entity.quotaSizeInBytes ?? 0,
|
|
||||||
quotaUsageInBytes: entity.quotaUsageInBytes,
|
|
||||||
isPartnerSharedBy: false,
|
|
||||||
isPartnerSharedWith: false,
|
|
||||||
avatarColor: AvatarColor.primary,
|
|
||||||
memoryEnabled: true,
|
|
||||||
inTimeline: true,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
.toList();
|
|
||||||
|
|
||||||
users.removeWhere((u) => currentUser?.id == u.id);
|
users.removeWhere((u) => currentUser?.id == u.id);
|
||||||
|
|
||||||
@@ -56,14 +37,14 @@ class DriftUserSelectionPage extends HookConsumerWidget {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context, WidgetRef ref) {
|
Widget build(BuildContext context, WidgetRef ref) {
|
||||||
final AsyncValue<List<UserDto>> suggestedShareUsers = ref.watch(driftUsersProvider);
|
final AsyncValue<List<User>> suggestedShareUsers = ref.watch(driftUsersProvider);
|
||||||
final sharedUsersList = useState<Set<UserDto>>({});
|
final sharedUsersList = useState<Set<User>>({});
|
||||||
|
|
||||||
addNewUsersHandler() {
|
addNewUsersHandler() {
|
||||||
context.maybePop(sharedUsersList.value.map((e) => e.id).toList());
|
context.maybePop(sharedUsersList.value.map((e) => e.id).toList());
|
||||||
}
|
}
|
||||||
|
|
||||||
buildTileIcon(UserDto user) {
|
buildTileIcon(User user) {
|
||||||
if (sharedUsersList.value.contains(user)) {
|
if (sharedUsersList.value.contains(user)) {
|
||||||
return CircleAvatar(
|
return CircleAvatar(
|
||||||
backgroundColor: context.primaryColor,
|
backgroundColor: context.primaryColor,
|
||||||
@@ -73,13 +54,13 @@ class DriftUserSelectionPage extends HookConsumerWidget {
|
|||||||
),
|
),
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
return UserCircleAvatar(
|
return DriftUserCircleAvatar(
|
||||||
user: user,
|
user: user,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
buildUserList(List<UserDto> users) {
|
buildUserList(List<User> users) {
|
||||||
List<Widget> usersChip = [];
|
List<Widget> usersChip = [];
|
||||||
|
|
||||||
for (var user in sharedUsersList.value) {
|
for (var user in sharedUsersList.value) {
|
||||||
|
|||||||
@@ -1,10 +1,11 @@
|
|||||||
import 'package:auto_route/auto_route.dart';
|
import 'package:auto_route/auto_route.dart';
|
||||||
import 'package:flutter/widgets.dart';
|
import 'package:flutter/widgets.dart';
|
||||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||||
|
import 'package:immich_mobile/domain/models/user.model.dart';
|
||||||
import 'package:immich_mobile/extensions/translate_extensions.dart';
|
import 'package:immich_mobile/extensions/translate_extensions.dart';
|
||||||
import 'package:immich_mobile/presentation/widgets/timeline/timeline.widget.dart';
|
import 'package:immich_mobile/presentation/widgets/timeline/timeline.widget.dart';
|
||||||
import 'package:immich_mobile/providers/infrastructure/timeline.provider.dart';
|
import 'package:immich_mobile/providers/infrastructure/timeline.provider.dart';
|
||||||
import 'package:immich_mobile/providers/user.provider.dart';
|
import 'package:immich_mobile/providers/infrastructure/user.provider.dart';
|
||||||
import 'package:immich_mobile/widgets/common/mesmerizing_sliver_app_bar.dart';
|
import 'package:immich_mobile/widgets/common/mesmerizing_sliver_app_bar.dart';
|
||||||
|
|
||||||
@RoutePage()
|
@RoutePage()
|
||||||
@@ -17,12 +18,14 @@ class DriftVideoPage extends StatelessWidget {
|
|||||||
overrides: [
|
overrides: [
|
||||||
timelineServiceProvider.overrideWith(
|
timelineServiceProvider.overrideWith(
|
||||||
(ref) {
|
(ref) {
|
||||||
final user = ref.watch(currentUserProvider);
|
User? user;
|
||||||
|
ref.watch(currentUserNotifierProvider).whenData((asyncUser) => user = asyncUser);
|
||||||
|
|
||||||
if (user == null) {
|
if (user == null) {
|
||||||
throw Exception('User must be logged in to video');
|
throw Exception('User must be logged in to video');
|
||||||
}
|
}
|
||||||
|
|
||||||
final timelineService = ref.watch(timelineFactoryProvider).video(user.id);
|
final timelineService = ref.watch(timelineFactoryProvider).video(user!.id);
|
||||||
ref.onDispose(timelineService.dispose);
|
ref.onDispose(timelineService.dispose);
|
||||||
return timelineService;
|
return timelineService;
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -2,11 +2,12 @@ import 'package:flutter/material.dart';
|
|||||||
import 'package:fluttertoast/fluttertoast.dart';
|
import 'package:fluttertoast/fluttertoast.dart';
|
||||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||||
import 'package:immich_mobile/constants/enums.dart';
|
import 'package:immich_mobile/constants/enums.dart';
|
||||||
|
import 'package:immich_mobile/domain/models/user.model.dart';
|
||||||
import 'package:immich_mobile/extensions/translate_extensions.dart';
|
import 'package:immich_mobile/extensions/translate_extensions.dart';
|
||||||
import 'package:immich_mobile/presentation/widgets/action_buttons/base_action_button.widget.dart';
|
import 'package:immich_mobile/presentation/widgets/action_buttons/base_action_button.widget.dart';
|
||||||
import 'package:immich_mobile/providers/infrastructure/action.provider.dart';
|
import 'package:immich_mobile/providers/infrastructure/action.provider.dart';
|
||||||
import 'package:immich_mobile/providers/timeline/multiselect.provider.dart';
|
import 'package:immich_mobile/providers/timeline/multiselect.provider.dart';
|
||||||
import 'package:immich_mobile/providers/user.provider.dart';
|
import 'package:immich_mobile/providers/infrastructure/user.provider.dart';
|
||||||
import 'package:immich_mobile/widgets/common/immich_toast.dart';
|
import 'package:immich_mobile/widgets/common/immich_toast.dart';
|
||||||
|
|
||||||
class StackActionButton extends ConsumerWidget {
|
class StackActionButton extends ConsumerWidget {
|
||||||
@@ -19,12 +20,14 @@ class StackActionButton extends ConsumerWidget {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
final user = ref.watch(currentUserProvider);
|
User? user;
|
||||||
|
ref.watch(currentUserNotifierProvider).whenData((asyncUser) => user = asyncUser);
|
||||||
|
|
||||||
if (user == null) {
|
if (user == null) {
|
||||||
throw Exception('User must be logged in to access stack action');
|
throw Exception('User must be logged in to access stack action');
|
||||||
}
|
}
|
||||||
|
|
||||||
final result = await ref.read(actionProvider.notifier).stack(user.id, source);
|
final result = await ref.read(actionProvider.notifier).stack(user!.id, source);
|
||||||
ref.read(multiSelectProvider.notifier).reset();
|
ref.read(multiSelectProvider.notifier).reset();
|
||||||
|
|
||||||
final successMessage = 'stack_action_prompt'.t(
|
final successMessage = 'stack_action_prompt'.t(
|
||||||
|
|||||||
@@ -2,13 +2,14 @@ import 'package:flutter/material.dart';
|
|||||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||||
import 'package:immich_mobile/constants/enums.dart';
|
import 'package:immich_mobile/constants/enums.dart';
|
||||||
import 'package:immich_mobile/domain/models/asset/base_asset.model.dart';
|
import 'package:immich_mobile/domain/models/asset/base_asset.model.dart';
|
||||||
|
import 'package:immich_mobile/domain/models/user.model.dart';
|
||||||
import 'package:immich_mobile/extensions/build_context_extensions.dart';
|
import 'package:immich_mobile/extensions/build_context_extensions.dart';
|
||||||
import 'package:immich_mobile/presentation/widgets/action_buttons/archive_action_button.widget.dart';
|
import 'package:immich_mobile/presentation/widgets/action_buttons/archive_action_button.widget.dart';
|
||||||
import 'package:immich_mobile/presentation/widgets/action_buttons/share_action_button.widget.dart';
|
import 'package:immich_mobile/presentation/widgets/action_buttons/share_action_button.widget.dart';
|
||||||
import 'package:immich_mobile/presentation/widgets/action_buttons/upload_action_button.widget.dart';
|
import 'package:immich_mobile/presentation/widgets/action_buttons/upload_action_button.widget.dart';
|
||||||
import 'package:immich_mobile/presentation/widgets/asset_viewer/asset_viewer.state.dart';
|
import 'package:immich_mobile/presentation/widgets/asset_viewer/asset_viewer.state.dart';
|
||||||
import 'package:immich_mobile/providers/infrastructure/asset_viewer/current_asset.provider.dart';
|
import 'package:immich_mobile/providers/infrastructure/asset_viewer/current_asset.provider.dart';
|
||||||
import 'package:immich_mobile/providers/user.provider.dart';
|
import 'package:immich_mobile/providers/infrastructure/user.provider.dart';
|
||||||
import 'package:immich_mobile/widgets/asset_viewer/video_controls.dart';
|
import 'package:immich_mobile/widgets/asset_viewer/video_controls.dart';
|
||||||
|
|
||||||
class ViewerBottomBar extends ConsumerWidget {
|
class ViewerBottomBar extends ConsumerWidget {
|
||||||
@@ -21,7 +22,9 @@ class ViewerBottomBar extends ConsumerWidget {
|
|||||||
return const SizedBox.shrink();
|
return const SizedBox.shrink();
|
||||||
}
|
}
|
||||||
|
|
||||||
final user = ref.watch(currentUserProvider);
|
User? user;
|
||||||
|
ref.watch(currentUserNotifierProvider).whenData((asyncUser) => user = asyncUser);
|
||||||
|
|
||||||
final isOwner = asset is RemoteAsset && asset.ownerId == user?.id;
|
final isOwner = asset is RemoteAsset && asset.ownerId == user?.id;
|
||||||
final isSheetOpen = ref.watch(
|
final isSheetOpen = ref.watch(
|
||||||
assetViewerProvider.select((s) => s.showingBottomSheet),
|
assetViewerProvider.select((s) => s.showingBottomSheet),
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ import 'package:flutter/material.dart';
|
|||||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||||
import 'package:immich_mobile/constants/enums.dart';
|
import 'package:immich_mobile/constants/enums.dart';
|
||||||
import 'package:immich_mobile/domain/models/asset/base_asset.model.dart';
|
import 'package:immich_mobile/domain/models/asset/base_asset.model.dart';
|
||||||
|
import 'package:immich_mobile/domain/models/user.model.dart';
|
||||||
import 'package:immich_mobile/domain/utils/event_stream.dart';
|
import 'package:immich_mobile/domain/utils/event_stream.dart';
|
||||||
import 'package:immich_mobile/extensions/build_context_extensions.dart';
|
import 'package:immich_mobile/extensions/build_context_extensions.dart';
|
||||||
import 'package:immich_mobile/presentation/widgets/action_buttons/cast_action_button.widget.dart';
|
import 'package:immich_mobile/presentation/widgets/action_buttons/cast_action_button.widget.dart';
|
||||||
@@ -13,7 +14,7 @@ import 'package:immich_mobile/presentation/widgets/asset_viewer/asset_viewer.sta
|
|||||||
import 'package:immich_mobile/providers/cast.provider.dart';
|
import 'package:immich_mobile/providers/cast.provider.dart';
|
||||||
import 'package:immich_mobile/providers/infrastructure/asset_viewer/current_asset.provider.dart';
|
import 'package:immich_mobile/providers/infrastructure/asset_viewer/current_asset.provider.dart';
|
||||||
import 'package:immich_mobile/providers/routes.provider.dart';
|
import 'package:immich_mobile/providers/routes.provider.dart';
|
||||||
import 'package:immich_mobile/providers/user.provider.dart';
|
import 'package:immich_mobile/providers/infrastructure/user.provider.dart';
|
||||||
import 'package:immich_mobile/providers/websocket.provider.dart';
|
import 'package:immich_mobile/providers/websocket.provider.dart';
|
||||||
|
|
||||||
class ViewerTopAppBar extends ConsumerWidget implements PreferredSizeWidget {
|
class ViewerTopAppBar extends ConsumerWidget implements PreferredSizeWidget {
|
||||||
@@ -26,7 +27,9 @@ class ViewerTopAppBar extends ConsumerWidget implements PreferredSizeWidget {
|
|||||||
return const SizedBox.shrink();
|
return const SizedBox.shrink();
|
||||||
}
|
}
|
||||||
|
|
||||||
final user = ref.watch(currentUserProvider);
|
User? user;
|
||||||
|
ref.watch(currentUserNotifierProvider).whenData((asyncUser) => user = asyncUser);
|
||||||
|
|
||||||
final isOwner = asset is RemoteAsset && asset.ownerId == user?.id;
|
final isOwner = asset is RemoteAsset && asset.ownerId == user?.id;
|
||||||
final isInLockedView = ref.watch(inLockedViewProvider);
|
final isInLockedView = ref.watch(inLockedViewProvider);
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import 'package:immich_mobile/services/api.service.dart';
|
|||||||
class PartnerUserAvatar extends StatelessWidget {
|
class PartnerUserAvatar extends StatelessWidget {
|
||||||
const PartnerUserAvatar({super.key, required this.partner});
|
const PartnerUserAvatar({super.key, required this.partner});
|
||||||
|
|
||||||
final PartnerUserDto partner;
|
final PartnerUser partner;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
|
|||||||
@@ -2,11 +2,11 @@ import 'package:hooks_riverpod/hooks_riverpod.dart';
|
|||||||
import 'package:immich_mobile/domain/models/user.model.dart';
|
import 'package:immich_mobile/domain/models/user.model.dart';
|
||||||
import 'package:immich_mobile/domain/services/user.service.dart';
|
import 'package:immich_mobile/domain/services/user.service.dart';
|
||||||
import 'package:immich_mobile/providers/infrastructure/user.provider.dart';
|
import 'package:immich_mobile/providers/infrastructure/user.provider.dart';
|
||||||
import 'package:immich_mobile/providers/user.provider.dart';
|
|
||||||
|
|
||||||
final otherUsersProvider = FutureProvider.autoDispose<List<UserDto>>((ref) async {
|
final otherUsersProvider = FutureProvider.autoDispose<List<UserDto>>((ref) async {
|
||||||
UserService userService = ref.watch(userServiceProvider);
|
UserService userService = ref.watch(userServiceProvider);
|
||||||
final currentUser = ref.watch(currentUserProvider);
|
User? currentUser;
|
||||||
|
ref.watch(currentUserNotifierProvider).whenData((asyncUser) => currentUser = asyncUser);
|
||||||
|
|
||||||
final allUsers = await userService.getAll();
|
final allUsers = await userService.getAll();
|
||||||
allUsers.removeWhere((u) => currentUser?.id == u.id);
|
allUsers.removeWhere((u) => currentUser?.id == u.id);
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:immich_mobile/constants/enums.dart';
|
import 'package:immich_mobile/constants/enums.dart';
|
||||||
import 'package:immich_mobile/domain/models/asset/base_asset.model.dart';
|
import 'package:immich_mobile/domain/models/asset/base_asset.model.dart';
|
||||||
|
import 'package:immich_mobile/domain/models/user.model.dart';
|
||||||
import 'package:immich_mobile/providers/infrastructure/asset_viewer/current_asset.provider.dart';
|
import 'package:immich_mobile/providers/infrastructure/asset_viewer/current_asset.provider.dart';
|
||||||
import 'package:immich_mobile/providers/timeline/multiselect.provider.dart';
|
import 'package:immich_mobile/providers/timeline/multiselect.provider.dart';
|
||||||
import 'package:immich_mobile/providers/user.provider.dart';
|
import 'package:immich_mobile/providers/infrastructure/user.provider.dart';
|
||||||
import 'package:immich_mobile/services/action.service.dart';
|
import 'package:immich_mobile/services/action.service.dart';
|
||||||
import 'package:immich_mobile/services/drift_backup.service.dart';
|
import 'package:immich_mobile/services/drift_backup.service.dart';
|
||||||
import 'package:immich_mobile/services/timeline.service.dart';
|
import 'package:immich_mobile/services/timeline.service.dart';
|
||||||
@@ -62,12 +63,16 @@ class ActionNotifier extends Notifier<void> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
List<String> _getOwnedRemoteIdsForSource(ActionSource source) {
|
List<String> _getOwnedRemoteIdsForSource(ActionSource source) {
|
||||||
final ownerId = ref.read(currentUserProvider)?.id;
|
User? user;
|
||||||
return _getAssets(source).whereType<RemoteAsset>().ownedAssets(ownerId).toIds().toList(growable: false);
|
ref.read(currentUserNotifierProvider).whenData((asyncUser) => user = asyncUser);
|
||||||
|
return _getAssets(source).whereType<RemoteAsset>().ownedAssets(user?.id).toIds().toList(growable: false);
|
||||||
}
|
}
|
||||||
|
|
||||||
List<RemoteAsset> _getOwnedRemoteAssetsForSource(ActionSource source) {
|
List<RemoteAsset> _getOwnedRemoteAssetsForSource(ActionSource source) {
|
||||||
final ownerId = ref.read(currentUserProvider)?.id;
|
User? user;
|
||||||
|
ref.read(currentUserNotifierProvider).whenData((asyncUser) => user = asyncUser);
|
||||||
|
|
||||||
|
final ownerId = user?.id;
|
||||||
return _getIdsForSource<RemoteAsset>(source).ownedAssets(ownerId).toList();
|
return _getIdsForSource<RemoteAsset>(source).ownedAssets(ownerId).toList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
import 'package:immich_mobile/domain/models/memory.model.dart';
|
import 'package:immich_mobile/domain/models/memory.model.dart';
|
||||||
|
import 'package:immich_mobile/domain/models/user.model.dart';
|
||||||
import 'package:immich_mobile/domain/services/memory.service.dart';
|
import 'package:immich_mobile/domain/services/memory.service.dart';
|
||||||
import 'package:immich_mobile/infrastructure/repositories/memory.repository.dart';
|
import 'package:immich_mobile/infrastructure/repositories/memory.repository.dart';
|
||||||
import 'package:immich_mobile/providers/user.provider.dart';
|
import 'package:immich_mobile/providers/infrastructure/user.provider.dart';
|
||||||
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
||||||
|
|
||||||
import 'db.provider.dart';
|
import 'db.provider.dart';
|
||||||
@@ -15,12 +16,14 @@ final driftMemoryServiceProvider = Provider<DriftMemoryService>(
|
|||||||
);
|
);
|
||||||
|
|
||||||
final driftMemoryFutureProvider = FutureProvider.autoDispose<List<DriftMemory>>((ref) async {
|
final driftMemoryFutureProvider = FutureProvider.autoDispose<List<DriftMemory>>((ref) async {
|
||||||
final user = ref.watch(currentUserProvider);
|
User? user;
|
||||||
|
ref.watch(currentUserNotifierProvider).whenData((asyncUser) => user = asyncUser);
|
||||||
|
|
||||||
if (user == null) {
|
if (user == null) {
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
|
|
||||||
final service = ref.watch(driftMemoryServiceProvider);
|
final service = ref.watch(driftMemoryServiceProvider);
|
||||||
|
|
||||||
return service.getMemoryLane(user.id);
|
return service.getMemoryLane(user!.id);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,29 +1,30 @@
|
|||||||
import 'package:immich_mobile/domain/models/user.model.dart';
|
import 'package:immich_mobile/domain/models/user.model.dart';
|
||||||
import 'package:immich_mobile/domain/services/partner.service.dart';
|
import 'package:immich_mobile/domain/services/partner.service.dart';
|
||||||
import 'package:immich_mobile/providers/infrastructure/user.provider.dart';
|
import 'package:immich_mobile/providers/infrastructure/user.provider.dart';
|
||||||
import 'package:immich_mobile/providers/user.provider.dart';
|
|
||||||
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
||||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||||
|
|
||||||
class PartnerNotifier extends Notifier<List<PartnerUserDto>> {
|
class PartnerNotifier extends Notifier<List<PartnerUser>> {
|
||||||
late DriftPartnerService _driftPartnerService;
|
late DriftPartnerService _driftPartnerService;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
List<PartnerUserDto> build() {
|
List<PartnerUser> build() {
|
||||||
_driftPartnerService = ref.read(driftPartnerServiceProvider);
|
_driftPartnerService = ref.read(driftPartnerServiceProvider);
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> _loadPartners() async {
|
Future<void> _loadPartners() async {
|
||||||
final currentUser = ref.read(currentUserProvider);
|
User? currentUser;
|
||||||
|
ref.read(currentUserNotifierProvider).whenData((asyncUser) => currentUser = asyncUser);
|
||||||
|
|
||||||
if (currentUser == null) {
|
if (currentUser == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
state = await _driftPartnerService.getSharedWith(currentUser.id);
|
state = await _driftPartnerService.getSharedWith(currentUser!.id);
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<List<PartnerUserDto>> getPartners(String userId) async {
|
Future<List<PartnerUser>> getPartners(String userId) async {
|
||||||
final partners = await _driftPartnerService.getSharedWith(userId);
|
final partners = await _driftPartnerService.getSharedWith(userId);
|
||||||
state = partners;
|
state = partners;
|
||||||
return partners;
|
return partners;
|
||||||
@@ -34,54 +35,64 @@ class PartnerNotifier extends Notifier<List<PartnerUserDto>> {
|
|||||||
await _loadPartners();
|
await _loadPartners();
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> addPartner(PartnerUserDto partner) async {
|
Future<void> addPartner(PartnerUser partner) async {
|
||||||
final currentUser = ref.read(currentUserProvider);
|
User? currentUser;
|
||||||
|
ref.read(currentUserNotifierProvider).whenData((asyncUser) => currentUser = asyncUser);
|
||||||
|
|
||||||
if (currentUser == null) {
|
if (currentUser == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
await _driftPartnerService.addPartner(partner.id, currentUser.id);
|
await _driftPartnerService.addPartner(partner.id, currentUser!.id);
|
||||||
await _loadPartners();
|
await _loadPartners();
|
||||||
ref.invalidate(driftAvailablePartnerProvider);
|
ref.invalidate(driftAvailablePartnerProvider);
|
||||||
ref.invalidate(driftSharedByPartnerProvider);
|
ref.invalidate(driftSharedByPartnerProvider);
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> removePartner(PartnerUserDto partner) async {
|
Future<void> removePartner(PartnerUser partner) async {
|
||||||
final currentUser = ref.read(currentUserProvider);
|
User? currentUser;
|
||||||
|
ref.read(currentUserNotifierProvider).whenData((asyncUser) => currentUser = asyncUser);
|
||||||
|
|
||||||
if (currentUser == null) {
|
if (currentUser == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
await _driftPartnerService.removePartner(partner.id, currentUser.id);
|
await _driftPartnerService.removePartner(partner.id, currentUser!.id);
|
||||||
await _loadPartners();
|
await _loadPartners();
|
||||||
ref.invalidate(driftAvailablePartnerProvider);
|
ref.invalidate(driftAvailablePartnerProvider);
|
||||||
ref.invalidate(driftSharedByPartnerProvider);
|
ref.invalidate(driftSharedByPartnerProvider);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
final driftAvailablePartnerProvider = FutureProvider.autoDispose<List<PartnerUserDto>>((ref) {
|
final driftAvailablePartnerProvider = FutureProvider.autoDispose<List<PartnerUser>>((ref) {
|
||||||
final currentUser = ref.watch(currentUserProvider);
|
User? currentUser;
|
||||||
|
ref.watch(currentUserNotifierProvider).whenData((asyncUser) => currentUser = asyncUser);
|
||||||
|
|
||||||
if (currentUser == null) {
|
if (currentUser == null) {
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
|
|
||||||
return ref.watch(driftPartnerServiceProvider).getAvailablePartners(currentUser.id);
|
return ref.watch(driftPartnerServiceProvider).getAvailablePartners(currentUser!.id);
|
||||||
});
|
});
|
||||||
|
|
||||||
final driftSharedByPartnerProvider = FutureProvider.autoDispose<List<PartnerUserDto>>((ref) {
|
final driftSharedByPartnerProvider = FutureProvider.autoDispose<List<PartnerUser>>((ref) {
|
||||||
final currentUser = ref.watch(currentUserProvider);
|
User? currentUser;
|
||||||
|
ref.watch(currentUserNotifierProvider).whenData((asyncUser) => currentUser = asyncUser);
|
||||||
|
|
||||||
if (currentUser == null) {
|
if (currentUser == null) {
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
|
|
||||||
return ref.watch(driftPartnerServiceProvider).getSharedBy(currentUser.id);
|
return ref.watch(driftPartnerServiceProvider).getSharedBy(currentUser!.id);
|
||||||
});
|
});
|
||||||
|
|
||||||
final driftSharedWithPartnerProvider = FutureProvider.autoDispose<List<PartnerUserDto>>((ref) {
|
final driftSharedWithPartnerProvider = FutureProvider.autoDispose<List<PartnerUser>>((ref) {
|
||||||
final currentUser = ref.watch(currentUserProvider);
|
User? currentUser;
|
||||||
|
ref.watch(currentUserNotifierProvider).whenData((asyncUser) => currentUser = asyncUser);
|
||||||
|
|
||||||
if (currentUser == null) {
|
if (currentUser == null) {
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
|
|
||||||
return ref.watch(driftPartnerServiceProvider).getSharedWith(currentUser.id);
|
return ref.watch(driftPartnerServiceProvider).getSharedWith(currentUser!.id);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -211,7 +211,7 @@ final remoteAlbumDateRangeProvider = FutureProvider.family<(DateTime, DateTime),
|
|||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
final remoteAlbumSharedUsersProvider = FutureProvider.autoDispose.family<List<UserDto>, String>(
|
final remoteAlbumSharedUsersProvider = FutureProvider.autoDispose.family<List<User>, String>(
|
||||||
(ref, albumId) async {
|
(ref, albumId) async {
|
||||||
final link = ref.keepAlive();
|
final link = ref.keepAlive();
|
||||||
ref.onDispose(() => link.close());
|
ref.onDispose(() => link.close());
|
||||||
|
|||||||
@@ -1,10 +1,11 @@
|
|||||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||||
|
import 'package:immich_mobile/domain/models/user.model.dart';
|
||||||
import 'package:immich_mobile/domain/services/timeline.service.dart';
|
import 'package:immich_mobile/domain/services/timeline.service.dart';
|
||||||
import 'package:immich_mobile/infrastructure/repositories/timeline.repository.dart';
|
import 'package:immich_mobile/infrastructure/repositories/timeline.repository.dart';
|
||||||
import 'package:immich_mobile/presentation/widgets/timeline/timeline.state.dart';
|
import 'package:immich_mobile/presentation/widgets/timeline/timeline.state.dart';
|
||||||
import 'package:immich_mobile/providers/infrastructure/db.provider.dart';
|
import 'package:immich_mobile/providers/infrastructure/db.provider.dart';
|
||||||
import 'package:immich_mobile/providers/infrastructure/setting.provider.dart';
|
import 'package:immich_mobile/providers/infrastructure/setting.provider.dart';
|
||||||
import 'package:immich_mobile/providers/user.provider.dart';
|
import 'package:immich_mobile/providers/infrastructure/user.provider.dart';
|
||||||
|
|
||||||
final timelineRepositoryProvider = Provider<DriftTimelineRepository>(
|
final timelineRepositoryProvider = Provider<DriftTimelineRepository>(
|
||||||
(ref) => DriftTimelineRepository(ref.watch(driftProvider)),
|
(ref) => DriftTimelineRepository(ref.watch(driftProvider)),
|
||||||
@@ -35,7 +36,10 @@ final timelineFactoryProvider = Provider<TimelineFactory>(
|
|||||||
|
|
||||||
final timelineUsersProvider = StreamProvider<List<String>>(
|
final timelineUsersProvider = StreamProvider<List<String>>(
|
||||||
(ref) {
|
(ref) {
|
||||||
final currentUserId = ref.watch(currentUserProvider.select((u) => u?.id));
|
User? user;
|
||||||
|
ref.watch(currentUserNotifierProvider).whenData((asyncUser) => user = asyncUser);
|
||||||
|
|
||||||
|
final currentUserId = user?.id;
|
||||||
if (currentUserId == null) {
|
if (currentUserId == null) {
|
||||||
return Stream.value([]);
|
return Stream.value([]);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import 'package:immich_mobile/infrastructure/repositories/user_api.repository.da
|
|||||||
import 'package:immich_mobile/providers/api.provider.dart';
|
import 'package:immich_mobile/providers/api.provider.dart';
|
||||||
import 'package:immich_mobile/providers/infrastructure/db.provider.dart';
|
import 'package:immich_mobile/providers/infrastructure/db.provider.dart';
|
||||||
import 'package:immich_mobile/providers/infrastructure/partner.provider.dart';
|
import 'package:immich_mobile/providers/infrastructure/partner.provider.dart';
|
||||||
|
import 'package:immich_mobile/providers/infrastructure/setting.provider.dart';
|
||||||
import 'package:immich_mobile/providers/infrastructure/store.provider.dart';
|
import 'package:immich_mobile/providers/infrastructure/store.provider.dart';
|
||||||
import 'package:immich_mobile/repositories/partner_api.repository.dart';
|
import 'package:immich_mobile/repositories/partner_api.repository.dart';
|
||||||
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
||||||
@@ -27,7 +28,28 @@ UserService userService(Ref ref) => UserService(
|
|||||||
storeService: ref.watch(storeServiceProvider),
|
storeService: ref.watch(storeServiceProvider),
|
||||||
);
|
);
|
||||||
|
|
||||||
/// Drifts
|
class CurrentUserNotifier extends AsyncNotifier<User?> {
|
||||||
|
@override
|
||||||
|
Future<User?> build() async {
|
||||||
|
return await ref.watch(driftUserServiceProvider).getMyUser();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
final currentUserNotifierProvider = AsyncNotifierProvider<CurrentUserNotifier, User?>(
|
||||||
|
CurrentUserNotifier.new,
|
||||||
|
);
|
||||||
|
|
||||||
|
final driftUserRepositoryProvider = Provider<DriftUserRepository>(
|
||||||
|
(ref) => DriftUserRepository(ref.watch(driftProvider)),
|
||||||
|
);
|
||||||
|
|
||||||
|
final driftUserServiceProvider = Provider<DriftUserService>(
|
||||||
|
(ref) => DriftUserService(
|
||||||
|
ref.watch(driftUserRepositoryProvider),
|
||||||
|
ref.watch(settingsProvider),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
final driftPartnerRepositoryProvider = Provider<DriftPartnerRepository>(
|
final driftPartnerRepositoryProvider = Provider<DriftPartnerRepository>(
|
||||||
(ref) => DriftPartnerRepository(ref.watch(driftProvider)),
|
(ref) => DriftPartnerRepository(ref.watch(driftProvider)),
|
||||||
);
|
);
|
||||||
@@ -39,6 +61,6 @@ final driftPartnerServiceProvider = Provider<DriftPartnerService>(
|
|||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
final partnerUsersProvider = NotifierProvider<PartnerNotifier, List<PartnerUserDto>>(
|
final partnerUsersProvider = NotifierProvider<PartnerNotifier, List<PartnerUser>>(
|
||||||
PartnerNotifier.new,
|
PartnerNotifier.new,
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -95,7 +95,7 @@ class AlbumRepository extends DatabaseRepository {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Future<void> removeUsers(Album album, List<UserDto> users) => txn(
|
Future<void> removeUsers(Album album, List<UserDto> users) => txn(
|
||||||
() => album.sharedUsers.update(unlink: users.map(entity.User.fromDto)),
|
() => album.sharedUsers.update(unlink: users.map(entity.IsarUser.fromDto)),
|
||||||
);
|
);
|
||||||
|
|
||||||
Future<void> addAssets(Album album, List<Asset> assets) => txn(() => album.assets.update(link: assets));
|
Future<void> addAssets(Album album, List<Asset> assets) => txn(() => album.assets.update(link: assets));
|
||||||
@@ -109,8 +109,9 @@ class AlbumRepository extends DatabaseRepository {
|
|||||||
return album;
|
return album;
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> addUsers(Album album, List<UserDto> users) =>
|
Future<void> addUsers(Album album, List<UserDto> users) => txn(
|
||||||
txn(() => album.sharedUsers.update(link: users.map(entity.User.fromDto)));
|
() => album.sharedUsers.update(link: users.map(entity.IsarUser.fromDto)),
|
||||||
|
);
|
||||||
|
|
||||||
Future<void> deleteAllLocal() => txn(() => db.albums.where().localIdIsNotNull().deleteAll());
|
Future<void> deleteAllLocal() => txn(() => db.albums.where().localIdIsNotNull().deleteAll());
|
||||||
|
|
||||||
|
|||||||
@@ -177,10 +177,10 @@ class AlbumApiRepository extends ApiRepository {
|
|||||||
sortOrder: dto.order == AssetOrder.asc ? SortOrder.asc : SortOrder.desc,
|
sortOrder: dto.order == AssetOrder.asc ? SortOrder.asc : SortOrder.desc,
|
||||||
);
|
);
|
||||||
album.remoteAssetCount = dto.assetCount;
|
album.remoteAssetCount = dto.assetCount;
|
||||||
album.owner.value = entity.User.fromDto(UserConverter.fromSimpleUserDto(dto.owner));
|
album.owner.value = entity.IsarUser.fromDto(UserConverter.fromSimpleUserDto(dto.owner));
|
||||||
album.remoteThumbnailAssetId = dto.albumThumbnailAssetId;
|
album.remoteThumbnailAssetId = dto.albumThumbnailAssetId;
|
||||||
final users = dto.albumUsers.map((albumUser) => UserConverter.fromSimpleUserDto(albumUser.user));
|
final users = dto.albumUsers.map((albumUser) => UserConverter.fromSimpleUserDto(albumUser.user));
|
||||||
album.sharedUsers.addAll(users.map(entity.User.fromDto));
|
album.sharedUsers.addAll(users.map(entity.IsarUser.fromDto));
|
||||||
final assets = dto.assets.map(Asset.remote).toList();
|
final assets = dto.assets.map(Asset.remote).toList();
|
||||||
album.assets.addAll(assets);
|
album.assets.addAll(assets);
|
||||||
|
|
||||||
|
|||||||
@@ -99,7 +99,7 @@ class AlbumMediaRepository {
|
|||||||
shared: false,
|
shared: false,
|
||||||
activityEnabled: false,
|
activityEnabled: false,
|
||||||
);
|
);
|
||||||
album.owner.value = User.fromDto(Store.get(StoreKey.currentUser));
|
album.owner.value = IsarUser.fromDto(Store.get(StoreKey.currentUser));
|
||||||
album.localId = assetPathEntity.id;
|
album.localId = assetPathEntity.id;
|
||||||
album.isAll = assetPathEntity.isAll;
|
album.isAll = assetPathEntity.isAll;
|
||||||
return album;
|
return album;
|
||||||
|
|||||||
@@ -43,6 +43,7 @@ class AuthRepository extends DatabaseRepository {
|
|||||||
_drift.remoteAlbumEntity.deleteAll(),
|
_drift.remoteAlbumEntity.deleteAll(),
|
||||||
_drift.remoteAssetEntity.deleteAll(),
|
_drift.remoteAssetEntity.deleteAll(),
|
||||||
_drift.userEntity.deleteAll(),
|
_drift.userEntity.deleteAll(),
|
||||||
|
_drift.authUserEntity.deleteAll(),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
return db.writeTxn(() {
|
return db.writeTxn(() {
|
||||||
@@ -51,7 +52,7 @@ class AuthRepository extends DatabaseRepository {
|
|||||||
db.exifInfos.clear(),
|
db.exifInfos.clear(),
|
||||||
db.albums.clear(),
|
db.albums.clear(),
|
||||||
db.eTags.clear(),
|
db.eTags.clear(),
|
||||||
db.users.clear(),
|
db.isarUsers.clear(),
|
||||||
]);
|
]);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,22 +13,24 @@ class PartnerRepository extends DatabaseRepository {
|
|||||||
const PartnerRepository(super.db);
|
const PartnerRepository(super.db);
|
||||||
|
|
||||||
Future<List<UserDto>> getSharedBy() async {
|
Future<List<UserDto>> getSharedBy() async {
|
||||||
return (await db.users.filter().isPartnerSharedByEqualTo(true).sortById().findAll()).map((u) => u.toDto()).toList();
|
return (await db.isarUsers.filter().isPartnerSharedByEqualTo(true).sortById().findAll())
|
||||||
|
.map((u) => u.toDto())
|
||||||
|
.toList();
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<List<UserDto>> getSharedWith() async {
|
Future<List<UserDto>> getSharedWith() async {
|
||||||
return (await db.users.filter().isPartnerSharedWithEqualTo(true).sortById().findAll())
|
return (await db.isarUsers.filter().isPartnerSharedWithEqualTo(true).sortById().findAll())
|
||||||
.map((u) => u.toDto())
|
.map((u) => u.toDto())
|
||||||
.toList();
|
.toList();
|
||||||
}
|
}
|
||||||
|
|
||||||
Stream<List<UserDto>> watchSharedBy() {
|
Stream<List<UserDto>> watchSharedBy() {
|
||||||
return (db.users.filter().isPartnerSharedByEqualTo(true).sortById().watch())
|
return (db.isarUsers.filter().isPartnerSharedByEqualTo(true).sortById().watch())
|
||||||
.map((users) => users.map((u) => u.toDto()).toList());
|
.map((users) => users.map((u) => u.toDto()).toList());
|
||||||
}
|
}
|
||||||
|
|
||||||
Stream<List<UserDto>> watchSharedWith() {
|
Stream<List<UserDto>> watchSharedWith() {
|
||||||
return (db.users.filter().isPartnerSharedWithEqualTo(true).sortById().watch())
|
return (db.isarUsers.filter().isPartnerSharedWithEqualTo(true).sortById().watch())
|
||||||
.map((users) => users.map((u) => u.toDto()).toList());
|
.map((users) => users.map((u) => u.toDto()).toList());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,11 +15,11 @@ class TimelineRepository extends DatabaseRepository {
|
|||||||
const TimelineRepository(super.db);
|
const TimelineRepository(super.db);
|
||||||
|
|
||||||
Future<List<String>> getTimelineUserIds(String id) {
|
Future<List<String>> getTimelineUserIds(String id) {
|
||||||
return db.users.filter().inTimelineEqualTo(true).or().idEqualTo(id).idProperty().findAll();
|
return db.isarUsers.filter().inTimelineEqualTo(true).or().idEqualTo(id).idProperty().findAll();
|
||||||
}
|
}
|
||||||
|
|
||||||
Stream<List<String>> watchTimelineUsers(String id) {
|
Stream<List<String>> watchTimelineUsers(String id) {
|
||||||
return db.users.filter().inTimelineEqualTo(true).or().idEqualTo(id).idProperty().watch();
|
return db.isarUsers.filter().inTimelineEqualTo(true).or().idEqualTo(id).idProperty().watch();
|
||||||
}
|
}
|
||||||
|
|
||||||
Stream<RenderList> watchArchiveTimeline(String userId) {
|
Stream<RenderList> watchArchiveTimeline(String userId) {
|
||||||
|
|||||||
@@ -893,7 +893,7 @@ class DriftMemoryRouteArgs {
|
|||||||
class DriftPartnerDetailRoute extends PageRouteInfo<DriftPartnerDetailRouteArgs> {
|
class DriftPartnerDetailRoute extends PageRouteInfo<DriftPartnerDetailRouteArgs> {
|
||||||
DriftPartnerDetailRoute({
|
DriftPartnerDetailRoute({
|
||||||
Key? key,
|
Key? key,
|
||||||
required PartnerUserDto partner,
|
required PartnerUser partner,
|
||||||
List<PageRouteInfo>? children,
|
List<PageRouteInfo>? children,
|
||||||
}) : super(
|
}) : super(
|
||||||
DriftPartnerDetailRoute.name,
|
DriftPartnerDetailRoute.name,
|
||||||
@@ -917,7 +917,7 @@ class DriftPartnerDetailRouteArgs {
|
|||||||
|
|
||||||
final Key? key;
|
final Key? key;
|
||||||
|
|
||||||
final PartnerUserDto partner;
|
final PartnerUser partner;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String toString() {
|
String toString() {
|
||||||
|
|||||||
@@ -347,7 +347,7 @@ class AlbumService {
|
|||||||
userId: user.id,
|
userId: user.id,
|
||||||
);
|
);
|
||||||
|
|
||||||
album.sharedUsers.remove(entity.User.fromDto(user));
|
album.sharedUsers.remove(entity.IsarUser.fromDto(user));
|
||||||
await _albumRepository.removeUsers(album, [user]);
|
await _albumRepository.removeUsers(album, [user]);
|
||||||
final a = await _albumRepository.get(album.id);
|
final a = await _albumRepository.get(album.id);
|
||||||
// trigger watcher
|
// trigger watcher
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ class EntityService {
|
|||||||
if (ownerId != null) {
|
if (ownerId != null) {
|
||||||
// replace owner with user from database
|
// replace owner with user from database
|
||||||
final user = await _isarUserRepository.getByUserId(ownerId);
|
final user = await _isarUserRepository.getByUserId(ownerId);
|
||||||
album.owner.value = user == null ? null : User.fromDto(user);
|
album.owner.value = user == null ? null : IsarUser.fromDto(user);
|
||||||
}
|
}
|
||||||
final thumbnailAssetId = album.remoteThumbnailAssetId ?? album.thumbnail.value?.remoteId;
|
final thumbnailAssetId = album.remoteThumbnailAssetId ?? album.thumbnail.value?.remoteId;
|
||||||
if (thumbnailAssetId != null) {
|
if (thumbnailAssetId != null) {
|
||||||
@@ -29,7 +29,7 @@ class EntityService {
|
|||||||
// replace all users with users from database
|
// replace all users with users from database
|
||||||
final users = await _isarUserRepository.getByUserIds(album.remoteUsers.map((user) => user.id).toList());
|
final users = await _isarUserRepository.getByUserIds(album.remoteUsers.map((user) => user.id).toList());
|
||||||
album.sharedUsers.clear();
|
album.sharedUsers.clear();
|
||||||
album.sharedUsers.addAll(users.nonNulls.map(User.fromDto));
|
album.sharedUsers.addAll(users.nonNulls.map(IsarUser.fromDto));
|
||||||
album.shared = true;
|
album.shared = true;
|
||||||
}
|
}
|
||||||
if (album.remoteAssets.isNotEmpty) {
|
if (album.remoteAssets.isNotEmpty) {
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ abstract final class Bootstrap {
|
|||||||
ExifInfoSchema,
|
ExifInfoSchema,
|
||||||
AssetSchema,
|
AssetSchema,
|
||||||
AlbumSchema,
|
AlbumSchema,
|
||||||
UserSchema,
|
IsarUserSchema,
|
||||||
BackupAlbumSchema,
|
BackupAlbumSchema,
|
||||||
DuplicatedAssetSchema,
|
DuplicatedAssetSchema,
|
||||||
LoggerMessageSchema,
|
LoggerMessageSchema,
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ Future<void> migrateDatabaseIfNeeded(Isar db) async {
|
|||||||
final id = value.intValue;
|
final id = value.intValue;
|
||||||
if (id != null) {
|
if (id != null) {
|
||||||
await db.writeTxn(() async {
|
await db.writeTxn(() async {
|
||||||
final user = await db.users.get(id);
|
final user = await db.isarUsers.get(id);
|
||||||
await db.storeValues.put(StoreValue(StoreKey.currentUser.id, strValue: user?.id));
|
await db.storeValues.put(StoreValue(StoreKey.currentUser.id, strValue: user?.id));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -77,7 +77,7 @@ Future<void> _migrateTo(Isar db, int version) async {
|
|||||||
await db.exifInfos.clear();
|
await db.exifInfos.clear();
|
||||||
await db.albums.clear();
|
await db.albums.clear();
|
||||||
await db.eTags.clear();
|
await db.eTags.clear();
|
||||||
await db.users.clear();
|
await db.isarUsers.clear();
|
||||||
});
|
});
|
||||||
await Store.put(StoreKey.version, version);
|
await Store.put(StoreKey.version, version);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import 'package:flutter/material.dart';
|
|||||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||||
import 'package:immich_mobile/providers/infrastructure/current_album.provider.dart';
|
import 'package:immich_mobile/providers/infrastructure/current_album.provider.dart';
|
||||||
import 'package:immich_mobile/providers/infrastructure/remote_album.provider.dart';
|
import 'package:immich_mobile/providers/infrastructure/remote_album.provider.dart';
|
||||||
import 'package:immich_mobile/widgets/common/user_circle_avatar.dart';
|
import 'package:immich_mobile/widgets/common/drift_user_circle_avatar.dart';
|
||||||
|
|
||||||
class RemoteAlbumSharedUserIcons extends ConsumerWidget {
|
class RemoteAlbumSharedUserIcons extends ConsumerWidget {
|
||||||
const RemoteAlbumSharedUserIcons({
|
const RemoteAlbumSharedUserIcons({
|
||||||
@@ -31,7 +31,7 @@ class RemoteAlbumSharedUserIcons extends ConsumerWidget {
|
|||||||
itemBuilder: ((context, index) {
|
itemBuilder: ((context, index) {
|
||||||
return Padding(
|
return Padding(
|
||||||
padding: const EdgeInsets.only(right: 4.0),
|
padding: const EdgeInsets.only(right: 4.0),
|
||||||
child: UserCircleAvatar(
|
child: DriftUserCircleAvatar(
|
||||||
user: sharedUsers[index],
|
user: sharedUsers[index],
|
||||||
radius: 18,
|
radius: 18,
|
||||||
size: 36,
|
size: 36,
|
||||||
|
|||||||
79
mobile/lib/widgets/common/drift_user_circle_avatar.dart
Normal file
79
mobile/lib/widgets/common/drift_user_circle_avatar.dart
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
import 'dart:math';
|
||||||
|
|
||||||
|
import 'package:cached_network_image/cached_network_image.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||||
|
import 'package:immich_mobile/domain/models/store.model.dart';
|
||||||
|
import 'package:immich_mobile/domain/models/user.model.dart';
|
||||||
|
import 'package:immich_mobile/domain/models/user_metadata.model.dart';
|
||||||
|
import 'package:immich_mobile/entities/store.entity.dart';
|
||||||
|
import 'package:immich_mobile/services/api.service.dart';
|
||||||
|
import 'package:immich_mobile/widgets/common/transparent_image.dart';
|
||||||
|
|
||||||
|
class DriftUserCircleAvatar extends ConsumerWidget {
|
||||||
|
final User user;
|
||||||
|
final double radius;
|
||||||
|
final double size;
|
||||||
|
final bool hasBorder;
|
||||||
|
|
||||||
|
const DriftUserCircleAvatar({
|
||||||
|
super.key,
|
||||||
|
this.radius = 22,
|
||||||
|
this.size = 44,
|
||||||
|
this.hasBorder = false,
|
||||||
|
required this.user,
|
||||||
|
});
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context, WidgetRef ref) {
|
||||||
|
// TODO: migrate to default user avatar
|
||||||
|
final userAvatarColor = user.avatarColor?.toColor() ?? AvatarColor.amber.toColor();
|
||||||
|
final profileImageUrl =
|
||||||
|
'${Store.get(StoreKey.serverEndpoint)}/users/${user.id}/profile-image?d=${Random().nextInt(1024)}';
|
||||||
|
|
||||||
|
final textIcon = DefaultTextStyle(
|
||||||
|
style: TextStyle(
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
fontSize: 12,
|
||||||
|
color: userAvatarColor.computeLuminance() > 0.5 ? Colors.black : Colors.white,
|
||||||
|
),
|
||||||
|
child: Text(user.name[0].toUpperCase()),
|
||||||
|
);
|
||||||
|
return Tooltip(
|
||||||
|
message: user.name,
|
||||||
|
child: Container(
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
shape: BoxShape.circle,
|
||||||
|
border: hasBorder
|
||||||
|
? Border.all(
|
||||||
|
color: Colors.grey[500]!,
|
||||||
|
width: 1,
|
||||||
|
)
|
||||||
|
: null,
|
||||||
|
),
|
||||||
|
child: CircleAvatar(
|
||||||
|
backgroundColor: userAvatarColor,
|
||||||
|
radius: radius,
|
||||||
|
child: textIcon,
|
||||||
|
// TODO: Migrate to auth user
|
||||||
|
// child: user.hasProfileImage
|
||||||
|
// ? ClipRRect(
|
||||||
|
// borderRadius: const BorderRadius.all(Radius.circular(50)),
|
||||||
|
// child: CachedNetworkImage(
|
||||||
|
// fit: BoxFit.cover,
|
||||||
|
// cacheKey: profileImageUrl,
|
||||||
|
// width: size,
|
||||||
|
// height: size,
|
||||||
|
// placeholder: (_, __) => Image.memory(kTransparentImage),
|
||||||
|
// imageUrl: profileImageUrl,
|
||||||
|
// httpHeaders: ApiService.getRequestHeaders(),
|
||||||
|
// fadeInDuration: const Duration(milliseconds: 300),
|
||||||
|
// errorWidget: (context, error, stackTrace) => textIcon,
|
||||||
|
// ),
|
||||||
|
// )
|
||||||
|
// : textIcon,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -48,6 +48,7 @@ void main() {
|
|||||||
|
|
||||||
when(() => mockSyncApiRepo.ack(any())).thenAnswer((_) async => {});
|
when(() => mockSyncApiRepo.ack(any())).thenAnswer((_) async => {});
|
||||||
|
|
||||||
|
when(() => mockSyncStreamRepo.updateAuthUsersV1(any())).thenAnswer(successHandler);
|
||||||
when(() => mockSyncStreamRepo.updateUsersV1(any())).thenAnswer(successHandler);
|
when(() => mockSyncStreamRepo.updateUsersV1(any())).thenAnswer(successHandler);
|
||||||
when(() => mockSyncStreamRepo.deleteUsersV1(any())).thenAnswer(successHandler);
|
when(() => mockSyncStreamRepo.deleteUsersV1(any())).thenAnswer(successHandler);
|
||||||
when(() => mockSyncStreamRepo.updatePartnerV1(any())).thenAnswer(successHandler);
|
when(() => mockSyncStreamRepo.updatePartnerV1(any())).thenAnswer(successHandler);
|
||||||
|
|||||||
5
mobile/test/drift/main/generated/schema.dart
generated
5
mobile/test/drift/main/generated/schema.dart
generated
@@ -7,6 +7,7 @@ import 'schema_v1.dart' as v1;
|
|||||||
import 'schema_v2.dart' as v2;
|
import 'schema_v2.dart' as v2;
|
||||||
import 'schema_v3.dart' as v3;
|
import 'schema_v3.dart' as v3;
|
||||||
import 'schema_v4.dart' as v4;
|
import 'schema_v4.dart' as v4;
|
||||||
|
import 'schema_v5.dart' as v5;
|
||||||
|
|
||||||
class GeneratedHelper implements SchemaInstantiationHelper {
|
class GeneratedHelper implements SchemaInstantiationHelper {
|
||||||
@override
|
@override
|
||||||
@@ -20,10 +21,12 @@ class GeneratedHelper implements SchemaInstantiationHelper {
|
|||||||
return v3.DatabaseAtV3(db);
|
return v3.DatabaseAtV3(db);
|
||||||
case 4:
|
case 4:
|
||||||
return v4.DatabaseAtV4(db);
|
return v4.DatabaseAtV4(db);
|
||||||
|
case 5:
|
||||||
|
return v5.DatabaseAtV5(db);
|
||||||
default:
|
default:
|
||||||
throw MissingSchemaException(version, versions);
|
throw MissingSchemaException(version, versions);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static const versions = const [1, 2, 3, 4];
|
static const versions = const [1, 2, 3, 4, 5];
|
||||||
}
|
}
|
||||||
|
|||||||
5935
mobile/test/drift/main/generated/schema_v5.dart
generated
Normal file
5935
mobile/test/drift/main/generated/schema_v5.dart
generated
Normal file
File diff suppressed because it is too large
Load Diff
4
mobile/test/fixtures/album.stub.dart
vendored
4
mobile/test/fixtures/album.stub.dart
vendored
@@ -28,7 +28,7 @@ final class AlbumStub {
|
|||||||
shared: true,
|
shared: true,
|
||||||
activityEnabled: false,
|
activityEnabled: false,
|
||||||
endDate: DateTime(2020),
|
endDate: DateTime(2020),
|
||||||
)..sharedUsers.addAll([User.fromDto(UserStub.admin)]);
|
)..sharedUsers.addAll([IsarUser.fromDto(UserStub.admin)]);
|
||||||
|
|
||||||
static final oneAsset = Album(
|
static final oneAsset = Album(
|
||||||
name: "album-with-single-asset",
|
name: "album-with-single-asset",
|
||||||
@@ -55,7 +55,7 @@ final class AlbumStub {
|
|||||||
)
|
)
|
||||||
..assets.addAll([AssetStub.image1, AssetStub.image2])
|
..assets.addAll([AssetStub.image1, AssetStub.image2])
|
||||||
..activityEnabled = true
|
..activityEnabled = true
|
||||||
..owner.value = User.fromDto(UserStub.admin);
|
..owner.value = IsarUser.fromDto(UserStub.admin);
|
||||||
|
|
||||||
static final create2020end2020Album = Album(
|
static final create2020end2020Album = Album(
|
||||||
name: "create2020update2020Album",
|
name: "create2020update2020Album",
|
||||||
|
|||||||
@@ -96,7 +96,7 @@ void main() {
|
|||||||
await db.writeTxn(() async {
|
await db.writeTxn(() async {
|
||||||
await db.clear();
|
await db.clear();
|
||||||
// Save all assets
|
// Save all assets
|
||||||
await db.users.put(User.fromDto(UserStub.admin));
|
await db.isarUsers.put(IsarUser.fromDto(UserStub.admin));
|
||||||
await db.assets.putAll([AssetStub.image1, AssetStub.image2]);
|
await db.assets.putAll([AssetStub.image1, AssetStub.image2]);
|
||||||
await db.albums.put(AlbumStub.twoAsset);
|
await db.albums.put(AlbumStub.twoAsset);
|
||||||
await AlbumStub.twoAsset.owner.save();
|
await AlbumStub.twoAsset.owner.save();
|
||||||
@@ -104,7 +104,7 @@ void main() {
|
|||||||
});
|
});
|
||||||
expect(db.albums.countSync(), 1);
|
expect(db.albums.countSync(), 1);
|
||||||
expect(db.assets.countSync(), 2);
|
expect(db.assets.countSync(), 2);
|
||||||
expect(db.users.countSync(), 1);
|
expect(db.isarUsers.countSync(), 1);
|
||||||
});
|
});
|
||||||
|
|
||||||
group("App bar", () {
|
group("App bar", () {
|
||||||
|
|||||||
@@ -35,9 +35,9 @@ void main() {
|
|||||||
)
|
)
|
||||||
..remoteThumbnailAssetId = AssetStub.image1.remoteId
|
..remoteThumbnailAssetId = AssetStub.image1.remoteId
|
||||||
..assets.addAll([AssetStub.image1, AssetStub.image1])
|
..assets.addAll([AssetStub.image1, AssetStub.image1])
|
||||||
..owner.value = User.fromDto(UserStub.user1)
|
..owner.value = IsarUser.fromDto(UserStub.user1)
|
||||||
..sharedUsers.addAll(
|
..sharedUsers.addAll(
|
||||||
[User.fromDto(UserStub.admin), User.fromDto(UserStub.admin)],
|
[IsarUser.fromDto(UserStub.admin), IsarUser.fromDto(UserStub.admin)],
|
||||||
);
|
);
|
||||||
|
|
||||||
when(() => userRepository.getByUserId(any())).thenAnswer((_) async => UserStub.admin);
|
when(() => userRepository.getByUserId(any())).thenAnswer((_) async => UserStub.admin);
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ abstract final class TestUtils {
|
|||||||
ExifInfoSchema,
|
ExifInfoSchema,
|
||||||
AssetSchema,
|
AssetSchema,
|
||||||
AlbumSchema,
|
AlbumSchema,
|
||||||
UserSchema,
|
IsarUserSchema,
|
||||||
BackupAlbumSchema,
|
BackupAlbumSchema,
|
||||||
DuplicatedAssetSchema,
|
DuplicatedAssetSchema,
|
||||||
LoggerMessageSchema,
|
LoggerMessageSchema,
|
||||||
|
|||||||
Reference in New Issue
Block a user