56 lines
1.7 KiB
Dart
56 lines
1.7 KiB
Dart
import 'dart:io';
|
|
import 'dart:typed_data';
|
|
|
|
import 'package:matrix/matrix.dart';
|
|
|
|
mixin DatabaseFileStorage {
|
|
bool get supportsFileStoring => fileStorageLocation != null;
|
|
|
|
late final Uri? fileStorageLocation;
|
|
late final Duration? deleteFilesAfterDuration;
|
|
|
|
Future<void> storeFile(Uri mxcUri, Uint8List bytes, int time) async {
|
|
final fileStorageLocation = this.fileStorageLocation;
|
|
if (!supportsFileStoring || fileStorageLocation == null) return;
|
|
|
|
final dir = Directory.fromUri(fileStorageLocation);
|
|
|
|
final file = File('${dir.path}/${mxcUri.toString().split('/').last}');
|
|
|
|
if (await file.exists()) return;
|
|
await file.writeAsBytes(bytes);
|
|
}
|
|
|
|
Future<Uint8List?> getFile(Uri mxcUri) async {
|
|
final fileStorageLocation = this.fileStorageLocation;
|
|
if (!supportsFileStoring || fileStorageLocation == null) return null;
|
|
|
|
final dir = Directory.fromUri(fileStorageLocation);
|
|
|
|
final file = File('${dir.path}/${mxcUri.toString().split('/').last}');
|
|
|
|
if (await file.exists()) return await file.readAsBytes();
|
|
return null;
|
|
}
|
|
|
|
Future<void> deleteOldFiles(int savedAt) async {
|
|
final dirUri = fileStorageLocation;
|
|
final deleteFilesAfterDuration = this.deleteFilesAfterDuration;
|
|
if (!supportsFileStoring ||
|
|
dirUri == null ||
|
|
deleteFilesAfterDuration == null) {
|
|
return;
|
|
}
|
|
final dir = Directory.fromUri(dirUri);
|
|
final entities = await dir.list().toList();
|
|
for (final file in entities) {
|
|
if (file is! File) continue;
|
|
final stat = await file.stat();
|
|
if (DateTime.now().difference(stat.modified) > deleteFilesAfterDuration) {
|
|
Logs().v('Delete old file', file.path);
|
|
await file.delete();
|
|
}
|
|
}
|
|
}
|
|
}
|