UserRepository::findUserSubscribersById()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 13

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 5
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 13
ccs 5
cts 5
cp 1
rs 9.8333
c 0
b 0
f 0
cc 1
nc 1
nop 1
crap 1
1
<?php
2
3
namespace Skobkin\Bundle\PointToolsBundle\Repository;
4
5
use Doctrine\ORM\EntityRepository;
6
use Skobkin\Bundle\PointToolsBundle\DTO\TopUserDTO;
7
use Skobkin\Bundle\PointToolsBundle\Entity\User;
8
9
class UserRepository extends EntityRepository
10
{
11
    public function add(User $entity)
12
    {
13
        $this->getEntityManager()->persist($entity);
14
    }
15
16
    public function findActiveUserWithSubscribers(int $id): ?User
17
    {
18 3
        $qb = $this->createQueryBuilder('u');
19
20 3
        // @todo May be optimize hydration procedure
21
        return $qb
22
            ->select(['u', 's', 'us'])
23 3
            ->innerJoin('u.subscribers', 's')
24 3
            ->innerJoin('s.subscriber', 'us')
25 3
            ->where('u.id = :user_id')
26 3
            ->andWhere('u.removed = FALSE')
27 3
            ->setParameter('user_id', $id)
28
            ->getQuery()->getOneOrNullResult()
29
        ;
30
    }
31
32
    /**
33
     * Case-insensitive user search
34
     */
35
    public function findUserByLogin(string $login): ?User
36
    {
37
        $qb = $this->createQueryBuilder('u');
38
39 2
        return $qb
40
            ->select('u')
41 2
            ->where('LOWER(u.login) = LOWER(:login)')
42
            ->setMaxResults(1)
43
            ->setParameter('login', $login)
44
            ->getQuery()->getOneOrNullResult()
45 2
        ;
46
    }
47
48 2
    /**
49 2
     * Case insensitive user LIKE %login% search
50 2
     *
51 2
     * @return User[]
52 2
     */
53 2
    public function findUsersLikeLogin(string $login, int $limit = 10): array
54
    {
55
        if (empty($login)) {
56
            return [];
57
        }
58
59
        $qb = $this->createQueryBuilder('u');
60 4
61
        return $qb
62 4
            ->where('LOWER(u.login) LIKE LOWER(:login)')
63
            ->orderBy('u.login', 'ASC')
64 4
            ->setMaxResults($limit)
65
            ->setParameter('login', '%'.$login.'%')
66
            ->getQuery()
67
            ->getResult()
68
        ;
69
    }
70
71 3
    public function getUsersCount(): int
72
    {
73 3
        $qb = $this->createQueryBuilder('u');
74
75
        return $qb->select('COUNT(u)')->getQuery()->getSingleScalarResult();
76
    }
77 3
78
    /**
79
     * @return User[]
80 3
     */
81 3
    public function findUserSubscribersById(int $id): array
82 3
    {
83 3
        $qb = $this->createQueryBuilder('u');
84 3
85 3
        return $qb
86
            ->select('u')
87
            ->innerJoin('u.subscriptions', 's')
88
            ->where('s.author = :author')
89
            ->orderBy('u.login', 'asc')
90
            ->setParameter('author', $id)
91
            ->getQuery()->getResult()
92
        ;
93
    }
94
95
    /**
96 1
     * Returns top users by subscribers count
97
     *
98 1
     * @return TopUserDTO[]
99
     */
100
    public function getTopUsers(int $limit = 30): array
101
    {
102 1
        $qb = $this->getEntityManager()->getRepository('SkobkinPointToolsBundle:Subscription')->createQueryBuilder('s');
103
104
        $rows = $qb
105 1
            ->select([
106 1
                'NEW Skobkin\Bundle\PointToolsBundle\DTO\TopUserDTO(a.login, COUNT(s.subscriber))',
107
                'COUNT(s.subscriber) as subscribers_count'
108
            ])
109 1
            ->innerJoin('s.author', 'a')
110 1
            ->orderBy('subscribers_count', 'desc')
111 1
            ->groupBy('a.id')
112 1
            ->setMaxResults($limit)
113 1
            ->getQuery()->getResult()
114
        ;
115
116 1
        $result = [];
117
118
        // Removing subscribers_count element, saving TopUserDTO
119
        // @todo remove crutches, refactor query
120 1
        foreach ($rows as $row) {
121 1
            unset($row['subscribers_count']);
122 1
            $result[] = reset($row);
123
        }
124
125 1
        return $result;
126
    }
127
}