/
kev
/
Nextcloud_File-Changes-Tracker
Обзор
Документация
Войти
/
kev
/
Nextcloud_File-Changes-Tracker
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
lib/Service/EventLogService.php
167 строк
5 KB
Evgeny Konovalov
first_commit
16 фев 2026, 17:45
16 фев 2026, 17:45
476f06c
Код
Авторство
О чём код?
<?php declare(strict_types=1); namespace OCA\FileChangesTracker\Service; use OCA\FileChangesTracker\Db\EventLog; use OCA\FileChangesTracker\Db\EventLogMapper; use OCA\FileChangesTracker\Db\FolderConfig; /** * Сервис для работы с журналом событий */ class EventLogService { private EventLogMapper $mapper; public function __construct(EventLogMapper $mapper) { $this->mapper = $mapper; } /** * Создать новую запись в журнале */ public function createEvent( FolderConfig $config, string $eventType, string $filePath, ?int $fileId, string $userId, string $userDisplayName, ?int $fileSize = null, ?string $mimeType = null, ?string $oldFilePath = null ): EventLog { $event = new EventLog(); $event->setFolderConfigId($config->getId()); $event->setEventType($eventType); $event->setFilePath($filePath); $event->setFileId($fileId); $event->setUserId($userId); $event->setUserDisplayName($userDisplayName); $event->setEventTimestamp(date('Y-m-d H:i:s')); $event->setFileSize($fileSize); $event->setMimeType($mimeType); $event->setOldFilePath($oldFilePath); $event->setNotificationSent(false); return $this->mapper->insert($event); } /** * Получить события с фильтрацией */ public function findByFilters( ?array $folderConfigIds = null, ?string $userId = null, ?string $dateFrom = null, ?string $dateTo = null, ?string $eventType = null, ?string $searchPath = null, int $limit = 50, int $offset = 0 ): array { return $this->mapper->findByFilters( $folderConfigIds, $userId, $dateFrom, $dateTo, $eventType, $searchPath, $limit, $offset ); } /** * Подсчитать количество событий */ public function countByFilters( ?array $folderConfigIds = null, ?string $userId = null, ?string $dateFrom = null, ?string $dateTo = null, ?string $eventType = null, ?string $searchPath = null ): int { return $this->mapper->countByFilters( $folderConfigIds, $userId, $dateFrom, $dateTo, $eventType, $searchPath ); } /** * Получить событие по ID */ public function find(int $id): ?EventLog { try { return $this->mapper->find($id); } catch (\Exception $e) { return null; } } /** * Получить статистику событий */ public function getStatistics(?array $folderConfigIds = null, ?string $dateFrom = null, ?string $dateTo = null): array { return $this->mapper->getStatistics($folderConfigIds, $dateFrom, $dateTo); } /** * Отметить уведомление как отправленное */ public function markNotificationSent(int $eventId): void { $event = $this->mapper->find($eventId); $event->setNotificationSent(true); $this->mapper->update($event); } /** * Экспортировать события в CSV */ public function exportToCsv(array $events): string { // Добавляем BOM для UTF-8 чтобы Excel правильно распознал кириллицу $csv = "\xEF\xBB\xBF"; // Заголовки (используем точку с запятой для русской локали Excel) $csv .= "ID;Тип события;Путь к файлу;Старый путь;Пользователь;Отображаемое имя;Время события;Размер файла;MIME тип\n"; foreach ($events as $event) { $csv .= sprintf( "%d;%s;%s;%s;%s;%s;%s;%s;%s\n", $event->getId(), $this->escapeCSV($event->getEventType()), $this->escapeCSV($event->getFilePath()), $this->escapeCSV($event->getOldFilePath() ?? ''), $this->escapeCSV($event->getUserId()), $this->escapeCSV($event->getUserDisplayName()), $event->getEventTimestamp(), $event->getFileSize() ?? '', $this->escapeCSV($event->getMimeType() ?? '') ); } return $csv; } /** * Экранирование данных для CSV */ private function escapeCSV(?string $value): string { if ($value === null) { return ''; } // Экранируем кавычки и оборачиваем в кавычки если есть точка с запятой, кавычки или перевод строки if (strpos($value, ';') !== false || strpos($value, '"') !== false || strpos($value, "\n") !== false) { return '"' . str_replace('"', '""', $value) . '"'; } return $value; } }