TF-145 Add data layer for getAllEmail in Caching

This commit is contained in:
dab246
2021-10-07 15:02:07 +07:00
committed by Dat H. Pham
parent 3cac5e4e83
commit bfd5901bf4
16 changed files with 524 additions and 22 deletions
@@ -6,12 +6,17 @@ import 'package:jmap_dart_client/jmap/core/filter/filter.dart';
import 'package:jmap_dart_client/jmap/core/properties/properties.dart';
import 'package:jmap_dart_client/jmap/core/request/reference_path.dart';
import 'package:jmap_dart_client/jmap/core/sort/comparator.dart';
import 'package:jmap_dart_client/jmap/core/state.dart';
import 'package:jmap_dart_client/jmap/core/unsigned_int.dart';
import 'package:jmap_dart_client/jmap/jmap_request.dart';
import 'package:jmap_dart_client/jmap/mail/email/changes/changes_email_method.dart';
import 'package:jmap_dart_client/jmap/mail/email/changes/changes_email_response.dart';
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
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/query/query_email_method.dart';
import 'package:tmail_ui_user/features/thread/data/model/email_change_response.dart';
import 'package:tmail_ui_user/features/thread/domain/model/email_response.dart';
class ThreadAPI {
@@ -19,7 +24,7 @@ class ThreadAPI {
ThreadAPI(this.httpClient);
Future<List<Email>> getAllEmail(
Future<EmailResponse> getAllEmail(
AccountId accountId,
{
int? position,
@@ -69,6 +74,72 @@ class ThreadAPI {
});
}
return resultList == null ? [] : resultList.list;
return EmailResponse(emailList: resultList?.list, state: resultList?.state);
}
Future<EmailChangeResponse> getChanges(
AccountId accountId,
State sinceState,
{
Properties? propertiesCreated,
Properties? propertiesUpdated
}
) async {
final processingInvocation = ProcessingInvocation();
final jmapRequestBuilder = JmapRequestBuilder(httpClient, processingInvocation);
final changesEmailMethod = ChangesEmailMethod(accountId, sinceState, maxChanges: UnsignedInt(128));
final changesEmailInvocation = jmapRequestBuilder.invocation(changesEmailMethod);
final getMailboxUpdated = GetEmailMethod(accountId)
..addReferenceIds(processingInvocation.createResultReference(
changesEmailInvocation.methodCallId,
ReferencePath.updatedPath));
if (propertiesUpdated != null) {
getMailboxUpdated..addProperties(propertiesUpdated);
}
final getEmailCreated = GetEmailMethod(accountId)
..addReferenceIds(processingInvocation.createResultReference(
changesEmailInvocation.methodCallId,
ReferencePath.createdPath));
if (propertiesCreated != null) {
getEmailCreated..addProperties(propertiesCreated);
}
final getEmailUpdatedInvocation = jmapRequestBuilder.invocation(getMailboxUpdated);
final getEmailCreatedInvocation = jmapRequestBuilder.invocation(getEmailCreated);
final result = await (jmapRequestBuilder
..usings(getEmailCreated.requiredCapabilities))
.build()
.execute();
final resultChanges = result.parse<ChangesEmailResponse>(
changesEmailInvocation.methodCallId,
ChangesEmailResponse.deserialize);
final resultUpdated = result.parse<GetEmailResponse>(
getEmailUpdatedInvocation.methodCallId,
GetEmailResponse.deserialize);
final resultCreated = result.parse<GetEmailResponse>(
getEmailCreatedInvocation.methodCallId,
GetEmailResponse.deserialize);
final listMailboxIdDestroyed = resultChanges?.destroyed.map((id) => EmailId(id)).toList() ?? <EmailId>[];
return EmailChangeResponse(
updated: resultUpdated?.list,
created: resultCreated?.list,
destroyed: listMailboxIdDestroyed,
newStateEmail: resultUpdated?.state,
newStateChanges: resultChanges?.newState,
hasMoreChanges: resultChanges?.hasMoreChanges ?? false,
updatedProperties: propertiesUpdated);
}
}