/
kev
/
Nextcloud_File-Changes-Tracker
Обзор
Документация
Войти
/
kev
/
Nextcloud_File-Changes-Tracker
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
lib/Controller/EventLogController.php
210 строк
8 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\Service\EventLogService; use OCA\FileChangesTracker\Service\FolderConfigService; use OCP\AppFramework\Controller; use OCP\AppFramework\Http; use OCP\AppFramework\Http\DataDownloadResponse; use OCP\AppFramework\Http\JSONResponse; use OCP\IGroupManager; use OCP\IRequest; use OCP\IUserSession; /** * Контроллер для работы с журналом событий */ class EventLogController extends Controller { private EventLogService $service; private FolderConfigService $folderConfigService; private IUserSession $userSession; private IGroupManager $groupManager; public function __construct( string $appName, IRequest $request, EventLogService $service, FolderConfigService $folderConfigService, IUserSession $userSession, IGroupManager $groupManager ) { parent::__construct($appName, $request); $this->service = $service; $this->folderConfigService = $folderConfigService; $this->userSession = $userSession; $this->groupManager = $groupManager; } /** * Получить список событий с фильтрацией * * @NoAdminRequired * @NoCSRFRequired */ public function list(): JSONResponse { try { $user = $this->userSession->getUser(); if (!$user) { return new JSONResponse(['error' => 'Пользователь не авторизован'], Http::STATUS_UNAUTHORIZED); } $userId = $user->getUID(); $isAdmin = $this->groupManager->isAdmin($userId); // Параметры фильтрации $folderConfigIds = $this->request->getParam('folderConfigIds'); $filterUserId = $this->request->getParam('userId'); $dateFrom = $this->request->getParam('dateFrom'); $dateTo = $this->request->getParam('dateTo'); $eventType = $this->request->getParam('eventType'); $searchPath = $this->request->getParam('searchPath'); $limit = (int)($this->request->getParam('limit', 50)); $offset = (int)($this->request->getParam('offset', 0)); // Если пользователь не администратор, показываем только его события if (!$isAdmin) { $userConfigs = $this->folderConfigService->findByResponsible($userId, 'user'); $allowedConfigIds = array_map(fn($config) => $config->getId(), $userConfigs); if (empty($allowedConfigIds)) { return new JSONResponse([ 'data' => [], 'total' => 0, 'limit' => $limit, 'offset' => $offset ], Http::STATUS_OK); } // Если указаны конкретные ID, фильтруем только разрешенные if ($folderConfigIds !== null) { $folderConfigIds = array_intersect($folderConfigIds, $allowedConfigIds); } else { $folderConfigIds = $allowedConfigIds; } } // Преобразуем массив ID если он передан как строка if (is_string($folderConfigIds)) { $folderConfigIds = json_decode($folderConfigIds, true); } $events = $this->service->findByFilters( $folderConfigIds, $filterUserId, $dateFrom, $dateTo, $eventType, $searchPath, $limit, $offset ); $total = $this->service->countByFilters( $folderConfigIds, $filterUserId, $dateFrom, $dateTo, $eventType, $searchPath ); return new JSONResponse([ 'data' => $events, 'total' => $total, 'limit' => $limit, 'offset' => $offset ], Http::STATUS_OK); } catch (\Exception $e) { return new JSONResponse(['error' => $e->getMessage()], Http::STATUS_INTERNAL_SERVER_ERROR); } } /** * Получить событие по ID * * @NoAdminRequired */ public function get(int $id): JSONResponse { try { $event = $this->service->find($id); if ($event === null) { return new JSONResponse(['error' => 'Событие не найдено'], Http::STATUS_NOT_FOUND); } return new JSONResponse(['data' => $event], Http::STATUS_OK); } catch (\Exception $e) { return new JSONResponse(['error' => $e->getMessage()], Http::STATUS_INTERNAL_SERVER_ERROR); } } /** * Экспортировать события в файл * * @NoAdminRequired */ public function export(): DataDownloadResponse { try { $user = $this->userSession->getUser(); if (!$user) { return new DataDownloadResponse('', 'error.txt', 'text/plain'); } $userId = $user->getUID(); $isAdmin = $this->groupManager->isAdmin($userId); // Параметры фильтрации (те же что и в list) $folderConfigIds = $this->request->getParam('folderConfigIds'); $filterUserId = $this->request->getParam('userId'); $dateFrom = $this->request->getParam('dateFrom'); $dateTo = $this->request->getParam('dateTo'); $eventType = $this->request->getParam('eventType'); $searchPath = $this->request->getParam('searchPath'); // Ограничение прав доступа для не-администраторов if (!$isAdmin) { $userConfigs = $this->folderConfigService->findByResponsible($userId, 'user'); $allowedConfigIds = array_map(fn($config) => $config->getId(), $userConfigs); if (empty($allowedConfigIds)) { return new DataDownloadResponse('Нет данных для экспорта', 'export.csv', 'text/csv'); } if ($folderConfigIds !== null) { $folderConfigIds = array_intersect($folderConfigIds, $allowedConfigIds); } else { $folderConfigIds = $allowedConfigIds; } } // Преобразуем массив ID if (is_string($folderConfigIds)) { $folderConfigIds = json_decode($folderConfigIds, true); } // Получаем все события (без пагинации для экспорта) $events = $this->service->findByFilters( $folderConfigIds, $filterUserId, $dateFrom, $dateTo, $eventType, $searchPath, 10000, // Максимум для экспорта 0 ); // Экспортируем в CSV $csv = $this->service->exportToCsv($events); $filename = 'file_changes_export_' . date('Y-m-d_His') . '.csv'; return new DataDownloadResponse($csv, $filename, 'text/csv'); } catch (\Exception $e) { return new DataDownloadResponse('Ошибка: ' . $e->getMessage(), 'error.txt', 'text/plain'); } } }