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,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();
}
}
}