Failed Conditions
Push — issue#763 ( 4f5bf6 )
by Guilherme
11:38
created

TaskController::resendEmailConfirmation()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 16
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 12

Importance

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