diff --git a/lib/features/home/data/datasource_impl/session_datasource_impl.dart b/lib/features/home/data/datasource_impl/session_datasource_impl.dart index c7fefa71d..3d00990f4 100644 --- a/lib/features/home/data/datasource_impl/session_datasource_impl.dart +++ b/lib/features/home/data/datasource_impl/session_datasource_impl.dart @@ -1,6 +1,7 @@ import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:tmail_ui_user/features/home/data/datasource/session_datasource.dart'; import 'package:tmail_ui_user/features/home/data/network/session_api.dart'; +import 'package:tmail_ui_user/features/home/domain/extensions/session_extensions.dart'; import 'package:tmail_ui_user/main/exceptions/exception_thrower.dart'; class SessionDataSourceImpl extends SessionDataSource { @@ -13,7 +14,9 @@ class SessionDataSourceImpl extends SessionDataSource { @override Future getSession() { return Future.sync(() async { - return await _sessionAPI.getSession(); + return await _sessionAPI.getSession( + converters: SessionExtensions.customMapCapabilitiesConverter, + ); }).catchError(_exceptionThrower.throwException); } diff --git a/lib/features/home/data/extensions/session_hive_obj_extension.dart b/lib/features/home/data/extensions/session_hive_obj_extension.dart index a2f333701..78e8a427a 100644 --- a/lib/features/home/data/extensions/session_hive_obj_extension.dart +++ b/lib/features/home/data/extensions/session_hive_obj_extension.dart @@ -1,9 +1,15 @@ import 'dart:convert'; +import 'package:jmap_dart_client/http/converter/capabilities_converter.dart'; import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:tmail_ui_user/features/home/data/model/session_hive_obj.dart'; +import 'package:tmail_ui_user/features/home/domain/extensions/session_extensions.dart'; extension SessionHiveObjExtension on SessionHiveObj { - Session toSession() => Session.fromJson(jsonDecode(value)); + Session toSession() => Session.fromJson( + jsonDecode(value), + converter: CapabilitiesConverter.defaultConverter + ..addConverters(SessionExtensions.customMapCapabilitiesConverter), + ); } \ No newline at end of file diff --git a/lib/features/home/data/network/session_api.dart b/lib/features/home/data/network/session_api.dart index c0f6bce86..6639e32fd 100644 --- a/lib/features/home/data/network/session_api.dart +++ b/lib/features/home/data/network/session_api.dart @@ -15,6 +15,10 @@ class SessionAPI { Future getSession({Map)>? converters}) async { final getSessionBuilder = GetSessionBuilder(httpClient); + if (converters != null) { + getSessionBuilder.registerCapabilityConverter(converters); + } + final result = await getSessionBuilder.build().execute(); return result; diff --git a/lib/features/home/domain/converter/capability_properties_converter.dart b/lib/features/home/domain/converter/capability_properties_converter.dart index d2e162d93..48f8f9a98 100644 --- a/lib/features/home/domain/converter/capability_properties_converter.dart +++ b/lib/features/home/domain/converter/capability_properties_converter.dart @@ -1,3 +1,5 @@ +import 'package:contact/contact/model/autocomplete_capability.dart'; +import 'package:jmap_dart_client/jmap/core/capability/calendar_event_capability.dart'; import 'package:jmap_dart_client/jmap/core/capability/capability_properties.dart'; import 'package:jmap_dart_client/jmap/core/capability/core_capability.dart'; import 'package:jmap_dart_client/jmap/core/capability/default_capability.dart'; @@ -6,7 +8,9 @@ import 'package:jmap_dart_client/jmap/core/capability/mail_capability.dart'; import 'package:jmap_dart_client/jmap/core/capability/mdn_capability.dart'; import 'package:jmap_dart_client/jmap/core/capability/submission_capability.dart'; import 'package:jmap_dart_client/jmap/core/capability/vacation_capability.dart'; +import 'package:jmap_dart_client/jmap/core/capability/web_socket_ticket_capability.dart'; import 'package:jmap_dart_client/jmap/core/capability/websocket_capability.dart'; +import 'package:model/support/contact_support_capability.dart'; class CapabilityPropertiesConverter { @@ -19,10 +23,18 @@ class CapabilityPropertiesConverter { return properties.toJson(); } else if (properties is VacationCapability) { return properties.toJson(); + } else if (properties is CalendarEventCapability) { + return properties.toJson(); } else if (properties is WebSocketCapability) { return properties.toJson(); + } else if (properties is WebSocketTicketCapability) { + return properties.toJson(); } else if (properties is MdnCapability) { return properties.toJson(); + } else if (properties is AutocompleteCapability) { + return properties.toJson(); + } else if (properties is ContactSupportCapability) { + return properties.toJson(); } else if (properties is DefaultCapability) { return properties.properties; } else if (properties is EmptyCapability) { diff --git a/lib/features/home/domain/extensions/session_extensions.dart b/lib/features/home/domain/extensions/session_extensions.dart index e27b1b790..5571747bc 100644 --- a/lib/features/home/domain/extensions/session_extensions.dart +++ b/lib/features/home/domain/extensions/session_extensions.dart @@ -10,7 +10,7 @@ import 'package:jmap_dart_client/http/converter/state_converter.dart'; import 'package:jmap_dart_client/http/converter/user_name_converter.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/core/capability/capability_identifier.dart'; -import 'package:jmap_dart_client/jmap/core/capability/default_capability.dart'; +import 'package:jmap_dart_client/jmap/core/capability/capability_properties.dart'; import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:jmap_dart_client/jmap/core/unsigned_int.dart'; import 'package:model/model.dart'; @@ -22,6 +22,11 @@ import 'package:tmail_ui_user/features/home/domain/converter/session_primary_acc extension SessionExtensions on Session { static final CapabilityIdentifier linagoraContactSupportCapability = CapabilityIdentifier(Uri.parse('com:linagora:params:jmap:contact:support')); + static final Map)> customMapCapabilitiesConverter = { + linagoraContactSupportCapability: ContactSupportCapability.deserialize, + tmailContactCapabilityIdentifier: AutocompleteCapability.deserialize, + }; + Map toJson() { final val = {}; @@ -85,26 +90,12 @@ extension SessionExtensions on Session { ContactSupportCapability? getContactSupportCapability(AccountId accountId) { try { - final contactSupportCapability = getCapabilityProperties(accountId, linagoraContactSupportCapability); - if (contactSupportCapability != null) { - if (contactSupportCapability != ContactSupportCapability(httpLink: null, supportMailAddress: null)) { - log('SessionExtensions::getContactSupportCapability:contactSupportCapability = $contactSupportCapability'); - return contactSupportCapability; - } else { - log('SessionExtensions::getContactSupportCapability:contactSupportCapability = null'); - return null; - } - } else { - final defaultCapability = getCapabilityProperties(accountId, linagoraContactSupportCapability); - if (defaultCapability != null && defaultCapability != DefaultCapability({})) { - final contactSupportCapability = ContactSupportCapability.deserialize(defaultCapability.properties!); - log('SessionExtensions::getContactSupportCapability:contactSupportCapability = $contactSupportCapability'); - return contactSupportCapability; - } else { - log('SessionExtensions::getContactSupportCapability:contactSupportCapability = null'); - return null; - } - } + final contactSupportCapability = getCapabilityProperties( + accountId, + linagoraContactSupportCapability, + ); + log('SessionExtensions::getContactSupportCapability:contactSupportCapability = $contactSupportCapability'); + return contactSupportCapability; } catch (e) { logError('SessionExtensions::getContactSupportCapability():[Exception] $e'); return null; diff --git a/test/features/session/session_extensions_test.dart b/test/features/session/session_extensions_test.dart index 953fb9c96..6fcf991d0 100644 --- a/test/features/session/session_extensions_test.dart +++ b/test/features/session/session_extensions_test.dart @@ -1,7 +1,6 @@ import 'package:contact/contact_module.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:jmap_dart_client/jmap/core/account/account.dart'; -import 'package:jmap_dart_client/jmap/core/capability/default_capability.dart'; import 'package:jmap_dart_client/jmap/core/capability/empty_capability.dart'; import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:jmap_dart_client/jmap/core/state.dart'; @@ -143,114 +142,11 @@ void main() { expect(result?.httpLink, equals(contactSupportCapability.httpLink)); }); - test('SHOULD return ContactSupportCapability WHEN DefaultCapability is available ', () { - // Arrange - const supportMailAddress = 'contact.support@example.com'; - const httpLink = 'https://contact.support'; - final defaultCapability = DefaultCapability({ - 'supportMailAddress': supportMailAddress, - 'httpLink': httpLink, - }); - final session = Session( - { - SessionExtensions.linagoraContactSupportCapability: defaultCapability - }, - { - AccountFixtures.aliceAccountId: Account( - AccountName('Alice'), - true, - false, - { - SessionExtensions.linagoraContactSupportCapability: defaultCapability - }, - ) - }, - {}, - UserName(''), - Uri(), - Uri(), - Uri(), - Uri(), - State(''), - ); - - // Act - final result = session.getContactSupportCapability(AccountFixtures.aliceAccountId); - - // Assert - expect(result?.supportMailAddress, equals(supportMailAddress)); - expect(result?.httpLink, equals(httpLink)); - }); - - test('SHOULD return null WHEN ContactSupportCapability is not available (EmptyCapability)', () { - // Arrange - final session = Session( - { - SessionExtensions.linagoraContactSupportCapability: EmptyCapability() - }, - { - AccountFixtures.aliceAccountId: Account( - AccountName('Alice'), - true, - false, - { - SessionExtensions.linagoraContactSupportCapability: EmptyCapability() - }, - ) - }, - {}, - UserName(''), - Uri(), - Uri(), - Uri(), - Uri(), - State(''), - ); - - // Act - final result = session.getContactSupportCapability(AccountFixtures.aliceAccountId); - - // Assert - expect(result, isNull); - }); - - test('SHOULD return null WHEN ContactSupportCapability is not available (empty ContactSupportCapability)', () { + test('SHOULD return null WHEN ContactSupportCapability is not available', () { // Arrange final session = Session( { - SessionExtensions.linagoraContactSupportCapability: ContactSupportCapability() - }, - { - AccountFixtures.aliceAccountId: Account( - AccountName('Alice'), - true, - false, - { - SessionExtensions.linagoraContactSupportCapability: EmptyCapability() - }, - ) - }, - {}, - UserName(''), - Uri(), - Uri(), - Uri(), - Uri(), - State(''), - ); - - // Act - final result = session.getContactSupportCapability(AccountFixtures.aliceAccountId); - - // Assert - expect(result, isNull); - }); - - test('SHOULD return null WHEN ContactSupportCapability is not available (empty DefaultCapability)', () { - // Arrange - final session = Session( - { - SessionExtensions.linagoraContactSupportCapability: DefaultCapability({}) + SessionExtensions.linagoraContactSupportCapability: EmptyCapability() }, { AccountFixtures.aliceAccountId: Account(