diff --git a/lib/features/email/data/datasource_impl/calendar_event_datasource_impl.dart b/lib/features/email/data/datasource_impl/calendar_event_datasource_impl.dart new file mode 100644 index 000000000..aabcc5193 --- /dev/null +++ b/lib/features/email/data/datasource_impl/calendar_event_datasource_impl.dart @@ -0,0 +1,22 @@ + +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/network/calendar_event_api.dart'; +import 'package:tmail_ui_user/main/exceptions/exception_thrower.dart'; + +class CalendarEventDataSourceImpl extends CalendarEventDataSource { + + final CalendarEventAPI _calendarEventAPI; + final ExceptionThrower _exceptionThrower; + + CalendarEventDataSourceImpl(this._calendarEventAPI, this._exceptionThrower); + + @override + Future> parse(AccountId accountId, Set blobIds) { + return Future.sync(() async { + return await _calendarEventAPI.parse(accountId, blobIds); + }).catchError(_exceptionThrower.throwException); + } +} \ No newline at end of file diff --git a/lib/features/email/data/network/calendar_event_api.dart b/lib/features/email/data/network/calendar_event_api.dart new file mode 100644 index 000000000..19ce72046 --- /dev/null +++ b/lib/features/email/data/network/calendar_event_api.dart @@ -0,0 +1,41 @@ +import 'dart:async'; + +import 'package:jmap_dart_client/http/http_client.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/jmap_request.dart'; +import 'package:jmap_dart_client/jmap/mail/calendar/calendar_event.dart'; +import 'package:jmap_dart_client/jmap/mail/calendar/parse/calendar_event_parse_method.dart'; +import 'package:jmap_dart_client/jmap/mail/calendar/parse/calendar_event_parse_response.dart'; +import 'package:tmail_ui_user/features/email/domain/exceptions/calendar_event_exceptions.dart'; + +class CalendarEventAPI { + + final HttpClient _httpClient; + + CalendarEventAPI(this._httpClient); + + Future> parse(AccountId accountId, Set blobIds) async { + final requestBuilder = JmapRequestBuilder(_httpClient, ProcessingInvocation()); + final calendarEventParseMethod = CalendarEventParseMethod(accountId, blobIds); + final calendarEventParseInvocation = requestBuilder.invocation(calendarEventParseMethod); + final response = await (requestBuilder + ..usings(calendarEventParseMethod.requiredCapabilities)) + .build() + .execute(); + + final calendarEventParseResponse = response.parse( + calendarEventParseInvocation.methodCallId, + CalendarEventParseResponse.deserialize); + + if (calendarEventParseResponse?.parsed?.isNotEmpty == true) { + return calendarEventParseResponse!.parsed!.values.toList(); + } else if (calendarEventParseResponse?.notParsable?.isNotEmpty == true) { + throw NotParsableCalendarEventException(); + } else if (calendarEventParseResponse?.notFound?.isNotEmpty == true) { + throw NotFoundCalendarEventException(); + } else { + throw NotParsableCalendarEventException(); + } + } +} \ No newline at end of file diff --git a/lib/features/email/data/repository/calendar_event_repository_impl.dart b/lib/features/email/data/repository/calendar_event_repository_impl.dart new file mode 100644 index 000000000..9d94ecc74 --- /dev/null +++ b/lib/features/email/data/repository/calendar_event_repository_impl.dart @@ -0,0 +1,18 @@ + +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/repository/calendar_event_repository.dart'; + +class CalendarEventRepositoryImpl extends CalendarEventRepository { + + final CalendarEventDataSource _calendarEventDataSource; + + CalendarEventRepositoryImpl(this._calendarEventDataSource); + + @override + Future> parse(AccountId accountId, Set blobIds) { + return _calendarEventDataSource.parse(accountId, blobIds); + } +} \ No newline at end of file diff --git a/lib/features/email/domain/exceptions/calendar_event_exceptions.dart b/lib/features/email/domain/exceptions/calendar_event_exceptions.dart new file mode 100644 index 000000000..1129d36f5 --- /dev/null +++ b/lib/features/email/domain/exceptions/calendar_event_exceptions.dart @@ -0,0 +1,4 @@ + +class NotFoundCalendarEventException implements Exception {} + +class NotParsableCalendarEventException implements Exception {} \ No newline at end of file