Contact::__construct()   A
last analyzed

Complexity

Conditions 2
Paths 2

Size

Total Lines 11
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 1
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 11
ccs 1
cts 1
cp 1
rs 9.4285
c 0
b 0
f 0
cc 2
eloc 9
nc 2
nop 4
crap 2
1
<?php
2
declare(strict_types=1);
3
4
namespace Acelaya\Website\Action;
5
6
use Acelaya\Website\Form\ContactFilter;
7
use Acelaya\Website\Service\ContactServiceInterface;
8
use Interop\Http\ServerMiddleware\DelegateInterface;
9
use Psr\Http\Message\ResponseInterface as Response;
10
use Psr\Http\Message\ServerRequestInterface as Request;
11
use Zend\Diactoros\Response\RedirectResponse;
12
use Zend\Expressive\Template\TemplateRendererInterface;
13
use Zend\Session\Container;
14
15
class Contact extends Template
16
{
17
    const PRG_DATA = 'prg_contact_data';
18
19
    /**
20
     * @var ContactServiceInterface
21
     */
22
    protected $contactService;
23
    /**
24
     * @var ContactFilter
25
     */
26
    protected $contactFilter;
27
    /**
28
     * @var \ArrayAccess
29
     */
30
    protected $session;
31
32
    public function __construct(
33
        TemplateRendererInterface $renderer,
34
        ContactServiceInterface $contactService,
35
        ContactFilter $contactFilter,
36
        \ArrayAccess $session = null
37
    ) {
38
        parent::__construct($renderer);
39 4
        $this->contactService = $contactService;
40
        $this->contactFilter = $contactFilter;
41
        $this->session= $session ?: new Container(__CLASS__);
42
    }
43
44
    /**
45 4
     * Returns the content to render
46 4
     *
47 4
     * @param Request $request
48 4
     * @param DelegateInterface $delegate
49 4
     * @return Response
50
     */
51
    public function dispatch(Request $request, DelegateInterface $delegate): Response
52
    {
53
        // On GET requests that are not comming from PRG, just return the template
54
        if ($request->getMethod() === self::METHOD_GET && ! $this->session->offsetExists(self::PRG_DATA)) {
55
            return $this->createTemplateResponse($request);
56
        }
57
58
        // On POST requests, get request data, store it in the session, and redirect to sel
59 4
        if ($request->getMethod() === self::METHOD_POST) {
60
            $params = $request->getParsedBody();
61
            $this->session->offsetSet(self::PRG_DATA, $params);
62 4
            return new RedirectResponse($request->getUri());
63 1
        }
64
65
        // On a GET request that contains data, process the data and clear it from session
66
        $params = $this->session->offsetGet(self::PRG_DATA);
67 3
        $this->session->offsetUnset(self::PRG_DATA);
68 1
        $filter = $this->contactFilter;
69 1
        $filter->setData($params);
70 1
        if (! $filter->isValid()) {
71
            return $this->createTemplateResponse($request, [
72
                'errors' => $filter->getMessages(),
73
                'currentData' => $params,
74 2
            ]);
75 2
        }
76 2
77 2
        // If the form is valid, send the email
78 2
        $result = $this->contactService->send($filter->getValues());
79 1
        return $this->createTemplateResponse($request, $result ? ['success' => true] : ['errors' => []]);
80 1
    }
81
}
82