TaskController::fillEmailAction()   A
last analyzed

Complexity

Conditions 2
Paths 2

Size

Total Lines 23
Code Lines 13

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 6

Importance

Changes 0
Metric Value
cc 2
eloc 13
nc 2
nop 2
dl 0
loc 23
ccs 0
cts 18
cp 0
crap 6
rs 9.8333
c 0
b 0
f 0
1
<?php
2
3
namespace LoginCidadao\CoreBundle\Controller;
4
5
use FOS\UserBundle\Event\FilterUserResponseEvent;
6
use FOS\UserBundle\Event\FormEvent;
7
use FOS\UserBundle\FOSUserEvents;
8
use FOS\UserBundle\Util\TokenGenerator;
9
use FOS\UserBundle\Event\GetResponseUserEvent;
10
use LoginCidadao\CoreBundle\Entity\Person;
11
use LoginCidadao\CoreBundle\Form\Type\EmailFormType;
12
use LoginCidadao\CoreBundle\Model\ConfirmEmailTask;
13
use LoginCidadao\CoreBundle\Model\PersonInterface;
14
use LoginCidadao\TaskStackBundle\Model\RouteTaskTarget;
15
use LoginCidadao\TaskStackBundle\Model\UrlTaskTarget;
16
use LoginCidadao\TaskStackBundle\Service\TaskStackManagerInterface;
17
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
18
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
19
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
20
use Symfony\Component\EventDispatcher\EventDispatcher;
21
use Symfony\Component\HttpFoundation\Request;
22
use Symfony\Component\HttpFoundation\Response;
23
use Symfony\Component\Translation\TranslatorInterface;
24
25
class TaskController extends Controller
26
{
27
    /**
28
     * @param Request $request
29
     * @return array|null|\Symfony\Component\HttpFoundation\RedirectResponse|Response
30
     *
31
     * @Route("/confirm-email", name="task_confirm_email")
32
     * @Template()
33
     */
34
    public function confirmEmailAction(Request $request)
35
    {
36
        /** @var PersonInterface $person */
37
        $person = $this->getUser();
38
        $resend = $request->get('resend', false);
39
        $notifySent = $request->get('resent', false);
40
        $originalEmail = $person->getEmail();
41
42
        /** @var TaskStackManagerInterface $stackManager */
43
        $stackManager = $this->get('task_stack.manager');
44
        $targetUrl = $this->getTargetUrl($stackManager);
45
46
        if ($person->getEmailConfirmedAt()) {
47
            $task = $stackManager->getCurrentTask();
48
49
            if ($task instanceof ConfirmEmailTask) {
50
                $stackManager->setTaskSkipped($task);
51
            }
52
53
            return $stackManager->processRequest($request, $this->redirect($targetUrl));
54
        }
55
56
        /** @var EventDispatcher $dispatcher */
57
        $dispatcher = $this->get('event_dispatcher');
58
        $event = new GetResponseUserEvent($person, $request);
59
        $dispatcher->dispatch(FOSUserEvents::PROFILE_EDIT_INITIALIZE, $event);
60
61
        $form = $this->createForm(EmailFormType::class, $person);
62
63
        $response = null;
64
        $form->handleRequest($request);
65
        $emailChanged = false;
66
        if ($form->isValid()) {
67
            $emailChanged = $originalEmail !== $person->getEmail();
68
            if ($emailChanged) {
69
                /** @var $userManager \FOS\UserBundle\Model\UserManagerInterface */
70
                $userManager = $this->get('fos_user.user_manager');
71
72
                $event = new FormEvent($form, $request);
73
                $dispatcher->dispatch(FOSUserEvents::PROFILE_EDIT_SUCCESS, $event);
74
75
                $userManager->updateUser($person);
76
77
                $response = $this->redirectToRoute('task_confirm_email', ['resent' => '✓']);
78
                $event = new FilterUserResponseEvent($person, $request, $response);
79
                $dispatcher->dispatch(FOSUserEvents::PROFILE_EDIT_COMPLETED, $event);
80
                $response = $event->getResponse();
81
            } else {
82
                $resend = true;
83
            }
84
        }
85
86
        if ($emailChanged || $notifySent) {
87
            $this->flashEmailSent();
88
        }
89
90
        if ($resend) {
91
            $this->resendEmailConfirmation($person);
92
        }
93
94
        if ($response instanceof Response) {
95
            return $response;
96
        }
97
98
        return ['targetUrl' => $targetUrl, 'form' => $form->createView()];
99
    }
100
101
    /**
102
     * @param Request $request
103
     * @param $service
104
     * @return array|\Symfony\Component\HttpFoundation\RedirectResponse
105
     *
106
     * @Route("/register/fill-email/{service}", name="task_fill_email")
107
     * @Template()
108
     */
109
    public function fillEmailAction(Request $request, $service)
110
    {
111
        $session = $request->getSession();
112
        $userInfo = $session->get("$service.userinfo");
113
114
        $person = new Person();
115
        $person->setEmail($userInfo['email']);
116
117
        $form = $this->createForm('LoginCidadao\CoreBundle\Form\Type\EmailFormType', $person);
118
119
        $form->handleRequest($request);
120
        if ($form->isValid()) {
121
            $session->set("$service.email", $form->getData()->getEmail());
122
123
            return $this->redirect(
124
                $this->generateUrl(
125
                    'hwi_oauth_service_redirect',
126
                    array('service' => $service)
127
                )
128
            );
129
        }
130
131
        return ['form' => $form->createView(), 'service' => $service];
132
    }
133
134
    private function resendEmailConfirmation(PersonInterface $person)
135
    {
136
        $mailer = $this->get('fos_user.mailer');
137
138
        if (is_null($person->getEmailConfirmedAt())) {
139
            if (is_null($person->getConfirmationToken())) {
140
                $tokenGenerator = new TokenGenerator();
141
                $person->setConfirmationToken($tokenGenerator->generateToken());
142
                $userManager = $this->get('fos_user.user_manager');
143
                $userManager->updateUser($person);
144
            }
145
            $mailer->sendConfirmationEmailMessage($person);
146
147
            $this->flashEmailSent();
148
149
            return $this->redirectToRoute('task_confirm_email');
150
        }
151
    }
152
153
    private function flashEmailSent()
154
    {
155
        /** @var TranslatorInterface $translator */
156
        $translator = $this->get('translator');
157
        $this->addFlash('success', $translator->trans("tasks.confirm_email.resent.alert"));
158
    }
159
160
    private function getTargetUrl(TaskStackManagerInterface $stackManager)
161
    {
162
        $nextTask = $stackManager->getNextTask();
163
        if ($nextTask) {
164
            $target = $nextTask->getTarget();
165
            if ($target instanceof RouteTaskTarget) {
166
                return $this->generateUrl($target->getRoute(), $target->getParameters());
167
            } elseif ($target instanceof UrlTaskTarget) {
168
                return $target->getUrl();
169
            }
170
        }
171
172
        return $this->generateUrl('lc_dashboard');
173
    }
174
}
175