Skip to content

Commit

Permalink
ACP-2930: Provided confirmation response building (#18)
Browse files Browse the repository at this point in the history
  • Loading branch information
pushokwhite authored Oct 3, 2024
1 parent 9d5b4c1 commit 4a06c8c
Show file tree
Hide file tree
Showing 17 changed files with 397 additions and 30 deletions.
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

0 comments on commit 4a06c8c

Please sign in to comment.