TF-2078 Implement get calendar event action in domain & data layer
(cherry picked from commit 6c372d57cfebf31e776f071b514e71c637b44257)
This commit is contained in:
@@ -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: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/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/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';
|
import 'package:tmail_ui_user/main/exceptions/exception_thrower.dart';
|
||||||
|
|
||||||
class CalendarEventDataSourceImpl extends CalendarEventDataSource {
|
class CalendarEventDataSourceImpl extends CalendarEventDataSource {
|
||||||
@@ -19,4 +20,9 @@ class CalendarEventDataSourceImpl extends CalendarEventDataSource {
|
|||||||
return await _calendarEventAPI.parse(accountId, blobIds);
|
return await _calendarEventAPI.parse(accountId, blobIds);
|
||||||
}).catchError(_exceptionThrower.throwException);
|
}).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 'dart:convert';
|
||||||
|
|
||||||
|
import 'package:collection/collection.dart';
|
||||||
import 'package:core/data/network/dio_client.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/dom/add_tooltip_link_transformers.dart';
|
||||||
import 'package:core/presentation/utils/html_transformer/html_transform.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/text/sanitize_autolink_html_transformers.dart';
|
||||||
import 'package:core/presentation/utils/html_transformer/transform_configuration.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.dart';
|
||||||
import 'package:model/email/email_content_type.dart';
|
import 'package:model/email/email_content_type.dart';
|
||||||
|
|
||||||
@@ -61,4 +63,14 @@ class HtmlAnalyzer {
|
|||||||
return emailContent;
|
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/account_id.dart';
|
||||||
import 'package:jmap_dart_client/jmap/core/id.dart';
|
import 'package:jmap_dart_client/jmap/core/id.dart';
|
||||||
import 'package:jmap_dart_client/jmap/mail/calendar/calendar_event.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/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';
|
import 'package:tmail_ui_user/features/email/domain/repository/calendar_event_repository.dart';
|
||||||
|
|
||||||
class CalendarEventRepositoryImpl extends CalendarEventRepository {
|
class CalendarEventRepositoryImpl extends CalendarEventRepository {
|
||||||
|
|
||||||
final CalendarEventDataSource _calendarEventDataSource;
|
final Map<DataSourceType, CalendarEventDataSource> _calendarEventDataSource;
|
||||||
|
|
||||||
CalendarEventRepositoryImpl(this._calendarEventDataSource);
|
CalendarEventRepositoryImpl(this._calendarEventDataSource);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<List<CalendarEvent>> parse(AccountId accountId, Set<Id> blobIds) {
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
|
||||||
|
import 'package:equatable/equatable.dart';
|
||||||
|
import 'package:flutter/cupertino.dart';
|
||||||
|
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
||||||
|
|
||||||
|
enum EventActionType {
|
||||||
|
yes,
|
||||||
|
maybe,
|
||||||
|
no;
|
||||||
|
|
||||||
|
String getLabelButton(BuildContext context) {
|
||||||
|
switch(this) {
|
||||||
|
case EventActionType.yes:
|
||||||
|
return AppLocalizations.of(context).yes;
|
||||||
|
case EventActionType.maybe:
|
||||||
|
return AppLocalizations.of(context).maybe;
|
||||||
|
case EventActionType.no:
|
||||||
|
return AppLocalizations.of(context).no;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class EventAction with EquatableMixin {
|
||||||
|
final EventActionType actionType;
|
||||||
|
final String link;
|
||||||
|
|
||||||
|
EventAction(this.actionType, this.link);
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object?> get props => [actionType, link];
|
||||||
|
}
|
||||||
@@ -1,17 +1,19 @@
|
|||||||
import 'package:core/presentation/state/failure.dart';
|
import 'package:core/presentation/state/failure.dart';
|
||||||
import 'package:core/presentation/state/success.dart';
|
import 'package:core/presentation/state/success.dart';
|
||||||
import 'package:jmap_dart_client/jmap/mail/calendar/calendar_event.dart';
|
import 'package:jmap_dart_client/jmap/mail/calendar/calendar_event.dart';
|
||||||
|
import 'package:tmail_ui_user/features/email/domain/model/event_action.dart';
|
||||||
|
|
||||||
class ParseCalendarEventLoading extends LoadingState {}
|
class ParseCalendarEventLoading extends LoadingState {}
|
||||||
|
|
||||||
class ParseCalendarEventSuccess extends UIState {
|
class ParseCalendarEventSuccess extends UIState {
|
||||||
|
|
||||||
final List<CalendarEvent> calendarEventList;
|
final List<CalendarEvent> calendarEventList;
|
||||||
|
final List<EventAction> eventActionList;
|
||||||
|
|
||||||
ParseCalendarEventSuccess(this.calendarEventList);
|
ParseCalendarEventSuccess(this.calendarEventList, this.eventActionList);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
List<Object> get props => [calendarEventList];
|
List<Object> get props => [calendarEventList, eventActionList];
|
||||||
}
|
}
|
||||||
|
|
||||||
class ParseCalendarEventFailure extends FeatureFailure {
|
class ParseCalendarEventFailure extends FeatureFailure {
|
||||||
|
|||||||
@@ -3,6 +3,8 @@ import 'package:core/presentation/state/success.dart';
|
|||||||
import 'package:dartz/dartz.dart';
|
import 'package:dartz/dartz.dart';
|
||||||
import 'package:jmap_dart_client/jmap/account_id.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/core/id.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/mail/calendar/calendar_event.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';
|
import 'package:tmail_ui_user/features/email/domain/repository/calendar_event_repository.dart';
|
||||||
import 'package:tmail_ui_user/features/email/domain/state/parse_calendar_event_state.dart';
|
import 'package:tmail_ui_user/features/email/domain/state/parse_calendar_event_state.dart';
|
||||||
|
|
||||||
@@ -11,11 +13,26 @@ class ParseCalendarEventInteractor {
|
|||||||
|
|
||||||
ParseCalendarEventInteractor(this._calendarEventRepository);
|
ParseCalendarEventInteractor(this._calendarEventRepository);
|
||||||
|
|
||||||
Stream<Either<Failure, Success>> execute(AccountId accountId, Set<Id> blobIds) async* {
|
Stream<Either<Failure, Success>> execute(
|
||||||
|
AccountId accountId,
|
||||||
|
Set<Id> blobIds,
|
||||||
|
String emailContents
|
||||||
|
) async* {
|
||||||
try {
|
try {
|
||||||
yield Right(ParseCalendarEventLoading());
|
yield Right(ParseCalendarEventLoading());
|
||||||
final calendarEventList = await _calendarEventRepository.parse(accountId, blobIds);
|
|
||||||
yield Right(ParseCalendarEventSuccess(calendarEventList));
|
final result = await Future.wait(
|
||||||
|
[
|
||||||
|
_calendarEventRepository.parse(accountId, blobIds),
|
||||||
|
_calendarEventRepository.getListEventAction(emailContents),
|
||||||
|
],
|
||||||
|
eagerError: true
|
||||||
|
);
|
||||||
|
|
||||||
|
final calendarEventList = result.first as List<CalendarEvent>;
|
||||||
|
final eventActionList = result.last as List<EventAction>;
|
||||||
|
|
||||||
|
yield Right(ParseCalendarEventSuccess(calendarEventList, eventActionList));
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
yield Left(ParseCalendarEventFailure(e));
|
yield Left(ParseCalendarEventFailure(e));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,12 +1,16 @@
|
|||||||
|
import 'package:core/data/model/source_type/data_source_type.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
import 'package:jmap_dart_client/http/http_client.dart';
|
import 'package:jmap_dart_client/http/http_client.dart';
|
||||||
import 'package:tmail_ui_user/features/base/interactors_bindings.dart';
|
import 'package:tmail_ui_user/features/base/interactors_bindings.dart';
|
||||||
import 'package:tmail_ui_user/features/email/data/datasource/calendar_event_datasource.dart';
|
import 'package:tmail_ui_user/features/email/data/datasource/calendar_event_datasource.dart';
|
||||||
import 'package:tmail_ui_user/features/email/data/datasource_impl/calendar_event_datasource_impl.dart';
|
import 'package:tmail_ui_user/features/email/data/datasource_impl/calendar_event_datasource_impl.dart';
|
||||||
|
import 'package:tmail_ui_user/features/email/data/datasource_impl/local_calendar_event_datasource_impl.dart';
|
||||||
|
import 'package:tmail_ui_user/features/email/data/local/html_analyzer.dart';
|
||||||
import 'package:tmail_ui_user/features/email/data/network/calendar_event_api.dart';
|
import 'package:tmail_ui_user/features/email/data/network/calendar_event_api.dart';
|
||||||
import 'package:tmail_ui_user/features/email/data/repository/calendar_event_repository_impl.dart';
|
import 'package:tmail_ui_user/features/email/data/repository/calendar_event_repository_impl.dart';
|
||||||
import 'package:tmail_ui_user/features/email/domain/repository/calendar_event_repository.dart';
|
import 'package:tmail_ui_user/features/email/domain/repository/calendar_event_repository.dart';
|
||||||
import 'package:tmail_ui_user/features/email/domain/usecases/parse_calendar_event_interactor.dart';
|
import 'package:tmail_ui_user/features/email/domain/usecases/parse_calendar_event_interactor.dart';
|
||||||
|
import 'package:tmail_ui_user/main/exceptions/cache_exception_thrower.dart';
|
||||||
import 'package:tmail_ui_user/main/exceptions/remote_exception_thrower.dart';
|
import 'package:tmail_ui_user/main/exceptions/remote_exception_thrower.dart';
|
||||||
|
|
||||||
class CalendarEventInteractorBindings extends InteractorsBindings {
|
class CalendarEventInteractorBindings extends InteractorsBindings {
|
||||||
@@ -22,6 +26,9 @@ class CalendarEventInteractorBindings extends InteractorsBindings {
|
|||||||
Get.lazyPut(() => CalendarEventDataSourceImpl(
|
Get.lazyPut(() => CalendarEventDataSourceImpl(
|
||||||
Get.find<CalendarEventAPI>(),
|
Get.find<CalendarEventAPI>(),
|
||||||
Get.find<RemoteExceptionThrower>()));
|
Get.find<RemoteExceptionThrower>()));
|
||||||
|
Get.lazyPut(() => LocalCalendarEventDataSourceImpl(
|
||||||
|
Get.find<HtmlAnalyzer>(),
|
||||||
|
Get.find<CacheExceptionThrower>()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@@ -36,6 +43,11 @@ class CalendarEventInteractorBindings extends InteractorsBindings {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
void bindingsRepositoryImpl() {
|
void bindingsRepositoryImpl() {
|
||||||
Get.lazyPut(() => CalendarEventRepositoryImpl(Get.find<CalendarEventDataSource>()));
|
Get.lazyPut(() => CalendarEventRepositoryImpl(
|
||||||
|
{
|
||||||
|
DataSourceType.network: Get.find<CalendarEventDataSource>(),
|
||||||
|
DataSourceType.local: Get.find<LocalCalendarEventDataSourceImpl>(),
|
||||||
|
}
|
||||||
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user