Skip to content

Commit

Permalink
Merge pull request #1266 from natoponen/master
Browse files Browse the repository at this point in the history
Add admin setting page with users defaults
  • Loading branch information
nickvergessen committed Nov 16, 2022
2 parents e515cfd + cff4eaf commit 26c56bb
Show file tree
Hide file tree
Showing 17 changed files with 567 additions and 2 deletions.
2 changes: 2 additions & 0 deletions appinfo/info.xml
Expand Up @@ -46,6 +46,8 @@
</commands>

<settings>
<admin>OCA\Notifications\Settings\Admin</admin>
<admin-section>OCA\Notifications\Settings\AdminSection</admin-section>
<personal>OCA\Notifications\Settings\Personal</personal>
<personal-section>OCA\Notifications\Settings\PersonalSection</personal-section>
</settings>
Expand Down
1 change: 1 addition & 0 deletions appinfo/routes.php
Expand Up @@ -34,5 +34,6 @@
['name' => 'API#generateNotification', 'url' => '/api/{apiVersion}/admin_notifications/{userId}', 'verb' => 'POST', 'requirements' => ['apiVersion' => 'v(1|2)']],

['name' => 'Settings#personal', 'url' => '/api/{apiVersion}/settings', 'verb' => 'POST', 'requirements' => ['apiVersion' => 'v2']],
['name' => 'Settings#admin', 'url' => '/api/{apiVersion}/settings/admin', 'verb' => 'POST', 'requirements' => ['apiVersion' => 'v2']],
],
];
3 changes: 3 additions & 0 deletions js/notifications-admin-settings.js

Large diffs are not rendered by default.

43 changes: 43 additions & 0 deletions js/notifications-admin-settings.js.LICENSE.txt
@@ -0,0 +1,43 @@
/*!
* The buffer module from node.js, for the browser.
*
* @author Feross Aboukhadijeh <feross@feross.org> <http://feross.org>
* @license MIT
*/

/*!
* The buffer module from node.js, for the browser.
*
* @author Feross Aboukhadijeh <https://feross.org>
* @license MIT
*/

/*!
* Vue.js v2.7.10
* (c) 2014-2022 Evan You
* Released under the MIT License.
*/

/*! For license information please see NcCheckboxRadioSwitch.js.LICENSE.txt */

/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */

/**
* @copyright Copyright (c) 2022 Nikita Toponen <natoponen@gmail.com>
*
* @license AGPL-3.0-or-later
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
1 change: 1 addition & 0 deletions js/notifications-admin-settings.js.map

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion js/notifications-settings.js.map

Large diffs are not rendered by default.

6 changes: 6 additions & 0 deletions lib/AppInfo/Application.php
Expand Up @@ -27,6 +27,8 @@
use OCA\Notifications\App;
use OCA\Notifications\Capabilities;
use OCA\Notifications\Listener\BeforeTemplateRenderedListener;
use OCA\Notifications\Listener\PostLoginListener;
use OCA\Notifications\Listener\UserCreatedListener;
use OCA\Notifications\Listener\UserDeletedListener;
use OCA\Notifications\Notifier\AdminNotifications;
use OCP\AppFramework\Bootstrap\IBootContext;
Expand All @@ -36,6 +38,8 @@
use OCP\AppFramework\IAppContainer;
use OCP\Notification\IManager;
use OCP\User\Events\UserDeletedEvent;
use OCP\User\Events\UserCreatedEvent;
use OCP\User\Events\PostLoginEvent;

class Application extends \OCP\AppFramework\App implements IBootstrap {
public const APP_ID = 'notifications';
Expand All @@ -55,6 +59,8 @@ public function register(IRegistrationContext $context): void {

$context->registerEventListener(UserDeletedEvent::class, UserDeletedListener::class);
$context->registerEventListener(BeforeTemplateRenderedEvent::class, BeforeTemplateRenderedListener::class);
$context->registerEventListener(UserCreatedEvent::class, UserCreatedListener::class);
$context->registerEventListener(PostLoginEvent::class, PostLoginListener::class);
}

public function boot(IBootContext $context): void {
Expand Down
11 changes: 11 additions & 0 deletions lib/Controller/SettingsController.php
Expand Up @@ -58,4 +58,15 @@ public function personal(int $batchSetting, string $soundNotification, string $s

return new DataResponse();
}

/**
* @AuthorizedAdminSetting(settings=OCA\Notifications\Settings\Admin)
*/
public function admin(int $batchSetting, string $soundNotification, string $soundTalk): DataResponse {
$this->config->setAppValue(Application::APP_ID, 'setting_batchtime', $batchSetting);
$this->config->setAppValue(Application::APP_ID, 'sound_notification', $soundNotification !== 'no' ? 'yes' : 'no');
$this->config->setAppValue(Application::APP_ID, 'sound_talk', $soundTalk !== 'no' ? 'yes' : 'no');

return new DataResponse();
}
}
78 changes: 78 additions & 0 deletions lib/Listener/PostLoginListener.php
@@ -0,0 +1,78 @@
<?php

