TF-2298 Update expires time when old token has expired

Signed-off-by: dab246 <tdvu@linagora.com>
(cherry picked from commit fb26afe8f52df6e16476aea8a68f9f92c5c4b001)
This commit is contained in:
dab246
2023-12-04 10:53:26 +07:00
committed by Dat H. Pham
parent e3dea129b6
commit f5d878012d
72 changed files with 964 additions and 736 deletions
@@ -1,11 +1,13 @@
import 'package:fcm/model/firebase_subscription.dart';
import 'package:fcm/model/device_client_id.dart';
import 'package:fcm/model/firebase_registration.dart';
import 'package:fcm/model/firebase_registration_id.dart';
import 'package:fcm/model/type_name.dart';
import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/core/state.dart' as jmap;
import 'package:jmap_dart_client/jmap/core/user_name.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/features/push_notification/domain/model/update_token_expired_time_request.dart';
abstract class FCMDatasource {
Future<void> storeStateToRefresh(AccountId accountId, UserName userName, TypeName typeName, jmap.State newState);
@@ -14,13 +16,17 @@ abstract class FCMDatasource {
Future<void> deleteStateToRefresh(AccountId accountId, UserName userName, TypeName typeName);
Future<void> storeSubscription(FCMSubscriptionCache fcmSubscriptionCache);
Future<void> storeFirebaseRegistration(FirebaseRegistration firebaseRegistration);
Future<FirebaseSubscription> getFirebaseSubscriptionByDeviceId(String deviceId);
Future<FirebaseRegistration> getFirebaseRegistrationByDeviceId(DeviceClientId deviceId);
Future<FirebaseSubscription> registerNewToken(RegisterNewTokenRequest newTokenRequest);
Future<FirebaseRegistration> registerNewFirebaseRegistrationToken(RegisterNewTokenRequest newTokenRequest);
Future<FCMSubscriptionCache> geSubscription();
Future<FirebaseRegistration> getStoredFirebaseRegistration();
Future<bool> destroySubscription(String subscriptionId);
Future<void> deleteFirebaseRegistrationCache();
Future<void> destroyFirebaseRegistration(FirebaseRegistrationId registrationId);
Future<void> updateFirebaseRegistrationToken(UpdateTokenExpiredTimeRequest expiredTimeRequest);
}
@@ -1,12 +1,16 @@
import 'package:fcm/model/firebase_subscription.dart';
import 'package:fcm/model/device_client_id.dart';
import 'package:fcm/model/firebase_registration.dart';
import 'package:fcm/model/firebase_registration_id.dart';
import 'package:fcm/model/type_name.dart';
import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/core/state.dart' as jmap;
import 'package:jmap_dart_client/jmap/core/user_name.dart';
import 'package:tmail_ui_user/features/push_notification/data/datasource/fcm_datasource.dart';
import 'package:tmail_ui_user/features/push_notification/data/extensions/firebase_registration_cache_extension.dart';
import 'package:tmail_ui_user/features/push_notification/data/extensions/firebase_registration_extension.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/features/push_notification/domain/model/update_token_expired_time_request.dart';
import 'package:tmail_ui_user/main/exceptions/exception_thrower.dart';
class CacheFCMDatasourceImpl extends FCMDatasource {
@@ -38,31 +42,44 @@ class CacheFCMDatasourceImpl extends FCMDatasource {
}
@override
Future<FirebaseSubscription> getFirebaseSubscriptionByDeviceId(String deviceId) {
Future<FirebaseRegistration> getFirebaseRegistrationByDeviceId(DeviceClientId deviceId) {
throw UnimplementedError();
}
@override
Future<FirebaseSubscription> registerNewToken(RegisterNewTokenRequest newTokenRequest) {
Future<FirebaseRegistration> registerNewFirebaseRegistrationToken(RegisterNewTokenRequest newTokenRequest) {
throw UnimplementedError();
}
@override
Future<void> storeSubscription(FCMSubscriptionCache fcmSubscriptionCache) {
Future<void> storeFirebaseRegistration(FirebaseRegistration firebaseRegistration) {
return Future.sync(() async {
return await _firebaseCacheManager.storeSubscription(fcmSubscriptionCache);
return await _firebaseCacheManager.storeFirebaseRegistration(firebaseRegistration.toFirebaseRegistrationCache());
}).catchError(_exceptionThrower.throwException);
}
@override
Future<FCMSubscriptionCache> geSubscription() {
Future<FirebaseRegistration> getStoredFirebaseRegistration() {
return Future.sync(() async {
return await _firebaseCacheManager.getSubscription();
final firebaseRegistrationCache = await _firebaseCacheManager.getStoredFirebaseRegistration();
return firebaseRegistrationCache.toFirebaseRegistration();
}).catchError(_exceptionThrower.throwException);
}
@override
Future<bool> destroySubscription(String subscriptionId) {
Future<void> destroyFirebaseRegistration(FirebaseRegistrationId registrationId) {
throw UnimplementedError();
}
@override
Future<void> updateFirebaseRegistrationToken(UpdateTokenExpiredTimeRequest expiredTimeRequest) {
throw UnimplementedError();
}
@override
Future<void> deleteFirebaseRegistrationCache() {
return Future.sync(() async {
return await _firebaseCacheManager.deleteFirebaseRegistration();
}).catchError(_exceptionThrower.throwException);
}
}
@@ -1,13 +1,15 @@
import 'package:fcm/model/firebase_subscription.dart';
import 'package:fcm/model/device_client_id.dart';
import 'package:fcm/model/firebase_registration.dart';
import 'package:fcm/model/firebase_registration_id.dart';
import 'package:fcm/model/type_name.dart';
import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/core/state.dart' as jmap;
import 'package:jmap_dart_client/jmap/core/user_name.dart';
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/extensions/firebase_registration_extension.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/model/update_token_expired_time_request.dart';
import 'package:tmail_ui_user/main/exceptions/exception_thrower.dart';
class FcmDatasourceImpl extends FCMDatasource {
@@ -18,9 +20,9 @@ class FcmDatasourceImpl extends FCMDatasource {
FcmDatasourceImpl(this._fcmApi, this._exceptionThrower);
@override
Future<FirebaseSubscription> getFirebaseSubscriptionByDeviceId(String deviceId) {
Future<FirebaseRegistration> getFirebaseRegistrationByDeviceId(DeviceClientId deviceId) {
return Future.sync(() async {
return await _fcmApi.getFirebaseSubscriptionByDeviceId(deviceId);
return await _fcmApi.getFirebaseRegistrationByDeviceId(deviceId);
}).catchError(_exceptionThrower.throwException);
}
@@ -40,27 +42,43 @@ class FcmDatasourceImpl extends FCMDatasource {
}
@override
Future<FirebaseSubscription> registerNewToken(RegisterNewTokenRequest newTokenRequest) {
Future<FirebaseRegistration> registerNewFirebaseRegistrationToken(RegisterNewTokenRequest newTokenRequest) {
return Future.sync(() async {
final firebaseSubscription = await _fcmApi.registerNewToken(newTokenRequest);
return firebaseSubscription.fromDeviceId(newDeviceId: newTokenRequest.firebaseSubscription.deviceClientId);
final registrationCreated = await _fcmApi.registerNewFirebaseRegistrationToken(newTokenRequest);
return registrationCreated.syncProperties(
newDeviceId: newTokenRequest.firebaseRegistration.deviceClientId,
newFcmToken: newTokenRequest.firebaseRegistration.token,
newTypes: newTokenRequest.firebaseRegistration.types,
);
}).catchError(_exceptionThrower.throwException);
}
@override
Future<bool> storeSubscription(FCMSubscriptionCache fcmSubscriptionCache) {
Future<bool> storeFirebaseRegistration(FirebaseRegistration firebaseRegistration) {
throw UnimplementedError();
}
@override
Future<FCMSubscriptionCache> geSubscription() {
Future<FirebaseRegistration> getStoredFirebaseRegistration() {
throw UnimplementedError();
}
@override
Future<bool> destroySubscription(String subscriptionId) {
Future<void> destroyFirebaseRegistration(FirebaseRegistrationId registrationId) {
return Future.sync(() async {
return await _fcmApi.destroySubscription(subscriptionId);
return await _fcmApi.destroyFirebaseRegistration(registrationId);
}).catchError(_exceptionThrower.throwException);
}
@override
Future<void> updateFirebaseRegistrationToken(UpdateTokenExpiredTimeRequest expiredTimeRequest) {
return Future.sync(() async {
return await _fcmApi.updateFirebaseRegistrationToken(expiredTimeRequest);
}).catchError(_exceptionThrower.throwException);
}
@override
Future<void> deleteFirebaseRegistrationCache() {
throw UnimplementedError();
}
}
@@ -1,10 +0,0 @@
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);
}
}
@@ -0,0 +1,20 @@
import 'package:fcm/converter/device_client_id_nullable_converter.dart';
import 'package:fcm/converter/fcm_token_nullable_converter.dart';
import 'package:fcm/converter/firebase_registration_id_nullable_converter.dart';
import 'package:fcm/converter/type_name_converter.dart';
import 'package:fcm/model/firebase_registration.dart';
import 'package:fcm/model/firebase_registration_expired_time.dart';
import 'package:jmap_dart_client/jmap/core/utc_date.dart';
import 'package:tmail_ui_user/features/push_notification/data/model/firebase_registration_cache.dart';
extension FirebaseRegistrationCacheExtension on FirebaseRegistrationCache {
FirebaseRegistration toFirebaseRegistration() {
return FirebaseRegistration(
id: const FirebaseRegistrationIdNullableConverter().fromJson(id),
token: const FcmTokenNullableConverter().fromJson(token),
deviceClientId: const DeviceClientIdNullableConverter().fromJson(deviceClientId),
expires: expires != null ? FirebaseRegistrationExpiredTime(UTCDate(expires!)) : null,
types: types?.map((type) => const TypeNameConverter().fromJson(type)).toList()
);
}
}
@@ -0,0 +1,14 @@
import 'package:fcm/model/firebase_registration.dart';
import 'package:tmail_ui_user/features/push_notification/data/model/firebase_registration_cache.dart';
extension FirebaseRegistrationExtension on FirebaseRegistration {
FirebaseRegistrationCache toFirebaseRegistrationCache() {
return FirebaseRegistrationCache(
deviceClientId: deviceClientId!.value,
id: id?.id.value,
token: token?.value,
expires: expires?.value.value,
types: types?.map((type) => type.value).toList(),
);
}
}
@@ -3,17 +3,17 @@ import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/core/user_name.dart';
import 'package:model/extensions/account_id_extensions.dart';
import 'package:tmail_ui_user/features/caching/clients/fcm_cache_client.dart';
import 'package:tmail_ui_user/features/caching/clients/subscription_cache_client.dart';
import 'package:tmail_ui_user/features/caching/clients/firebase_registration_cache_client.dart';
import 'package:tmail_ui_user/features/caching/utils/cache_utils.dart';
import 'package:tmail_ui_user/features/push_notification/data/model/fcm_subscription.dart';
import 'package:tmail_ui_user/features/push_notification/data/model/firebase_registration_cache.dart';
import 'package:tmail_ui_user/features/push_notification/domain/exceptions/fcm_exception.dart';
import 'package:jmap_dart_client/jmap/core/state.dart' as jmap;
class FCMCacheManager {
final FcmCacheClient _fcmCacheClient;
final FCMSubscriptionCacheClient _fcmSubscriptionCacheClient;
final FirebaseRegistrationCacheClient _firebaseRegistrationCacheClient;
FCMCacheManager(this._fcmCacheClient,this._fcmSubscriptionCacheClient);
FCMCacheManager(this._fcmCacheClient,this._firebaseRegistrationCacheClient);
Future<void> storeStateToRefresh(AccountId accountId, UserName userName, TypeName typeName, jmap.State newState) {
final stateKeyCache = TupleKey(typeName.value, accountId.asString, userName.value).encodeKey;
@@ -43,17 +43,23 @@ class FCMCacheManager {
return _fcmCacheClient.clearAllData();
}
Future<void> storeSubscription(FCMSubscriptionCache fcmSubscriptionCache) {
return _fcmSubscriptionCacheClient.insertItem(
FCMSubscriptionCache.keyCacheValue, fcmSubscriptionCache);
Future<void> storeFirebaseRegistration(FirebaseRegistrationCache firebaseRegistrationCache) {
return _firebaseRegistrationCacheClient.insertItem(
FirebaseRegistrationCache.keyCacheValue,
firebaseRegistrationCache
);
}
Future<FCMSubscriptionCache> getSubscription() async {
final fcmSubscription = await _fcmSubscriptionCacheClient.getItem(FCMSubscriptionCache.keyCacheValue);
if (fcmSubscription == null) {
throw NotFoundSubscriptionException();
Future<FirebaseRegistrationCache> getStoredFirebaseRegistration() async {
final firebaseRegistration = await _firebaseRegistrationCacheClient.getItem(FirebaseRegistrationCache.keyCacheValue);
if (firebaseRegistration == null) {
throw NotFoundFirebaseRegistrationCacheException();
} else {
return fcmSubscription;
return firebaseRegistration;
}
}
Future<void> deleteFirebaseRegistration() async {
await _firebaseRegistrationCacheClient.deleteItem(FirebaseRegistrationCache.keyCacheValue);
}
}
@@ -1,23 +0,0 @@
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_IDENTITY)
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<Object?> get props => [deviceId, subscriptionId];
}
@@ -0,0 +1,44 @@
import 'package:equatable/equatable.dart';
import 'package:hive/hive.dart';
import 'package:tmail_ui_user/features/caching/utils/caching_constants.dart';
part 'firebase_registration_cache.g.dart';
@HiveType(typeId: CachingConstants.FIREBASE_REGISTRATION_HIVE_CACHE_IDENTITY)
class FirebaseRegistrationCache extends HiveObject with EquatableMixin {
static const String keyCacheValue = 'firebaseRegistrationCache';
@HiveField(0)
final String deviceClientId;
@HiveField(1)
final String? id;
@HiveField(2)
final String? token;
@HiveField(3)
final DateTime? expires;
@HiveField(4)
final List<String>? types;
FirebaseRegistrationCache({
required this.deviceClientId,
this.id,
this.token,
this.expires,
this.types
});
@override
List<Object?> get props => [
deviceClientId,
id,
token,
expires,
types
];
}
@@ -1,16 +1,19 @@
import 'package:fcm/method/set/firebase_subscription_set_method.dart';
import 'package:fcm/method/set/firebase_subscription_set_response.dart';
import 'package:fcm/method/get/firebase_subscription_get_method.dart';
import 'package:fcm/method/get/firebase_subscription_get_response.dart';
import 'package:fcm/model/firebase_capability.dart';
import 'package:fcm/model/firebase_subscription.dart';
import 'package:fcm/converter/firebase_registration_expired_time_nullable_converter.dart';
import 'package:fcm/method/set/firebase_registration_set_method.dart';
import 'package:fcm/method/set/firebase_registration_set_response.dart';
import 'package:fcm/method/get/firebase_registration_get_method.dart';
import 'package:fcm/method/get/firebase_registration_get_response.dart';
import 'package:fcm/model/device_client_id.dart';
import 'package:fcm/model/firebase_registration.dart';
import 'package:fcm/model/firebase_registration_id.dart';
import 'package:jmap_dart_client/http/http_client.dart';
import 'package:jmap_dart_client/jmap/core/capability/capability_identifier.dart';
import 'package:jmap_dart_client/jmap/core/id.dart';
import 'package:jmap_dart_client/jmap/core/patch_object.dart';
import 'package:jmap_dart_client/jmap/jmap_request.dart';
import 'package:tmail_ui_user/features/push_notification/domain/exceptions/fcm_exception.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/model/update_token_expired_time_request.dart';
import 'package:tmail_ui_user/features/push_notification/domain/utils/fcm_constants.dart';
class FcmApi {
@@ -18,76 +21,105 @@ class FcmApi {
FcmApi(this._httpClient);
Future<FirebaseSubscription> getFirebaseSubscriptionByDeviceId(String deviceId) async {
Future<FirebaseRegistration> getFirebaseRegistrationByDeviceId(DeviceClientId deviceId) async {
final processingInvocation = ProcessingInvocation();
final requestBuilder = JmapRequestBuilder(_httpClient, processingInvocation);
final firebaseSubscriptionGetMethod = FirebaseSubscriptionGetMethod();
final firebaseSubscriptionGetInvocation = requestBuilder.invocation(firebaseSubscriptionGetMethod);
final firebaseRegistrationGetMethod = FirebaseRegistrationGetMethod();
final firebaseRegistrationGetInvocation = requestBuilder.invocation(firebaseRegistrationGetMethod);
final response = await (requestBuilder
..usings(firebaseSubscriptionGetMethod.requiredCapabilities))
..usings(firebaseRegistrationGetMethod.requiredCapabilities))
.build()
.execute();
final getResponse = response.parse<FirebaseSubscriptionGetResponse>(
firebaseSubscriptionGetInvocation.methodCallId,
FirebaseSubscriptionGetResponse.deserialize);
final getResponse = response.parse<FirebaseRegistrationGetResponse>(
firebaseRegistrationGetInvocation.methodCallId,
FirebaseRegistrationGetResponse.deserialize);
final matchedFirebaseSubscription = getResponse?.list
.where((fcmSub) => fcmSub.deviceClientId?.value == deviceId)
final matchedFirebaseRegistration = getResponse?.list
.where((fcmSub) => fcmSub.deviceClientId == deviceId)
.toList();
if (matchedFirebaseSubscription?.isNotEmpty == true) {
return matchedFirebaseSubscription!.first;
if (matchedFirebaseRegistration?.isNotEmpty == true) {
return matchedFirebaseRegistration!.first;
} else {
throw NotFoundFirebaseSubscriptionException();
throw NotFoundFirebaseRegistrationForDeviceException();
}
}
Future<FirebaseSubscription> registerNewToken(RegisterNewTokenRequest newTokenRequest) async {
Future<FirebaseRegistration> registerNewFirebaseRegistrationToken(RegisterNewTokenRequest newTokenRequest) async {
final processingInvocation = ProcessingInvocation();
final requestBuilder = JmapRequestBuilder(_httpClient, processingInvocation);
final firebaseSubscriptionSetMethod = FirebaseSubscriptionSetMethod()
final firebaseRegistrationSetMethod = FirebaseRegistrationSetMethod()
..addCreate(
newTokenRequest.createRequestId,
newTokenRequest.firebaseSubscription
newTokenRequest.firebaseRegistration
);
final firebaseSubscriptionSetInvocation = requestBuilder.invocation(firebaseSubscriptionSetMethod);
final firebaseRegistrationSetInvocation = requestBuilder.invocation(firebaseRegistrationSetMethod);
final response = await (requestBuilder
..usings(firebaseSubscriptionSetMethod.requiredCapabilities))
..usings(firebaseRegistrationSetMethod.requiredCapabilities))
.build()
.execute();
final firebaseSubscriptionSetResponse = response.parse<FirebaseSubscriptionSetResponse>(
firebaseSubscriptionSetInvocation.methodCallId,
FirebaseSubscriptionSetResponse.deserialize);
final firebaseRegistrationSetResponse = response.parse<FirebaseRegistrationSetResponse>(
firebaseRegistrationSetInvocation.methodCallId,
FirebaseRegistrationSetResponse.deserialize);
return firebaseSubscriptionSetResponse!.created![newTokenRequest.createRequestId]!;
final firebaseRegistration = firebaseRegistrationSetResponse?.created?[newTokenRequest.createRequestId];
if (firebaseRegistration != null) {
return firebaseRegistration;
} else {
throw NotFoundFirebaseRegistrationCreatedException();
}
}
Future<bool> destroySubscription(String subscriptionId) async {
Future<void> destroyFirebaseRegistration(FirebaseRegistrationId registrationId) async {
final processingInvocation = ProcessingInvocation();
final requestBuilder = JmapRequestBuilder(_httpClient, processingInvocation);
final firebaseSubscriptionSetMethod = FirebaseSubscriptionSetMethod()..addDestroy({Id(subscriptionId)});
final firebaseSubscriptionSetInvocation = requestBuilder.invocation(firebaseSubscriptionSetMethod);
final firebaseRegistrationSetMethod = FirebaseRegistrationSetMethod()..addDestroy({registrationId.id});
final firebaseRegistrationSetInvocation = requestBuilder.invocation(firebaseRegistrationSetMethod);
final response = await (requestBuilder
..usings({
CapabilityIdentifier.jmapCore,
FirebaseCapability.fcmIdentifier,
}))
..usings(firebaseRegistrationSetMethod.requiredCapabilities))
.build()
.execute();
final firebaseSubscriptionSetResponse = response.parse<FirebaseSubscriptionSetResponse>(
firebaseSubscriptionSetInvocation.methodCallId,
FirebaseSubscriptionSetResponse.deserialize);
final firebaseRegistrationSetResponse = response.parse<FirebaseRegistrationSetResponse>(
firebaseRegistrationSetInvocation.methodCallId,
FirebaseRegistrationSetResponse.deserialize);
return Future.sync(() async {
return firebaseSubscriptionSetResponse?.destroyed?.contains(Id(subscriptionId)) == true;
}).catchError((error) {
throw error;
});
if (firebaseRegistrationSetResponse?.destroyed?.contains(registrationId.id) == true) {
return;
} else {
throw NotFoundFirebaseRegistrationDestroyedException();
}
}
Future<void> updateFirebaseRegistrationToken(UpdateTokenExpiredTimeRequest expiredTimeRequest) async {
final processingInvocation = ProcessingInvocation();
final requestBuilder = JmapRequestBuilder(_httpClient, processingInvocation);
final firebaseRegistrationSetMethod = FirebaseRegistrationSetMethod()
..addUpdates({
expiredTimeRequest.firebaseRegistrationId.id: PatchObject({
FcmConstants.firebaseRegistrationExpiredTimeProperty: const FirebaseRegistrationExpiredTimeNullableConverter().toJson(expiredTimeRequest.firebaseRegistrationExpiredTime)
})
});
final firebaseRegistrationSetInvocation = requestBuilder.invocation(firebaseRegistrationSetMethod);
final response = await (requestBuilder
..usings(firebaseRegistrationSetMethod.requiredCapabilities))
.build()
.execute();
final firebaseRegistrationSetResponse = response.parse<FirebaseRegistrationSetResponse>(
firebaseRegistrationSetInvocation.methodCallId,
FirebaseRegistrationSetResponse.deserialize);
if (firebaseRegistrationSetResponse?.updated?.containsKey(expiredTimeRequest.firebaseRegistrationId.id) == true) {
return;
} else {
throw NotFoundFirebaseRegistrationUpdatedException();
}
}
}
@@ -1,6 +1,8 @@
import 'package:core/data/model/source_type/data_source_type.dart';
import 'package:core/utils/app_logger.dart';
import 'package:fcm/model/firebase_subscription.dart';
import 'package:fcm/model/device_client_id.dart';
import 'package:fcm/model/firebase_registration.dart';
import 'package:fcm/model/firebase_registration_id.dart';
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';
@@ -15,10 +17,9 @@ import 'package:model/extensions/presentation_mailbox_extension.dart';
import 'package:model/mailbox/presentation_mailbox.dart';
import 'package:tmail_ui_user/features/mailbox/data/datasource/mailbox_datasource.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/exceptions/fcm_exception.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/model/update_token_expired_time_request.dart';
import 'package:tmail_ui_user/features/push_notification/domain/repository/fcm_repository.dart';
import 'package:tmail_ui_user/features/push_notification/domain/utils/fcm_constants.dart';
import 'package:tmail_ui_user/features/thread/data/datasource/thread_datasource.dart';
@@ -94,29 +95,28 @@ class FCMRepositoryImpl extends FCMRepository {
}
@override
Future<FirebaseSubscription> getFirebaseSubscriptionByDeviceId(String deviceId) {
return _fcmDatasource[DataSourceType.network]!.getFirebaseSubscriptionByDeviceId(deviceId);
Future<FirebaseRegistration> getFirebaseRegistrationByDeviceId(DeviceClientId deviceId) {
return _fcmDatasource[DataSourceType.network]!.getFirebaseRegistrationByDeviceId(deviceId);
}
@override
Future<FirebaseSubscription> registerNewToken(RegisterNewTokenRequest newTokenRequest) {
return _fcmDatasource[DataSourceType.network]!.registerNewToken(newTokenRequest);
Future<FirebaseRegistration> registerNewFirebaseRegistrationToken(RegisterNewTokenRequest newTokenRequest) {
return _fcmDatasource[DataSourceType.network]!.registerNewFirebaseRegistrationToken(newTokenRequest);
}
@override
Future<FCMSubscription> getSubscription() async {
final fcmSubScription = await _fcmDatasource[DataSourceType.local]!.geSubscription();
return FCMSubscription(fcmSubScription.deviceId, fcmSubScription.subscriptionId);
Future<FirebaseRegistration> getStoredFirebaseRegistration() {
return _fcmDatasource[DataSourceType.local]!.getStoredFirebaseRegistration();
}
@override
Future<void> storeSubscription(FCMSubscription fcmSubscription) {
return _fcmDatasource[DataSourceType.local]!.storeSubscription(fcmSubscription.toFCMSubscriptionCache());
Future<void> storeFirebaseRegistration(FirebaseRegistration firebaseRegistration) {
return _fcmDatasource[DataSourceType.local]!.storeFirebaseRegistration(firebaseRegistration);
}
@override
Future<bool> destroySubscription(String subscriptionId) {
return _fcmDatasource[DataSourceType.network]!.destroySubscription(subscriptionId);
Future<void> destroyFirebaseRegistration(FirebaseRegistrationId registrationId) {
return _fcmDatasource[DataSourceType.network]!.destroyFirebaseRegistration(registrationId);
}
@override
@@ -127,7 +127,7 @@ class FCMRepositoryImpl extends FCMRepository {
.where((presentationMailbox) => presentationMailbox.pushNotificationDeactivated)
.toList();
log('FCMRepositoryImpl::getMailboxesNotPutNotifications():mailboxesCacheNotPutNotifications: $mailboxesCacheNotPutNotifications');
if (mailboxesCacheNotPutNotifications.isNotEmpty && mailboxesCacheNotPutNotifications.length == FcmConstants.mailboxRuleAllowPushNotifications.length) {
if (mailboxesCacheNotPutNotifications.isNotEmpty && mailboxesCacheNotPutNotifications.length == FcmConstants.mailboxRuleDoNotAllowPushNotifications.length) {
return mailboxesCacheNotPutNotifications;
} else {
final mailboxResponse = await _mapMailboxDataSource[DataSourceType.network]!.getAllMailbox(session, accountId);
@@ -217,4 +217,14 @@ class FCMRepositoryImpl extends FCMRepository {
throw NotFoundNewReceiveEmailException();
}
}
@override
Future<void> updateFirebaseRegistrationToken(UpdateTokenExpiredTimeRequest expiredTimeRequest) {
return _fcmDatasource[DataSourceType.network]!.updateFirebaseRegistrationToken(expiredTimeRequest);
}
@override
Future<void> deleteFirebaseRegistrationCache() {
return _fcmDatasource[DataSourceType.local]!.deleteFirebaseRegistrationCache();
}
}