/
kev
/
Nextcloud_File-Changes-Tracker
Обзор
Документация
Войти
/
kev
/
Nextcloud_File-Changes-Tracker
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
lib/Controller/NotificationSettingsController.php
146 строк
6 KB
Evgeny Konovalov
first_commit
16 фев 2026, 17:45
16 фев 2026, 17:45
476f06c
Код
Авторство
О чём код?
<?php declare(strict_types=1); namespace OCA\FileChangesTracker\Controller; use OCA\FileChangesTracker\Db\NotificationSettingsMapper; use OCA\FileChangesTracker\Service\EmailDigestService; use OCP\AppFramework\Controller; use OCP\AppFramework\Http; use OCP\AppFramework\Http\JSONResponse; use OCP\IGroupManager; use OCP\IRequest; use OCP\IUserSession; /** * Контроллер для управления настройками уведомлений */ class NotificationSettingsController extends Controller { private NotificationSettingsMapper $mapper; private EmailDigestService $digestService; private IUserSession $userSession; private IGroupManager $groupManager; public function __construct( string $appName, IRequest $request, NotificationSettingsMapper $mapper, EmailDigestService $digestService, IUserSession $userSession, IGroupManager $groupManager ) { parent::__construct($appName, $request); $this->mapper = $mapper; $this->digestService = $digestService; $this->userSession = $userSession; $this->groupManager = $groupManager; } /** * Получить настройки уведомлений для папки * * @NoAdminRequired */ public function get(int $folderConfigId): JSONResponse { try { $user = $this->userSession->getUser(); if (!$user || !$this->groupManager->isAdmin($user->getUID())) { return new JSONResponse(['error' => 'Требуются права администратора'], Http::STATUS_FORBIDDEN); } $settings = $this->mapper->findByFolderConfigId($folderConfigId); if ($settings === null) { // Создаем настройки по умолчанию $settings = $this->mapper->createDefault($folderConfigId); } // ЯВНО вызываем jsonSerialize для правильной сериализации return new JSONResponse(['data' => $settings->jsonSerialize()], Http::STATUS_OK); } catch (\Exception $e) { \OC::$server->getLogger()->logException($e, ['app' => 'file_changes_tracker']); return new JSONResponse(['error' => $e->getMessage()], Http::STATUS_INTERNAL_SERVER_ERROR); } } /** * Обновить настройки уведомлений * * @NoAdminRequired */ public function update(int $folderConfigId): JSONResponse { try { $user = $this->userSession->getUser(); if (!$user || !$this->groupManager->isAdmin($user->getUID())) { return new JSONResponse(['error' => 'Требуются права администратора'], Http::STATUS_FORBIDDEN); } $settings = $this->mapper->findByFolderConfigId($folderConfigId); if ($settings === null) { $settings = $this->mapper->createDefault($folderConfigId); } // Обновляем настройки из запроса $instantNotifications = filter_var($this->request->getParam('instantNotifications'), FILTER_VALIDATE_BOOLEAN); $notifyOnCreate = filter_var($this->request->getParam('notifyOnCreate'), FILTER_VALIDATE_BOOLEAN); $notifyOnModify = filter_var($this->request->getParam('notifyOnModify'), FILTER_VALIDATE_BOOLEAN); $notifyOnDelete = filter_var($this->request->getParam('notifyOnDelete'), FILTER_VALIDATE_BOOLEAN); $notifyOnRename = filter_var($this->request->getParam('notifyOnRename'), FILTER_VALIDATE_BOOLEAN); $dailyDigestEnabled = filter_var($this->request->getParam('dailyDigestEnabled'), FILTER_VALIDATE_BOOLEAN); $digestTime = $this->request->getParam('digestTime', '09:00'); $digestEmail = $this->request->getParam('digestEmail', null); $settings->setInstantNotifications($instantNotifications); $settings->setNotifyOnCreate($notifyOnCreate); $settings->setNotifyOnModify($notifyOnModify); $settings->setNotifyOnDelete($notifyOnDelete); $settings->setNotifyOnRename($notifyOnRename); $settings->setDailyDigestEnabled($dailyDigestEnabled); $settings->setDigestTime($digestTime); $settings->setDigestEmail($digestEmail ?: null); $settings->setUpdatedAt(date('Y-m-d H:i:s')); $this->mapper->update($settings); return new JSONResponse([ 'message' => 'Настройки сохранены', 'data' => $settings->jsonSerialize() // ЯВНО вызываем jsonSerialize ], Http::STATUS_OK); } catch (\Exception $e) { \OC::$server->getLogger()->logException($e, ['app' => 'file_changes_tracker']); return new JSONResponse([ 'error' => 'Ошибка сохранения настроек: ' . $e->getMessage(), 'trace' => $e->getTraceAsString() ], Http::STATUS_INTERNAL_SERVER_ERROR); } } /** * Отправить тестовое письмо со сводкой (для проверки настроек) * * @NoAdminRequired */ public function sendTest(int $folderConfigId): JSONResponse { try { $user = $this->userSession->getUser(); if (!$user || !$this->groupManager->isAdmin($user->getUID())) { return new JSONResponse(['error' => 'Требуются права администратора'], Http::STATUS_FORBIDDEN); } // Отправляем тестовое письмо $this->digestService->sendTestDigest($folderConfigId); return new JSONResponse([ 'message' => 'Тестовое письмо отправлено! Проверьте почту.' ], Http::STATUS_OK); } catch (\Exception $e) { \OC::$server->getLogger()->logException($e, ['app' => 'file_changes_tracker']); return new JSONResponse([ 'error' => 'Ошибка отправки: ' . $e->getMessage(), 'details' => $e->getTraceAsString() ], Http::STATUS_INTERNAL_SERVER_ERROR); } } }