declare(strict_types=1);

/**
* @copyright Copyright (c) 2022 Nikita Toponen <natoponen@gmail.com>
*
* @author Nikita Toponen <natoponen@gmail.com>
*
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/

namespace OCA\Notifications\Listener;

use OCA\Notifications\AppInfo\Application;
use OCA\Notifications\Model\Settings;
use OCA\Notifications\Model\SettingsMapper;
use OCP\AppFramework\Db\DoesNotExistException;
use OCP\User\Events\PostLoginEvent;
use OCP\EventDispatcher\IEventListener;
use OCP\EventDispatcher\Event;
use OCP\IUserManager;
use OCP\IConfig;

class PostLoginListener implements IEventListener {
private IUserManager $userManager;
private SettingsMapper $settingsMapper;
private IConfig $config;

public function __construct(IUserManager $userManager, SettingsMapper $settingsMapper, IConfig $config) {
$this->userManager = $userManager;
$this->settingsMapper = $settingsMapper;
$this->config = $config;
}

public function handle(Event $event): void {
if (!($event instanceof PostLoginEvent)) {
// Unrelated
return;
}

$userId = $event->getUser()->getUID();

try {
$this->settingsMapper->getSettingsByUser($userId);
} catch (DoesNotExistException $e) {
$defaultSoundNotification = $this->config->getAppValue(Application::APP_ID, 'sound_notification') === 'yes' ? 'yes' : 'no';
$defaultSoundTalk = $this->config->getAppValue(Application::APP_ID, 'sound_talk') === 'yes' ? 'yes' : 'no';
$defaultBatchtime = $this->config->getAppValue(Application::APP_ID, 'setting_batchtime');

if ($defaultBatchtime !== Settings::EMAIL_SEND_WEEKLY
&& $defaultBatchtime !== Settings::EMAIL_SEND_DAILY
&& $defaultBatchtime !== Settings::EMAIL_SEND_3HOURLY
&& $defaultBatchtime !== Settings::EMAIL_SEND_HOURLY
&& $defaultBatchtime !== Settings::EMAIL_SEND_OFF) {
$defaultBatchtime = Settings::EMAIL_SEND_3HOURLY;
}

$this->config->setUserValue($userId, Application::APP_ID, 'sound_notification', $defaultSoundNotification);
$this->config->setUserValue($userId, Application::APP_ID, 'sound_talk', $defaultSoundTalk);
$this->settingsMapper->setBatchSettingForUser($userId, $defaultBatchtime);
}
}
}
72 changes: 72 additions & 0 deletions lib/Listener/UserCreatedListener.php
@@ -0,0 +1,72 @@
<?php

/**
* @copyright Copyright (c) 2022 Nikita Toponen <natoponen@gmail.com>
*
* @author Nikita Toponen <natoponen@gmail.com>
*
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/

namespace OCA\Notifications\Listener;

use OCA\Notifications\AppInfo\Application;
use OCA\Notifications\Model\Settings;
use OCA\Notifications\Model\SettingsMapper;
use OCP\IUserManager;
use OCP\User\Events\UserCreatedEvent;
use OCP\EventDispatcher\IEventListener;
use OCP\EventDispatcher\Event;
use OCP\IConfig;

class UserCreatedListener implements IEventListener {
private IUserManager $userManager;
private SettingsMapper $settingsMapper;
private IConfig $config;


public function __construct(IUserManager $userManager, SettingsMapper $settingsMapper, IConfig $config) {
$this->userManager = $userManager;
$this->settingsMapper = $settingsMapper;
$this->config = $config;
}

public function handle(Event $event): void {
if (!($event instanceof UserCreatedEvent)) {
// Unrelated
return;
}

$userId = $event->getUser()->getUID();

$defaultSoundNotification = $this->config->getAppValue(Application::APP_ID, 'sound_notification') === 'yes' ? 'yes' : 'no';
$defaultSoundTalk = $this->config->getAppValue(Application::APP_ID, 'sound_talk') === 'yes' ? 'yes' : 'no';
$defaultBatchtime = $this->config->getAppValue(Application::APP_ID, 'setting_batchtime');

if ($defaultBatchtime !== Settings::EMAIL_SEND_WEEKLY
&& $defaultBatchtime !== Settings::EMAIL_SEND_DAILY
&& $defaultBatchtime !== Settings::EMAIL_SEND_3HOURLY
&& $defaultBatchtime !== Settings::EMAIL_SEND_HOURLY
&& $defaultBatchtime !== Settings::EMAIL_SEND_OFF) {
$defaultBatchtime = Settings::EMAIL_SEND_3HOURLY;
}

$this->config->setUserValue($userId, Application::APP_ID, 'sound_notification', $defaultSoundNotification);
$this->config->setUserValue($userId, Application::APP_ID, 'sound_talk', $defaultSoundTalk);
$this->settingsMapper->setBatchSettingForUser($userId, $defaultBatchtime);
}
}
101 changes: 101 additions & 0 deletions lib/Settings/Admin.php
@@ -0,0 +1,101 @@
<?php

declare(strict_types=1);

/**
* @copyright Copyright (c) 2022 Nikita Toponen <natoponen@gmail.com>
*
* @author Nikita Toponen <natoponen@gmail.com>
*
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/

namespace OCA\Notifications\Settings;

use OCA\Notifications\AppInfo\Application;
use OCA\Notifications\Model\Settings;
use OCA\Notifications\Model\SettingsMapper;
use OCP\AppFramework\Http\TemplateResponse;
use OCP\AppFramework\Services\IInitialState;
use OCP\IConfig;
use OCP\IL10N;
use OCP\Settings\ISettings;
use OCP\IUserSession;
use OCP\Util;

class Admin implements ISettings {
protected IConfig $config;
protected IL10N $l10n;
private SettingsMapper$settingsMapper;
private IUserSession $session;
private IInitialState $initialState;

public function __construct(IConfig $config,
IL10N $l10n,
IUserSession $session,
SettingsMapper $settingsMapper,
IInitialState $initialState) {
$this->config = $config;
$this->l10n = $l10n;
$this->settingsMapper = $settingsMapper;
$this->session = $session;
$this->initialState = $initialState;
}

public function getForm(): TemplateResponse {
Util::addScript('notifications', 'notifications-admin-settings');

$defaultSoundNotification = $this->config->getAppValue(Application::APP_ID, 'sound_notification') === 'yes' ? 'yes' : 'no';
$defaultSoundTalk = $this->config->getAppValue(Application::APP_ID, 'sound_talk') === 'yes' ? 'yes' : 'no';
$defaultBatchtime = $this->config->getAppValue(Application::APP_ID, 'setting_batchtime');

if ($defaultBatchtime != Settings::EMAIL_SEND_WEEKLY
&& $defaultBatchtime != Settings::EMAIL_SEND_DAILY
&& $defaultBatchtime != Settings::EMAIL_SEND_3HOURLY
&& $defaultBatchtime != Settings::EMAIL_SEND_HOURLY
&& $defaultBatchtime != Settings::EMAIL_SEND_OFF) {
$defaultBatchtime = Settings::EMAIL_SEND_3HOURLY;
}

$this->initialState->provideInitialState('config', [
'setting' => 'admin',
'setting_batchtime' => $defaultBatchtime,
'sound_notification' => $defaultSoundNotification === 'yes',
'sound_talk' => $defaultSoundTalk === 'yes',
]);

return new TemplateResponse('notifications', 'settings/admin');
}

/**
* @return string the section ID, e.g. 'sharing'
*/
public function getSection(): string {
return 'notifications';
}

/**
* @return int whether the form should be rather on the top or bottom of
* the admin section. The forms are arranged in ascending order of the
* priority values. It is required to return a value between 0 and 100.
*
* E.g.: 70
*/
public function getPriority(): int {
return 20;
}
}

0 comments on commit 26c56bb

Please sign in to comment.