From 97a37e36bec4e06ccaeb83f7100860c066d7677a Mon Sep 17 00:00:00 2001 From: HuyNguyen Date: Thu, 29 Dec 2022 15:37:15 +0700 Subject: [PATCH] TF-1289: [Data] implement storeSubscription in fcm repository --- .../data/datasource/fcm_datasource.dart | 5 +- .../datasource_impl/fcm_datasource_impl.dart | 10 +-- .../fcm_subscriptions_impl.dart | 62 +++++++++++++++++++ .../fcm_subscription_extensions.dart | 10 +++ .../data/model/fcm_subscription.dart | 23 +++++++ .../data/repository/fcm_repository_impl.dart | 13 ++-- 6 files changed, 105 insertions(+), 18 deletions(-) create mode 100644 lib/features/push_notification/data/datasource_impl/fcm_subscriptions_impl.dart create mode 100644 lib/features/push_notification/data/extensions/fcm_subscription_extensions.dart create mode 100644 lib/features/push_notification/data/model/fcm_subscription.dart diff --git a/lib/features/push_notification/data/datasource/fcm_datasource.dart b/lib/features/push_notification/data/datasource/fcm_datasource.dart index 0cc5370dc..5ef1c5f5c 100644 --- a/lib/features/push_notification/data/datasource/fcm_datasource.dart +++ b/lib/features/push_notification/data/datasource/fcm_datasource.dart @@ -2,6 +2,7 @@ import 'package:fcm/model/firebase_subscription.dart'; import 'package:fcm/model/type_name.dart'; import 'package:jmap_dart_client/jmap/core/state.dart' as jmap; +import 'package:tmail_ui_user/features/push_notification/data/model/fcm_subscription.dart'; import 'package:tmail_ui_user/features/push_notification/domain/model/register_new_token_request.dart'; abstract class FCMDatasource { @@ -11,11 +12,9 @@ abstract class FCMDatasource { Future deleteStateToRefresh(TypeName typeName); - Future storeDeviceId(String deviceId); + Future storeSubscription(FCMSubscriptionCache fcmSubscriptionCache); Future getFirebaseSubscriptionByDeviceId(String deviceId); Future registerNewToken(RegisterNewTokenRequest newTokenRequest); - - Future getDeviceId(); } \ No newline at end of file diff --git a/lib/features/push_notification/data/datasource_impl/fcm_datasource_impl.dart b/lib/features/push_notification/data/datasource_impl/fcm_datasource_impl.dart index e625f791a..555540f77 100644 --- a/lib/features/push_notification/data/datasource_impl/fcm_datasource_impl.dart +++ b/lib/features/push_notification/data/datasource_impl/fcm_datasource_impl.dart @@ -2,6 +2,7 @@ import 'package:fcm/model/firebase_subscription.dart'; import 'package:fcm/model/type_name.dart'; import 'package:jmap_dart_client/jmap/core/state.dart' as jmap; import 'package:tmail_ui_user/features/push_notification/data/datasource/fcm_datasource.dart'; +import 'package:tmail_ui_user/features/push_notification/data/model/fcm_subscription.dart'; import 'package:tmail_ui_user/features/push_notification/data/network/fcm_api.dart'; import 'package:tmail_ui_user/features/push_notification/domain/extensions/firebase_subscription_extension.dart'; import 'package:tmail_ui_user/features/push_notification/domain/model/register_new_token_request.dart'; @@ -33,11 +34,6 @@ class FcmDatasourceImpl extends FCMDatasource { throw UnimplementedError(); } - @override - Future storeDeviceId(String deviceId) { - throw UnimplementedError(); - } - @override Future storeStateToRefresh(TypeName typeName, jmap.State newState) { throw UnimplementedError(); @@ -52,9 +48,9 @@ class FcmDatasourceImpl extends FCMDatasource { _exceptionThrower.throwException(error); }); } - + @override - Future getDeviceId() { + Future storeSubscription(FCMSubscriptionCache fcmSubscriptionCache) { throw UnimplementedError(); } } \ No newline at end of file diff --git a/lib/features/push_notification/data/datasource_impl/fcm_subscriptions_impl.dart b/lib/features/push_notification/data/datasource_impl/fcm_subscriptions_impl.dart new file mode 100644 index 000000000..4ae4b5c79 --- /dev/null +++ b/lib/features/push_notification/data/datasource_impl/fcm_subscriptions_impl.dart @@ -0,0 +1,62 @@ +import 'package:fcm/model/firebase_subscription.dart'; +import 'package:fcm/model/type_name.dart'; +import 'package:jmap_dart_client/jmap/core/state.dart' as jmap; +import 'package:tmail_ui_user/features/push_notification/data/datasource/fcm_datasource.dart'; +import 'package:tmail_ui_user/features/push_notification/data/local/fcm_cache_manager.dart'; +import 'package:tmail_ui_user/features/push_notification/data/model/fcm_subscription.dart'; +import 'package:tmail_ui_user/features/push_notification/domain/model/register_new_token_request.dart'; +import 'package:tmail_ui_user/main/exceptions/exception_thrower.dart'; + +class CacheFCMDatasourceImpl extends FCMDatasource { + + final FCMCacheManager _firebaseCacheManager; + final ExceptionThrower _exceptionThrower; + + CacheFCMDatasourceImpl(this._firebaseCacheManager, this._exceptionThrower); + + @override + Future storeStateToRefresh(TypeName typeName, jmap.State newState) { + return Future.sync(() async { + return await _firebaseCacheManager.storeStateToRefresh(typeName, newState); + }).catchError((error) { + _exceptionThrower.throwException(error); + }); + } + + @override + Future getStateToRefresh(TypeName typeName) { + return Future.sync(() async { + return await _firebaseCacheManager.getStateToRefresh(typeName); + }).catchError((error) { + _exceptionThrower.throwException(error); + }); + } + + @override + Future deleteStateToRefresh(TypeName typeName) { + return Future.sync(() async { + return await _firebaseCacheManager.deleteStateToRefresh(typeName); + }).catchError((error) { + _exceptionThrower.throwException(error); + }); + } + + @override + Future getFirebaseSubscriptionByDeviceId(String deviceId) { + throw UnimplementedError(); + } + + @override + Future registerNewToken(RegisterNewTokenRequest newTokenRequest) { + throw UnimplementedError(); + } + + @override + Future storeSubscription(FCMSubscriptionCache fcmSubscriptionCache) { + return Future.sync(() async { + return await _firebaseCacheManager.storeSubscription(fcmSubscriptionCache); + }).catchError((error) { + _exceptionThrower.throwException(error); + }); + } +} \ No newline at end of file diff --git a/lib/features/push_notification/data/extensions/fcm_subscription_extensions.dart b/lib/features/push_notification/data/extensions/fcm_subscription_extensions.dart new file mode 100644 index 000000000..82c3de42c --- /dev/null +++ b/lib/features/push_notification/data/extensions/fcm_subscription_extensions.dart @@ -0,0 +1,10 @@ + + +import 'package:tmail_ui_user/features/push_notification/data/model/fcm_subscription.dart'; +import 'package:tmail_ui_user/features/push_notification/domain/model/fcm_subscription.dart'; + +extension FCMSubscriptionExtension on FCMSubscription { + FCMSubscriptionCache toFCMSubscriptionCache() { + return FCMSubscriptionCache(deviceId, subscriptionId); + } +} diff --git a/lib/features/push_notification/data/model/fcm_subscription.dart b/lib/features/push_notification/data/model/fcm_subscription.dart new file mode 100644 index 000000000..aaef3e936 --- /dev/null +++ b/lib/features/push_notification/data/model/fcm_subscription.dart @@ -0,0 +1,23 @@ + +import 'package:equatable/equatable.dart'; +import 'package:hive/hive.dart'; +import 'package:tmail_ui_user/features/caching/utils/caching_constants.dart'; + +part 'fcm_subscription.g.dart'; + +@HiveType(typeId: CachingConstants.FCM_SUBSCRIPTION_HIVE_CACHE_INDENTITY) +class FCMSubscriptionCache extends HiveObject with EquatableMixin { + + static const String keyCacheValue = 'fcmSubscriptionCache'; + + @HiveField(0) + final String deviceId; + + @HiveField(1) + final String subscriptionId; + + FCMSubscriptionCache(this.deviceId, this.subscriptionId); + + @override + List get props => [deviceId, subscriptionId]; +} \ No newline at end of file diff --git a/lib/features/push_notification/data/repository/fcm_repository_impl.dart b/lib/features/push_notification/data/repository/fcm_repository_impl.dart index e6e10f881..cee7d8741 100644 --- a/lib/features/push_notification/data/repository/fcm_repository_impl.dart +++ b/lib/features/push_notification/data/repository/fcm_repository_impl.dart @@ -4,6 +4,8 @@ import 'package:fcm/model/type_name.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/core/properties/properties.dart'; import 'package:tmail_ui_user/features/push_notification/data/datasource/fcm_datasource.dart'; +import 'package:tmail_ui_user/features/push_notification/data/extensions/fcm_subscription_extensions.dart'; +import 'package:tmail_ui_user/features/push_notification/domain/model/fcm_subscription.dart'; import 'package:tmail_ui_user/features/push_notification/domain/model/register_new_token_request.dart'; import 'package:tmail_ui_user/features/push_notification/domain/repository/fcm_repository.dart'; import 'package:tmail_ui_user/features/thread/data/datasource/thread_datasource.dart'; @@ -74,11 +76,6 @@ class FCMRepositoryImpl extends FCMRepository { return _fcmDatasource[DataSourceType.local]!.deleteStateToRefresh(typeName); } - @override - Future storeDeviceId(String deviceId) { - return _fcmDatasource[DataSourceType.local]!.storeDeviceId(deviceId); - } - @override Future getFirebaseSubscriptionByDeviceId(String deviceId) { return _fcmDatasource[DataSourceType.network]!.getFirebaseSubscriptionByDeviceId(deviceId); @@ -88,9 +85,9 @@ class FCMRepositoryImpl extends FCMRepository { Future registerNewToken(RegisterNewTokenRequest newTokenRequest) { return _fcmDatasource[DataSourceType.network]!.registerNewToken(newTokenRequest); } - + @override - Future getDeviceId() { - return _fcmDatasource[DataSourceType.local]!.getDeviceId(); + Future storeSubscription(FCMSubscription fcmSubscription) { + return _fcmDatasource[DataSourceType.local]!.storeSubscription(fcmSubscription.toFCMSubscriptionCache()); } } \ No newline at end of file