TF-2078 Implement get calendar event action in domain & data layer

(cherry picked from commit 6c372d57cfebf31e776f071b514e71c637b44257)
This commit is contained in:
dab246
2023-08-10 18:12:58 +07:00
committed by Dat Vu
parent 86a3ba8d89
commit bc8c5336bd
8 changed files with 131 additions and 8 deletions
@@ -4,6 +4,7 @@ import 'package:jmap_dart_client/jmap/core/id.dart';
import 'package:jmap_dart_client/jmap/mail/calendar/calendar_event.dart';
import 'package:tmail_ui_user/features/email/data/datasource/calendar_event_datasource.dart';
import 'package:tmail_ui_user/features/email/data/network/calendar_event_api.dart';
import 'package:tmail_ui_user/features/email/domain/model/event_action.dart';
import 'package:tmail_ui_user/main/exceptions/exception_thrower.dart';
class CalendarEventDataSourceImpl extends CalendarEventDataSource {
@@ -19,4 +20,9 @@ class CalendarEventDataSourceImpl extends CalendarEventDataSource {
return await _calendarEventAPI.parse(accountId, blobIds);
}).catchError(_exceptionThrower.throwException);
}
@override
Future<List<EventAction>> getListEventAction(String emailContents) {
throw UnimplementedError();
}
}
@@ -0,0 +1,36 @@
import 'package:collection/collection.dart';
import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/core/id.dart';
import 'package:jmap_dart_client/jmap/mail/calendar/calendar_event.dart';
import 'package:tmail_ui_user/features/email/data/datasource/calendar_event_datasource.dart';
import 'package:tmail_ui_user/features/email/data/local/html_analyzer.dart';
import 'package:tmail_ui_user/features/email/domain/model/event_action.dart';
import 'package:tmail_ui_user/main/exceptions/exception_thrower.dart';
class LocalCalendarEventDataSourceImpl extends CalendarEventDataSource {
final HtmlAnalyzer _htmlAnalyzer;
final ExceptionThrower _exceptionThrower;
LocalCalendarEventDataSourceImpl(this._htmlAnalyzer, this._exceptionThrower);
@override
Future<List<CalendarEvent>> parse(AccountId accountId, Set<Id> blobIds) {
throw UnimplementedError();
}
@override
Future<List<EventAction>> getListEventAction(String emailContents) {
return Future.sync(() async {
final listLink = await _htmlAnalyzer.getListLinkCalendarEvent(emailContents);
if (listLink.length >= EventActionType.values.length) {
return EventActionType.values
.mapIndexed((index, type) => EventAction(type, listLink[index]))
.toList();
} else {
return <EventAction>[];
}
}).catchError(_exceptionThrower.throwException);
}
}
@@ -1,11 +1,13 @@
import 'dart:convert';
import 'package:collection/collection.dart';
import 'package:core/data/network/dio_client.dart';
import 'package:core/presentation/utils/html_transformer/dom/add_tooltip_link_transformers.dart';
import 'package:core/presentation/utils/html_transformer/html_transform.dart';
import 'package:core/presentation/utils/html_transformer/text/sanitize_autolink_html_transformers.dart';
import 'package:core/presentation/utils/html_transformer/transform_configuration.dart';
import 'package:html/parser.dart';
import 'package:model/email/email_content.dart';
import 'package:model/email/email_content_type.dart';
@@ -61,4 +63,14 @@ class HtmlAnalyzer {
return emailContent;
}
}
Future<List<String>> getListLinkCalendarEvent(String emailContents) async {
final document = parse(emailContents);
final linkElements = document.querySelectorAll('a.part-button');
final listLink = linkElements
.map((element) => element.attributes['href'])
.whereNotNull()
.toList();
return listLink;
}
}
@@ -1,18 +1,25 @@
import 'package:core/data/model/source_type/data_source_type.dart';
import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/core/id.dart';
import 'package:jmap_dart_client/jmap/mail/calendar/calendar_event.dart';
import 'package:tmail_ui_user/features/email/data/datasource/calendar_event_datasource.dart';
import 'package:tmail_ui_user/features/email/domain/model/event_action.dart';
import 'package:tmail_ui_user/features/email/domain/repository/calendar_event_repository.dart';
class CalendarEventRepositoryImpl extends CalendarEventRepository {
final CalendarEventDataSource _calendarEventDataSource;
final Map<DataSourceType, CalendarEventDataSource> _calendarEventDataSource;
CalendarEventRepositoryImpl(this._calendarEventDataSource);
@override
Future<List<CalendarEvent>> parse(AccountId accountId, Set<Id> blobIds) {
return _calendarEventDataSource.parse(accountId, blobIds);
return _calendarEventDataSource[DataSourceType.network]!.parse(accountId, blobIds);
}
@override
Future<List<EventAction>> getListEventAction(String emailContents) {
return _calendarEventDataSource[DataSourceType.local]!.getListEventAction(emailContents);
}
}