/
kev
/
Nextcloud_File-Changes-Tracker
Обзор
Документация
Войти
/
kev
/
Nextcloud_File-Changes-Tracker
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
lib/Db/FolderConfigMapper.php
146 строк
5 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\DoesNotExistException; use OCP\AppFramework\Db\QBMapper; use OCP\DB\QueryBuilder\IQueryBuilder; use OCP\IDBConnection; /** * Маппер для работы с конфигурацией отслеживаемых папок */ class FolderConfigMapper extends QBMapper { public function __construct(IDBConnection $db) { parent::__construct($db, 'fct_folder_config', FolderConfig::class); } /** * Найти конфигурацию по ID */ public function find(int $id): FolderConfig { $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 findAll(): array { $qb = $this->db->getQueryBuilder(); $qb->select('*') ->from($this->getTableName()) ->orderBy('created_at', 'DESC'); return $this->findEntities($qb); } /** * Получить конфигурации для конкретного ответственного */ public function findByResponsible(string $responsibleId, string $responsibleType): array { $qb = $this->db->getQueryBuilder(); $qb->select('*') ->from($this->getTableName()) ->where($qb->expr()->eq('responsible_id', $qb->createNamedParameter($responsibleId))) ->andWhere($qb->expr()->eq('responsible_type', $qb->createNamedParameter($responsibleType))) ->orderBy('folder_path', 'ASC'); return $this->findEntities($qb); } /** * Найти конфигурацию по пути к папке */ public function findByFolderPath(string $folderPath): ?FolderConfig { $qb = $this->db->getQueryBuilder(); $qb->select('*') ->from($this->getTableName()) ->where($qb->expr()->eq('folder_path', $qb->createNamedParameter($folderPath))); try { return $this->findEntity($qb); } catch (DoesNotExistException $e) { return null; } } /** * Найти конфигурацию по ID папки */ public function findByFolderId(int $folderId): ?FolderConfig { $qb = $this->db->getQueryBuilder(); $qb->select('*') ->from($this->getTableName()) ->where($qb->expr()->eq('folder_id', $qb->createNamedParameter($folderId, IQueryBuilder::PARAM_INT))); try { return $this->findEntity($qb); } catch (DoesNotExistException $e) { return null; } } /** * Найти все конфигурации, где путь файла начинается с отслеживаемой папки */ public function findMatchingConfigs(string $filePath): array { $qb = $this->db->getQueryBuilder(); $qb->select('*') ->from($this->getTableName()); $configs = $this->findEntities($qb); $matchingConfigs = []; // Нормализуем путь к файлу: убираем /username/files/ префикс // Путь в Nextcloud: /admin/files/Templates/test.txt // Нужно получить: /Templates/test.txt $normalizedFilePath = $this->normalizeFilePath($filePath); foreach ($configs as $config) { $folderPath = $config->getFolderPath(); // Убираем начальный слэш для корректного сравнения $folderPath = '/' . trim($folderPath, '/'); $normalizedFilePath = '/' . trim($normalizedFilePath, '/'); // Проверяем, находится ли файл в отслеживаемой папке // Файл должен начинаться с пути папки if ($folderPath === '/' || strpos($normalizedFilePath, $folderPath . '/') === 0 || $normalizedFilePath === $folderPath) { $matchingConfigs[] = $config; } } return $matchingConfigs; } /** * Нормализовать путь к файлу, убрать префикс /username/files/ */ private function normalizeFilePath(string $filePath): string { // Паттерны путей в Nextcloud: // /username/files/path/to/file.txt -> /path/to/file.txt // __groupfolders/123/path/to/file.txt -> /path/to/file.txt (групповые папки) // Убираем префикс /username/files/ if (preg_match('#^/[^/]+/files/(.*)$#', $filePath, $matches)) { return '/' . $matches[1]; } // Убираем префикс __groupfolders/id/ if (preg_match('#^__groupfolders/[0-9]+/(.*)$#', $filePath, $matches)) { return '/' . $matches[1]; } // Если путь не соответствует шаблонам, возвращаем как есть return $filePath; } }