diff --git a/lib/features/caching/config/hive_cache_config.dart b/lib/features/caching/config/hive_cache_config.dart index bea12da44..14c86e538 100644 --- a/lib/features/caching/config/hive_cache_config.dart +++ b/lib/features/caching/config/hive_cache_config.dart @@ -26,6 +26,7 @@ import 'package:tmail_ui_user/features/offline_mode/model/detailed_email_hive_ca import 'package:tmail_ui_user/features/offline_mode/model/email_header_hive_cache.dart'; import 'package:tmail_ui_user/features/offline_mode/model/sending_email_hive_cache.dart'; import 'package:tmail_ui_user/features/push_notification/data/model/fcm_subscription.dart'; +import 'package:tmail_ui_user/features/session/data/model/session_hive_obj.dart'; import 'package:tmail_ui_user/features/thread/data/model/email_address_hive_cache.dart'; import 'package:tmail_ui_user/features/thread/data/model/email_cache.dart'; @@ -155,6 +156,10 @@ class HiveCacheConfig { SendingEmailHiveCacheAdapter(), CachingConstants.SENDING_EMAIL_HIVE_CACHE_ID ); + registerCacheAdapter( + SessionHiveObjAdapter(), + CachingConstants.typeIdSessionHiveObj + ); } void registerCacheAdapter(TypeAdapter typeAdapter, int typeId) { diff --git a/lib/features/caching/utils/caching_constants.dart b/lib/features/caching/utils/caching_constants.dart index dd84f20f3..9a3277b0f 100644 --- a/lib/features/caching/utils/caching_constants.dart +++ b/lib/features/caching/utils/caching_constants.dart @@ -18,6 +18,7 @@ class CachingConstants { static const int EMAIL_HEADER_HIVE_CACHE_ID = 16; static const int DETAILED_EMAIL_HIVE_CACHE_ID = 17; static const int SENDING_EMAIL_HIVE_CACHE_ID = 18; + static const int typeIdSessionHiveObj = 19; static const String fcmCacheBoxName = 'fcm_cache_box'; static const String incomingEmailedCacheBoxName = 'incoming_emailed_cache_box'; diff --git a/lib/features/session/data/extensions/session_hive_obj_extension.dart b/lib/features/session/data/extensions/session_hive_obj_extension.dart new file mode 100644 index 000000000..958d170f2 --- /dev/null +++ b/lib/features/session/data/extensions/session_hive_obj_extension.dart @@ -0,0 +1,7 @@ + +import 'package:jmap_dart_client/jmap/core/session/session.dart'; +import 'package:tmail_ui_user/features/session/data/model/session_hive_obj.dart'; + +extension SessionHiveObjExtension on SessionHiveObj { + Session toSession() => Session.fromJson(values); +} \ No newline at end of file diff --git a/lib/features/session/data/model/session_hive_obj.dart b/lib/features/session/data/model/session_hive_obj.dart new file mode 100644 index 000000000..38c612091 --- /dev/null +++ b/lib/features/session/data/model/session_hive_obj.dart @@ -0,0 +1,21 @@ +import 'package:equatable/equatable.dart'; +import 'package:hive/hive.dart'; +import 'package:tmail_ui_user/features/caching/utils/caching_constants.dart'; + +part 'session_hive_obj.g.dart'; + +@HiveType(typeId: CachingConstants.typeIdSessionHiveObj) +class SessionHiveObj extends HiveObject with EquatableMixin { + + static const String keyValue = 'session'; + + @HiveField(0) + final Map values; + + SessionHiveObj({ + required this.values + }); + + @override + List get props => [values]; +} \ No newline at end of file diff --git a/lib/features/session/domain/converter/capability_properties_converter.dart b/lib/features/session/domain/converter/capability_properties_converter.dart new file mode 100644 index 000000000..d2e162d93 --- /dev/null +++ b/lib/features/session/domain/converter/capability_properties_converter.dart @@ -0,0 +1,34 @@ +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'; +import 'package:jmap_dart_client/jmap/core/capability/empty_capability.dart'; +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/websocket_capability.dart'; + +class CapabilityPropertiesConverter { + + Map? toJson(CapabilityProperties properties) { + if (properties is CoreCapability) { + return properties.toJson(); + } else if (properties is MailCapability) { + return properties.toJson(); + } else if (properties is SubmissionCapability) { + return properties.toJson(); + } else if (properties is VacationCapability) { + return properties.toJson(); + } else if (properties is WebSocketCapability) { + return properties.toJson(); + } else if (properties is MdnCapability) { + return properties.toJson(); + } else if (properties is DefaultCapability) { + return properties.properties; + } else if (properties is EmptyCapability) { + return properties.toJson(); + } else { + return null; + } + } +} \ No newline at end of file diff --git a/lib/features/session/domain/converter/session_account_converter.dart b/lib/features/session/domain/converter/session_account_converter.dart new file mode 100644 index 000000000..9dbed1d94 --- /dev/null +++ b/lib/features/session/domain/converter/session_account_converter.dart @@ -0,0 +1,14 @@ +import 'package:jmap_dart_client/http/converter/account_id_converter.dart'; +import 'package:jmap_dart_client/jmap/account_id.dart'; +import 'package:jmap_dart_client/jmap/core/account/account.dart'; +import 'package:tmail_ui_user/features/session/domain/extensions/session_account_extension.dart'; + +class SessionAccountConverter { + + MapEntry convertToMapEntry(AccountId accountId, Account account) { + return MapEntry( + const AccountIdConverter().toJson(accountId), + account.toJson() + ); + } +} \ No newline at end of file diff --git a/lib/features/session/domain/converter/session_capabilities_converter.dart b/lib/features/session/domain/converter/session_capabilities_converter.dart new file mode 100644 index 000000000..e458b0204 --- /dev/null +++ b/lib/features/session/domain/converter/session_capabilities_converter.dart @@ -0,0 +1,14 @@ +import 'package:jmap_dart_client/http/converter/capability_identifier_converter.dart'; +import 'package:jmap_dart_client/jmap/core/capability/capability_identifier.dart'; +import 'package:jmap_dart_client/jmap/core/capability/capability_properties.dart'; +import 'package:tmail_ui_user/features/session/domain/converter/capability_properties_converter.dart'; + +class SessionCapabilitiesConverter { + + MapEntry convertToMapEntry(CapabilityIdentifier identifier, CapabilityProperties properties) { + return MapEntry( + const CapabilityIdentifierConverter().toJson(identifier), + CapabilityPropertiesConverter().toJson(properties) + ); + } +} \ No newline at end of file diff --git a/lib/features/session/domain/converter/session_primary_account_converter.dart b/lib/features/session/domain/converter/session_primary_account_converter.dart new file mode 100644 index 000000000..572e5c088 --- /dev/null +++ b/lib/features/session/domain/converter/session_primary_account_converter.dart @@ -0,0 +1,14 @@ +import 'package:jmap_dart_client/http/converter/account_id_converter.dart'; +import 'package:jmap_dart_client/http/converter/capability_identifier_converter.dart'; +import 'package:jmap_dart_client/jmap/account_id.dart'; +import 'package:jmap_dart_client/jmap/core/capability/capability_identifier.dart'; + +class SessionPrimaryAccountConverter { + + MapEntry convertToMapEntry(CapabilityIdentifier identifier, AccountId accountId) { + return MapEntry( + const CapabilityIdentifierConverter().toJson(identifier), + const AccountIdConverter().toJson(accountId) + ); + } +} \ No newline at end of file diff --git a/lib/features/session/domain/extensions/session_account_extension.dart b/lib/features/session/domain/extensions/session_account_extension.dart new file mode 100644 index 000000000..b4eba81fc --- /dev/null +++ b/lib/features/session/domain/extensions/session_account_extension.dart @@ -0,0 +1,24 @@ + +import 'package:jmap_dart_client/http/converter/account_name_converter.dart'; +import 'package:jmap_dart_client/jmap/core/account/account.dart'; +import 'package:tmail_ui_user/features/session/domain/converter/session_capabilities_converter.dart'; + +extension SessionAccountExtension on Account { + + Map toJson() { + final val = {}; + + void writeNotNull(String key, dynamic value) { + if (value != null) { + val[key] = value; + } + } + + writeNotNull('name', const AccountNameConverter().toJson(name)); + writeNotNull('isPersonal', isPersonal); + writeNotNull('isReadOnly', isReadOnly); + writeNotNull('accountCapabilities', accountCapabilities.map((key, value) => SessionCapabilitiesConverter().convertToMapEntry(key, value))); + + return val; + } +} \ No newline at end of file diff --git a/lib/features/session/domain/extensions/session_extensions.dart b/lib/features/session/domain/extensions/session_extensions.dart new file mode 100644 index 000000000..7ab50a8e9 --- /dev/null +++ b/lib/features/session/domain/extensions/session_extensions.dart @@ -0,0 +1,35 @@ + +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/core/session/session.dart'; +import 'package:tmail_ui_user/features/session/data/model/session_hive_obj.dart'; +import 'package:tmail_ui_user/features/session/domain/converter/session_account_converter.dart'; +import 'package:tmail_ui_user/features/session/domain/converter/session_capabilities_converter.dart'; +import 'package:tmail_ui_user/features/session/domain/converter/session_primary_account_converter.dart'; + +extension SessionExtensions on Session { + + Map toJson() { + final val = {}; + + void writeNotNull(String key, dynamic value) { + if (value != null) { + val[key] = value; + } + } + + writeNotNull('capabilities', capabilities.map((key, value) => SessionCapabilitiesConverter().convertToMapEntry(key, value))); + writeNotNull('accounts', accounts.map((key, value) => SessionAccountConverter().convertToMapEntry(key, value))); + writeNotNull('primaryAccounts', primaryAccounts.map((key, value) => SessionPrimaryAccountConverter().convertToMapEntry(key, value))); + writeNotNull('username', const UserNameConverter().toJson(username)); + writeNotNull('apiUrl', apiUrl.toString()); + writeNotNull('downloadUrl', downloadUrl.toString()); + writeNotNull('uploadUrl', uploadUrl.toString()); + writeNotNull('eventSourceUrl', eventSourceUrl.toString()); + writeNotNull('state', const StateConverter().toJson(state)); + + return val; + } + + SessionHiveObj toHiveObj() => SessionHiveObj(values: toJson()); +} \ No newline at end of file diff --git a/test/features/session/session_hive_obj_test.dart b/test/features/session/session_hive_obj_test.dart new file mode 100644 index 000000000..a88b0102d --- /dev/null +++ b/test/features/session/session_hive_obj_test.dart @@ -0,0 +1,16 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:tmail_ui_user/features/session/data/extensions/session_hive_obj_extension.dart'; +import 'package:tmail_ui_user/features/session/domain/extensions/session_extensions.dart'; + +import '../../fixtures/session_fixtures.dart'; + +void main() { + group('SessionHiveObj test', () { + test('toSession() should return parsing correctly session', () { + final sessionHiveObj = SessionFixtures.aliceSession.toHiveObj(); + final sessionParsed = sessionHiveObj.toSession(); + + expect(sessionParsed.accounts.length, equals(SessionFixtures.aliceSession.accounts.length)); + }); + }); +} \ No newline at end of file