Passed
Push — master ( 0c0424...e3b211 )
by
unknown
18:36 queued 08:53
created

CreateUserOnAccessUrlAction   A

Complexity

Total Complexity 8

Size/Duplication

Total Lines 118
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 67
dl 0
loc 118
rs 10
c 0
b 0
f 0
wmc 8

2 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 11 1
B __invoke() 0 103 7
1
<?php
2
3
/* For licensing terms, see /license.txt */
4
5
declare(strict_types=1);
6
7
namespace Chamilo\CoreBundle\Controller\Api;
8
9
use ApiPlatform\Validator\ValidatorInterface;
10
use Chamilo\CoreBundle\Dto\CreateUserOnAccessUrlInput;
11
use Chamilo\CoreBundle\Entity\AccessUrlRelUser;
12
use Chamilo\CoreBundle\Entity\User;
13
use Chamilo\CoreBundle\Helpers\MessageHelper;
14
use Chamilo\CoreBundle\Helpers\UserHelper;
15
use Chamilo\CoreBundle\Repository\ExtraFieldRepository;
16
use Chamilo\CoreBundle\Repository\ExtraFieldValuesRepository;
17
use Chamilo\CoreBundle\Repository\Node\AccessUrlRepository;
18
use Doctrine\ORM\EntityManagerInterface;
19
use RuntimeException;
20
use Symfony\Component\HttpKernel\Attribute\AsController;
21
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
22
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
23
use Symfony\Contracts\Translation\TranslatorInterface;
24
25
#[AsController]
26
class CreateUserOnAccessUrlAction
27
{
28
    public function __construct(
29
        private EntityManagerInterface $em,
30
        private AccessUrlRepository $accessUrlRepo,
31
        private ValidatorInterface $validator,
32
        private UserPasswordHasherInterface $passwordHasher,
33
        private ExtraFieldValuesRepository $extraFieldValuesRepo,
34
        private ExtraFieldRepository $extraFieldRepo,
35
        private MessageHelper $messageHelper,
36
        private TranslatorInterface $translator,
37
        private UserHelper $userHelper
38
    ) {}
39
40
    public function __invoke(CreateUserOnAccessUrlInput $data): User
41
    {
42
        $this->validator->validate($data);
43
44
        $url = $this->accessUrlRepo->find($data->getAccessUrlId());
45
        if (!$url) {
46
            throw new NotFoundHttpException('Access URL not found.');
47
        }
48
49
        $user = new User();
50
        $user
51
            ->setUsername($data->getUsername())
52
            ->setFirstname($data->getFirstname())
53
            ->setLastname($data->getLastname())
54
            ->setEmail($data->getEmail())
55
            ->setLocale($data->getLocale() ?? 'en')
56
            ->setTimezone($data->getTimezone() ?? 'Europe/Paris')
57
            ->setStatus($data->getStatus() ?? 5)
58
            ->setActive(User::ACTIVE)
59
            ->setPassword(
60
                $this->passwordHasher->hashPassword($user, $data->getPassword())
61
            )
62
        ;
63
64
        $this->em->persist($user);
65
        $this->em->flush();
66
67
        if (!empty($data->extraFields)) {
68
            foreach ($data->extraFields as $variable => $value) {
69
                $extraField = $this->extraFieldRepo->findOneBy([
70
                    'variable' => $variable,
71
                    'itemType' => 1,
72
                ]);
73
74
                if (!$extraField) {
75
                    throw new RuntimeException("ExtraField '{$variable}' not found for users.");
76
                }
77
78
                $this->extraFieldValuesRepo->updateItemData(
79
                    $extraField,
80
                    $user,
81
                    $value
82
                );
83
            }
84
        }
85
86
        $hasAccess = $user->getPortals()->exists(
87
            fn ($k, $rel) => $rel->getUrl()?->getId() === $url->getId()
88
        );
89
90
        if (!$hasAccess) {
91
            $rel = new AccessUrlRelUser();
92
            $rel->setUser($user)->setUrl($url);
93
94
            $this->em->persist($rel);
95
            $this->em->flush();
96
        }
97
98
        if ($data->getSendEmail()) {
99
            $subject = $this->translator->trans('You have been enrolled in a new course');
100
101
            $sessionUrl = '/sessions';
102
            $password = $data->getPassword();
103
104
            $body = $this->translator->trans(
105
                'Hello %s,<br><br>'.
106
                'You have been enrolled in the Chamilo platform.<br>'.
107
                'You can access your account from <a href="%s">here</a>.<br><br>'.
108
                'Your login credentials are:<br>'.
109
                'Username: <strong>%s</strong><br>'.
110
                'Password: <strong>%s</strong><br><br>'.
111
                'Best regards,<br>'.
112
                'Chamilo'
113
            );
114
115
            $body = \sprintf(
116
                $body,
117
                $user->getFullname(),
118
                $sessionUrl,
119
                $user->getUsername(),
120
                $password
121
            );
122
123
            $currentUser = $this->userHelper->getCurrent();
124
            $senderId = $currentUser?->getId() ?? 1;
125
126
            $this->messageHelper->sendMessage(
127
                $user->getId(),
128
                $subject,
129
                $body,
130
                [],
131
                [],
132
                0,
133
                0,
134
                0,
135
                $senderId,
136
                0,
137
                false,
138
                true
139
            );
140
        }
141
142
        return $user;
143
    }
144
}
145