TF-239 Delete multiple emails permanently
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
import 'package:dio/dio.dart';
|
||||
import 'package:jmap_dart_client/jmap/account_id.dart';
|
||||
import 'package:jmap_dart_client/jmap/core/session/session.dart';
|
||||
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
|
||||
import 'package:model/model.dart';
|
||||
import 'package:tmail_ui_user/features/composer/domain/model/email_request.dart';
|
||||
@@ -50,4 +51,6 @@ abstract class EmailDataSource {
|
||||
Future<bool> removeEmailDrafts(AccountId accountId, EmailId emailId);
|
||||
|
||||
Future<Email?> updateEmailDrafts(AccountId accountId, Email newEmail, EmailId oldEmailId);
|
||||
|
||||
Future<List<EmailId>> deleteMultipleEmailPermanently(Session session, AccountId accountId, List<EmailId> emailIds);
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
import 'package:dio/dio.dart';
|
||||
import 'package:jmap_dart_client/jmap/account_id.dart';
|
||||
import 'package:jmap_dart_client/jmap/core/session/session.dart';
|
||||
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
|
||||
import 'package:model/model.dart';
|
||||
import 'package:tmail_ui_user/features/composer/domain/model/email_request.dart';
|
||||
@@ -132,4 +133,13 @@ class EmailDataSourceImpl extends EmailDataSource {
|
||||
throw error;
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
Future<List<EmailId>> deleteMultipleEmailPermanently(Session session, AccountId accountId, List<EmailId> emailIds) {
|
||||
return Future.sync(() async {
|
||||
return await emailAPI.deleteMultipleEmailPermanently(session, accountId, emailIds);
|
||||
}).catchError((error) {
|
||||
throw error;
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -7,10 +7,13 @@ import 'package:external_path/external_path.dart';
|
||||
import 'package:flutter_downloader/flutter_downloader.dart';
|
||||
import 'package:jmap_dart_client/http/http_client.dart';
|
||||
import 'package:jmap_dart_client/jmap/account_id.dart';
|
||||
import 'package:jmap_dart_client/jmap/core/capability/capability_identifier.dart';
|
||||
import 'package:jmap_dart_client/jmap/core/capability/core_capability.dart';
|
||||
import 'package:jmap_dart_client/jmap/core/patch_object.dart';
|
||||
import 'package:jmap_dart_client/jmap/core/properties/properties.dart';
|
||||
import 'package:jmap_dart_client/jmap/core/reference_id.dart';
|
||||
import 'package:jmap_dart_client/jmap/core/reference_prefix.dart';
|
||||
import 'package:jmap_dart_client/jmap/core/session/session.dart';
|
||||
import 'package:jmap_dart_client/jmap/jmap_request.dart';
|
||||
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
|
||||
import 'package:jmap_dart_client/jmap/mail/email/get/get_email_method.dart';
|
||||
@@ -28,6 +31,7 @@ import 'package:tmail_ui_user/features/composer/domain/model/email_request.dart'
|
||||
import 'package:model/model.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/model/move_request.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/model/move_to_trash_request.dart';
|
||||
import 'package:tmail_ui_user/main/error/capability_validator.dart';
|
||||
|
||||
class EmailAPI {
|
||||
|
||||
@@ -381,4 +385,49 @@ class EmailAPI {
|
||||
throw error;
|
||||
});
|
||||
}
|
||||
|
||||
Future<List<EmailId>> deleteMultipleEmailPermanently(Session session, AccountId accountId, List<EmailId> emailIds) async {
|
||||
requireCapability(session, [CapabilityIdentifier.jmapCore, CapabilityIdentifier.jmapMail]);
|
||||
|
||||
final coreCapability = (session.capabilities[CapabilityIdentifier.jmapCore] as CoreCapability);
|
||||
final maxMethodCount = coreCapability.maxCallsInRequest.value.toInt();
|
||||
|
||||
List<EmailId> listEmailResult = [];
|
||||
var start = 0;
|
||||
var end = 0;
|
||||
while (end < emailIds.length) {
|
||||
start = end;
|
||||
if (emailIds.length - start >= maxMethodCount) {
|
||||
end = maxMethodCount;
|
||||
} else {
|
||||
end = emailIds.length;
|
||||
}
|
||||
log('EmailAPI::deleteMultipleEmailPermanently(): delete from $start to $end / ${emailIds.length}');
|
||||
final currentExecuteList = emailIds.sublist(start, end);
|
||||
|
||||
final requestBuilder = JmapRequestBuilder(_httpClient, ProcessingInvocation());
|
||||
final currentSetEmailInvocations = currentExecuteList
|
||||
.map((emailId) {
|
||||
return SetEmailMethod(accountId)
|
||||
..addDestroy(Set.of([emailId.id]));
|
||||
})
|
||||
.map(requestBuilder.invocation)
|
||||
.toList();
|
||||
|
||||
final response = await (requestBuilder
|
||||
..usings(Set.of([CapabilityIdentifier.jmapCore, CapabilityIdentifier.jmapMail])))
|
||||
.build()
|
||||
.execute();
|
||||
|
||||
currentSetEmailInvocations
|
||||
.map((currentInvocation) => response.parse(currentInvocation.methodCallId, SetEmailResponse.deserialize))
|
||||
.map((response) => response?.destroyed?.map((id) => EmailId(id)))
|
||||
.where((listId) => listId != null && listId.isNotEmpty)
|
||||
.forEach((listId) {
|
||||
listEmailResult.addAll(listId!);
|
||||
});
|
||||
}
|
||||
|
||||
return listEmailResult;
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,7 @@
|
||||
|
||||
import 'package:dio/dio.dart';
|
||||
import 'package:jmap_dart_client/jmap/account_id.dart';
|
||||
import 'package:jmap_dart_client/jmap/core/session/session.dart';
|
||||
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
|
||||
import 'package:model/model.dart';
|
||||
import 'package:tmail_ui_user/features/composer/domain/model/email_request.dart';
|
||||
@@ -114,4 +115,9 @@ class EmailRepositoryImpl extends EmailRepository {
|
||||
Future<List<EmailId>> moveToTrash(AccountId accountId, MoveToTrashRequest moveRequest) {
|
||||
return emailDataSource.moveToTrash(accountId, moveRequest);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<List<EmailId>> deleteMultipleEmailPermanently(Session session, AccountId accountId, List<EmailId> emailIds) {
|
||||
return emailDataSource.deleteMultipleEmailPermanently(session, accountId, emailIds);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user