From 9b522391b1ecd03018b2c54895d346fc386fa74f Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Thu, 17 Dec 2020 16:08:26 +0100 Subject: [PATCH] MOBILE-3662 pushnotifications: Implement cron handlers --- .../pushnotifications.module.ts | 7 ++ .../services/handlers/register-cron.ts | 75 +++++++++++++++++++ .../services/handlers/unregister-cron.ts | 51 +++++++++++++ 3 files changed, 133 insertions(+) create mode 100644 src/core/features/pushnotifications/services/handlers/register-cron.ts create mode 100644 src/core/features/pushnotifications/services/handlers/unregister-cron.ts diff --git a/src/core/features/pushnotifications/pushnotifications.module.ts b/src/core/features/pushnotifications/pushnotifications.module.ts index ceeda4e7a..9f83001aa 100644 --- a/src/core/features/pushnotifications/pushnotifications.module.ts +++ b/src/core/features/pushnotifications/pushnotifications.module.ts @@ -14,6 +14,9 @@ import { APP_INITIALIZER, NgModule } from '@angular/core'; +import { CoreCronDelegate } from '@services/cron'; +import { CorePushNotificationsRegisterCronHandler } from './services/handlers/register-cron'; +import { CorePushNotificationsUnregisterCronHandler } from './services/handlers/unregister-cron'; import { CorePushNotifications } from './services/pushnotifications'; @NgModule({ @@ -27,6 +30,10 @@ import { CorePushNotifications } from './services/pushnotifications'; multi: true, deps: [], useFactory: () => async () => { + // Register the handlers. + CoreCronDelegate.instance.register(CorePushNotificationsRegisterCronHandler.instance); + CoreCronDelegate.instance.register(CorePushNotificationsUnregisterCronHandler.instance); + await CorePushNotifications.instance.initialize(); }, }, diff --git a/src/core/features/pushnotifications/services/handlers/register-cron.ts b/src/core/features/pushnotifications/services/handlers/register-cron.ts new file mode 100644 index 000000000..dd31a26fa --- /dev/null +++ b/src/core/features/pushnotifications/services/handlers/register-cron.ts @@ -0,0 +1,75 @@ +// (C) Copyright 2015 Moodle Pty Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import { Injectable } from '@angular/core'; + +import { CoreCronHandler } from '@services/cron'; +import { makeSingleton } from '@singletons'; +import { CorePushNotifications } from '../pushnotifications'; + +/** + * Cron handler to force a register on a Moodle site when a site is manually synchronized. + */ +@Injectable({ providedIn: 'root' }) +export class CorePushNotificationsRegisterCronHandlerService implements CoreCronHandler { + + name = 'CorePushNotificationsRegisterCronHandler'; + + /** + * Check whether the sync can be executed manually. Call isSync if not defined. + * + * @return Whether the sync can be executed manually. + */ + canManualSync(): boolean { + return true; // Execute the handler when the site is manually synchronized. + } + + /** + * Execute the process. + * Receives the ID of the site affected, undefined for all sites. + * + * @param siteId ID of the site affected, undefined for all sites. + * @return Promise resolved when done, rejected if failure. + */ + async execute(siteId?: string): Promise { + if (!siteId || !CorePushNotifications.instance.canRegisterOnMoodle()) { + // It's not a specific site, don't do anything. + return; + } + + // Register the device again. + await CorePushNotifications.instance.registerDeviceOnMoodle(siteId, true); + } + + /** + * Get the time between consecutive executions. + * + * @return Time between consecutive executions (in ms). + */ + getInterval(): number { + return 86400000; // 1 day. We won't do anything with automatic execution, so use a big number. + } + + /** + * Check whether it's a synchronization process or not. True if not defined. + * + * @return Whether it's a synchronization process or not. + */ + isSync(): boolean { + return false; + } + +} + +export class CorePushNotificationsRegisterCronHandler extends makeSingleton(CorePushNotificationsRegisterCronHandlerService) {} diff --git a/src/core/features/pushnotifications/services/handlers/unregister-cron.ts b/src/core/features/pushnotifications/services/handlers/unregister-cron.ts new file mode 100644 index 000000000..0a8eba061 --- /dev/null +++ b/src/core/features/pushnotifications/services/handlers/unregister-cron.ts @@ -0,0 +1,51 @@ +// (C) Copyright 2015 Moodle Pty Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import { Injectable } from '@angular/core'; + +import { CoreCronHandler } from '@services/cron'; +import { makeSingleton } from '@singletons'; +import { CorePushNotifications } from '../pushnotifications'; + +/** + * Cron handler to retry pending unregisters. + */ +@Injectable({ providedIn: 'root' }) +export class CorePushNotificationsUnregisterCronHandlerService implements CoreCronHandler { + + name = 'CorePushNotificationsUnregisterCronHandler'; + + /** + * Execute the process. + * Receives the ID of the site affected, undefined for all sites. + * + * @param siteId ID of the site affected, undefined for all sites. + * @return Promise resolved when done, rejected if failure. + */ + async execute(siteId?: string): Promise { + await CorePushNotifications.instance.retryUnregisters(siteId); + } + + /** + * Get the time between consecutive executions. + * + * @return Time between consecutive executions (in ms). + */ + getInterval(): number { + return 300000; + } + +} + +export class CorePushNotificationsUnregisterCronHandler extends makeSingleton(CorePushNotificationsUnregisterCronHandlerService) {}