TF-3235 Create seach emails in thread API, datasource and repository

This commit is contained in:
DatDang
2024-10-31 11:17:48 +07:00
committed by Dat H. Pham
parent 4be3184f92
commit 659acd7b17
11 changed files with 615 additions and 5 deletions
@@ -7,7 +7,7 @@ class EmailsResponse with EquatableMixin {
final List<Email>? emailList;
final State? state;
EmailsResponse({
const EmailsResponse({
this.emailList,
this.state
});
@@ -0,0 +1,91 @@
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
class SearchEmail extends Email {
final String? searchSnippetSubject;
final String? searchSnippetPreview;
SearchEmail({
super.id,
super.blobId,
super.threadId,
super.mailboxIds,
super.keywords,
super.size,
super.receivedAt,
super.headers,
super.messageId,
super.inReplyTo,
super.references,
super.subject,
super.sentAt,
super.hasAttachment,
super.preview,
super.sender,
super.from,
super.to,
super.cc,
super.bcc,
super.replyTo,
super.textBody,
super.htmlBody,
super.attachments,
super.bodyStructure,
super.bodyValues,
super.headerUserAgent,
super.headerMdn,
super.headerCalendarEvent,
super.sMimeStatusHeader,
super.identityHeader,
required this.searchSnippetSubject,
required this.searchSnippetPreview
});
@override
List<Object?> get props => [
...super.props,
searchSnippetSubject,
searchSnippetPreview,
];
factory SearchEmail.fromEmail(
Email email, {
String? searchSnippetSubject,
String? searchSnippetPreview,
}) {
return SearchEmail(
id: email.id,
blobId: email.blobId,
threadId: email.threadId,
mailboxIds: email.mailboxIds,
keywords: email.keywords,
size: email.size,
receivedAt: email.receivedAt,
headers: email.headers,
messageId: email.messageId,
inReplyTo: email.inReplyTo,
references: email.references,
subject: email.subject,
sentAt: email.sentAt,
hasAttachment: email.hasAttachment,
preview: email.preview,
sender: email.sender,
from: email.from,
to: email.to,
cc: email.cc,
bcc: email.bcc,
replyTo: email.replyTo,
textBody: email.textBody,
htmlBody: email.htmlBody,
attachments: email.attachments,
bodyStructure: email.bodyStructure,
bodyValues: email.bodyValues,
headerUserAgent: email.headerUserAgent,
headerMdn: email.headerMdn,
headerCalendarEvent: email.headerCalendarEvent,
sMimeStatusHeader: email.sMimeStatusHeader,
identityHeader: email.identityHeader,
searchSnippetSubject: searchSnippetSubject,
searchSnippetPreview: searchSnippetPreview,
);
}
}
@@ -0,0 +1,35 @@
import 'package:jmap_dart_client/jmap/mail/email/search_snippet/search_snippet.dart';
import 'package:tmail_ui_user/features/thread/domain/model/email_response.dart';
import 'package:tmail_ui_user/features/thread/domain/model/search_email.dart';
class SearchEmailsResponse extends EmailsResponse {
const SearchEmailsResponse({
super.emailList,
super.state,
required this.searchSnippets,
});
final List<SearchSnippet>? searchSnippets;
@override
List<Object?> get props => [...super.props, searchSnippets];
List<SearchEmail>? get toSearchEmails {
if (searchSnippets == null) {
return emailList?.map(SearchEmail.fromEmail).toList();
}
final mapSearchSnippet = Map.fromEntries(
searchSnippets!.map((searchSnippet) => MapEntry(
searchSnippet.emailId,
searchSnippet)));
return emailList?.map((email) {
final searchSnippet = mapSearchSnippet[email.id];
return SearchEmail.fromEmail(
email,
searchSnippetSubject: searchSnippet?.subject,
searchSnippetPreview: searchSnippet?.preview);
}).toList();
}
}