[client] Move db manipulation functions into separate db helper

This commit is contained in:
Abhishek Shroff
2025-01-02 22:47:58 +05:30
parent 2922396a79
commit 8f472b5da1
13 changed files with 97 additions and 90 deletions
@@ -5,6 +5,7 @@ import 'package:offtheline/offtheline.dart';
import 'package:phylum/libphylum/actions/action_resource_bind.dart';
import 'package:phylum/libphylum/actions/action_resource_create.dart';
import 'package:phylum/libphylum/db/db.dart';
import 'package:phylum/libphylum/db/resource_helpers.dart';
import 'package:phylum/libphylum/phylum_api_types.dart';
class ResourceCopyAction extends ResourceCreateAction with JsonApiAction {
@@ -102,9 +103,9 @@ class ResourceCopyAction extends ResourceCreateAction with JsonApiAction {
@override
Future<void> applyOptimisticUpdate() async {
await account.resourceRepository.createResource(resourceId, parent, resourceName, dir);
await account.db.createResource(resourceId, parent, resourceName, dir);
if (!dir) {
await account.resourceRepository.updateResource(
await account.db.updateResource(
resourceId,
(o) => o(
contentType: Value(contentType),
@@ -117,7 +118,7 @@ class ResourceCopyAction extends ResourceCreateAction with JsonApiAction {
@override
Future<void> revertOptimisticUpdate() {
return account.resourceRepository.deleteResource(resourceId);
return account.db.deleteResource(resourceId);
}
@override
@@ -3,6 +3,7 @@ import 'dart:async';
import 'package:drift/drift.dart';
import 'package:offtheline/offtheline.dart';
import 'package:phylum/libphylum/db/db.dart';
import 'package:phylum/libphylum/db/resource_helpers.dart';
import 'package:phylum/libphylum/phylum_api_types.dart';
import 'action_resource.dart';
@@ -55,12 +56,12 @@ class ResourceDeleteAction extends ResourceAction with JsonApiAction {
@override
Future<void> applyOptimisticUpdate() {
return account.resourceRepository.updateResource(resourceId, (o) => o(deleted: const Value(true)));
return account.db.updateResource(resourceId, (o) => o(deleted: const Value(true)));
}
@override
Future<void> revertOptimisticUpdate() {
return account.resourceRepository.updateResource(resourceId, (o) => o(deleted: const Value(false)));
return account.db.updateResource(resourceId, (o) => o(deleted: const Value(false)));
}
@override
@@ -2,6 +2,7 @@ import 'dart:async';
import 'package:offtheline/offtheline.dart';
import 'package:phylum/libphylum/actions/action_resource_create.dart';
import 'package:phylum/libphylum/db/resource_helpers.dart';
import 'package:phylum/libphylum/phylum_api_types.dart';
class ResourceMkdirAction extends ResourceCreateAction with JsonApiAction {
@@ -55,12 +56,12 @@ class ResourceMkdirAction extends ResourceCreateAction with JsonApiAction {
@override
Future<void> applyOptimisticUpdate() {
return account.resourceRepository.createResource(resourceId, parent, resourceName, true);
return account.db.createResource(resourceId, parent, resourceName, true);
}
@override
Future<void> revertOptimisticUpdate() {
return account.resourceRepository.deleteResource(resourceId);
return account.db.deleteResource(resourceId);
}
@override
@@ -5,6 +5,7 @@ import 'package:offtheline/offtheline.dart';
import 'package:phylum/libphylum/actions/action_resource_bind.dart';
import 'package:phylum/libphylum/actions/action_resource_create.dart';
import 'package:phylum/libphylum/db/db.dart';
import 'package:phylum/libphylum/db/resource_helpers.dart';
import 'package:phylum/libphylum/phylum_api_types.dart';
class ResourceMoveAction extends ResourceBindAction with JsonApiAction {
@@ -83,7 +84,7 @@ class ResourceMoveAction extends ResourceBindAction with JsonApiAction {
@override
Future<void> applyOptimisticUpdate() {
return account.resourceRepository.updateResource(
return account.db.updateResource(
resourceId,
(o) => o(
name: Value.absentIfNull(resourceName),
@@ -96,7 +97,7 @@ class ResourceMoveAction extends ResourceBindAction with JsonApiAction {
@override
Future<void> revertOptimisticUpdate() {
final serverData = account.resourceRepository.getServerData(resourceId)!;
return account.resourceRepository.updateResource(
return account.db.updateResource(
resourceId,
(o) => o(
name: Value(serverData.name),
@@ -3,6 +3,7 @@ import 'dart:convert';
import 'package:drift/drift.dart';
import 'package:offtheline/offtheline.dart';
import 'package:phylum/libphylum/db/resource_helpers.dart';
import 'package:phylum/libphylum/phylum_api_types.dart';
import 'package:phylum/util/permissions.dart';
@@ -83,7 +84,7 @@ class ResourceShareAction extends ResourceAction with JsonApiAction {
@override
Future<void> applyOptimisticUpdate() async {
final resource = await account.resourceRepository.getResource(resourceId);
final resource = await account.db.getResource(resourceId);
final p = mergePermissions({}, resource?.permissions);
if ((p[username] ?? 0) == permission) {
return;
@@ -94,7 +95,7 @@ class ResourceShareAction extends ResourceAction with JsonApiAction {
p[username] = permission;
}
final serialized = p.isEmpty ? null : json.encode(p);
account.resourceRepository.updateResource(
account.db.updateResource(
resourceId,
(o) => o(
permissions: Value(serialized),
@@ -106,7 +107,7 @@ class ResourceShareAction extends ResourceAction with JsonApiAction {
@override
Future<void> revertOptimisticUpdate() {
final serverData = account.resourceRepository.getServerData(resourceId)!;
return account.resourceRepository.updateResource(
return account.db.updateResource(
resourceId,
(o) => o(
permissions: Value(serverData.permissions),
@@ -7,6 +7,7 @@ import 'package:http_parser/http_parser.dart';
import 'package:mime/mime.dart';
import 'package:offtheline/offtheline.dart';
import 'package:phylum/libphylum/actions/action_resource_create.dart';
import 'package:phylum/libphylum/db/resource_helpers.dart';
import 'package:phylum/libphylum/phylum_api_types.dart';
import 'package:phylum/libphylum/util/uuid.dart';
@@ -89,8 +90,8 @@ class ResourceUploadAction extends ResourceCreateAction with FileUploadApiAction
@override
Future<void> applyOptimisticUpdate() async {
await account.resourceRepository.createResource(resourceId, parent, resourceName, false);
await account.resourceRepository.updateResource(
await account.db.createResource(resourceId, parent, resourceName, false);
await account.db.updateResource(
resourceId,
(o) => o(
contentType: Value(contentType),
@@ -101,7 +102,7 @@ class ResourceUploadAction extends ResourceCreateAction with FileUploadApiAction
@override
Future<void> revertOptimisticUpdate() {
return account.resourceRepository.deleteResource(resourceId);
return account.db.deleteResource(resourceId);
}
@override
@@ -0,0 +1,58 @@
import 'package:drift/drift.dart';
import 'package:phylum/libphylum/db/db.dart';
extension ResourceHelpers on AppDatabase {
Future<Resource?> getResource(String id) {
return _selectResource(id).getSingleOrNull();
}
Stream<Resource?> watchResource(String id) {
return _selectResource(id).watchSingleOrNull();
}
Future<List<Resource>> getResources(Iterable<String> ids) {
return _selectResources(ids).get();
}
Stream<List<Resource>> watchChildren(String id) {
return (_selectChildren(id)..orderBy([(u) => OrderingTerm.desc(u.dir), (u) => OrderingTerm.asc(u.name.collate(Collate.noCase))])).watch();
}
Stream<List<ParentsResult>> watchParents(String id) {
return parents(id).watch();
}
SimpleSelectStatement<Resources, Resource> _selectResource(String id) {
return resources.select()..where((f) => f.id.equals(id) & f.deleted.equals(false));
}
SimpleSelectStatement<Resources, Resource> _selectChildren(String id) {
return resources.select()..where((f) => f.parent.equals(id) & f.deleted.equals(false));
}
SimpleSelectStatement<Resources, Resource> _selectResources(Iterable<String> ids) {
return resources.select()..where((f) => f.id.isIn(ids));
}
Future<int> createResource(String id, String parent, String name, bool dir) {
return resources.insertOne(
ResourcesCompanion.insert(
id: id,
name: name,
parent: Value(parent),
dir: dir,
created: Value(DateTime.now()),
modified: Value(DateTime.now()),
),
mode: InsertMode.insertOrReplace,
);
}
Future<int> updateResource(String id, Insertable<Resource> Function($ResourcesUpdateCompanionBuilder o) fn) {
return managers.resources.filter((f) => f.id.equals(id)).update(fn);
}
Future<int> deleteResource(String id) {
return resources.deleteWhere((f) => f.id.equals(id));
}
}
+6 -15
View File
@@ -1,5 +1,6 @@
import 'package:flutter/foundation.dart';
import 'package:phylum/libphylum/db/db.dart';
import 'package:phylum/libphylum/db/resource_helpers.dart';
import 'package:phylum/libphylum/phylum_account.dart';
sealed class ExplorerPage {
@@ -20,29 +21,19 @@ class ExplorerPageFolder extends ExplorerPage {
ExplorerPageFolder({required this.folderId});
@override
Future<bool> refresh(PhylumAccount account) {
return account.resourceRepository.requestResource(folderId).then((result) => result.success);
}
Future<bool> refresh(PhylumAccount account) => account.resourceRepository.requestResource(folderId).then((result) => result.success);
@override
Stream<Resource?> watchResource(PhylumAccount account) {
return account.resourceRepository.watchResource(folderId);
}
Stream<Resource?> watchResource(PhylumAccount account) => account.db.watchResource(folderId);
@override
Stream<List<Resource>> watchChildren(PhylumAccount account) {
return account.resourceRepository.watchChildren(folderId);
}
Stream<List<Resource>> watchChildren(PhylumAccount account) => account.db.watchChildren(folderId);
@override
Stream<Iterable<ParentsResult>> watchParents(PhylumAccount account) {
return account.resourceRepository.watchParents(folderId).map((p) => p.reversed);
}
Stream<Iterable<ParentsResult>> watchParents(PhylumAccount account) => account.db.watchParents(folderId).map((p) => p.reversed);
@override
String toString() {
return 'ExplorerPageFolder($folderId)';
}
String toString() => 'ExplorerPageFolder($folderId)';
@override
bool operator ==(Object other) {
@@ -4,6 +4,7 @@ import 'package:drift/drift.dart';
import 'package:hive/hive.dart';
import 'package:offtheline/offtheline.dart';
import 'package:phylum/libphylum/db/db.dart';
import 'package:phylum/libphylum/db/resource_helpers.dart';
import 'package:phylum/libphylum/phylum_account.dart';
import 'package:phylum/libphylum/phylum_api_types.dart';
import 'package:phylum/libphylum/requests/resource_detail_request.dart';
@@ -31,45 +32,14 @@ class ResourceRepository {
});
}
Future<Resource?> getResource(String id) {
return _selectResource(id).getSingleOrNull();
}
Stream<Resource?> watchResource(String id) {
return _selectResource(id).watchSingleOrNull();
}
Future<List<Resource>> getResources(Iterable<String> ids) {
return _selectResources(ids).get();
}
Stream<List<Resource>> watchChildren(String id) {
return (_selectChildren(id)..orderBy([(u) => OrderingTerm.desc(u.dir), (u) => OrderingTerm.asc(u.name.collate(Collate.noCase))])).watch();
}
Stream<List<ParentsResult>> watchParents(String id) {
return account.db.parents(id).watch();
}
SimpleSelectStatement<Resources, Resource> _selectResource(String id) {
return account.db.resources.select()..where((f) => f.id.equals(id) & f.deleted.equals(false));
}
SimpleSelectStatement<Resources, Resource> _selectChildren(String id) {
return account.db.resources.select()..where((f) => f.parent.equals(id) & f.deleted.equals(false));
}
SimpleSelectStatement<Resources, Resource> _selectResources(Iterable<String> ids) {
return account.db.resources.select()..where((f) => f.id.isIn(ids));
}
Future<void> trackServerData(String id) async {
final count = _serverDataCountsBox.get(id) ?? 0;
if (count == 0) {
final r = await _selectResource(id).getSingle();
final r = await account.db.getResource(id);
assert(r != null);
await Future.wait([
_serverDataCountsBox.put(id, 1),
_serverDataBox.put(id, r),
_serverDataBox.put(id, r!),
]);
} else {
return _serverDataCountsBox.put(id, count + 1);
@@ -95,28 +65,6 @@ class ResourceRepository {
return _serverDataBox.get(id);
}
Future<int> createResource(String id, String parent, String name, bool dir) {
return account.db.resources.insertOne(
ResourcesCompanion.insert(
id: id,
name: name,
parent: Value(parent),
dir: dir,
created: Value(DateTime.now()),
modified: Value(DateTime.now()),
),
mode: InsertMode.insertOrReplace,
);
}
Future<int> updateResource(String id, Insertable<Resource> Function($ResourcesUpdateCompanionBuilder o) fn) {
return account.db.managers.resources.filter((f) => f.id.equals(id)).update(fn);
}
Future<int> deleteResource(String id) {
return account.db.resources.deleteWhere((f) => f.id.equals(id));
}
Future processResourceResponse(Map<String, dynamic> data) async {
final db = account.db;
final (insert, update) = await parseFullResourceObject(data);
@@ -6,6 +6,7 @@ import 'package:phylum/app_shortcuts.dart';
import 'package:phylum/libphylum/actions/action_resource_copy.dart';
import 'package:phylum/libphylum/actions/action_resource_move.dart';
import 'package:phylum/libphylum/db/db.dart';
import 'package:phylum/libphylum/db/resource_helpers.dart';
import 'package:phylum/libphylum/phylum_account.dart';
import 'package:phylum/libphylum/explorer/explorer_controller.dart';
import 'package:phylum/util/upload_utils.dart';
@@ -48,7 +49,7 @@ void handlePasteAction(PasteFromClipboardIntent i, BuildContext context) async {
if (uri.authority == openUri.authority && uri.path == openUri.path && uri.queryParameters.containsKey('id')) {
final resourceId = uri.queryParameters['id']!;
final cut = uri.queryParameters.containsKey('cut');
final resource = await account.resourceRepository.getResource(resourceId);
final resource = await account.db.getResource(resourceId);
if (resource != null) {
(cut ? cutResources : copyResources).add(resource);
}
@@ -2,6 +2,7 @@ import 'dart:async';
import 'package:flutter/material.dart';
import 'package:phylum/libphylum/db/db.dart';
import 'package:phylum/libphylum/db/resource_helpers.dart';
import 'package:phylum/libphylum/phylum_account.dart';
import 'package:phylum/libphylum/explorer/explorer_controller.dart';
import 'package:phylum/util/file_size.dart';
@@ -110,7 +111,7 @@ class _PermissionsTileState extends State<PermissionsTile> {
void initState() {
super.initState();
final account = context.read<PhylumAccount>();
sub = account.resourceRepository.watchParents(widget.resourceId).listen((data) {
sub = account.db.watchParents(widget.resourceId).listen((data) {
final p = calculatePermissionSet(data.map((e) => e.permissions));
setState(() {
myPermission = p.remove(account.userEmail) ?? 0;
@@ -3,6 +3,7 @@ import 'dart:async';
import 'package:flutter/material.dart';
import 'package:phylum/libphylum/actions/action_resource_share.dart';
import 'package:phylum/libphylum/db/db.dart';
import 'package:phylum/libphylum/db/resource_helpers.dart';
import 'package:phylum/libphylum/phylum_account.dart';
import 'package:phylum/util/dialogs.dart';
import 'package:phylum/util/permissions.dart';
@@ -27,7 +28,7 @@ class _ResourcePermissionsViewState extends State<ResourcePermissionsView> {
void initState() {
super.initState();
final account = context.read<PhylumAccount>();
sub = account.resourceRepository.watchParents(widget.resourceId).listen((data) {
sub = account.db.watchParents(widget.resourceId).listen((data) {
final inheritedPermissions = calculatePermissionSet(data.sublist(1).map((e) => e.permissions));
final permissions = mergePermissions(Map.of(inheritedPermissions), data.first.permissions);
setState(() {
+2 -1
View File
@@ -1,6 +1,7 @@
import 'package:flutter/material.dart';
import 'package:phylum/integrations/download_manager.dart';
import 'package:phylum/libphylum/db/db.dart';
import 'package:phylum/libphylum/db/resource_helpers.dart';
import 'package:phylum/libphylum/phylum_account.dart';
import 'package:provider/provider.dart';
@@ -27,7 +28,7 @@ class _ResourcePreviewState extends State<ResourcePreview> {
@override
void initState() {
super.initState();
context.read<PhylumAccount>().resourceRepository.getResource(widget.resourceId).then((r) => setState(() {
context.read<PhylumAccount>().db.getResource(widget.resourceId).then((r) => setState(() {
loading = false;
resource = r;
}));