-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathRouteCRUDHandler.php
More file actions
85 lines (71 loc) · 2.88 KB
/
Copy pathRouteCRUDHandler.php
File metadata and controls
85 lines (71 loc) · 2.88 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
<?php
declare(strict_types=1);
namespace ESB\Handlers\HTTP;
use ESB\Assembler\RouteEntityAssembler;
use ESB\Entity\Route;
use ESB\Exception\ValidationException;
use ESB\Repository\RouteRepositoryInterface;
use ESB\Response\ESBJsonResponse;
use ESB\Validation\Route\RouteEntityInputValidator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use function array_filter;
use function is_array;
use function reset;
use function strtoupper;
class RouteCRUDHandler
{
public function __construct(
private readonly RouteRepositoryInterface $routeRepository,
private readonly RouteEntityInputValidator $validator,
private readonly RouteEntityAssembler $assembler,
) {
}
public function __invoke(ServerRequestInterface $request, ResponseInterface $response) : ResponseInterface
{
return match (strtoupper($request->getMethod())) {
'POST' => $this->create($request),
'GET' => $this->read($request),
'PUT' => $this->update($request),
'DELETE' => $this->delete($request),
};
}
private function create(ServerRequestInterface $request) : ResponseInterface
{
$requestData = $request->getParsedBody();
if (! is_array($requestData)) {
throw new ValidationException('RouteCRUDHadler - wrong request body', '');
}
$this->validator->validate($requestData);
$route = $this->assembler->buildRoute($requestData);
$this->routeRepository->store($route);
return new ESBJsonResponse(['message' => 'Successfully processed']);
}
private function read(ServerRequestInterface $request) : ResponseInterface
{
$name = $request->getAttribute('name');
$route = array_filter($this->routeRepository->loadAll(), fn(Route $route) => $route->name() === $name);
return new ESBJsonResponse(reset($route));
}
private function update(ServerRequestInterface $request) : ResponseInterface
{
$requestData = $request->getParsedBody();
if (! is_array($requestData)) {
throw new ValidationException('RouteCRUDHadler - wrong request body', '');
}
$this->validator->validate($requestData);
$route = $this->assembler->buildRoute($requestData);
$this->routeRepository->store($route);
return new ESBJsonResponse(['message' => 'Successfully processed']);
}
private function delete(ServerRequestInterface $request) : ResponseInterface
{
$name = $request->getAttribute('name');
$route = array_filter($this->routeRepository->loadAll(), fn(Route $route) => $route->name() === $name);
if (! $route) {
throw new ValidationException('Unknown route', '');
}
$this->routeRepository->delete(reset($route));
return new ESBJsonResponse(['message' => 'Successfully deleted']);
}
}