Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ACP-2930: Provided confirmation response building #18

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ nbproject/
/node_modules/

# tooling
data/
/data/cache
vendor/
composer.lock
.phpunit.result.cache
Expand Down
3 changes: 2 additions & 1 deletion composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
"spryker/secrets-manager-extension": "^1.0.0",
"spryker/symfony": "^3.0.0",
"spryker/transfer": "^3.33.0",
"spryker/translator": "^1.13.0",
"spryker/util-encoding": "^2.0.0",
"spryker/util-text": "^1.0.0"
},
Expand Down Expand Up @@ -60,7 +61,7 @@
"minimum-stability": "dev",
"prefer-stable": true,
"scripts": {
"setup": "tests/bin/console app-kernel:setup && tests/bin/console transfer:generate && tests/bin/console transfer:databuilder:generate && tests/bin/console propel:install && tests/bin/console dev:ide-auto-completion:zed:generate && tests/bin/console dev:ide-auto-completion:glue:generate && tests/bin/console dev:ide-auto-completion:glue-backend:generate",
"setup": "tests/bin/console app-kernel:setup && tests/bin/console transfer:generate && tests/bin/console transfer:databuilder:generate && tests/bin/console translator:generate && tests/bin/console propel:install && tests/bin/console dev:ide-auto-completion:zed:generate && tests/bin/console dev:ide-auto-completion:glue:generate && tests/bin/console dev:ide-auto-completion:glue-backend:generate",
"cs-check": "phpcs -p src/ tests/",
"cs-fix": "phpcbf -p src/ tests/",
"stan": "phpstan analyze src/Spryker/",
Expand Down
3 changes: 3 additions & 0 deletions data/translation/Zed/de_DE.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
"Ignore & Disconnect","Ignorieren & Trennen"
Cancel,Stornieren
"Tenant identifier is missing.","Mandantenkennung fehlt."
3 changes: 3 additions & 0 deletions data/translation/Zed/en_US.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
"Ignore & Disconnect","Ignore & Disconnect"
Cancel,Cancel
"Tenant identifier is missing.","Tenant identifier is missing."
5 changes: 5 additions & 0 deletions phpcs.xml
Original file line number Diff line number Diff line change
Expand Up @@ -36,4 +36,9 @@
<exclude name="SlevomatCodingStandard.Classes.DisallowConstructorPropertyPromotion.DisallowedConstructorPropertyPromotion"/>
</rule>

<!-- PHP 8.0 null safe operator -->
<rule ref="SlevomatCodingStandard.ControlStructures.DisallowNullSafeObjectOperator">
<exclude name="SlevomatCodingStandard.ControlStructures.DisallowNullSafeObjectOperator"/>
</rule>

</ruleset>
2 changes: 2 additions & 0 deletions rector.php
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@
__DIR__ . '/src/Spryker/Zed/AppKernel/Dependency/Service/AppKernelToUtilTextServiceBridge.php',
__DIR__ . '/src/Spryker/Glue/AppKernel/Dependency/Facade/AppKernelToAppKernelFacadeBridge.php',
__DIR__ . '/src/Spryker/Glue/AppKernel/Dependency/Service/AppKernelToUtilEncodingServiceBridge.php',
__DIR__ . '/src/Spryker/Glue/AppKernel/Dependency/Facade/AppKernelToTranslatorFacadeBridge.php',
],
AddParamTypeFromPropertyTypeRector::class => [
__DIR__ . '/src/Spryker/Zed/AppKernel/Dependency/Client/AppKernelToSecretsManagerClientBridge.php',
Expand All @@ -55,6 +56,7 @@
__DIR__ . '/src/Spryker/Zed/AppKernel/Dependency/Service/AppKernelToUtilTextServiceBridge.php',
__DIR__ . '/src/Spryker/Glue/AppKernel/Dependency/Facade/AppKernelToAppKernelFacadeBridge.php',
__DIR__ . '/src/Spryker/Glue/AppKernel/Dependency/Service/AppKernelToUtilEncodingServiceBridge.php',
__DIR__ . '/src/Spryker/Glue/AppKernel/Dependency/Facade/AppKernelToTranslatorFacadeBridge.php',
],
]);
};
17 changes: 1 addition & 16 deletions src/Spryker/Glue/AppKernel/AppKernelConfig.php
Original file line number Diff line number Diff line change
Expand Up @@ -54,20 +54,5 @@ class AppKernelConfig extends AbstractBundleConfig
/**
* @var string
*/
public const RESPONSE_MESSAGE_BLANK_CLIENT_ID_FIELD = 'Client ID is required.';

