feat: Automatically cache storable files on upload

This commit is contained in:
Sorunome 2020-12-17 11:59:31 +01:00
parent bc47859999
commit d1ce075b5b
No known key found for this signature in database
GPG Key ID: B19471D07FC9BE9C
2 changed files with 23 additions and 0 deletions

View File

@ -19,6 +19,7 @@
import 'dart:async'; import 'dart:async';
import 'dart:convert'; import 'dart:convert';
import 'dart:core'; import 'dart:core';
import 'dart:typed_data';
import 'package:http/http.dart' as http; import 'package:http/http.dart' as http;
@ -520,6 +521,20 @@ class Client extends MatrixApi {
return archiveList; return archiveList;
} }
/// Uploads a file and automatically caches it in the database, if it is small enough
/// and returns the mxc url as a string.
@override
Future<String> upload(Uint8List file, String fileName,
{String contentType}) async {
final mxc = await super.upload(file, fileName, contentType: contentType);
final storeable = database != null && file.length <= database.maxFileSize;
if (storeable) {
await database.storeFile(
mxc, file, DateTime.now().millisecondsSinceEpoch);
}
return mxc;
}
/// Uploads a new user avatar for this user. /// Uploads a new user avatar for this user.
Future<void> setAvatar(MatrixFile file) async { Future<void> setAvatar(MatrixFile file) async {
final uploadResp = await upload(file.bytes, file.name); final uploadResp = await upload(file.bytes, file.name);

View File

@ -31,6 +31,7 @@ import 'package:test/test.dart';
import 'fake_matrix_api.dart'; import 'fake_matrix_api.dart';
import 'fake_database.dart'; import 'fake_database.dart';
import 'fake_client.dart';
void main() { void main() {
Client matrix; Client matrix;
@ -444,6 +445,13 @@ void main() {
await matrix.ignoreUser('@charley2:stupid.abc'); await matrix.ignoreUser('@charley2:stupid.abc');
await matrix.unignoreUser('@charley:stupid.abc'); await matrix.unignoreUser('@charley:stupid.abc');
}); });
test('upload', () async {
final client = await getClient();
final response = await client.upload(Uint8List(0), 'file.jpeg');
expect(response, 'mxc://example.com/AQwafuaFswefuhsfAFAgsw');
expect(await client.database.getFile(response) != null, true);
await client.dispose(closeDatabase: true);
});
test('dispose', () async { test('dispose', () async {
await matrix.dispose(closeDatabase: true); await matrix.dispose(closeDatabase: true);