matrix-dart-sdk/lib/src/database/database_file_storage_io.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();
}
}
}
}