Line data Source code
1 : import 'dart:io'; 2 : import 'dart:typed_data'; 3 : 4 : import 'package:matrix/matrix.dart'; 5 : 6 : mixin DatabaseFileStorage { 7 68 : bool get supportsFileStoring => fileStorageLocation != null; 8 : 9 : late final Uri? fileStorageLocation; 10 : late final Duration? deleteFilesAfterDuration; 11 : 12 0 : File _getFileFromMxc(Uri mxcUri) => File( 13 0 : '${Directory.fromUri(fileStorageLocation!).path}/${mxcUri.toString().split('/').last}', 14 : ); 15 : 16 5 : Future<void> storeFile(Uri mxcUri, Uint8List bytes, int time) async { 17 5 : final fileStorageLocation = this.fileStorageLocation; 18 5 : if (!supportsFileStoring || fileStorageLocation == null) return; 19 : 20 0 : final file = _getFileFromMxc(mxcUri); 21 : 22 0 : if (await file.exists()) return; 23 0 : await file.writeAsBytes(bytes); 24 : } 25 : 26 2 : Future<Uint8List?> getFile(Uri mxcUri) async { 27 2 : final fileStorageLocation = this.fileStorageLocation; 28 2 : if (!supportsFileStoring || fileStorageLocation == null) return null; 29 : 30 0 : final file = _getFileFromMxc(mxcUri); 31 : 32 0 : if (await file.exists()) return await file.readAsBytes(); 33 : return null; 34 : } 35 : 36 1 : Future<bool> deleteFile(Uri mxcUri) async { 37 1 : final fileStorageLocation = this.fileStorageLocation; 38 1 : if (!supportsFileStoring || fileStorageLocation == null) return false; 39 : 40 0 : final file = _getFileFromMxc(mxcUri); 41 : 42 0 : if (await file.exists() == false) return false; 43 : 44 0 : await file.delete(); 45 : return true; 46 : } 47 : 48 34 : Future<void> deleteOldFiles(int savedAt) async { 49 34 : final dirUri = fileStorageLocation; 50 34 : final deleteFilesAfterDuration = this.deleteFilesAfterDuration; 51 34 : if (!supportsFileStoring || 52 : dirUri == null || 53 : deleteFilesAfterDuration == null) { 54 : return; 55 : } 56 0 : final dir = Directory.fromUri(dirUri); 57 0 : final entities = await dir.list().toList(); 58 0 : for (final file in entities) { 59 0 : if (file is! File) continue; 60 0 : final stat = await file.stat(); 61 0 : if (DateTime.now().difference(stat.modified) > deleteFilesAfterDuration) { 62 0 : Logs().v('Delete old file', file.path); 63 0 : await file.delete(); 64 : } 65 : } 66 : } 67 : }