Merge pull request #5674 from christianbeeznest/ofaj-21826-4
	
		
	
				
					
				
			Internal: Refactor file search logic into repository and fix UUID search - refs BT#21826pull/5675/head
						commit
						df17d56346
					
				@ -0,0 +1,81 @@ | 
				
			|||||||
 | 
					<?php | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					declare(strict_types=1); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* For licensing terms, see /license.txt */ | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Chamilo\CoreBundle\Repository; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; | 
				
			||||||
 | 
					use Doctrine\Persistence\ManagerRegistry; | 
				
			||||||
 | 
					use Chamilo\CoreBundle\Entity\ResourceFile; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class ResourceFileRepository extends ServiceEntityRepository | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					    public function __construct(ManagerRegistry $registry) | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        parent::__construct($registry, ResourceFile::class); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function searchFiles(string $search, int $offset, int $limit): array | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $uuid = ''; | 
				
			||||||
 | 
					        if (preg_match('/[a-f0-9]{32}|[a-f0-9\-]{36}/i', $search, $matches)) { | 
				
			||||||
 | 
					            $uuid = strtoupper(str_replace('-', '', $matches[0])); | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $uuidBinary = pack('H*', $uuid); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $queryBuilder = $this->createQueryBuilder('rf') | 
				
			||||||
 | 
					            ->leftJoin('rf.resourceNode', 'rn') | 
				
			||||||
 | 
					            ->leftJoin('rn.resourceLinks', 'rl') | 
				
			||||||
 | 
					            ->leftJoin('rl.course', 'c') | 
				
			||||||
 | 
					            ->leftJoin('rl.user', 'u') | 
				
			||||||
 | 
					            ->addSelect('rn', 'rl', 'c', 'u'); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if ($search) { | 
				
			||||||
 | 
					            $queryBuilder->where('rf.title LIKE :search') | 
				
			||||||
 | 
					                ->orWhere('rf.originalName LIKE :search') | 
				
			||||||
 | 
					                ->orWhere('c.title LIKE :search') | 
				
			||||||
 | 
					                ->orWhere('u.username LIKE :search') | 
				
			||||||
 | 
					                ->orWhere('rn.uuid = :uuid') | 
				
			||||||
 | 
					                ->setParameter('search', '%' . $search . '%') | 
				
			||||||
 | 
					                ->setParameter('uuid', $uuidBinary); | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $queryBuilder->orderBy('rf.id', 'DESC') | 
				
			||||||
 | 
					            ->setFirstResult($offset) | 
				
			||||||
 | 
					            ->setMaxResults($limit); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return $queryBuilder->getQuery()->getResult(); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function countFiles(string $search): int | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $uuid = ''; | 
				
			||||||
 | 
					        if (preg_match('/[a-f0-9]{32}|[a-f0-9\-]{36}/i', $search, $matches)) { | 
				
			||||||
 | 
					            $uuid = strtoupper(str_replace('-', '', $matches[0])); | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $uuidBinary = pack('H*', $uuid); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $queryBuilder = $this->createQueryBuilder('rf') | 
				
			||||||
 | 
					            ->leftJoin('rf.resourceNode', 'rn') | 
				
			||||||
 | 
					            ->leftJoin('rn.resourceLinks', 'rl') | 
				
			||||||
 | 
					            ->leftJoin('rl.course', 'c') | 
				
			||||||
 | 
					            ->leftJoin('rl.user', 'u') | 
				
			||||||
 | 
					            ->select('COUNT(rf.id)'); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if ($search) { | 
				
			||||||
 | 
					            $queryBuilder->where('rf.title LIKE :search') | 
				
			||||||
 | 
					                ->orWhere('rf.originalName LIKE :search') | 
				
			||||||
 | 
					                ->orWhere('c.title LIKE :search') | 
				
			||||||
 | 
					                ->orWhere('u.username LIKE :search') | 
				
			||||||
 | 
					                ->orWhere('rn.uuid = :uuid') | 
				
			||||||
 | 
					                ->setParameter('search', '%' . $search . '%') | 
				
			||||||
 | 
					                ->setParameter('uuid', $uuidBinary); | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return $queryBuilder->getQuery()->getSingleScalarResult(); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					} | 
				
			||||||
					Loading…
					
					
				
		Reference in new issue