feat: Add deleteFile() endpoint to database

This commit is contained in:
Krille 2024-10-23 17:30:16 +02:00
parent 03416cd463
commit 60d500956c
No known key found for this signature in database
GPG Key ID: E067ECD60F1A0652
6 changed files with 40 additions and 7 deletions

View File

@ -121,6 +121,8 @@ abstract class DatabaseApi {
Future storeFile(Uri mxcUri, Uint8List bytes, int time); Future storeFile(Uri mxcUri, Uint8List bytes, int time);
Future<bool> deleteFile(Uri mxcUri);
Future storeSyncFilterId( Future storeSyncFilterId(
String syncFilterId, String syncFilterId,
); );

View File

@ -9,13 +9,15 @@ mixin DatabaseFileStorage {
late final Uri? fileStorageLocation; late final Uri? fileStorageLocation;
late final Duration? deleteFilesAfterDuration; late final Duration? deleteFilesAfterDuration;
File _getFileFromMxc(Uri mxcUri) => File(
'${Directory.fromUri(fileStorageLocation!).path}/${mxcUri.toString().split('/').last}',
);
Future<void> storeFile(Uri mxcUri, Uint8List bytes, int time) async { Future<void> storeFile(Uri mxcUri, Uint8List bytes, int time) async {
final fileStorageLocation = this.fileStorageLocation; final fileStorageLocation = this.fileStorageLocation;
if (!supportsFileStoring || fileStorageLocation == null) return; if (!supportsFileStoring || fileStorageLocation == null) return;
final dir = Directory.fromUri(fileStorageLocation); final file = _getFileFromMxc(mxcUri);
final file = File('${dir.path}/${mxcUri.toString().split('/').last}');
if (await file.exists()) return; if (await file.exists()) return;
await file.writeAsBytes(bytes); await file.writeAsBytes(bytes);
@ -25,14 +27,24 @@ mixin DatabaseFileStorage {
final fileStorageLocation = this.fileStorageLocation; final fileStorageLocation = this.fileStorageLocation;
if (!supportsFileStoring || fileStorageLocation == null) return null; if (!supportsFileStoring || fileStorageLocation == null) return null;
final dir = Directory.fromUri(fileStorageLocation); final file = _getFileFromMxc(mxcUri);
final file = File('${dir.path}/${mxcUri.toString().split('/').last}');
if (await file.exists()) return await file.readAsBytes(); if (await file.exists()) return await file.readAsBytes();
return null; return null;
} }
Future<bool> deleteFile(Uri mxcUri) async {
final fileStorageLocation = this.fileStorageLocation;
if (!supportsFileStoring || fileStorageLocation == null) return false;
final file = _getFileFromMxc(mxcUri);
if (await file.exists() == false) return false;
await file.delete();
return true;
}
Future<void> deleteOldFiles(int savedAt) async { Future<void> deleteOldFiles(int savedAt) async {
final dirUri = fileStorageLocation; final dirUri = fileStorageLocation;
final deleteFilesAfterDuration = this.deleteFilesAfterDuration; final deleteFilesAfterDuration = this.deleteFilesAfterDuration;

View File

@ -17,4 +17,6 @@ mixin DatabaseFileStorage {
Future<void> deleteOldFiles(int savedAt) async { Future<void> deleteOldFiles(int savedAt) async {
return; return;
} }
Future<bool> deleteFile(Uri mxcUri) async => false;
} }

View File

@ -462,6 +462,11 @@ class HiveCollectionsDatabase extends DatabaseApi {
return null; return null;
} }
@override
Future<bool> deleteFile(Uri mxcUri) async {
return false;
}
@override @override
Future<StoredInboundGroupSession?> getInboundGroupSession( Future<StoredInboundGroupSession?> getInboundGroupSession(
String roomId, String roomId,

View File

@ -479,6 +479,11 @@ class FamedlySdkHiveDatabase extends DatabaseApi with ZoneTransactionMixin {
return null; return null;
} }
@override
Future<bool> deleteFile(Uri mxcUri) async {
return false;
}
@override @override
Future<StoredInboundGroupSession?> getInboundGroupSession( Future<StoredInboundGroupSession?> getInboundGroupSession(
String roomId, String roomId,

View File

@ -78,7 +78,7 @@ void main() {
final toDeviceQueue = await database.getToDeviceEventQueue(); final toDeviceQueue = await database.getToDeviceEventQueue();
expect(toDeviceQueue.isEmpty, true); expect(toDeviceQueue.isEmpty, true);
}); });
test('storeFile', () async { test('storeFile and deleteFile', () async {
await database.storeFile( await database.storeFile(
Uri.parse('mxc://test'), Uri.parse('mxc://test'),
Uint8List.fromList([0]), Uint8List.fromList([0]),
@ -86,6 +86,13 @@ void main() {
); );
final file = await database.getFile(Uri.parse('mxc://test')); final file = await database.getFile(Uri.parse('mxc://test'));
expect(file != null, database.supportsFileStoring); expect(file != null, database.supportsFileStoring);
final result = await database.deleteFile(Uri.parse('mxc://test'));
expect(result, database.supportsFileStoring);
if (result) {
final file = await database.getFile(Uri.parse('mxc://test'));
expect(file, null);
}
}); });
test('getFile', () async { test('getFile', () async {
await database.getFile(Uri.parse('mxc://test')); await database.getFile(Uri.parse('mxc://test'));