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