mirror of
https://codeberg.org/shroff/phylum.git
synced 2026-05-02 18:20:58 -05:00
[client] Move db manipulation functions into separate db helper
This commit is contained in:
@@ -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));
|
||||
}
|
||||
}
|
||||
@@ -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(() {
|
||||
|
||||
@@ -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;
|
||||
}));
|
||||
|
||||
Reference in New Issue
Block a user