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 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 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 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(); } } } }