/**
* @var string
*/
public const RESPONSE_MESSAGE_NOT_STRING_CLIENT_ID_FIELD = 'Client ID must be a string.';

/**
* @var string
*/
public const RESPONSE_MESSAGE_BLANK_CLIENT_SECRET_FIELD = 'Client Secret is required.';

/**
* @var string
*/
public const RESPONSE_MESSAGE_NOT_STRING_CLIENT_SECRET_FIELD = 'Client Secret must be a string.';
public const ERROR_CODE_PAYMENT_DISCONNECTION_TENANT_IDENTIFIER_MISSING = '20000';
}
17 changes: 17 additions & 0 deletions src/Spryker/Glue/AppKernel/AppKernelDependencyProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@

use Spryker\Glue\AppKernel\Dependency\Facade\AppKernelToAppKernelFacadeBridge;
use Spryker\Glue\AppKernel\Dependency\Facade\AppKernelToAppKernelFacadeInterface;
use Spryker\Glue\AppKernel\Dependency\Facade\AppKernelToTranslatorFacadeBridge;
use Spryker\Glue\AppKernel\Dependency\Facade\AppKernelToTranslatorFacadeInterface;
use Spryker\Glue\AppKernel\Dependency\Service\AppKernelToUtilEncodingServiceBridge;
use Spryker\Glue\AppKernel\Dependency\Service\AppKernelToUtilEncodingServiceInterface;
use Spryker\Glue\Kernel\Backend\AbstractBundleDependencyProvider;
Expand All @@ -24,6 +26,11 @@ class AppKernelDependencyProvider extends AbstractBundleDependencyProvider
*/
public const FACADE_APP_KERNEL = 'FACADE_APP_KERNEL';

/**
* @var string
*/
public const FACADE_TRANSLATOR = 'FACADE_TRANSLATOR';

/**
* @var string
*/
Expand All @@ -47,6 +54,7 @@ public function provideBackendDependencies(Container $container): Container
$container = $this->addAppKernelFacade($container);
$container = $this->addRequestConfigureValidatorPlugins($container);
$container = $this->addRequestDisconnectValidatorPlugins($container);
$container = $this->addTranslatorFacade($container);

return $container;
}
Expand Down Expand Up @@ -102,4 +110,13 @@ protected function getRequestDisconnectValidatorPlugins(): array
{
return [];
}

protected function addTranslatorFacade(Container $container): Container
{
$container->set(static::FACADE_TRANSLATOR, static function (Container $container): AppKernelToTranslatorFacadeInterface {
return new AppKernelToTranslatorFacadeBridge($container->getLocator()->translator()->facade());
});

return $container;
}
}
6 changes: 6 additions & 0 deletions src/Spryker/Glue/AppKernel/AppKernelFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
use Spryker\Glue\AppKernel\Builder\ResponseBuilder;
use Spryker\Glue\AppKernel\Builder\ResponseBuilderInterface;
use Spryker\Glue\AppKernel\Dependency\Facade\AppKernelToAppKernelFacadeInterface;
use Spryker\Glue\AppKernel\Dependency\Facade\AppKernelToTranslatorFacadeInterface;
use Spryker\Glue\AppKernel\Dependency\Service\AppKernelToUtilEncodingServiceInterface;
use Spryker\Glue\AppKernel\Mapper\GlueRequestMapper;
use Spryker\Glue\AppKernel\Mapper\GlueRequestMapperInterface;
Expand Down Expand Up @@ -88,6 +89,11 @@ public function getAppKernelFacade(): AppKernelToAppKernelFacadeInterface
return $this->getProvidedDependency(AppKernelDependencyProvider::FACADE_APP_KERNEL);
}

