TF-3719 Fix error Too many items in an email read at level FULL in Email/get

Signed-off-by: dab246 <tdvu@linagora.com>
This commit is contained in:
dab246
2025-05-14 11:52:02 +07:00
committed by Dat H. Pham
parent 5d119e8307
commit 8bb428b8b9
2 changed files with 68 additions and 34 deletions
@@ -43,7 +43,6 @@ import 'package:tmail_ui_user/features/push_notification/domain/usecases/store_e
import 'package:tmail_ui_user/features/push_notification/presentation/action/push_notification_state_change_action.dart'; import 'package:tmail_ui_user/features/push_notification/presentation/action/push_notification_state_change_action.dart';
import 'package:tmail_ui_user/features/push_notification/presentation/listener/change_listener.dart'; import 'package:tmail_ui_user/features/push_notification/presentation/listener/change_listener.dart';
import 'package:tmail_ui_user/features/push_notification/presentation/notification/local_notification_manager.dart'; import 'package:tmail_ui_user/features/push_notification/presentation/notification/local_notification_manager.dart';
import 'package:tmail_ui_user/features/thread/domain/constants/thread_constants.dart';
import 'package:tmail_ui_user/main/routes/route_navigation.dart'; import 'package:tmail_ui_user/main/routes/route_navigation.dart';
class EmailChangeListener extends ChangeListener { class EmailChangeListener extends ChangeListener {
@@ -162,8 +161,10 @@ class EmailChangeListener extends ChangeListener {
_accountId!, _accountId!,
_userName!, _userName!,
state, state,
propertiesCreated: EmailUtils.getPropertiesForEmailGetMethod(_session!, _accountId!), propertiesCreated: EmailUtils.getPropertiesForEmailGetMethod(
propertiesUpdated: ThreadConstants.propertiesUpdatedDefault, _session!,
_accountId!,
),
)); ));
} }
} }
@@ -304,7 +305,6 @@ class EmailChangeListener extends ChangeListener {
session, session,
accountId, accountId,
newState, newState,
propertiesCreated: Properties({EmailProperty.id, EmailProperty.keywords}),
propertiesUpdated: Properties({EmailProperty.keywords}), propertiesUpdated: Properties({EmailProperty.keywords}),
)); ));
} }
@@ -20,6 +20,7 @@ import 'package:jmap_dart_client/jmap/mail/email/get/get_email_method.dart';
import 'package:jmap_dart_client/jmap/mail/email/get/get_email_response.dart'; import 'package:jmap_dart_client/jmap/mail/email/get/get_email_response.dart';
import 'package:jmap_dart_client/jmap/mail/email/query/query_email_method.dart'; import 'package:jmap_dart_client/jmap/mail/email/query/query_email_method.dart';
import 'package:jmap_dart_client/jmap/mail/email/query/query_email_response.dart'; import 'package:jmap_dart_client/jmap/mail/email/query/query_email_response.dart';
import 'package:model/extensions/list_id_extension.dart';
import 'package:tmail_ui_user/features/thread/data/extensions/list_email_extension.dart'; import 'package:tmail_ui_user/features/thread/data/extensions/list_email_extension.dart';
import 'package:jmap_dart_client/jmap/mail/email/search_snippet/search_snippet.dart'; import 'package:jmap_dart_client/jmap/mail/email/search_snippet/search_snippet.dart';
import 'package:jmap_dart_client/jmap/mail/email/search_snippet/search_snippet_get_method.dart'; import 'package:jmap_dart_client/jmap/mail/email/search_snippet/search_snippet_get_method.dart';
@@ -226,32 +227,46 @@ class ThreadAPI {
final changesEmailInvocation = jmapRequestBuilder.invocation(changesEmailMethod); final changesEmailInvocation = jmapRequestBuilder.invocation(changesEmailMethod);
final getMailboxUpdated = GetEmailMethod(accountId) GetEmailMethod? getEmailUpdated;
..addReferenceIds(processingInvocation.createResultReference( GetEmailMethod? getEmailCreated;
changesEmailInvocation.methodCallId, RequestInvocation? getEmailUpdatedInvocation;
ReferencePath.updatedPath)); RequestInvocation? getEmailCreatedInvocation;
if (propertiesUpdated != null) { if (propertiesUpdated != null) {
getMailboxUpdated.addProperties(propertiesUpdated); getEmailUpdated = GetEmailMethod(accountId)
} ..addReferenceIds(
processingInvocation.createResultReference(
changesEmailInvocation.methodCallId,
ReferencePath.updatedPath,
),
)
..addProperties(propertiesUpdated);
final getEmailCreated = GetEmailMethod(accountId) getEmailUpdatedInvocation = jmapRequestBuilder.invocation(getEmailUpdated);
..addReferenceIds(processingInvocation.createResultReference( }
changesEmailInvocation.methodCallId,
ReferencePath.createdPath));
if (propertiesCreated != null) { if (propertiesCreated != null) {
getEmailCreated.addProperties(propertiesCreated); getEmailCreated = GetEmailMethod(accountId)
..addReferenceIds(
processingInvocation.createResultReference(
changesEmailInvocation.methodCallId,
ReferencePath.createdPath,
),
)
..addProperties(propertiesCreated);
getEmailCreatedInvocation = jmapRequestBuilder.invocation(getEmailCreated);
} }
final getEmailUpdatedInvocation = jmapRequestBuilder.invocation(getMailboxUpdated); final requiredCapabilitiesMethod = getEmailCreated?.requiredCapabilities
final getEmailCreatedInvocation = jmapRequestBuilder.invocation(getEmailCreated); ?? getEmailUpdated?.requiredCapabilities
?? changesEmailMethod.requiredCapabilities;
final capabilities = getEmailCreated.requiredCapabilities final usedCapabilities = requiredCapabilitiesMethod
.toCapabilitiesSupportTeamMailboxes(session, accountId); .toCapabilitiesSupportTeamMailboxes(session, accountId);
final result = await (jmapRequestBuilder final result = await (jmapRequestBuilder
..usings(capabilities)) ..usings(usedCapabilities))
.build() .build()
.execute(); .execute();
@@ -259,24 +274,43 @@ class ThreadAPI {
changesEmailInvocation.methodCallId, changesEmailInvocation.methodCallId,
ChangesEmailResponse.deserialize); ChangesEmailResponse.deserialize);
final resultUpdated = result.parse<GetEmailResponse>( List<EmailId>? destroyedEmailIds = resultChanges
getEmailUpdatedInvocation.methodCallId, ?.destroyed
GetEmailResponse.deserialize); .toEmailIds()
.toList();
State? newStateChanges = resultChanges?.newState;
bool hasMoreChanges = resultChanges?.hasMoreChanges ?? false;
List<Email>? updatedEmail;
List<Email>? createdEmail;
State? newStateEmail;
final resultCreated = result.parse<GetEmailResponse>( if (getEmailUpdatedInvocation != null) {
getEmailCreatedInvocation.methodCallId, final emailResponseUpdated = result.parse<GetEmailResponse>(
GetEmailResponse.deserialize); getEmailUpdatedInvocation.methodCallId,
GetEmailResponse.deserialize,
);
updatedEmail = emailResponseUpdated?.list;
newStateEmail = emailResponseUpdated?.state;
}
final listMailboxIdDestroyed = resultChanges?.destroyed.map((id) => EmailId(id)).toList() ?? <EmailId>[]; if (getEmailCreatedInvocation != null) {
final emailResponseCreated = result.parse<GetEmailResponse>(
getEmailCreatedInvocation.methodCallId,
GetEmailResponse.deserialize,
);
createdEmail = emailResponseCreated?.list;
newStateEmail = emailResponseCreated?.state;
}
return EmailChangeResponse( return EmailChangeResponse(
updated: resultUpdated?.list, updated: updatedEmail,
created: resultCreated?.list, created: createdEmail,
destroyed: listMailboxIdDestroyed, destroyed: destroyedEmailIds,
newStateEmail: resultUpdated?.state, newStateEmail: newStateEmail,
newStateChanges: resultChanges?.newState, newStateChanges: newStateChanges,
hasMoreChanges: resultChanges?.hasMoreChanges ?? false, hasMoreChanges: hasMoreChanges,
updatedProperties: propertiesUpdated); updatedProperties: propertiesUpdated,
);
} }
Future<Email> getEmailById(Session session, AccountId accountId, EmailId emailId, {Properties? properties}) async { Future<Email> getEmailById(Session session, AccountId accountId, EmailId emailId, {Properties? properties}) async {