Skip to content
Open
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
30 changes: 19 additions & 11 deletions config/actions.php
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,9 @@
use MyParcelNL\Pdk\App\Request\Addresses\AddressesValidateEndpointRequest;
use MyParcelNL\Pdk\App\Action\Addresses\AddressesListAction;
use MyParcelNL\Pdk\App\Action\Addresses\AddressesValidateAction;
use MyParcelNL\Pdk\Api\PdkCapabilitiesActions;
use MyParcelNL\Pdk\App\Action\Capabilities\CapabilitiesAction;
use MyParcelNL\Pdk\App\Request\Capabilities\CapabilitiesEndpointRequest;

return [
PdkEndpoint::CONTEXT_SHARED => [
Expand Down Expand Up @@ -90,6 +93,11 @@
'request' => AddressesValidateEndpointRequest::class,
'action' => AddressesValidateAction::class,
],

PdkCapabilitiesActions::PROXY_CAPABILITIES => [
'request' => CapabilitiesEndpointRequest::class,
'action' => CapabilitiesAction::class,
],
],

PdkEndpoint::CONTEXT_BACKEND => [
Expand Down Expand Up @@ -162,87 +170,87 @@
'action' => UpdateOrderAction::class,
],

PdkBackendActions::UPDATE_ORDER_STATUS => [
PdkBackendActions::UPDATE_ORDER_STATUS => [
'request' => UpdateOrderStatusEndpointRequest::class,
'action' => UpdateOrderStatusAction::class,
],

/**
* Get new shipments data from the API.
*/
PdkBackendActions::UPDATE_SHIPMENTS => [
PdkBackendActions::UPDATE_SHIPMENTS => [
'request' => UpdateShipmentsEndpointRequest::class,
'action' => UpdateShipmentsAction::class,
],

/**
* Soft delete shipments in the plugin.
*/
PdkBackendActions::DELETE_SHIPMENTS => [
PdkBackendActions::DELETE_SHIPMENTS => [
'request' => DeleteShipmentsEndpointRequest::class,
'action' => DeleteShipmentsAction::class,
],

/**
* Print shipment labels
*/
PdkBackendActions::PRINT_SHIPMENTS => [
PdkBackendActions::PRINT_SHIPMENTS => [
'request' => PrintShipmentsEndpointRequest::class,
'action' => PrintShipmentsAction::class,
],

/**
* Update plugin settings
*/
PdkBackendActions::UPDATE_PLUGIN_SETTINGS => [
PdkBackendActions::UPDATE_PLUGIN_SETTINGS => [
'request' => UpdatePluginSettingsEndpointRequest::class,
'action' => UpdatePluginSettingsAction::class,
],

/**
* Update product settings
*/
PdkBackendActions::UPDATE_PRODUCT_SETTINGS => [
PdkBackendActions::UPDATE_PRODUCT_SETTINGS => [
'request' => UpdateProductSettingsEndpointRequest::class,
'action' => UpdateProductSettingsAction::class,
],

/**
* Create return shipment
*/
PdkBackendActions::EXPORT_RETURN => [
PdkBackendActions::EXPORT_RETURN => [
'request' => ExportReturnEndpointRequest::class,
'action' => ExportReturnAction::class,
],

/**
* Create webhooks
*/
PdkBackendActions::CREATE_WEBHOOKS => [
PdkBackendActions::CREATE_WEBHOOKS => [
'request' => CreateWebhooksEndpointRequest::class,
'action' => CreateWebhooksAction::class,
],

/**
* Delete webhooks
*/
PdkBackendActions::DELETE_WEBHOOKS => [
PdkBackendActions::DELETE_WEBHOOKS => [
'request' => DeleteWebhooksEndpointRequest::class,
'action' => DeleteWebhooksAction::class,
],

/**
* Fetch webhooks
*/
PdkBackendActions::FETCH_WEBHOOKS => [
PdkBackendActions::FETCH_WEBHOOKS => [
'request' => FetchWebhooksEndpointRequest::class,
'action' => FetchWebhooksAction::class,
],

/**
* Download logs
*/
PdkBackendActions::DOWNLOAD_LOGS => [
PdkBackendActions::DOWNLOAD_LOGS => [
'request' => DownloadLogsEndpointRequest::class,
'action' => DownloadLogsAction::class,
],
Expand Down
1 change: 1 addition & 0 deletions config/pdk-default.php
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
'apiUrl' => env('PDK_API_URL', 'https://api.myparcel.nl'),
'printingApiUrl' => env('PDK_PRINTING_API_URL', 'https://printing.api.myparcel.nl'),
'addressesServiceUrl' => env('PDK_ADDRESSES_SERVICE_URL', 'https://address.api.myparcel.nl'),
'capabilitiesServiceUrl' => env('PDK_CAPABILITIES_SERVICE_URL', 'https://api.myparcel.nl'),

/**
* Security settings for the proxy
Expand Down
6 changes: 6 additions & 0 deletions config/pdk-services.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
use MyParcelNL\Pdk\Account\Service\AccountSettingsService;
use MyParcelNL\Pdk\Api\Contract\ApiServiceInterface;
use MyParcelNL\Pdk\Api\Service\AddressesApiService;
use MyParcelNL\Pdk\Api\Service\CapabilitiesApiService;
use MyParcelNL\Pdk\Api\Service\MyParcelApiService;
use MyParcelNL\Pdk\App\Account\Contract\PdkAccountRepositoryInterface;
use MyParcelNL\Pdk\App\Api\Contract\PdkActionsServiceInterface;
Expand Down Expand Up @@ -200,6 +201,11 @@
*/
AddressesApiService::class => autowire(),

/**
* Capabilities API proxy
*/
CapabilitiesApiService::class => autowire(),

/**
* @todo remove in v3.0.0
*/
Expand Down
13 changes: 13 additions & 0 deletions src/Api/PdkCapabilitiesActions.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<?php

declare(strict_types=1);

namespace MyParcelNL\Pdk\Api;

/**
* Constants for capabilities-related actions in the PDK
*/
class PdkCapabilitiesActions
{
public const PROXY_CAPABILITIES = 'proxyCapabilities';
}
41 changes: 41 additions & 0 deletions src/Api/Response/CapabilitiesResponse.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
<?php

declare(strict_types=1);

namespace MyParcelNL\Pdk\Api\Response;

use MyParcelNL\Pdk\Api\Contract\ClientResponseInterface;
use Symfony\Component\HttpFoundation\Response;

/**
* Response for capabilities API requests
*/
class CapabilitiesResponse extends ApiResponse
{
/**
* @var null|string
*/
private $body;

/**
* @var null|int
*/
private $statusCode;

public function __construct(ClientResponseInterface $response)
{
parent::__construct($response);
$this->body = $response->getBody();
$this->statusCode = $response->getStatusCode();
}

public function getBody(): ?string
{
return $this->body;
}

public function getSymfonyResponse(): Response
{
return new Response($this->body, $this->statusCode, ['Content-Type' => 'application/json']);
}
}
70 changes: 70 additions & 0 deletions src/Api/Service/CapabilitiesApiService.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
<?php

declare(strict_types=1);

namespace MyParcelNL\Pdk\Api\Service;

use MyParcelNL\Pdk\Facade\Pdk;
use MyParcelNL\Pdk\Facade\Settings;
use MyParcelNL\Pdk\Settings\Model\AccountSettings;
use RuntimeException;

/**
* Service for communicating with the Capabilities API
*/
class CapabilitiesApiService extends AbstractApiService
{
/**
* @return string
*/
public function getBaseUrl(): string
{
$baseUrl = $this->baseUrl ?? Pdk::get('capabilitiesServiceUrl');

if (! $baseUrl) {
throw new RuntimeException('Capabilities service URL is not configured');
}

return $baseUrl;
}

/**
* @return array
*/
public function getHeaders(): array
{
$apiKey = Settings::get(AccountSettings::API_KEY, AccountSettings::ID);

if (! $apiKey) {
throw new RuntimeException('API key is not configured');
}

return [
'Authorization' => sprintf('bearer %s', base64_encode($apiKey)),
'User-Agent' => $this->getUserAgentHeader(),
];
}

/**
* @return string
*/
protected function getUserAgentHeader(): string
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Willen we dit echt letterlijk dupliceren uit de MyParcelApiService? Anders zou ik het anders oplossen. Ik zie nu dat de AddressesApiService ook precies dezelfde code heeft. Misschien kan het gewoon in de AbstractApiService gezet worden, dan hebben alle apies het. 🐵

{
$userAgentStrings = [];
$userAgents = array_merge(
(array) (Pdk::get('userAgent') ?? []),
[
'MyParcelNL-PDK' => Pdk::get('pdkVersion'),
'php' => PHP_VERSION,
]
);

foreach ($userAgents as $platform => $version) {
if ($version) {
$userAgentStrings[] = sprintf('%s/%s', $platform, $version);
}
}

return implode(' ', $userAgentStrings);
}
}
71 changes: 71 additions & 0 deletions src/App/Action/Capabilities/CapabilitiesAction.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
<?php

declare(strict_types=1);

namespace MyParcelNL\Pdk\App\Action\Capabilities;

use MyParcelNL\Pdk\Api\Handler\CorsHandler;
use MyParcelNL\Pdk\Api\Request\Request as ApiRequest;
use MyParcelNL\Pdk\Api\Response\CapabilitiesResponse;
use MyParcelNL\Pdk\Api\Service\CapabilitiesApiService;
use MyParcelNL\Pdk\App\Action\Contract\ActionInterface;
use MyParcelNL\Pdk\Facade\Pdk;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

class CapabilitiesAction implements ActionInterface
{
/**
* @var \MyParcelNL\Pdk\Api\Service\CapabilitiesApiService
*/
private $apiService;

/**
* @param \MyParcelNL\Pdk\Api\Service\CapabilitiesApiService $apiService
*/
public function __construct(CapabilitiesApiService $apiService)
{
$this->apiService = $apiService;
}

/**
* @param \Symfony\Component\HttpFoundation\Request $request
*
* @return \Symfony\Component\HttpFoundation\Response
*/
public function handle(Request $request): Response
{
$corsHandler = Pdk::get(CorsHandler::class);

if ($request->isMethod('OPTIONS')) {
return $corsHandler->handlePreflightRequest($request) ?? new Response();
}

/** @var \MyParcelNL\Pdk\Api\Response\CapabilitiesResponse $response */
$response = $this->apiService->doRequest($this->buildRequest($request), CapabilitiesResponse::class);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here the SDK capabilities client needs to be used rather than internal PDK API logic (see acceptance criteria)


$symfonyResponse = $response->getSymfonyResponse();

return $corsHandler->addCorsHeaders($request, $symfonyResponse);
}

/**
* @param \Symfony\Component\HttpFoundation\Request $incomingRequest
*
* @return \MyParcelNL\Pdk\Api\Request\Request
*/
public function buildRequest(Request $incomingRequest): ApiRequest
{
$query = $incomingRequest->query->all();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is not the correct way to call capabilities - but using the SDK for this should make it redundant

$path = $query['path'] ?? '';
$method = $incomingRequest->getMethod();

unset($query['action'], $query['pdk_action'], $query['path']);

return new ApiRequest([
'method' => $method,
'path' => $path ? '/' . ltrim((string) $path, '/') : '',
'parameters' => $query,
]);
}
}
18 changes: 18 additions & 0 deletions src/App/Request/Capabilities/CapabilitiesEndpointRequest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<?php

declare(strict_types=1);

namespace MyParcelNL\Pdk\App\Request\Capabilities;

use MyParcelNL\Pdk\App\Request\AbstractEndpointRequest;

class CapabilitiesEndpointRequest extends AbstractEndpointRequest
{
/**
* @return string
*/
public function getProperty(): string
{
return 'capabilities';
}
}
Loading