Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 47
0.00% covered (danger)
0.00%
0 / 6
CRAP
0.00% covered (danger)
0.00%
0 / 1
RoleRepository
0.00% covered (danger)
0.00%
0 / 47
0.00% covered (danger)
0.00%
0 / 6
72
0.00% covered (danger)
0.00%
0 / 1
 getPredefinedRole
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
6
 findRoleFuzzilyByUsername
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
2
 findRoleFuzzilyByOldUsername
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
2
 getRolesWithParent
0.00% covered (danger)
0.00%
0 / 11
0.00% covered (danger)
0.00%
0 / 1
6
 getAllActive
0.00% covered (danger)
0.00%
0 / 9
0.00% covered (danger)
0.00%
0 / 1
2
 search
0.00% covered (danger)
0.00%
0 / 17
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2
3namespace Olz\Repository\Roles;
4
5use Doctrine\Common\Collections\Collection;
6use Doctrine\Common\Collections\Criteria;
7use Doctrine\Common\Collections\Order;
8use Olz\Entity\Roles\Role;
9use Olz\Repository\Common\OlzRepository;
10
11/**
12 * @extends OlzRepository<Role>
13 */
14class RoleRepository extends OlzRepository {
15    protected string $entityClass = Role::class;
16
17    public function getPredefinedRole(PredefinedRole $predefined_role): ?Role {
18        $role = $this->findOneBy(['username' => $predefined_role->value]);
19        if (!$role) {
20            $this->log()->warning("Predefined role does not exist: {$predefined_role->value}");
21        }
22        return $role;
23    }
24
25    public function findRoleFuzzilyByUsername(string $username): ?Role {
26        $dql = "SELECT r FROM {$this->entityClass} r WHERE r.username LIKE ?1";
27        $query = $this->getEntityManager()->createQuery($dql)->setParameter(1, $username);
28        return $query->getOneOrNullResult();
29    }
30
31    public function findRoleFuzzilyByOldUsername(string $old_username): ?Role {
32        $dql = "SELECT r FROM {$this->entityClass} r WHERE r.old_username LIKE ?1";
33        $query = $this->getEntityManager()->createQuery($dql)->setParameter(1, $old_username);
34        return $query->getOneOrNullResult();
35    }
36
37    /** @return array<Role> */
38    public function getRolesWithParent(?int $roleId, int $limit = 100): array {
39        if ($roleId === null) {
40            $dql = "
41                SELECT r
42                FROM {$this->entityClass} r
43                WHERE
44                    r.parent_role IS NULL
45                    AND r.position_within_parent IS NOT NULL
46                    AND r.position_within_parent >= 0
47                    AND r.on_off = 1
48                ORDER BY r.position_within_parent ASC";
49            $query = $this->getEntityManager()->createQuery($dql);
50        } else {
51            $dql = "
52                SELECT r
53                FROM {$this->entityClass} r
54                WHERE
55                    r.parent_role = ?1
56                    AND r.position_within_parent IS NOT NULL
57                    AND r.on_off = 1
58                ORDER BY r.position_within_parent ASC";
59            $query = $this->getEntityManager()->createQuery($dql)->setParameter(1, $roleId);
60        }
61        $query->setMaxResults($limit);
62        return $query->getResult();
63    }
64
65    /** @return Collection<int, Role>&iterable<Role> */
66    public function getAllActive(): Collection {
67        // TODO: Remove guide != '' condition again, after all ressort
68        // descriptions have been updated. This is just temporary logic!
69        $criteria = Criteria::create()
70            ->where(Criteria::expr()->andX(
71                Criteria::expr()->gte('position_within_parent', 0), // Negative = hidden
72                Criteria::expr()->neq('guide', ''),
73            ))
74            ->setFirstResult(0)
75            ->setMaxResults(1000000)
76        ;
77        return $this->matching($criteria);
78    }
79
80    /**
81     * @param string[] $terms
82     *
83     * @return Collection<int, Role>&iterable<Role>
84     */
85    public function search(array $terms): Collection {
86        $criteria = Criteria::create()
87            ->where(Criteria::expr()->andX(
88                Criteria::expr()->eq('on_off', 1),
89                ...array_map(fn ($term) => Criteria::expr()->orX(
90                    Criteria::expr()->contains('username', $term),
91                    Criteria::expr()->contains('old_username', $term),
92                    Criteria::expr()->contains('name', $term),
93                    Criteria::expr()->contains('description', $term),
94                ), $terms),
95            ))
96            ->orderBy([
97                'last_modified_at' => Order::Descending,
98            ])
99            ->setFirstResult(0)
100            ->setMaxResults(1000000)
101        ;
102        return $this->matching($criteria);
103    }
104}