TF-145 Add domain layer for getAllEmail in Caching
This commit is contained in:
@@ -1,5 +1,27 @@
|
||||
import 'package:jmap_dart_client/jmap/core/properties/properties.dart';
|
||||
import 'package:jmap_dart_client/jmap/core/unsigned_int.dart';
|
||||
import 'package:model/email/email_property.dart';
|
||||
|
||||
class ThreadConstants {
|
||||
static final defaultLimit = UnsignedInt(20);
|
||||
static final propertiesDefault = Properties({
|
||||
EmailProperty.id,
|
||||
EmailProperty.subject,
|
||||
EmailProperty.from,
|
||||
EmailProperty.to,
|
||||
EmailProperty.cc,
|
||||
EmailProperty.bcc,
|
||||
EmailProperty.keywords,
|
||||
EmailProperty.size,
|
||||
EmailProperty.receivedAt,
|
||||
EmailProperty.sentAt,
|
||||
EmailProperty.preview,
|
||||
EmailProperty.hasAttachment,
|
||||
EmailProperty.replyTo,
|
||||
EmailProperty.mailboxIds,
|
||||
});
|
||||
static final propertiesUpdatedDefault = Properties({
|
||||
EmailProperty.keywords,
|
||||
EmailProperty.mailboxIds,
|
||||
});
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
|
||||
import 'package:equatable/equatable.dart';
|
||||
import 'package:jmap_dart_client/jmap/core/state.dart';
|
||||
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
|
||||
|
||||
class EmailResponse with EquatableMixin {
|
||||
final List<Email>? emailList;
|
||||
final State? state;
|
||||
|
||||
EmailResponse({
|
||||
this.emailList,
|
||||
this.state
|
||||
});
|
||||
|
||||
bool hasEmails() => emailList != null && emailList!.isNotEmpty;
|
||||
|
||||
bool hasState() => state != null;
|
||||
|
||||
@override
|
||||
List<Object?> get props => [emailList, state];
|
||||
}
|
||||
@@ -3,17 +3,20 @@ 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/sort/comparator.dart';
|
||||
import 'package:jmap_dart_client/jmap/core/unsigned_int.dart';
|
||||
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
|
||||
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
|
||||
import 'package:tmail_ui_user/features/thread/domain/model/email_response.dart';
|
||||
|
||||
abstract class ThreadRepository {
|
||||
Future<List<Email>> getAllEmail(
|
||||
Stream<EmailResponse> getAllEmail(
|
||||
AccountId accountId,
|
||||
{
|
||||
int? position,
|
||||
UnsignedInt? limit,
|
||||
Set<Comparator>? sort,
|
||||
Filter? filter,
|
||||
Properties? properties
|
||||
Properties? propertiesCreated,
|
||||
Properties? propertiesUpdated,
|
||||
MailboxId? inMailboxId
|
||||
}
|
||||
);
|
||||
}
|
||||
@@ -1,13 +1,15 @@
|
||||
import 'package:core/core.dart';
|
||||
import 'package:jmap_dart_client/jmap/core/state.dart';
|
||||
import 'package:model/model.dart';
|
||||
|
||||
class GetAllEmailSuccess extends UIState {
|
||||
final List<PresentationEmail> emailList;
|
||||
final State? currentEmailState;
|
||||
|
||||
GetAllEmailSuccess(this.emailList);
|
||||
GetAllEmailSuccess({required this.emailList, this.currentEmailState});
|
||||
|
||||
@override
|
||||
List<Object> get props => [emailList];
|
||||
List<Object?> get props => [emailList, currentEmailState];
|
||||
}
|
||||
|
||||
class GetAllEmailFailure extends FeatureFailure {
|
||||
|
||||
@@ -1,13 +1,15 @@
|
||||
import 'package:core/core.dart';
|
||||
import 'package:model/model.dart';
|
||||
import 'package:dartz/dartz.dart';
|
||||
import 'package:jmap_dart_client/jmap/account_id.dart';
|
||||
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/sort/comparator.dart';
|
||||
import 'package:jmap_dart_client/jmap/core/unsigned_int.dart';
|
||||
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
|
||||
import 'package:tmail_ui_user/features/thread/domain/model/email_response.dart';
|
||||
import 'package:tmail_ui_user/features/thread/domain/repository/thread_repository.dart';
|
||||
import 'package:tmail_ui_user/features/thread/domain/state/get_all_email_state.dart';
|
||||
import 'package:model/model.dart';
|
||||
|
||||
class GetEmailsInMailboxInteractor {
|
||||
final ThreadRepository threadRepository;
|
||||
@@ -21,23 +23,36 @@ class GetEmailsInMailboxInteractor {
|
||||
UnsignedInt? limit,
|
||||
Set<Comparator>? sort,
|
||||
Filter? filter,
|
||||
Properties? properties
|
||||
Properties? propertiesCreated,
|
||||
Properties? propertiesUpdated,
|
||||
MailboxId? inMailboxId
|
||||
}
|
||||
) async* {
|
||||
try {
|
||||
yield Right<Failure, Success>(LoadingState());
|
||||
final emailList = await threadRepository.getAllEmail(
|
||||
accountId,
|
||||
position: position,
|
||||
limit: limit,
|
||||
sort: sort,
|
||||
filter: filter,
|
||||
properties: properties
|
||||
);
|
||||
final presentationEmailList = emailList.map((email) => email.toPresentationEmail()).toList();
|
||||
yield Right<Failure, Success>(GetAllEmailSuccess(presentationEmailList));
|
||||
|
||||
yield* threadRepository
|
||||
.getAllEmail(
|
||||
accountId,
|
||||
position: position,
|
||||
limit: limit,
|
||||
sort: sort,
|
||||
filter: filter,
|
||||
propertiesCreated: propertiesCreated,
|
||||
propertiesUpdated: propertiesUpdated,
|
||||
inMailboxId: inMailboxId)
|
||||
.map(_toGetEmailState);
|
||||
} catch (e) {
|
||||
yield Left(GetAllEmailFailure(e));
|
||||
}
|
||||
}
|
||||
|
||||
Either<Failure, Success> _toGetEmailState(EmailResponse emailResponse) {
|
||||
final presentationEmailList = emailResponse.emailList
|
||||
?.map((email) => email.toPresentationEmail()).toList() ?? List.empty();
|
||||
|
||||
return Right<Failure, Success>(GetAllEmailSuccess(
|
||||
emailList: presentationEmailList,
|
||||
currentEmailState: emailResponse.state));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user