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:
@@ -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);
|
||||
}
|
||||
}
|
||||
+20
@@ -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();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user