ente/lib/models/collection.dart

273 lines
6.5 KiB
Dart
Raw Normal View History

2020-10-09 18:43:59 +00:00
import 'dart:convert';
2022-03-21 09:32:24 +00:00
import 'dart:core';
2020-10-09 18:43:59 +00:00
2022-03-21 09:32:24 +00:00
import 'package:photos/models/magic_metadata.dart';
2020-11-02 14:38:59 +00:00
2020-10-09 18:43:59 +00:00
class Collection {
final int id;
final User? owner;
2020-10-09 18:43:59 +00:00
final String encryptedKey;
final String? keyDecryptionNonce;
2020-10-09 18:43:59 +00:00
final String name;
final String encryptedName;
final String nameDecryptionNonce;
2020-10-09 18:43:59 +00:00
final CollectionType type;
final CollectionAttributes? attributes;
final List<User?>? sharees;
final List<PublicURL?>? publicURLs;
2020-10-31 12:48:41 +00:00
final int updationTime;
final bool isDeleted;
String? mMdEncodedJson;
2022-03-21 09:32:24 +00:00
int mMdVersion = 0;
CollectionMagicMetadata? _mmd;
2022-03-21 09:32:24 +00:00
CollectionMagicMetadata get magicMetadata =>
_mmd ?? CollectionMagicMetadata.fromEncodedJson(mMdEncodedJson ?? '{}');
set magicMetadata(val) => _mmd = val;
2020-10-09 18:43:59 +00:00
Collection(
this.id,
2020-10-31 16:11:43 +00:00
this.owner,
2020-10-09 18:43:59 +00:00
this.encryptedKey,
this.keyDecryptionNonce,
this.name,
this.encryptedName,
this.nameDecryptionNonce,
2020-10-09 18:43:59 +00:00
this.type,
2020-10-21 22:22:09 +00:00
this.attributes,
2020-11-02 14:38:59 +00:00
this.sharees,
this.publicURLs,
2020-10-31 12:48:41 +00:00
this.updationTime, {
this.isDeleted = false,
});
2020-10-09 18:43:59 +00:00
2022-03-21 09:32:24 +00:00
bool isArchived() {
return mMdVersion > 0 && magicMetadata.visibility == visibilityArchive;
2022-03-21 09:32:24 +00:00
}
2020-10-21 22:22:09 +00:00
static CollectionType typeFromString(String type) {
switch (type) {
case "folder":
return CollectionType.folder;
case "favorites":
return CollectionType.favorites;
}
return CollectionType.album;
}
static String typeToString(CollectionType type) {
switch (type) {
case CollectionType.folder:
return "folder";
case CollectionType.favorites:
return "favorites";
default:
return "album";
}
}
2022-06-11 08:23:52 +00:00
Collection copyWith({
int? id,
User? owner,
String? encryptedKey,
String? keyDecryptionNonce,
String? name,
String? encryptedName,
String? nameDecryptionNonce,
CollectionType? type,
CollectionAttributes? attributes,
List<User>? sharees,
List<PublicURL>? publicURLs,
int? updationTime,
bool? isDeleted,
String? mMdEncodedJson,
int? mMdVersion,
2022-06-11 08:23:52 +00:00
}) {
2022-08-29 14:43:31 +00:00
final Collection result = Collection(
2020-11-02 14:38:59 +00:00
id ?? this.id,
owner ?? this.owner,
encryptedKey ?? this.encryptedKey,
keyDecryptionNonce ?? this.keyDecryptionNonce,
name ?? this.name,
encryptedName ?? this.encryptedName,
nameDecryptionNonce ?? this.nameDecryptionNonce,
2020-11-02 14:38:59 +00:00
type ?? this.type,
attributes ?? this.attributes,
sharees ?? this.sharees,
publicURLs ?? this.publicURLs,
2020-11-02 14:38:59 +00:00
updationTime ?? this.updationTime,
isDeleted: isDeleted ?? this.isDeleted,
);
2022-03-21 09:32:24 +00:00
result.mMdVersion = mMdVersion ?? this.mMdVersion;
result.mMdEncodedJson = mMdEncodedJson ?? this.mMdEncodedJson;
return result;
2020-11-02 14:38:59 +00:00
}
2020-10-09 18:43:59 +00:00
Map<String, dynamic> toMap() {
return {
'id': id,
2020-10-31 16:11:43 +00:00
'owner': owner?.toMap(),
2020-10-09 18:43:59 +00:00
'encryptedKey': encryptedKey,
'keyDecryptionNonce': keyDecryptionNonce,
'name': name,
'encryptedName': encryptedName,
'nameDecryptionNonce': nameDecryptionNonce,
'type': typeToString(type),
2020-10-21 22:22:09 +00:00
'attributes': attributes?.toMap(),
'sharees': sharees?.map((x) => x?.toMap()).toList(),
'publicURLs': publicURLs?.map((x) => x?.toMap()).toList(),
2020-10-31 12:48:41 +00:00
'updationTime': updationTime,
2020-11-02 14:38:59 +00:00
'isDeleted': isDeleted,
2020-10-09 18:43:59 +00:00
};
}
factory Collection.fromMap(Map<String, dynamic>? map) {
if (map == null) {
throw Exception('Argument is null');
}
2020-11-02 14:38:59 +00:00
final sharees = (map['sharees'] == null || map['sharees'].length == 0)
2021-07-22 18:41:58 +00:00
? <User>[]
2020-11-02 14:38:59 +00:00
: List<User>.from(map['sharees'].map((x) => User.fromMap(x)));
final publicURLs =
(map['publicURLs'] == null || map['publicURLs'].length == 0)
? <PublicURL>[]
: List<PublicURL>.from(
2022-06-11 08:23:52 +00:00
map['publicURLs'].map((x) => PublicURL.fromMap(x)),
);
2020-10-09 18:43:59 +00:00
return Collection(
map['id'],
2020-11-02 14:38:59 +00:00
User.fromMap(map['owner']),
2020-10-09 18:43:59 +00:00
map['encryptedKey'],
map['keyDecryptionNonce'],
map['name'],
map['encryptedName'],
map['nameDecryptionNonce'],
typeFromString(map['type']),
2020-10-21 22:22:09 +00:00
CollectionAttributes.fromMap(map['attributes']),
2020-11-02 14:38:59 +00:00
sharees,
publicURLs,
2020-10-31 12:48:41 +00:00
map['updationTime'],
isDeleted: map['isDeleted'] ?? false,
2020-10-09 18:43:59 +00:00
);
}
}
2020-10-09 18:43:59 +00:00
enum CollectionType {
folder,
favorites,
album,
}
2020-10-21 22:22:09 +00:00
class CollectionAttributes {
final String? encryptedPath;
final String? pathDecryptionNonce;
final int? version;
2021-01-24 06:12:10 +00:00
2020-10-21 22:22:09 +00:00
CollectionAttributes({
this.encryptedPath,
this.pathDecryptionNonce,
this.version,
2020-10-21 22:22:09 +00:00
});
Map<String, dynamic> toMap() {
2021-07-22 18:41:58 +00:00
final map = <String, dynamic>{};
2020-10-21 22:22:09 +00:00
if (encryptedPath != null) {
map['encryptedPath'] = encryptedPath;
}
if (pathDecryptionNonce != null) {
map['pathDecryptionNonce'] = pathDecryptionNonce;
}
map['version'] = version ?? 0;
2020-10-21 22:22:09 +00:00
return map;
}
factory CollectionAttributes.fromMap(Map<String, dynamic>? map) {
if (map == null) {
throw Exception('Argument is null');
}
2020-10-21 22:22:09 +00:00
return CollectionAttributes(
encryptedPath: map['encryptedPath'],
pathDecryptionNonce: map['pathDecryptionNonce'],
version: map['version'] ?? 0,
2020-10-21 22:22:09 +00:00
);
}
}
2020-10-31 16:11:43 +00:00
2020-11-02 14:38:59 +00:00
class User {
int? id;
2020-10-31 16:11:43 +00:00
String email;
String? name;
2020-10-31 16:11:43 +00:00
2020-11-02 14:38:59 +00:00
User({
2020-10-31 16:11:43 +00:00
this.id,
required this.email,
2020-10-31 16:11:43 +00:00
this.name,
});
Map<String, dynamic> toMap() {
return {
'id': id,
'email': email,
'name': name,
};
}
factory User.fromMap(Map<String, dynamic>? map) {
if (map == null) {
throw Exception('Argument is null');
}
2020-10-31 16:11:43 +00:00
2020-11-02 14:38:59 +00:00
return User(
2020-10-31 16:11:43 +00:00
id: map['id'],
email: map['email'],
name: map['name'],
);
}
String toJson() => json.encode(toMap());
2020-11-02 14:38:59 +00:00
factory User.fromJson(String source) => User.fromMap(json.decode(source));
2020-10-31 16:11:43 +00:00
}
class PublicURL {
String url;
int deviceLimit;
int validTill;
bool enableDownload;
bool passwordEnabled;
2022-06-11 08:23:52 +00:00
PublicURL({
required this.url,
required this.deviceLimit,
required this.validTill,
this.enableDownload = true,
this.passwordEnabled = false,
2022-06-11 08:23:52 +00:00
});
Map<String, dynamic> toMap() {
return {
'url': url,
'deviceLimit': deviceLimit,
'validTill': validTill,
'enableDownload': enableDownload,
2022-02-21 02:13:10 +00:00
'passwordEnabled': passwordEnabled,
};
}
factory PublicURL.fromMap(Map<String, dynamic>? map) {
if (map == null) {
throw Exception('Argument is null');
}
return PublicURL(
url: map['url'],
deviceLimit: map['deviceLimit'],
2022-02-21 02:13:10 +00:00
validTill: map['validTill'] ?? 0,
enableDownload: map['enableDownload'] ?? true,
2022-02-21 02:13:10 +00:00
passwordEnabled: map['passwordEnabled'] ?? false,
);
}
}