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 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 32 : Future<void> deleteOldFiles(int savedAt) async {
49 32 : final dirUri = fileStorageLocation;
50 32 : final deleteFilesAfterDuration = this.deleteFilesAfterDuration;
51 32 : 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 : }
|