/
kev
/
Nextcloud_File-Changes-Tracker
Обзор
Документация
Войти
/
kev
/
Nextcloud_File-Changes-Tracker
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
lib/Db/EventLogMapper.php
185 строк
6 KB
Evgeny Konovalov
first_commit
16 фев 2026, 17:45
16 фев 2026, 17:45
476f06c
Код
Авторство
О чём код?
<?php declare(strict_types=1); namespace OCA\FileChangesTracker\Db; use OCP\AppFramework\Db\QBMapper; use OCP\DB\QueryBuilder\IQueryBuilder; use OCP\IDBConnection; /** * Маппер для работы с журналом событий */ class EventLogMapper extends QBMapper { public function __construct(IDBConnection $db) { parent::__construct($db, 'fct_event_log', EventLog::class); } /** * Найти событие по ID */ public function find(int $id): EventLog { $qb = $this->db->getQueryBuilder(); $qb->select('*') ->from($this->getTableName()) ->where($qb->expr()->eq('id', $qb->createNamedParameter($id, IQueryBuilder::PARAM_INT))); return $this->findEntity($qb); } /** * Получить события с фильтрацией и пагинацией */ 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 { $qb = $this->db->getQueryBuilder(); $qb->select('*') ->from($this->getTableName()); if ($folderConfigIds !== null && !empty($folderConfigIds)) { $qb->andWhere($qb->expr()->in('folder_config_id', $qb->createNamedParameter($folderConfigIds, IQueryBuilder::PARAM_INT_ARRAY))); } if ($userId !== null) { $qb->andWhere($qb->expr()->eq('user_id', $qb->createNamedParameter($userId))); } if ($dateFrom !== null) { // Добавляем время 00:00:00 к дате "с" $dateFromWithTime = $dateFrom . ' 00:00:00'; $qb->andWhere($qb->expr()->gte('event_timestamp', $qb->createNamedParameter($dateFromWithTime))); } if ($dateTo !== null) { // Добавляем время 23:59:59 к дате "по" $dateToWithTime = $dateTo . ' 23:59:59'; $qb->andWhere($qb->expr()->lte('event_timestamp', $qb->createNamedParameter($dateToWithTime))); } if ($eventType !== null) { $qb->andWhere($qb->expr()->eq('event_type', $qb->createNamedParameter($eventType))); } if ($searchPath !== null) { $qb->andWhere($qb->expr()->like('file_path', $qb->createNamedParameter('%' . $this->db->escapeLikeParameter($searchPath) . '%'))); } $qb->orderBy('event_timestamp', 'DESC') ->setMaxResults($limit) ->setFirstResult($offset); return $this->findEntities($qb); } /** * Подсчитать количество событий с учетом фильтров */ public function countByFilters( ?array $folderConfigIds = null, ?string $userId = null, ?string $dateFrom = null, ?string $dateTo = null, ?string $eventType = null, ?string $searchPath = null ): int { $qb = $this->db->getQueryBuilder(); $qb->select($qb->createFunction('COUNT(*)')) ->from($this->getTableName()); if ($folderConfigIds !== null && !empty($folderConfigIds)) { $qb->andWhere($qb->expr()->in('folder_config_id', $qb->createNamedParameter($folderConfigIds, IQueryBuilder::PARAM_INT_ARRAY))); } if ($userId !== null) { $qb->andWhere($qb->expr()->eq('user_id', $qb->createNamedParameter($userId))); } if ($dateFrom !== null) { // Добавляем время 00:00:00 к дате "с" $dateFromWithTime = $dateFrom . ' 00:00:00'; $qb->andWhere($qb->expr()->gte('event_timestamp', $qb->createNamedParameter($dateFromWithTime))); } if ($dateTo !== null) { // Добавляем время 23:59:59 к дате "по" $dateToWithTime = $dateTo . ' 23:59:59'; $qb->andWhere($qb->expr()->lte('event_timestamp', $qb->createNamedParameter($dateToWithTime))); } if ($eventType !== null) { $qb->andWhere($qb->expr()->eq('event_type', $qb->createNamedParameter($eventType))); } if ($searchPath !== null) { $qb->andWhere($qb->expr()->like('file_path', $qb->createNamedParameter('%' . $this->db->escapeLikeParameter($searchPath) . '%'))); } $result = $qb->execute(); $count = $result->fetchColumn(); $result->closeCursor(); return (int)$count; } /** * Получить события по конфигурации папки */ public function findByFolderConfigId(int $folderConfigId, int $limit = 100): array { $qb = $this->db->getQueryBuilder(); $qb->select('*') ->from($this->getTableName()) ->where($qb->expr()->eq('folder_config_id', $qb->createNamedParameter($folderConfigId, IQueryBuilder::PARAM_INT))) ->orderBy('event_timestamp', 'DESC') ->setMaxResults($limit); return $this->findEntities($qb); } /** * Получить статистику событий */ public function getStatistics(?array $folderConfigIds = null, ?string $dateFrom = null, ?string $dateTo = null): array { $qb = $this->db->getQueryBuilder(); $qb->select('event_type') ->selectAlias($qb->createFunction('COUNT(*)'), 'count') ->from($this->getTableName()); if ($folderConfigIds !== null && !empty($folderConfigIds)) { $qb->andWhere($qb->expr()->in('folder_config_id', $qb->createNamedParameter($folderConfigIds, IQueryBuilder::PARAM_INT_ARRAY))); } if ($dateFrom !== null) { // Добавляем время 00:00:00 к дате "с" $dateFromWithTime = $dateFrom . ' 00:00:00'; $qb->andWhere($qb->expr()->gte('event_timestamp', $qb->createNamedParameter($dateFromWithTime))); } if ($dateTo !== null) { // Добавляем время 23:59:59 к дате "по" $dateToWithTime = $dateTo . ' 23:59:59'; $qb->andWhere($qb->expr()->lte('event_timestamp', $qb->createNamedParameter($dateToWithTime))); } $qb->groupBy('event_type'); $result = $qb->execute(); $stats = []; while ($row = $result->fetch()) { $stats[$row['event_type']] = (int)$row['count']; } $result->closeCursor(); return $stats; } }