diff --git a/Events.php b/Events.php index a36da48..d8435f2 100644 --- a/Events.php +++ b/Events.php @@ -8,6 +8,7 @@ use humhub\modules\fcmPush\components\MailerMessage; use humhub\modules\fcmPush\components\NotificationTargetProvider; use humhub\modules\fcmPush\helpers\MobileAppHelper; +use humhub\modules\fcmPush\helpers\WebAppHelper; use humhub\modules\fcmPush\services\DriverService; use humhub\modules\fcmPush\widgets\PushNotificationInfoWidget; use humhub\modules\notification\targets\MobileTargetProvider; @@ -101,22 +102,28 @@ public static function onLayoutAddonInit($event) Yii::$app->session->remove(MobileAppHelper::SESSION_VAR_REGISTER_NOTIFICATION); } - // Before logout + // After logout + if (Yii::$app->session->has(WebAppHelper::SESSION_VAR_UNREGISTER_NOTIFICATION)) { + static::registerAssets(); + WebAppHelper::unregisterNotificationScript(); + Yii::$app->session->remove(WebAppHelper::SESSION_VAR_UNREGISTER_NOTIFICATION); + } if (Yii::$app->session->has(MobileAppHelper::SESSION_VAR_UNREGISTER_NOTIFICATION)) { MobileAppHelper::unregisterNotificationScript(); Yii::$app->session->remove(MobileAppHelper::SESSION_VAR_UNREGISTER_NOTIFICATION); } - - // After logout if (Yii::$app->session->has(MobileAppHelper::SESSION_VAR_SHOW_OPENER)) { MobileAppHelper::registerShowOpenerScript(); Yii::$app->session->remove(MobileAppHelper::SESSION_VAR_SHOW_OPENER); } - if (Yii::$app->user->isGuest) { - return; + if (!Yii::$app->user->isGuest) { + static::registerAssets(); } + } + private static function registerAssets() + { /** @var Module $module */ $module = Yii::$app->getModule('fcm-push'); @@ -136,6 +143,7 @@ public static function onAfterLogin() public static function onAfterLogout() { + Yii::$app->session->set(WebAppHelper::SESSION_VAR_UNREGISTER_NOTIFICATION, 1); Yii::$app->session->set(MobileAppHelper::SESSION_VAR_UNREGISTER_NOTIFICATION, 1); Yii::$app->session->set(MobileAppHelper::SESSION_VAR_SHOW_OPENER, 1); } diff --git a/assets/FcmPushAsset.php b/assets/FcmPushAsset.php index 05a476e..4e5cb86 100644 --- a/assets/FcmPushAsset.php +++ b/assets/FcmPushAsset.php @@ -39,6 +39,7 @@ public static function register($view) if ($pushDriver !== null) { Yii::$app->view->registerJsConfig('firebase', [ 'tokenUpdateUrl' => Url::to(['/fcm-push/token/update']), + 'tokenDeleteUrl' => Url::to(['/fcm-push/token/delete']), 'senderId' => $pushDriver->getSenderId(), 'projectId' => $module->getConfigureForm()->getJsonParam('project_id'), 'apiKey' => $module->getConfigureForm()->firebaseApiKey, diff --git a/controllers/TokenController.php b/controllers/TokenController.php index 11de51c..3a59a6d 100644 --- a/controllers/TokenController.php +++ b/controllers/TokenController.php @@ -30,54 +30,58 @@ public function beforeAction($action) public function actionUpdate() { - $this->requireLogin(); + return $this->update(false, Yii::$app->request->post('token')); + } - $driver = (new DriverService($this->module->getConfigureForm()))->getWebDriver(); - if (!$driver) { - Yii::$app->response->statusCode = 400; - return $this->asJson(['success' => false, 'message' => 'No push driver available!']); - } + public function actionUpdateMobileApp() + { + return $this->update(true, Yii::$app->request->post('token')); + } - return $this->asJson([ - 'success' => ( - (new TokenService())->storeTokenForUser( - Yii::$app->user->getIdentity(), - $driver, - Yii::$app->request->post('token'), - ) - ), - ]); + public function actionDelete() + { + return $this->delete(false, Yii::$app->request->post('token')); } - public function actionUpdateMobileApp() + public function actionDeleteMobileApp() + { + return $this->delete(true, Yii::$app->request->post('token')); + } + + private function update(bool $mobile, ?string $token) { - $this->requireLogin(); + if (Yii::$app->user->isGuest) { + throw new HttpException(401, 'Login required!'); + } - $driver = (new DriverService($this->module->getConfigureForm()))->getMobileAppDriver(); + $driverService = new DriverService($this->module->getConfigureForm()); + $tokenService = new TokenService(); + + $driver = $mobile ? $driverService->getMobileAppDriver() : $driverService->getWebDriver(); if (!$driver) { - Yii::error('Could not update token for mobile app. No driver available.', 'fcm-push'); + Yii::error('Could not update token for ' . ($mobile ? 'mobile' : 'web') . ' app. No driver available.', 'fcm-push'); Yii::$app->response->statusCode = 400; return $this->asJson(['success' => false, 'message' => 'No push driver available!']); } return $this->asJson([ - 'success' => ( - (new TokenService())->storeTokenForUser( - Yii::$app->user->getIdentity(), - $driver, - Yii::$app->request->post('token'), - ) + 'success' => $tokenService->storeTokenForUser( + Yii::$app->user->getIdentity(), + $driver, + $token, ), ]); } - - public function actionDeleteMobileApp() + private function delete(bool $mobile, ?string $token) { - $driver = (new DriverService($this->module->getConfigureForm()))->getMobileAppDriver(); + $driverService = new DriverService($this->module->getConfigureForm()); + $tokenService = new TokenService(); + + $driver = $mobile ? $driverService->getMobileAppDriver() : $driverService->getWebDriver(); if (!$driver) { - Yii::error('Could not delete token for mobile app. No driver available.', 'fcm-push'); + Yii::error('Could not delete token for ' . ($mobile ? 'mobile' : 'web') . ' app. No driver available.', 'fcm-push'); Yii::$app->response->statusCode = 400; return $this->asJson(['success' => false, 'message' => 'No push driver available!']); @@ -88,19 +92,7 @@ public function actionDeleteMobileApp() } return $this->asJson([ - 'success' => ( - (new TokenService())->deleteToken( - Yii::$app->request->post('token'), - ) - ), + 'success' => $tokenService->deleteToken($token), ]); } - - private function requireLogin(): void - { - if (Yii::$app->user->isGuest) { - throw new HttpException(401, 'Login required!'); - } - } - } diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index a616ef8..24742a5 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -1,6 +1,10 @@ Changelog ========= +2.1.3 (Unreleased) +------------------------- +- Fix #32: Delete DeviceID after Logout + 2.1.2 (December 19, 2024) ------------------------- - Fix #262: Switch Network doesn't work diff --git a/helpers/WebAppHelper.php b/helpers/WebAppHelper.php new file mode 100644 index 0000000..b9b1ea3 --- /dev/null +++ b/helpers/WebAppHelper.php @@ -0,0 +1,19 @@ +view->registerJs('humhub.modules.firebase.unregisterNotification();'); + } +} diff --git a/module.json b/module.json index 106ab4e..86647bc 100644 --- a/module.json +++ b/module.json @@ -11,7 +11,7 @@ "humhub": { "minVersion": "1.14" }, - "version": "2.1.2", + "version": "2.1.3", "screenshots": [ "resources/screenshot1.PNG", "resources/screenshot2.PNG" diff --git a/resources/js/humhub.firebase.js b/resources/js/humhub.firebase.js index ecb39aa..c0fc4f2 100644 --- a/resources/js/humhub.firebase.js +++ b/resources/js/humhub.firebase.js @@ -64,6 +64,21 @@ humhub.module('firebase', function (module, require, $) { } }; + const deleteTokenToServer = function (token) { + const that = this; + if (that.isTokenSentToServer(token)) { + module.log.info("Delete FCM Push Token to Server"); + $.ajax({ + method: "POST", + url: that.tokenDeleteUrl(), + data: {token: token}, + success: function (data) { + that.deleteTokenLocalStore(); + } + }); + } + }; + const isTokenSentToServer = function (token) { return (this.getTokenLocalStore() === token); }; @@ -96,10 +111,21 @@ humhub.module('firebase', function (module, require, $) { return item.value; }; + const unregisterNotification = function () { + const token = this.getTokenLocalStore(); + if (token) { + this.deleteTokenToServer(token); + } + } + const tokenUpdateUrl = function () { return module.config.tokenUpdateUrl; }; + const tokenDeleteUrl = function () { + return module.config.tokenDeleteUrl; + }; + const senderId = function () { return module.config.senderId; }; @@ -109,11 +135,14 @@ humhub.module('firebase', function (module, require, $) { isTokenSentToServer, sendTokenToServer, + deleteTokenToServer, afterServiceWorkerRegistration, + unregisterNotification, // Config Vars senderId, tokenUpdateUrl, + tokenDeleteUrl, // LocalStore Helper setTokenLocalStore, diff --git a/views/admin/mobile-app.php b/views/admin/mobile-app.php index e043837..a1297b4 100644 --- a/views/admin/mobile-app.php +++ b/views/admin/mobile-app.php @@ -86,7 +86,7 @@

Registered FireBase Devices (Current User)

Yii::$app->user->id]); + $tokens = FcmUser::find()->where(['user_id' => Yii::$app->user->id])->orderBy('created_at DESC')->all(); ?> @@ -105,8 +105,11 @@ · sender_id ?> + · + formatter->asDatetime($fcm->created_at, 'short') ?> + · $fcm->id, 'confirm' => 'PWA: You may need to delete token from localStorage to trigger resave!']) ?>