public function getTranslatorFacade(): AppKernelToTranslatorFacadeInterface
{
return $this->getProvidedDependency(AppKernelDependencyProvider::FACADE_TRANSLATOR);
}

/**
* @return array<\Spryker\Glue\GlueApplicationExtension\Dependency\Plugin\RequestValidatorPluginInterface>
*/
Expand Down
1 change: 1 addition & 0 deletions src/Spryker/Glue/AppKernel/Builder/ResponseBuilder.php
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ public function buildRequestNotValidResponse(
'code' => $error->getCode(),
'message' => $error->getMessage(),
'status' => $error->getStatus(),
'confirm' => $error->getConfirm()?->toArray(true, true),
];
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
<?php

/**
* Copyright © 2016-present Spryker Systems GmbH. All rights reserved.
* Use of this software requires acceptance of the Evaluation License Agreement. See LICENSE file.
*/

namespace Spryker\Glue\AppKernel\Dependency\Facade;

class AppKernelToTranslatorFacadeBridge implements AppKernelToTranslatorFacadeInterface
{
/**
* @var \Spryker\Zed\Translator\Business\TranslatorFacadeInterface
*/
protected $translatorFacade;

/**
* @param \Spryker\Zed\Translator\Business\TranslatorFacadeInterface $translatorFacade
*/
public function __construct($translatorFacade)
{
$this->translatorFacade = $translatorFacade;
}

/**
* @param array<mixed> $parameters
* @param string|null $domain
* @param string|null $locale
*/
public function trans(string $id, array $parameters = [], ?string $domain = null, ?string $locale = null): string
{
return $this->translatorFacade->trans($id, $parameters, $domain, $locale);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<?php

/**
* Copyright © 2016-present Spryker Systems GmbH. All rights reserved.
* Use of this software requires acceptance of the Evaluation License Agreement. See LICENSE file.
*/

namespace Spryker\Glue\AppKernel\Dependency\Facade;

interface AppKernelToTranslatorFacadeInterface
{
/**
* @param array<mixed> $parameters
* @param string|null $domain
* @param string|null $locale
*/
public function trans(string $id, array $parameters = [], ?string $domain = null, ?string $locale = null): string;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,151 @@
<?php

/**
* Copyright © 2016-present Spryker Systems GmbH. All rights reserved.
* Use of this software requires acceptance of the Evaluation License Agreement. See LICENSE file.
*/

namespace Spryker\Glue\AppKernel\Plugin\GlueApplication;

use Generated\Shared\Transfer\GlueErrorConfirmTransfer;
use Generated\Shared\Transfer\GlueErrorTransfer;
use Generated\Shared\Transfer\GlueRequestTransfer;
use Generated\Shared\Transfer\GlueRequestValidationTransfer;
use Spryker\Glue\AppKernel\AppKernelConfig;
use Spryker\Glue\GlueApplicationExtension\Dependency\Plugin\RequestValidatorPluginInterface;
use Spryker\Glue\Kernel\Backend\AbstractPlugin;
use Symfony\Component\HttpFoundation\Response;

/**
* @method \Spryker\Glue\AppKernel\AppKernelFactory getFactory()
*/
abstract class AbstractConfirmDisconnectionRequestValidatorPlugin extends AbstractPlugin implements RequestValidatorPluginInterface
{
/**
* @var string
*/
protected const HEADER_CONFIRMATION_STATUS = 'x-confirmation-status';

public function validate(GlueRequestTransfer $glueRequestTransfer): GlueRequestValidationTransfer
{
$tenantIdentifier = $this->findTenantIdentifier($glueRequestTransfer);

if ($tenantIdentifier === null || $tenantIdentifier === '') {
return $this->getFailedGlueRequestValidationTransfer(
AppKernelConfig::ERROR_CODE_PAYMENT_DISCONNECTION_TENANT_IDENTIFIER_MISSING,
$this->getFactory()->getTranslatorFacade()->trans('Tenant identifier is missing.'),
);
}

$glueRequestValidationTransfer = $this->validateDisconnectionRequest($glueRequestTransfer, $tenantIdentifier);

if ($glueRequestValidationTransfer->getIsValid()) {
return $glueRequestValidationTransfer;
}

$glueRequestValidationTransfer->requireErrors();

$confirmationStatusValue = $this->extractConfirmationStatusValue($glueRequestTransfer);

if ($confirmationStatusValue !== null) {
$isConfirmed = filter_var($confirmationStatusValue, FILTER_VALIDATE_BOOLEAN);

return match ($isConfirmed) {
true => $this->onConfirmationOk(),
false => $this->onConfirmationCancel(),
};
}

$glueRequestValidationTransfer->setStatus(Response::HTTP_CONFLICT)
->getErrors()[0]
->setStatus(Response::HTTP_CONFLICT)
->setConfirm(
(new GlueErrorConfirmTransfer())
->setLabelOk($this->getLabelOk())
->setLabelCancel($this->getLabelCancel()),
);

return $glueRequestValidationTransfer;
}

abstract protected function validateDisconnectionRequest(
GlueRequestTransfer $glueRequestTransfer,
string $tenantIdentifier
): GlueRequestValidationTransfer;

abstract protected function getCancellationErrorCode(): string;

abstract protected function getCancellationErrorMessage(): string;

protected function onConfirmationOk(): GlueRequestValidationTransfer
{
return (new GlueRequestValidationTransfer())
->setIsValid(true);
}

protected function onConfirmationCancel(): GlueRequestValidationTransfer
{
return (new GlueRequestValidationTransfer())
->setIsValid(false)
->setStatus(Response::HTTP_BAD_REQUEST)
->addError(
(new GlueErrorTransfer())
->setCode($this->getCancellationErrorCode())
->setStatus(Response::HTTP_BAD_REQUEST)
->setMessage($this->getCancellationErrorMessage()),
);
}

protected function getLabelOk(): string
{
return $this->getFactory()->getTranslatorFacade()->trans('Ignore & Disconnect');
}

protected function getLabelCancel(): string
{
return $this->getFactory()->getTranslatorFacade()->trans('Cancel');
}

protected function findTenantIdentifier(GlueRequestTransfer $glueRequestTransfer): ?string
{
return $glueRequestTransfer->getMeta()[AppKernelConfig::HEADER_TENANT_IDENTIFIER][0] ?? null;
}

protected function getFailedGlueRequestValidationTransfer(
string $errorCode,
string $errorMessage,
?int $httpStatus = Response::HTTP_BAD_REQUEST
): GlueRequestValidationTransfer {
return (new GlueRequestValidationTransfer())
->setIsValid(false)
->setStatus($httpStatus)
->addError(
(new GlueErrorTransfer())
->setCode($errorCode)
->setStatus($httpStatus)
->setMessage($errorMessage),
);
}

protected function extractConfirmationStatusValue(GlueRequestTransfer $glueRequestTransfer): ?string
{
$confirmationStatusMetaDatum = $glueRequestTransfer->getMeta()[static::HEADER_CONFIRMATION_STATUS] ?? [];

if (!$confirmationStatusMetaDatum) {
return null;
}

$confirmationStatusValue = $confirmationStatusMetaDatum[0] ?? '';

if (!$confirmationStatusValue) {
return null;
}

$confirmationStatusValues = explode(',', $confirmationStatusValue);
$confirmationStatusExtractedValue = array_shift($confirmationStatusValues);
$confirmationStatusMetaDatum[0] = implode(',', $confirmationStatusValues);
$glueRequestTransfer->addMeta(static::HEADER_CONFIRMATION_STATUS, $confirmationStatusMetaDatum);

return $confirmationStatusExtractedValue;
}
}
6 changes: 6 additions & 0 deletions src/Spryker/Shared/AppKernel/Transfer/app_kernel.transfer.xml
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,12 @@
<property name="code" type="string"/>
<property name="status" type="int"/>
<property name="message" type="string"/>
<property name="confirm" type="GlueErrorConfirm"/>
</transfer>

<transfer name="GlueErrorConfirm" strict="true">
<property name="labelOk" type="string"/>
<property name="labelCancel" type="string"/>
</transfer>

</transfers>
Loading
Loading