Skip to content

Commit 0353184

Browse files
authored
Merge pull request #389 from dotkernel/issue-388
Issue #388: Inject `InputFilter`s in handlers
2 parents e991fe1 + 4eb99fd commit 0353184

19 files changed

+204
-81
lines changed

src/Admin/src/Handler/Account/PatchAdminAccountResourceHandler.php

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,11 @@ class PatchAdminAccountResourceHandler extends AbstractHandler
1919
{
2020
#[Inject(
2121
AdminServiceInterface::class,
22+
UpdateAdminInputFilter::class,
2223
)]
2324
public function __construct(
2425
protected AdminServiceInterface $adminService,
26+
protected UpdateAdminInputFilter $inputFilter,
2527
) {
2628
}
2729

@@ -32,12 +34,13 @@ public function __construct(
3234
*/
3335
public function handle(ServerRequestInterface $request): ResponseInterface
3436
{
35-
$inputFilter = (new UpdateAdminInputFilter())->setData((array) $request->getParsedBody());
36-
if (! $inputFilter->isValid()) {
37-
throw (new BadRequestException())->setMessages($inputFilter->getMessages());
37+
$this->inputFilter->setData((array) $request->getParsedBody());
38+
if (! $this->inputFilter->isValid()) {
39+
throw (new BadRequestException())->setMessages($this->inputFilter->getMessages());
3840
}
3941

40-
$admin = $this->adminService->updateAdmin($request->getAttribute(Admin::class), $inputFilter->getValues());
42+
$admin = $request->getAttribute(Admin::class);
43+
$this->adminService->updateAdmin($admin, (array) $this->inputFilter->getValues());
4144

4245
return $this->createResponse($request, $admin);
4346
}

src/Admin/src/Handler/Admin/PatchAdminResourceHandler.php

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,11 @@ class PatchAdminResourceHandler extends AbstractHandler
1818
{
1919
#[Inject(
2020
AdminServiceInterface::class,
21+
UpdateAdminInputFilter::class,
2122
)]
2223
public function __construct(
2324
protected AdminServiceInterface $adminService,
25+
protected UpdateAdminInputFilter $inputFilter,
2426
) {
2527
}
2628

@@ -31,13 +33,13 @@ public function __construct(
3133
*/
3234
public function handle(ServerRequestInterface $request): ResponseInterface
3335
{
34-
$inputFilter = (new UpdateAdminInputFilter())->setData((array) $request->getParsedBody());
35-
if (! $inputFilter->isValid()) {
36-
throw (new BadRequestException())->setMessages($inputFilter->getMessages());
36+
$this->inputFilter->setData((array) $request->getParsedBody());
37+
if (! $this->inputFilter->isValid()) {
38+
throw (new BadRequestException())->setMessages($this->inputFilter->getMessages());
3739
}
3840

3941
$admin = $this->adminService->findOneBy(['uuid' => $request->getAttribute('uuid')]);
40-
$this->adminService->updateAdmin($admin, $inputFilter->getValues());
42+
$this->adminService->updateAdmin($admin, (array) $this->inputFilter->getValues());
4143

4244
return $this->createResponse($request, $admin);
4345
}

src/Admin/src/Handler/Admin/PostAdminResourceHandler.php

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,11 @@ class PostAdminResourceHandler extends AbstractHandler
1818
{
1919
#[Inject(
2020
AdminServiceInterface::class,
21+
CreateAdminInputFilter::class,
2122
)]
2223
public function __construct(
2324
protected AdminServiceInterface $adminService,
25+
protected CreateAdminInputFilter $inputFilter,
2426
) {
2527
}
2628

@@ -31,12 +33,12 @@ public function __construct(
3133
*/
3234
public function handle(ServerRequestInterface $request): ResponseInterface
3335
{
34-
$inputFilter = (new CreateAdminInputFilter())->setData((array) $request->getParsedBody());
35-
if (! $inputFilter->isValid()) {
36-
throw (new BadRequestException())->setMessages($inputFilter->getMessages());
36+
$this->inputFilter->setData((array) $request->getParsedBody());
37+
if (! $this->inputFilter->isValid()) {
38+
throw (new BadRequestException())->setMessages($this->inputFilter->getMessages());
3739
}
3840

39-
$admin = $this->adminService->createAdmin($inputFilter->getValues());
41+
$admin = $this->adminService->createAdmin((array) $this->inputFilter->getValues());
4042

4143
return $this->createdResponse($request, $admin);
4244
}

src/App/src/ConfigProvider.php

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
use Api\App\Middleware\AuthorizationMiddleware;
1616
use Api\App\Middleware\ContentNegotiationMiddleware;
1717
use Api\App\Middleware\DeprecationMiddleware;
18+
use Api\App\Middleware\ErrorReportPermissionMiddleware;
1819
use Api\App\Middleware\ResponseMiddleware;
1920
use Api\App\Service\ErrorReportService;
2021
use Api\App\Service\ErrorReportServiceInterface;
@@ -54,20 +55,21 @@ public function getDependencies(): array
5455
PostErrorReportResourceHandler::class => [HandlerDelegatorFactory::class],
5556
],
5657
'factories' => [
57-
'dot-mail.options.default' => MailOptionsAbstractFactory::class,
58-
'dot-mail.service.default' => MailServiceAbstractFactory::class,
59-
AuthenticationMiddleware::class => AuthenticationMiddlewareFactory::class,
60-
AuthorizationMiddleware::class => AttributedServiceFactory::class,
61-
ContentNegotiationMiddleware::class => AttributedServiceFactory::class,
62-
DeprecationMiddleware::class => AttributedServiceFactory::class,
63-
Environment::class => TwigEnvironmentFactory::class,
64-
PostErrorReportResourceHandler::class => AttributedServiceFactory::class,
65-
ErrorReportService::class => AttributedServiceFactory::class,
66-
ResponseMiddleware::class => AttributedServiceFactory::class,
67-
RouteListCommand::class => RouteListCommandFactory::class,
68-
TokenGenerateCommand::class => TokenGenerateCommandFactory::class,
69-
TwigExtension::class => TwigExtensionFactory::class,
70-
TwigRenderer::class => TwigRendererFactory::class,
58+
'dot-mail.options.default' => MailOptionsAbstractFactory::class,
59+
'dot-mail.service.default' => MailServiceAbstractFactory::class,
60+
AuthenticationMiddleware::class => AuthenticationMiddlewareFactory::class,
61+
AuthorizationMiddleware::class => AttributedServiceFactory::class,
62+
ContentNegotiationMiddleware::class => AttributedServiceFactory::class,
63+
DeprecationMiddleware::class => AttributedServiceFactory::class,
64+
Environment::class => TwigEnvironmentFactory::class,
65+
ErrorReportPermissionMiddleware::class => AttributedServiceFactory::class,
66+
PostErrorReportResourceHandler::class => AttributedServiceFactory::class,
67+
ErrorReportService::class => AttributedServiceFactory::class,
68+
ResponseMiddleware::class => AttributedServiceFactory::class,
69+
RouteListCommand::class => RouteListCommandFactory::class,
70+
TokenGenerateCommand::class => TokenGenerateCommandFactory::class,
71+
TwigExtension::class => TwigExtensionFactory::class,
72+
TwigRenderer::class => TwigRendererFactory::class,
7173
],
7274
'aliases' => [
7375
Authentication\AuthenticationInterface::class => Authentication\OAuth2\OAuth2Adapter::class,

src/App/src/Handler/PostErrorReportResourceHandler.php

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
namespace Api\App\Handler;
66

77
use Api\App\Attribute\MethodDeprecation;
8-
use Api\App\Exception\ForbiddenException;
9-
use Api\App\Exception\UnauthorizedException;
8+
use Api\App\Exception\BadRequestException;
9+
use Api\App\InputFilter\ErrorReportInputFilter;
1010
use Api\App\Service\ErrorReportServiceInterface;
1111
use Core\App\Message;
1212
use Dot\DependencyInjection\Attribute\Inject;
@@ -19,16 +19,17 @@ class PostErrorReportResourceHandler extends AbstractHandler
1919
{
2020
#[Inject(
2121
ErrorReportServiceInterface::class,
22+
ErrorReportInputFilter::class,
2223
)]
2324
public function __construct(
2425
protected ErrorReportServiceInterface $errorReportService,
26+
protected ErrorReportInputFilter $inputFilter,
2527
) {
2628
}
2729

2830
/**
29-
* @throws ForbiddenException
31+
* @throws BadRequestException
3032
* @throws RuntimeException
31-
* @throws UnauthorizedException
3233
*/
3334
#[MethodDeprecation(
3435
sunset: '2038-01-01',
@@ -37,11 +38,12 @@ public function __construct(
3738
)]
3839
public function handle(ServerRequestInterface $request): ResponseInterface
3940
{
40-
$this->errorReportService
41-
->checkRequest($request)
42-
->appendMessage(
43-
$request->getParsedBody()['message'] ?? ''
44-
);
41+
$this->inputFilter->setData((array) $request->getParsedBody());
42+
if (! $this->inputFilter->isValid()) {
43+
throw (new BadRequestException())->setMessages($this->inputFilter->getMessages());
44+
}
45+
46+
$this->errorReportService->appendMessage($this->inputFilter->getValue('message'));
4547

4648
return $this->infoResponse(Message::ERROR_REPORT_OK, StatusCodeInterface::STATUS_CREATED);
4749
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Api\App\InputFilter;
6+
7+
use Api\App\InputFilter\Input\MessageInput;
8+
use Laminas\InputFilter\InputFilter;
9+
10+
/**
11+
* @extends InputFilter<object>
12+
*/
13+
class ErrorReportInputFilter extends InputFilter
14+
{
15+
public function __construct()
16+
{
17+
$this->add(new MessageInput('message'));
18+
}
19+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Api\App\InputFilter\Input;
6+
7+
use Core\App\Message;
8+
use Laminas\Filter\StringTrim;
9+
use Laminas\Filter\StripTags;
10+
use Laminas\InputFilter\Input;
11+
use Laminas\Validator\NotEmpty;
12+
13+
use function sprintf;
14+
15+
class MessageInput extends Input
16+
{
17+
public function __construct(?string $name = null, bool $isRequired = true)
18+
{
19+
parent::__construct($name);
20+
21+
$this->setRequired($isRequired);
22+
23+
$this->getFilterChain()
24+
->attachByName(StringTrim::class)
25+
->attachByName(StripTags::class);
26+
27+
$this->getValidatorChain()
28+
->attachByName(NotEmpty::class, [
29+
'message' => sprintf(Message::VALIDATOR_REQUIRED_FIELD_BY_NAME, 'Message'),
30+
], true);
31+
}
32+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Api\App\Middleware;
6+
7+
use Api\App\Exception\ForbiddenException;
8+
use Api\App\Exception\UnauthorizedException;
9+
use Api\App\Service\ErrorReportServiceInterface;
10+
use Dot\DependencyInjection\Attribute\Inject;
11+
use Psr\Http\Message\ResponseInterface;
12+
use Psr\Http\Message\ServerRequestInterface;
13+
use Psr\Http\Server\MiddlewareInterface;
14+
use Psr\Http\Server\RequestHandlerInterface;
15+
16+
class ErrorReportPermissionMiddleware implements MiddlewareInterface
17+
{
18+
#[Inject(
19+
ErrorReportServiceInterface::class,
20+
)]
21+
public function __construct(
22+
protected ErrorReportServiceInterface $errorReportService,
23+
) {
24+
}
25+
26+
/**
27+
* @throws UnauthorizedException
28+
* @throws ForbiddenException
29+
*/
30+
public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
31+
{
32+
$this->errorReportService->checkRequest($request);
33+
34+
return $handler->handle($request);
35+
}
36+
}

src/App/src/RoutesDelegator.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
use Api\App\Handler\GetIndexResourceHandler;
88
use Api\App\Handler\PostErrorReportResourceHandler;
9+
use Api\App\Middleware\ErrorReportPermissionMiddleware;
910
use Mezzio\Application;
1011
use Psr\Container\ContainerInterface;
1112

@@ -24,7 +25,11 @@ public function __invoke(ContainerInterface $container, string $serviceName, cal
2425
$app->get('/', GetIndexResourceHandler::class, 'app::view-index');
2526

2627
// Other application reports an error
27-
$app->post('/error-report', PostErrorReportResourceHandler::class, 'app::create-error-report');
28+
$app->post(
29+
'/error-report',
30+
[ErrorReportPermissionMiddleware::class, PostErrorReportResourceHandler::class],
31+
'app::create-error-report'
32+
);
2833

2934
return $app;
3035
}

src/User/src/Handler/Account/Avatar/PostUserAccountAvatarHandler.php

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,11 @@ class PostUserAccountAvatarHandler extends AbstractHandler
1717
{
1818
#[Inject(
1919
UserAvatarServiceInterface::class,
20+
UpdateAvatarInputFilter::class,
2021
)]
2122
public function __construct(
2223
protected UserAvatarServiceInterface $userAvatarService,
24+
protected UpdateAvatarInputFilter $inputFilter,
2325
) {
2426
}
2527

@@ -28,14 +30,14 @@ public function __construct(
2830
*/
2931
public function handle(ServerRequestInterface $request): ResponseInterface
3032
{
31-
$inputFilter = (new UpdateAvatarInputFilter())->setData($request->getUploadedFiles());
32-
if (! $inputFilter->isValid()) {
33-
throw (new BadRequestException())->setMessages($inputFilter->getMessages());
33+
$this->inputFilter->setData($request->getUploadedFiles());
34+
if (! $this->inputFilter->isValid()) {
35+
throw (new BadRequestException())->setMessages($this->inputFilter->getMessages());
3436
}
3537

3638
$userAvatar = $this->userAvatarService->createAvatar(
3739
$request->getAttribute(User::class),
38-
$inputFilter->getValue('avatar')
40+
$this->inputFilter->getValue('avatar')
3941
);
4042

4143
return $this->createdResponse($request, $userAvatar);

0 commit comments

Comments
 (0)