diff --git a/client/lib/integrations/download_manager.dart b/client/lib/integrations/download_manager.dart index 7b6e802d..1f0c2699 100644 --- a/client/lib/integrations/download_manager.dart +++ b/client/lib/integrations/download_manager.dart @@ -26,7 +26,7 @@ class DownloadManager extends StateNotifier { Future downloadResource(Resource r) async { int id = account.getPersisted(_keyDownloadTaskId) ?? 1; await account.persist(_keyDownloadTaskId, id + 1); - final task = DownloadTask(id: id, resourceId: r.id, resourceName: r.name, expectedSize: r.size); + final task = DownloadTask(id: id, resourceId: r.id, resourceName: r.name, expectedSize: r.contentSize); RemoveListener? remove; remove = task._statusNotifier.addListener((status) { @@ -53,7 +53,7 @@ class DownloadManager extends StateNotifier { } final sink = output.openWrite(); - final length = response.contentLength ?? r.size; + final length = response.contentLength ?? r.contentSize; int received = 0; final stream = response.stream.map((s) { received += s.length; diff --git a/client/lib/libphylum/actions/action_resource_copy.dart b/client/lib/libphylum/actions/action_resource_copy.dart index 8d8a73fc..660fc6cf 100644 --- a/client/lib/libphylum/actions/action_resource_copy.dart +++ b/client/lib/libphylum/actions/action_resource_copy.dart @@ -95,7 +95,7 @@ class ResourceCopyAction extends PhylumAction with JsonApiAction, ResourceCreate @override FutureOr processResponse(PhylumAccount account, ApiResponse response) async { if (response is PhylumApiSuccessResponse) { - await account.resourceRepository.processResourceResponse(response.data); + await account.resourceRepository.processResourceUpdateResponse(resourceId, response.data); } } diff --git a/client/lib/libphylum/actions/action_resource_mkdir.dart b/client/lib/libphylum/actions/action_resource_mkdir.dart index 152d2a89..78f4ed13 100644 --- a/client/lib/libphylum/actions/action_resource_mkdir.dart +++ b/client/lib/libphylum/actions/action_resource_mkdir.dart @@ -68,7 +68,7 @@ class ResourceMkdirAction extends PhylumAction with JsonApiAction, ResourceCreat @override FutureOr processResponse(PhylumAccount account, ApiResponse response) async { if (response is PhylumApiSuccessResponse) { - await account.resourceRepository.processResourceResponse(response.data); + await account.resourceRepository.processResourceUpdateResponse(resourceId, response.data); } } diff --git a/client/lib/libphylum/actions/action_resource_move.dart b/client/lib/libphylum/actions/action_resource_move.dart index 071a2248..e7848623 100644 --- a/client/lib/libphylum/actions/action_resource_move.dart +++ b/client/lib/libphylum/actions/action_resource_move.dart @@ -105,7 +105,7 @@ class ResourceMoveAction extends PhylumAction with JsonApiAction { @override FutureOr processResponse(PhylumAccount account, ApiResponse response) async { if (response is PhylumApiSuccessResponse) { - await account.resourceRepository.processResourceResponse(response.data); + await account.resourceRepository.processResourceUpdateResponse(resourceId, response.data); } } diff --git a/client/lib/libphylum/actions/action_resource_upload.dart b/client/lib/libphylum/actions/action_resource_upload.dart index 3ac50573..fefe2bba 100644 --- a/client/lib/libphylum/actions/action_resource_upload.dart +++ b/client/lib/libphylum/actions/action_resource_upload.dart @@ -104,7 +104,7 @@ class ResourceUploadAction extends PhylumAction with FileUploadApiAction, Resour @override FutureOr processResponse(PhylumAccount account, ApiResponse response) async { if (response is PhylumApiSuccessResponse) { - await account.resourceRepository.processResourceResponse(response.data); + await account.resourceRepository.processResourceUpdateResponse(resourceId, response.data); } } diff --git a/client/lib/libphylum/db/db.dart b/client/lib/libphylum/db/db.dart index 51e72cea..857c06c3 100644 --- a/client/lib/libphylum/db/db.dart +++ b/client/lib/libphylum/db/db.dart @@ -16,7 +16,7 @@ class AppDatabase extends _$AppDatabase { AppDatabase({required this.id}) : super(_openConnection(id)); @override - int get schemaVersion => 9; + int get schemaVersion => 10; @override MigrationStrategy get migration => MigrationStrategy( diff --git a/client/lib/libphylum/db/db.g.dart b/client/lib/libphylum/db/db.g.dart index 32e8e1a3..acdb7a55 100644 --- a/client/lib/libphylum/db/db.g.dart +++ b/client/lib/libphylum/db/db.g.dart @@ -35,28 +35,18 @@ class $ResourcesTable extends Resources requiredDuringInsert: true, defaultConstraints: GeneratedColumn.constraintIsAlways('CHECK ("dir" IN (0, 1))')); + static const VerificationMeta _createdMeta = + const VerificationMeta('created'); + @override + late final GeneratedColumn created = GeneratedColumn( + 'created', aliasedName, true, + type: DriftSqlType.dateTime, requiredDuringInsert: false); static const VerificationMeta _modifiedMeta = const VerificationMeta('modified'); @override late final GeneratedColumn modified = GeneratedColumn( - 'modified', aliasedName, false, - type: DriftSqlType.dateTime, requiredDuringInsert: true); - static const VerificationMeta _sizeMeta = const VerificationMeta('size'); - @override - late final GeneratedColumn size = GeneratedColumn( - 'size', aliasedName, false, - type: DriftSqlType.int, requiredDuringInsert: true); - static const VerificationMeta _sha256Meta = const VerificationMeta('sha256'); - @override - late final GeneratedColumn sha256 = GeneratedColumn( - 'sha256', aliasedName, false, - type: DriftSqlType.string, requiredDuringInsert: true); - static const VerificationMeta _contentTypeMeta = - const VerificationMeta('contentType'); - @override - late final GeneratedColumn contentType = GeneratedColumn( - 'content_type', aliasedName, false, - type: DriftSqlType.string, requiredDuringInsert: true); + 'modified', aliasedName, true, + type: DriftSqlType.dateTime, requiredDuringInsert: false); static const VerificationMeta _deletedMeta = const VerificationMeta('deleted'); @override @@ -67,24 +57,36 @@ class $ResourcesTable extends Resources defaultConstraints: GeneratedColumn.constraintIsAlways('CHECK ("deleted" IN (0, 1))'), defaultValue: const Constant(false)); - static const VerificationMeta _lastFetchMeta = - const VerificationMeta('lastFetch'); + static const VerificationMeta _contentSizeMeta = + const VerificationMeta('contentSize'); @override - late final GeneratedColumn lastFetch = GeneratedColumn( - 'last_fetch', aliasedName, true, - type: DriftSqlType.dateTime, requiredDuringInsert: false); + late final GeneratedColumn contentSize = GeneratedColumn( + 'content_size', aliasedName, false, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultValue: const Constant(0)); + static const VerificationMeta _contentSha256Meta = + const VerificationMeta('contentSha256'); + @override + late final GeneratedColumn contentSha256 = GeneratedColumn( + 'content_sha256', aliasedName, false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: const Constant("")); + static const VerificationMeta _contentTypeMeta = + const VerificationMeta('contentType'); + @override + late final GeneratedColumn contentType = GeneratedColumn( + 'content_type', aliasedName, false, + type: DriftSqlType.string, + requiredDuringInsert: false, + defaultValue: const Constant("")); static const VerificationMeta _permissionsMeta = const VerificationMeta('permissions'); @override late final GeneratedColumn permissions = GeneratedColumn( 'permissions', aliasedName, true, type: DriftSqlType.string, requiredDuringInsert: false); - static const VerificationMeta _inheritedMeta = - const VerificationMeta('inherited'); - @override - late final GeneratedColumn inherited = GeneratedColumn( - 'inherited', aliasedName, true, - type: DriftSqlType.string, requiredDuringInsert: false); static const VerificationMeta _publinksMeta = const VerificationMeta('publinks'); @override @@ -93,21 +95,27 @@ class $ResourcesTable extends Resources type: DriftSqlType.int, requiredDuringInsert: false, defaultValue: const Constant(0)); + static const VerificationMeta _lastRefreshMeta = + const VerificationMeta('lastRefresh'); + @override + late final GeneratedColumn lastRefresh = GeneratedColumn( + 'last_refresh', aliasedName, true, + type: DriftSqlType.dateTime, requiredDuringInsert: false); @override List get $columns => [ id, parent, name, dir, + created, modified, - size, - sha256, - contentType, deleted, - lastFetch, + contentSize, + contentSha256, + contentType, permissions, - inherited, - publinks + publinks, + lastRefresh ]; @override String get aliasedName => _alias ?? actualTableName; @@ -140,39 +148,35 @@ class $ResourcesTable extends Resources } else if (isInserting) { context.missing(_dirMeta); } + if (data.containsKey('created')) { + context.handle(_createdMeta, + created.isAcceptableOrUnknown(data['created']!, _createdMeta)); + } if (data.containsKey('modified')) { context.handle(_modifiedMeta, modified.isAcceptableOrUnknown(data['modified']!, _modifiedMeta)); - } else if (isInserting) { - context.missing(_modifiedMeta); } - if (data.containsKey('size')) { + if (data.containsKey('deleted')) { + context.handle(_deletedMeta, + deleted.isAcceptableOrUnknown(data['deleted']!, _deletedMeta)); + } + if (data.containsKey('content_size')) { context.handle( - _sizeMeta, size.isAcceptableOrUnknown(data['size']!, _sizeMeta)); - } else if (isInserting) { - context.missing(_sizeMeta); + _contentSizeMeta, + contentSize.isAcceptableOrUnknown( + data['content_size']!, _contentSizeMeta)); } - if (data.containsKey('sha256')) { - context.handle(_sha256Meta, - sha256.isAcceptableOrUnknown(data['sha256']!, _sha256Meta)); - } else if (isInserting) { - context.missing(_sha256Meta); + if (data.containsKey('content_sha256')) { + context.handle( + _contentSha256Meta, + contentSha256.isAcceptableOrUnknown( + data['content_sha256']!, _contentSha256Meta)); } if (data.containsKey('content_type')) { context.handle( _contentTypeMeta, contentType.isAcceptableOrUnknown( data['content_type']!, _contentTypeMeta)); - } else if (isInserting) { - context.missing(_contentTypeMeta); - } - if (data.containsKey('deleted')) { - context.handle(_deletedMeta, - deleted.isAcceptableOrUnknown(data['deleted']!, _deletedMeta)); - } - if (data.containsKey('last_fetch')) { - context.handle(_lastFetchMeta, - lastFetch.isAcceptableOrUnknown(data['last_fetch']!, _lastFetchMeta)); } if (data.containsKey('permissions')) { context.handle( @@ -180,14 +184,16 @@ class $ResourcesTable extends Resources permissions.isAcceptableOrUnknown( data['permissions']!, _permissionsMeta)); } - if (data.containsKey('inherited')) { - context.handle(_inheritedMeta, - inherited.isAcceptableOrUnknown(data['inherited']!, _inheritedMeta)); - } if (data.containsKey('publinks')) { context.handle(_publinksMeta, publinks.isAcceptableOrUnknown(data['publinks']!, _publinksMeta)); } + if (data.containsKey('last_refresh')) { + context.handle( + _lastRefreshMeta, + lastRefresh.isAcceptableOrUnknown( + data['last_refresh']!, _lastRefreshMeta)); + } return context; } @@ -205,24 +211,24 @@ class $ResourcesTable extends Resources .read(DriftSqlType.string, data['${effectivePrefix}name'])!, dir: attachedDatabase.typeMapping .read(DriftSqlType.bool, data['${effectivePrefix}dir'])!, + created: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}created']), modified: attachedDatabase.typeMapping - .read(DriftSqlType.dateTime, data['${effectivePrefix}modified'])!, - size: attachedDatabase.typeMapping - .read(DriftSqlType.int, data['${effectivePrefix}size'])!, - sha256: attachedDatabase.typeMapping - .read(DriftSqlType.string, data['${effectivePrefix}sha256'])!, - contentType: attachedDatabase.typeMapping - .read(DriftSqlType.string, data['${effectivePrefix}content_type'])!, + .read(DriftSqlType.dateTime, data['${effectivePrefix}modified']), deleted: attachedDatabase.typeMapping .read(DriftSqlType.bool, data['${effectivePrefix}deleted'])!, - lastFetch: attachedDatabase.typeMapping - .read(DriftSqlType.dateTime, data['${effectivePrefix}last_fetch']), + contentSize: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}content_size'])!, + contentSha256: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}content_sha256'])!, + contentType: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}content_type'])!, permissions: attachedDatabase.typeMapping .read(DriftSqlType.string, data['${effectivePrefix}permissions']), - inherited: attachedDatabase.typeMapping - .read(DriftSqlType.string, data['${effectivePrefix}inherited']), publinks: attachedDatabase.typeMapping .read(DriftSqlType.int, data['${effectivePrefix}publinks'])!, + lastRefresh: attachedDatabase.typeMapping + .read(DriftSqlType.dateTime, data['${effectivePrefix}last_refresh']), ); } @@ -237,29 +243,29 @@ class Resource extends DataClass implements Insertable { final String? parent; final String name; final bool dir; - final DateTime modified; - final int size; - final String sha256; - final String contentType; + final DateTime? created; + final DateTime? modified; final bool deleted; - final DateTime? lastFetch; + final int contentSize; + final String contentSha256; + final String contentType; final String? permissions; - final String? inherited; final int publinks; + final DateTime? lastRefresh; const Resource( {required this.id, this.parent, required this.name, required this.dir, - required this.modified, - required this.size, - required this.sha256, - required this.contentType, + this.created, + this.modified, required this.deleted, - this.lastFetch, + required this.contentSize, + required this.contentSha256, + required this.contentType, this.permissions, - this.inherited, - required this.publinks}); + required this.publinks, + this.lastRefresh}); @override Map toColumns(bool nullToAbsent) { final map = {}; @@ -269,21 +275,23 @@ class Resource extends DataClass implements Insertable { } map['name'] = Variable(name); map['dir'] = Variable(dir); - map['modified'] = Variable(modified); - map['size'] = Variable(size); - map['sha256'] = Variable(sha256); - map['content_type'] = Variable(contentType); - map['deleted'] = Variable(deleted); - if (!nullToAbsent || lastFetch != null) { - map['last_fetch'] = Variable(lastFetch); + if (!nullToAbsent || created != null) { + map['created'] = Variable(created); } + if (!nullToAbsent || modified != null) { + map['modified'] = Variable(modified); + } + map['deleted'] = Variable(deleted); + map['content_size'] = Variable(contentSize); + map['content_sha256'] = Variable(contentSha256); + map['content_type'] = Variable(contentType); if (!nullToAbsent || permissions != null) { map['permissions'] = Variable(permissions); } - if (!nullToAbsent || inherited != null) { - map['inherited'] = Variable(inherited); - } map['publinks'] = Variable(publinks); + if (!nullToAbsent || lastRefresh != null) { + map['last_refresh'] = Variable(lastRefresh); + } return map; } @@ -294,21 +302,23 @@ class Resource extends DataClass implements Insertable { parent == null && nullToAbsent ? const Value.absent() : Value(parent), name: Value(name), dir: Value(dir), - modified: Value(modified), - size: Value(size), - sha256: Value(sha256), - contentType: Value(contentType), - deleted: Value(deleted), - lastFetch: lastFetch == null && nullToAbsent + created: created == null && nullToAbsent ? const Value.absent() - : Value(lastFetch), + : Value(created), + modified: modified == null && nullToAbsent + ? const Value.absent() + : Value(modified), + deleted: Value(deleted), + contentSize: Value(contentSize), + contentSha256: Value(contentSha256), + contentType: Value(contentType), permissions: permissions == null && nullToAbsent ? const Value.absent() : Value(permissions), - inherited: inherited == null && nullToAbsent - ? const Value.absent() - : Value(inherited), publinks: Value(publinks), + lastRefresh: lastRefresh == null && nullToAbsent + ? const Value.absent() + : Value(lastRefresh), ); } @@ -320,15 +330,15 @@ class Resource extends DataClass implements Insertable { parent: serializer.fromJson(json['parent']), name: serializer.fromJson(json['name']), dir: serializer.fromJson(json['dir']), - modified: serializer.fromJson(json['modified']), - size: serializer.fromJson(json['size']), - sha256: serializer.fromJson(json['sha256']), - contentType: serializer.fromJson(json['contentType']), + created: serializer.fromJson(json['created']), + modified: serializer.fromJson(json['modified']), deleted: serializer.fromJson(json['deleted']), - lastFetch: serializer.fromJson(json['lastFetch']), + contentSize: serializer.fromJson(json['contentSize']), + contentSha256: serializer.fromJson(json['contentSha256']), + contentType: serializer.fromJson(json['contentType']), permissions: serializer.fromJson(json['permissions']), - inherited: serializer.fromJson(json['inherited']), publinks: serializer.fromJson(json['publinks']), + lastRefresh: serializer.fromJson(json['lastRefresh']), ); } @override @@ -339,15 +349,15 @@ class Resource extends DataClass implements Insertable { 'parent': serializer.toJson(parent), 'name': serializer.toJson(name), 'dir': serializer.toJson(dir), - 'modified': serializer.toJson(modified), - 'size': serializer.toJson(size), - 'sha256': serializer.toJson(sha256), - 'contentType': serializer.toJson(contentType), + 'created': serializer.toJson(created), + 'modified': serializer.toJson(modified), 'deleted': serializer.toJson(deleted), - 'lastFetch': serializer.toJson(lastFetch), + 'contentSize': serializer.toJson(contentSize), + 'contentSha256': serializer.toJson(contentSha256), + 'contentType': serializer.toJson(contentType), 'permissions': serializer.toJson(permissions), - 'inherited': serializer.toJson(inherited), 'publinks': serializer.toJson(publinks), + 'lastRefresh': serializer.toJson(lastRefresh), }; } @@ -356,29 +366,29 @@ class Resource extends DataClass implements Insertable { Value parent = const Value.absent(), String? name, bool? dir, - DateTime? modified, - int? size, - String? sha256, - String? contentType, + Value created = const Value.absent(), + Value modified = const Value.absent(), bool? deleted, - Value lastFetch = const Value.absent(), + int? contentSize, + String? contentSha256, + String? contentType, Value permissions = const Value.absent(), - Value inherited = const Value.absent(), - int? publinks}) => + int? publinks, + Value lastRefresh = const Value.absent()}) => Resource( id: id ?? this.id, parent: parent.present ? parent.value : this.parent, name: name ?? this.name, dir: dir ?? this.dir, - modified: modified ?? this.modified, - size: size ?? this.size, - sha256: sha256 ?? this.sha256, - contentType: contentType ?? this.contentType, + created: created.present ? created.value : this.created, + modified: modified.present ? modified.value : this.modified, deleted: deleted ?? this.deleted, - lastFetch: lastFetch.present ? lastFetch.value : this.lastFetch, + contentSize: contentSize ?? this.contentSize, + contentSha256: contentSha256 ?? this.contentSha256, + contentType: contentType ?? this.contentType, permissions: permissions.present ? permissions.value : this.permissions, - inherited: inherited.present ? inherited.value : this.inherited, publinks: publinks ?? this.publinks, + lastRefresh: lastRefresh.present ? lastRefresh.value : this.lastRefresh, ); Resource copyWithCompanion(ResourcesCompanion data) { return Resource( @@ -386,17 +396,21 @@ class Resource extends DataClass implements Insertable { parent: data.parent.present ? data.parent.value : this.parent, name: data.name.present ? data.name.value : this.name, dir: data.dir.present ? data.dir.value : this.dir, + created: data.created.present ? data.created.value : this.created, modified: data.modified.present ? data.modified.value : this.modified, - size: data.size.present ? data.size.value : this.size, - sha256: data.sha256.present ? data.sha256.value : this.sha256, + deleted: data.deleted.present ? data.deleted.value : this.deleted, + contentSize: + data.contentSize.present ? data.contentSize.value : this.contentSize, + contentSha256: data.contentSha256.present + ? data.contentSha256.value + : this.contentSha256, contentType: data.contentType.present ? data.contentType.value : this.contentType, - deleted: data.deleted.present ? data.deleted.value : this.deleted, - lastFetch: data.lastFetch.present ? data.lastFetch.value : this.lastFetch, permissions: data.permissions.present ? data.permissions.value : this.permissions, - inherited: data.inherited.present ? data.inherited.value : this.inherited, publinks: data.publinks.present ? data.publinks.value : this.publinks, + lastRefresh: + data.lastRefresh.present ? data.lastRefresh.value : this.lastRefresh, ); } @@ -407,22 +421,34 @@ class Resource extends DataClass implements Insertable { ..write('parent: $parent, ') ..write('name: $name, ') ..write('dir: $dir, ') + ..write('created: $created, ') ..write('modified: $modified, ') - ..write('size: $size, ') - ..write('sha256: $sha256, ') - ..write('contentType: $contentType, ') ..write('deleted: $deleted, ') - ..write('lastFetch: $lastFetch, ') + ..write('contentSize: $contentSize, ') + ..write('contentSha256: $contentSha256, ') + ..write('contentType: $contentType, ') ..write('permissions: $permissions, ') - ..write('inherited: $inherited, ') - ..write('publinks: $publinks') + ..write('publinks: $publinks, ') + ..write('lastRefresh: $lastRefresh') ..write(')')) .toString(); } @override - int get hashCode => Object.hash(id, parent, name, dir, modified, size, sha256, - contentType, deleted, lastFetch, permissions, inherited, publinks); + int get hashCode => Object.hash( + id, + parent, + name, + dir, + created, + modified, + deleted, + contentSize, + contentSha256, + contentType, + permissions, + publinks, + lastRefresh); @override bool operator ==(Object other) => identical(this, other) || @@ -431,15 +457,15 @@ class Resource extends DataClass implements Insertable { other.parent == this.parent && other.name == this.name && other.dir == this.dir && + other.created == this.created && other.modified == this.modified && - other.size == this.size && - other.sha256 == this.sha256 && - other.contentType == this.contentType && other.deleted == this.deleted && - other.lastFetch == this.lastFetch && + other.contentSize == this.contentSize && + other.contentSha256 == this.contentSha256 && + other.contentType == this.contentType && other.permissions == this.permissions && - other.inherited == this.inherited && - other.publinks == this.publinks); + other.publinks == this.publinks && + other.lastRefresh == this.lastRefresh); } class ResourcesCompanion extends UpdateCompanion { @@ -447,30 +473,30 @@ class ResourcesCompanion extends UpdateCompanion { final Value parent; final Value name; final Value dir; - final Value modified; - final Value size; - final Value sha256; - final Value contentType; + final Value created; + final Value modified; final Value deleted; - final Value lastFetch; + final Value contentSize; + final Value contentSha256; + final Value contentType; final Value permissions; - final Value inherited; final Value publinks; + final Value lastRefresh; final Value rowid; const ResourcesCompanion({ this.id = const Value.absent(), this.parent = const Value.absent(), this.name = const Value.absent(), this.dir = const Value.absent(), + this.created = const Value.absent(), this.modified = const Value.absent(), - this.size = const Value.absent(), - this.sha256 = const Value.absent(), - this.contentType = const Value.absent(), this.deleted = const Value.absent(), - this.lastFetch = const Value.absent(), + this.contentSize = const Value.absent(), + this.contentSha256 = const Value.absent(), + this.contentType = const Value.absent(), this.permissions = const Value.absent(), - this.inherited = const Value.absent(), this.publinks = const Value.absent(), + this.lastRefresh = const Value.absent(), this.rowid = const Value.absent(), }); ResourcesCompanion.insert({ @@ -478,37 +504,33 @@ class ResourcesCompanion extends UpdateCompanion { this.parent = const Value.absent(), required String name, required bool dir, - required DateTime modified, - required int size, - required String sha256, - required String contentType, + this.created = const Value.absent(), + this.modified = const Value.absent(), this.deleted = const Value.absent(), - this.lastFetch = const Value.absent(), + this.contentSize = const Value.absent(), + this.contentSha256 = const Value.absent(), + this.contentType = const Value.absent(), this.permissions = const Value.absent(), - this.inherited = const Value.absent(), this.publinks = const Value.absent(), + this.lastRefresh = const Value.absent(), this.rowid = const Value.absent(), }) : id = Value(id), name = Value(name), - dir = Value(dir), - modified = Value(modified), - size = Value(size), - sha256 = Value(sha256), - contentType = Value(contentType); + dir = Value(dir); static Insertable custom({ Expression? id, Expression? parent, Expression? name, Expression? dir, + Expression? created, Expression? modified, - Expression? size, - Expression? sha256, - Expression? contentType, Expression? deleted, - Expression? lastFetch, + Expression? contentSize, + Expression? contentSha256, + Expression? contentType, Expression? permissions, - Expression? inherited, Expression? publinks, + Expression? lastRefresh, Expression? rowid, }) { return RawValuesInsertable({ @@ -516,15 +538,15 @@ class ResourcesCompanion extends UpdateCompanion { if (parent != null) 'parent': parent, if (name != null) 'name': name, if (dir != null) 'dir': dir, + if (created != null) 'created': created, if (modified != null) 'modified': modified, - if (size != null) 'size': size, - if (sha256 != null) 'sha256': sha256, - if (contentType != null) 'content_type': contentType, if (deleted != null) 'deleted': deleted, - if (lastFetch != null) 'last_fetch': lastFetch, + if (contentSize != null) 'content_size': contentSize, + if (contentSha256 != null) 'content_sha256': contentSha256, + if (contentType != null) 'content_type': contentType, if (permissions != null) 'permissions': permissions, - if (inherited != null) 'inherited': inherited, if (publinks != null) 'publinks': publinks, + if (lastRefresh != null) 'last_refresh': lastRefresh, if (rowid != null) 'rowid': rowid, }); } @@ -534,30 +556,30 @@ class ResourcesCompanion extends UpdateCompanion { Value? parent, Value? name, Value? dir, - Value? modified, - Value? size, - Value? sha256, - Value? contentType, + Value? created, + Value? modified, Value? deleted, - Value? lastFetch, + Value? contentSize, + Value? contentSha256, + Value? contentType, Value? permissions, - Value? inherited, Value? publinks, + Value? lastRefresh, Value? rowid}) { return ResourcesCompanion( id: id ?? this.id, parent: parent ?? this.parent, name: name ?? this.name, dir: dir ?? this.dir, + created: created ?? this.created, modified: modified ?? this.modified, - size: size ?? this.size, - sha256: sha256 ?? this.sha256, - contentType: contentType ?? this.contentType, deleted: deleted ?? this.deleted, - lastFetch: lastFetch ?? this.lastFetch, + contentSize: contentSize ?? this.contentSize, + contentSha256: contentSha256 ?? this.contentSha256, + contentType: contentType ?? this.contentType, permissions: permissions ?? this.permissions, - inherited: inherited ?? this.inherited, publinks: publinks ?? this.publinks, + lastRefresh: lastRefresh ?? this.lastRefresh, rowid: rowid ?? this.rowid, ); } @@ -577,33 +599,33 @@ class ResourcesCompanion extends UpdateCompanion { if (dir.present) { map['dir'] = Variable(dir.value); } + if (created.present) { + map['created'] = Variable(created.value); + } if (modified.present) { map['modified'] = Variable(modified.value); } - if (size.present) { - map['size'] = Variable(size.value); - } - if (sha256.present) { - map['sha256'] = Variable(sha256.value); - } - if (contentType.present) { - map['content_type'] = Variable(contentType.value); - } if (deleted.present) { map['deleted'] = Variable(deleted.value); } - if (lastFetch.present) { - map['last_fetch'] = Variable(lastFetch.value); + if (contentSize.present) { + map['content_size'] = Variable(contentSize.value); + } + if (contentSha256.present) { + map['content_sha256'] = Variable(contentSha256.value); + } + if (contentType.present) { + map['content_type'] = Variable(contentType.value); } if (permissions.present) { map['permissions'] = Variable(permissions.value); } - if (inherited.present) { - map['inherited'] = Variable(inherited.value); - } if (publinks.present) { map['publinks'] = Variable(publinks.value); } + if (lastRefresh.present) { + map['last_refresh'] = Variable(lastRefresh.value); + } if (rowid.present) { map['rowid'] = Variable(rowid.value); } @@ -617,15 +639,15 @@ class ResourcesCompanion extends UpdateCompanion { ..write('parent: $parent, ') ..write('name: $name, ') ..write('dir: $dir, ') + ..write('created: $created, ') ..write('modified: $modified, ') - ..write('size: $size, ') - ..write('sha256: $sha256, ') - ..write('contentType: $contentType, ') ..write('deleted: $deleted, ') - ..write('lastFetch: $lastFetch, ') + ..write('contentSize: $contentSize, ') + ..write('contentSha256: $contentSha256, ') + ..write('contentType: $contentType, ') ..write('permissions: $permissions, ') - ..write('inherited: $inherited, ') ..write('publinks: $publinks, ') + ..write('lastRefresh: $lastRefresh, ') ..write('rowid: $rowid') ..write(')')) .toString(); @@ -648,15 +670,15 @@ typedef $$ResourcesTableCreateCompanionBuilder = ResourcesCompanion Function({ Value parent, required String name, required bool dir, - required DateTime modified, - required int size, - required String sha256, - required String contentType, + Value created, + Value modified, Value deleted, - Value lastFetch, + Value contentSize, + Value contentSha256, + Value contentType, Value permissions, - Value inherited, Value publinks, + Value lastRefresh, Value rowid, }); typedef $$ResourcesTableUpdateCompanionBuilder = ResourcesCompanion Function({ @@ -664,15 +686,15 @@ typedef $$ResourcesTableUpdateCompanionBuilder = ResourcesCompanion Function({ Value parent, Value name, Value dir, - Value modified, - Value size, - Value sha256, - Value contentType, + Value created, + Value modified, Value deleted, - Value lastFetch, + Value contentSize, + Value contentSha256, + Value contentType, Value permissions, - Value inherited, Value publinks, + Value lastRefresh, Value rowid, }); @@ -712,33 +734,33 @@ class $$ResourcesTableFilterComposer ColumnFilters get dir => $composableBuilder( column: $table.dir, builder: (column) => ColumnFilters(column)); + ColumnFilters get created => $composableBuilder( + column: $table.created, builder: (column) => ColumnFilters(column)); + ColumnFilters get modified => $composableBuilder( column: $table.modified, builder: (column) => ColumnFilters(column)); - ColumnFilters get size => $composableBuilder( - column: $table.size, builder: (column) => ColumnFilters(column)); - - ColumnFilters get sha256 => $composableBuilder( - column: $table.sha256, builder: (column) => ColumnFilters(column)); - - ColumnFilters get contentType => $composableBuilder( - column: $table.contentType, builder: (column) => ColumnFilters(column)); - ColumnFilters get deleted => $composableBuilder( column: $table.deleted, builder: (column) => ColumnFilters(column)); - ColumnFilters get lastFetch => $composableBuilder( - column: $table.lastFetch, builder: (column) => ColumnFilters(column)); + ColumnFilters get contentSize => $composableBuilder( + column: $table.contentSize, builder: (column) => ColumnFilters(column)); + + ColumnFilters get contentSha256 => $composableBuilder( + column: $table.contentSha256, builder: (column) => ColumnFilters(column)); + + ColumnFilters get contentType => $composableBuilder( + column: $table.contentType, builder: (column) => ColumnFilters(column)); ColumnFilters get permissions => $composableBuilder( column: $table.permissions, builder: (column) => ColumnFilters(column)); - ColumnFilters get inherited => $composableBuilder( - column: $table.inherited, builder: (column) => ColumnFilters(column)); - ColumnFilters get publinks => $composableBuilder( column: $table.publinks, builder: (column) => ColumnFilters(column)); + ColumnFilters get lastRefresh => $composableBuilder( + column: $table.lastRefresh, builder: (column) => ColumnFilters(column)); + $$ResourcesTableFilterComposer get parent { final $$ResourcesTableFilterComposer composer = $composerBuilder( composer: this, @@ -778,33 +800,34 @@ class $$ResourcesTableOrderingComposer ColumnOrderings get dir => $composableBuilder( column: $table.dir, builder: (column) => ColumnOrderings(column)); + ColumnOrderings get created => $composableBuilder( + column: $table.created, builder: (column) => ColumnOrderings(column)); + ColumnOrderings get modified => $composableBuilder( column: $table.modified, builder: (column) => ColumnOrderings(column)); - ColumnOrderings get size => $composableBuilder( - column: $table.size, builder: (column) => ColumnOrderings(column)); - - ColumnOrderings get sha256 => $composableBuilder( - column: $table.sha256, builder: (column) => ColumnOrderings(column)); - - ColumnOrderings get contentType => $composableBuilder( - column: $table.contentType, builder: (column) => ColumnOrderings(column)); - ColumnOrderings get deleted => $composableBuilder( column: $table.deleted, builder: (column) => ColumnOrderings(column)); - ColumnOrderings get lastFetch => $composableBuilder( - column: $table.lastFetch, builder: (column) => ColumnOrderings(column)); + ColumnOrderings get contentSize => $composableBuilder( + column: $table.contentSize, builder: (column) => ColumnOrderings(column)); + + ColumnOrderings get contentSha256 => $composableBuilder( + column: $table.contentSha256, + builder: (column) => ColumnOrderings(column)); + + ColumnOrderings get contentType => $composableBuilder( + column: $table.contentType, builder: (column) => ColumnOrderings(column)); ColumnOrderings get permissions => $composableBuilder( column: $table.permissions, builder: (column) => ColumnOrderings(column)); - ColumnOrderings get inherited => $composableBuilder( - column: $table.inherited, builder: (column) => ColumnOrderings(column)); - ColumnOrderings get publinks => $composableBuilder( column: $table.publinks, builder: (column) => ColumnOrderings(column)); + ColumnOrderings get lastRefresh => $composableBuilder( + column: $table.lastRefresh, builder: (column) => ColumnOrderings(column)); + $$ResourcesTableOrderingComposer get parent { final $$ResourcesTableOrderingComposer composer = $composerBuilder( composer: this, @@ -844,33 +867,33 @@ class $$ResourcesTableAnnotationComposer GeneratedColumn get dir => $composableBuilder(column: $table.dir, builder: (column) => column); + GeneratedColumn get created => + $composableBuilder(column: $table.created, builder: (column) => column); + GeneratedColumn get modified => $composableBuilder(column: $table.modified, builder: (column) => column); - GeneratedColumn get size => - $composableBuilder(column: $table.size, builder: (column) => column); - - GeneratedColumn get sha256 => - $composableBuilder(column: $table.sha256, builder: (column) => column); - - GeneratedColumn get contentType => $composableBuilder( - column: $table.contentType, builder: (column) => column); - GeneratedColumn get deleted => $composableBuilder(column: $table.deleted, builder: (column) => column); - GeneratedColumn get lastFetch => - $composableBuilder(column: $table.lastFetch, builder: (column) => column); + GeneratedColumn get contentSize => $composableBuilder( + column: $table.contentSize, builder: (column) => column); + + GeneratedColumn get contentSha256 => $composableBuilder( + column: $table.contentSha256, builder: (column) => column); + + GeneratedColumn get contentType => $composableBuilder( + column: $table.contentType, builder: (column) => column); GeneratedColumn get permissions => $composableBuilder( column: $table.permissions, builder: (column) => column); - GeneratedColumn get inherited => - $composableBuilder(column: $table.inherited, builder: (column) => column); - GeneratedColumn get publinks => $composableBuilder(column: $table.publinks, builder: (column) => column); + GeneratedColumn get lastRefresh => $composableBuilder( + column: $table.lastRefresh, builder: (column) => column); + $$ResourcesTableAnnotationComposer get parent { final $$ResourcesTableAnnotationComposer composer = $composerBuilder( composer: this, @@ -919,15 +942,15 @@ class $$ResourcesTableTableManager extends RootTableManager< Value parent = const Value.absent(), Value name = const Value.absent(), Value dir = const Value.absent(), - Value modified = const Value.absent(), - Value size = const Value.absent(), - Value sha256 = const Value.absent(), - Value contentType = const Value.absent(), + Value created = const Value.absent(), + Value modified = const Value.absent(), Value deleted = const Value.absent(), - Value lastFetch = const Value.absent(), + Value contentSize = const Value.absent(), + Value contentSha256 = const Value.absent(), + Value contentType = const Value.absent(), Value permissions = const Value.absent(), - Value inherited = const Value.absent(), Value publinks = const Value.absent(), + Value lastRefresh = const Value.absent(), Value rowid = const Value.absent(), }) => ResourcesCompanion( @@ -935,15 +958,15 @@ class $$ResourcesTableTableManager extends RootTableManager< parent: parent, name: name, dir: dir, + created: created, modified: modified, - size: size, - sha256: sha256, - contentType: contentType, deleted: deleted, - lastFetch: lastFetch, + contentSize: contentSize, + contentSha256: contentSha256, + contentType: contentType, permissions: permissions, - inherited: inherited, publinks: publinks, + lastRefresh: lastRefresh, rowid: rowid, ), createCompanionCallback: ({ @@ -951,15 +974,15 @@ class $$ResourcesTableTableManager extends RootTableManager< Value parent = const Value.absent(), required String name, required bool dir, - required DateTime modified, - required int size, - required String sha256, - required String contentType, + Value created = const Value.absent(), + Value modified = const Value.absent(), Value deleted = const Value.absent(), - Value lastFetch = const Value.absent(), + Value contentSize = const Value.absent(), + Value contentSha256 = const Value.absent(), + Value contentType = const Value.absent(), Value permissions = const Value.absent(), - Value inherited = const Value.absent(), Value publinks = const Value.absent(), + Value lastRefresh = const Value.absent(), Value rowid = const Value.absent(), }) => ResourcesCompanion.insert( @@ -967,15 +990,15 @@ class $$ResourcesTableTableManager extends RootTableManager< parent: parent, name: name, dir: dir, + created: created, modified: modified, - size: size, - sha256: sha256, - contentType: contentType, deleted: deleted, - lastFetch: lastFetch, + contentSize: contentSize, + contentSha256: contentSha256, + contentType: contentType, permissions: permissions, - inherited: inherited, publinks: publinks, + lastRefresh: lastRefresh, rowid: rowid, ), withReferenceMapper: (p0) => p0 diff --git a/client/lib/libphylum/db/resources.dart b/client/lib/libphylum/db/resources.dart index ee9a41ab..c8e05f0c 100644 --- a/client/lib/libphylum/db/resources.dart +++ b/client/lib/libphylum/db/resources.dart @@ -5,15 +5,15 @@ class Resources extends Table { TextColumn get parent => text().nullable().references(Resources, #id)(); TextColumn get name => text()(); BoolColumn get dir => boolean()(); - DateTimeColumn get modified => dateTime()(); - IntColumn get size => integer()(); - TextColumn get sha256 => text()(); - TextColumn get contentType => text()(); + DateTimeColumn get created => dateTime().nullable()(); + DateTimeColumn get modified => dateTime().nullable()(); BoolColumn get deleted => boolean().withDefault(const Constant(false))(); - DateTimeColumn get lastFetch => dateTime().nullable()(); + IntColumn get contentSize => integer().withDefault(const Constant(0))(); + TextColumn get contentSha256 => text().withDefault(const Constant(""))(); + TextColumn get contentType => text().withDefault(const Constant(""))(); TextColumn get permissions => text().nullable()(); - TextColumn get inherited => text().nullable()(); IntColumn get publinks => integer().withDefault(const Constant(0))(); + DateTimeColumn get lastRefresh => dateTime().nullable()(); @override Set get primaryKey => {id}; diff --git a/client/lib/libphylum/repositories/resource_repository.dart b/client/lib/libphylum/repositories/resource_repository.dart index 89bae120..65bdb911 100644 --- a/client/lib/libphylum/repositories/resource_repository.dart +++ b/client/lib/libphylum/repositories/resource_repository.dart @@ -53,10 +53,12 @@ class ResourceRepository { name: name, parent: Value(parent), dir: dir, - modified: DateTime.now(), - size: 0, - sha256: "", - contentType: contentType, + created: Value(DateTime.now()), + modified: Value(DateTime.now()), + contentSize: Value(0), + contentSha256: Value(""), + contentType: Value(contentType), + publinks: Value(0), ), mode: InsertMode.insertOrReplace, ); @@ -72,46 +74,72 @@ class ResourceRepository { Future processResourceResponse(Map data) async { final db = account.db; - final (resources, deleted) = await parseResourceObject(data); + final (resources, deleted) = await parseFullResourceObject(data); await db.batch((batch) { batch.deleteWhere(db.resources, (o) => o.id.isIn(deleted)); - batch.insertAll(db.resources, resources, mode: InsertMode.insertOrReplace); + batch.insertAllOnConflictUpdate(db.resources, resources); }); } - Future<(Iterable, Iterable)> parseResourceObject(Map data) async { - bool fullFetch = data.containsKey('children'); - final id = data['id']; - final details = ResourcesCompanion.insert( - id: id, - parent: Value(data['parent']), - name: data['name'], - dir: data['dir'], - modified: DateTime.parse(data['modified']), - size: data['csize'], - sha256: data['csha256'], - contentType: data['ctype'] ?? '', - deleted: Value(data['deleted'] != null), - permissions: data['permisisons'] == '{}' ? Value.absent() : Value(data['permisisons']), - lastFetch: fullFetch ? Value(DateTime.now()) : const Value.absent(), - ); + Future processResourceUpdateResponse(String id, Map data) async { + final resource = parsePartialResourceObject(data); + final update = (account.db.resources.update()..where((o) => o.id.equals(id))); + return update.write(resource); + } + + Future<(Iterable, Iterable)> parseFullResourceObject(Map data) async { + final ancestors = (data['ancestors'] as List).cast().map( + (a) => parsePartialResourceObject(a.cast()).copyWith(dir: Value(true)), + ); + + final info = parseResourceObject(data['info'])..copyWith(lastRefresh: Value(DateTime.now())); + final id = info.id.value; final db = account.db; - if (data.containsKey('children')) { - final resources = [details]; - final deleted = []; - final existing = Set.of(await (db.select(db.resources)..where((t) => t.parent.equals(id))).map((r) => r.id).get()); - final children = (data['children'] as List).cast(); - for (final childData in children) { - existing.remove(childData['id']); - final (r, del) = await parseResourceObject(childData.cast()); - resources.addAll(r); - deleted.addAll(del); - } - deleted.addAll(existing); - return (resources, existing); - } else { - return ([details], const []); - } + final existing = Set.of(await (db.select(db.resources)..where((t) => t.parent.equals(id))).map((r) => r.id).get()); + final children = (data['children'] as List).cast().map((c) { + existing.remove(c['id']); + return parseResourceObject(c.cast()); + }); + return ([...ancestors, info, ...children], existing); + } + + ResourcesCompanion parseResourceObject(Map data) { + return ResourcesCompanion( + id: Value(data['id']), + parent: Value(data['parent']), + name: Value(data['name']), + dir: Value(data['dir']), + created: Value(DateTime.parse(data['created'])), + modified: Value(DateTime.parse(data['modified'])), + deleted: Value(data['deleted'] != null), + contentSize: Value(data['c_size']), + contentSha256: Value(data['c_sha256']), + contentType: Value(data['c_type']), + permissions: data['permisisons'] == '{}' ? Value(null) : Value(data['permisisons']), + publinks: Value(data['publinks']), + lastRefresh: Value(DateTime.now()), + ); + } + + ResourcesCompanion parsePartialResourceObject(Map data) { + return ResourcesCompanion( + id: Value.absentIfNull(data['id']), + parent: Value.absentIfNull(data['parent']), + name: Value.absentIfNull(data['name']), + dir: Value.absentIfNull(data['dir']), + created: Value.absentIfNull(data.containsKey('created') ? DateTime.parse(data['created']) : null), + modified: Value.absentIfNull(data.containsKey('modified') ? DateTime.parse(data['modified']) : null), + deleted: Value.absentIfNull(data.containsKey('deleted') ? data['deleted'] != null : null), + contentSize: Value.absentIfNull(data['c_size']), + contentSha256: Value.absentIfNull(data['c_sha256']), + contentType: Value.absentIfNull(data['c_type']), + permissions: data.containsKey('permissions') + ? data['permisisons'] == '{}' + ? Value(null) + : Value(data['permisisons']) + : Value.absent(), + publinks: Value.absentIfNull(data['publinks']), + ); } } diff --git a/client/lib/ui/preview/resource_preview.dart b/client/lib/ui/preview/resource_preview.dart index 9e4f60a0..da57cfa0 100644 --- a/client/lib/ui/preview/resource_preview.dart +++ b/client/lib/ui/preview/resource_preview.dart @@ -64,7 +64,7 @@ class _ResourcePreviewState extends State { style: TextStyle(fontSize: 18), ); } - if (r.size > maxPreviewSize) { + if (r.contentSize > maxPreviewSize) { return const Text( 'File too large to preview', style: TextStyle(fontSize: 18),