Passed
Push — master ( a515e2...9b5f20 )
by Julito
06:26
created

TagRepository::addTagToUser()   A

Complexity

Conditions 3
Paths 4

Size

Total Lines 34
Code Lines 20

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
eloc 20
nc 4
nop 3
dl 0
loc 34
rs 9.6
c 0
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
/* For licensing terms, see /license.txt */
6
7
namespace Chamilo\CoreBundle\Repository;
8
9
use Chamilo\CoreBundle\Entity\ExtraField;
10
use Chamilo\CoreBundle\Entity\Tag;
11
use Chamilo\CoreBundle\Entity\User;
12
use Chamilo\CoreBundle\Entity\UserRelTag;
13
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
14
use Doctrine\Common\Collections\Collection;
15
use Doctrine\Persistence\ManagerRegistry;
16
17
class TagRepository extends ServiceEntityRepository
18
{
19
    public function __construct(ManagerRegistry $registry)
20
    {
21
        parent::__construct($registry, Tag::class);
22
    }
23
24
    /**
25
     * @return Collection|Tag[]
26
     */
27
    public function findTagsByField(string $tag, ExtraField $field)
28
    {
29
        $qb = $this->createQueryBuilder('t')
30
            ->where('t.tag LIKE :tag')
31
            ->andWhere('t.field = :field')
32
            ->setParameter('field', $field)
33
            ->setParameter('tag', "$tag%")
34
        ;
35
36
        return $qb->getQuery()->getResult();
37
    }
38
39
    /**
40
     * @return Collection|Tag[]
41
     */
42
    public function getTagsByUser(ExtraField $field, User $user)
43
    {
44
        $qb = $this->createQueryBuilder('t')
45
            ->innerJoin('t.userRelTags', 'ut')
46
            ->where('t.field = :field')
47
            ->andWhere('ut.user = :user')
48
            ->setParameter('field', $field)
49
            ->setParameter('user', $user)
50
        ;
51
52
        return $qb->getQuery()->getResult();
53
    }
54
55
    /**
56
     * Get the tags for an item.
57
     *
58
     * @return Collection|Tag[]
59
     */
60
    public function getTagsByItem(ExtraField $extraField, int $itemId)
61
    {
62
        $qb = $this->createQueryBuilder('t')
63
            ->innerJoin('t.extraFieldRelTags', 'et')
64
            ->where('et.itemId = :itemId')
65
            ->andWhere('et.field = :field')
66
            ->setParameter('field', $extraField)
67
            ->setParameter('itemId', $itemId)
68
        ;
69
70
        return $qb->getQuery()->getResult();
71
    }
72
73
    public function addTagToUser(ExtraField $extraField, User $user, string $tag): User
74
    {
75
        $entityTag = $this->findOneBy(['tag' => $tag, 'field' => $extraField]);
76
        $em = $this->getEntityManager();
77
        if (null === $entityTag) {
78
            $entityTag = (new Tag())
79
                ->setField($extraField)
80
                ->setTag($tag)
81
            ;
82
            $em->persist($entityTag);
83
        }
84
85
        $userRelTag = (new UserRelTag())
86
            ->setUser($user)
87
            ->setTag($entityTag)
88
        ;
89
90
        $exists = $user->getUserRelTags()->exists(
91
            /** @var UserRelTag $element */
92
            function ($key, $element) use ($userRelTag) {
93
                return $userRelTag->getTag() === $element->getTag();
94
            }
95
        );
96
97
        if (!$exists) {
98
            $entityTag->setCount($entityTag->getCount() + 1);
99
            $em->persist($entityTag);
100
            $user->getUserRelTags()->add($userRelTag);
101
        }
102
103
        $em->persist($user);
104
        $em->flush();
105
106
        return $user;
107
    }
108
}
109