diff --git a/TODO.md b/TODO.md new file mode 100644 index 0000000..733c330 --- /dev/null +++ b/TODO.md @@ -0,0 +1,4 @@ +# TODO + +- Remove deceased related entity by form setting. +- Refactor to PHP8 branch. diff --git a/src/PrefillGravityForms/Abstracts/GetController.php b/src/PrefillGravityForms/Abstracts/GetController.php new file mode 100644 index 0000000..8ef44aa --- /dev/null +++ b/src/PrefillGravityForms/Abstracts/GetController.php @@ -0,0 +1,38 @@ + $embeddedItem) { + if (! isset($embeddedItem['_links']['ingeschrevenPersoon']['href'])) { + continue; + } + + $response = $this->requestEmbedded(str_replace('https://api.acc-vrijbrp-hoeksche-waard.commonground.nu/haal-centraal-brp-bevragen/api/v1.3/ingeschrevenpersonen', 'https://api.acc-vrijbrp-hoeksche-waard.commonground.nu/api/haalcentraal-brp-bevragen/api/v1.3/ingeschrevenpersonen', $embeddedItem['_links']['ingeschrevenPersoon']['href']), $doelBinding); + + // @todo: do this conditionally based on setting. + if (true === ($response['overlijden']['indicatieOverleden'] ?? false)) { + unset($apiResponse['_embedded'][$embedType][$key]); + } + } + + return $apiResponse; + } + + abstract protected function requestEmbedded(string $url, string $doelBinding): array; +} diff --git a/src/PrefillGravityForms/Abstracts/PostController.php b/src/PrefillGravityForms/Abstracts/PostController.php new file mode 100644 index 0000000..c7e97f0 --- /dev/null +++ b/src/PrefillGravityForms/Abstracts/PostController.php @@ -0,0 +1,44 @@ + $embeddedItem) { + if (! isset($embeddedItem['burgerservicenummer']) || ! is_numeric($embeddedItem['burgerservicenummer'])) { + continue; + } + + $response = $this->requestEmbedded((string) $embeddedItem['burgerservicenummer']); + $personData = $response['personen'] ?? []; + $firstPerson = reset($personData); // Response is in a multidimensional array which differs from other suppliers. + + if (! is_array($firstPerson) || 0 === count($firstPerson)) { + continue; + } + + // @todo: do this conditionally based on setting. + if ('overlijden' === ($firstPerson['opschortingBijhouding']['reden']['omschrijving'] ?? '')) { + unset($apiResponse[$embedType][$key]); + } + } + + return $apiResponse; + } + + abstract protected function requestEmbedded(string $bsn): array; +} diff --git a/src/PrefillGravityForms/Controllers/EnableUController.php b/src/PrefillGravityForms/Controllers/EnableUController.php index 6c84d9d..1c5a1cf 100644 --- a/src/PrefillGravityForms/Controllers/EnableUController.php +++ b/src/PrefillGravityForms/Controllers/EnableUController.php @@ -4,9 +4,10 @@ namespace OWC\PrefillGravityForms\Controllers; +use OWC\PrefillGravityForms\Abstracts\GetController; use OWC\PrefillGravityForms\Services\CacheService; -class EnableUController extends BaseController +class EnableUController extends GetController { public function handle(array $form): array { @@ -65,6 +66,10 @@ protected function fetchApiResponse(string $bsn, string $doelBinding = '', strin return []; } + foreach (array_filter(explode(',', $expand)) as $expandItem) { + $apiResponse = $this->supplementEmbeddedByLinks($apiResponse, trim($expandItem), $doelBinding); + } + return $apiResponse; } @@ -77,4 +82,17 @@ protected function request(string $bsn = '', string $doelBinding = '', string $e return $this->handleCurl($curlArgs, CacheService::formatTransientKey($bsn)); } + + protected function requestEmbedded(string $url, string $doelBinding): array + { + $curlArgs = [ + CURLOPT_URL => $url, + CURLOPT_HTTPHEADER => $this->getCurlHeaders($doelBinding), + ]; + + $urlParts = explode('/', $url); + $bsn = is_array($urlParts) && 0 < count($urlParts) ? end($urlParts) : ''; + + return $this->handleCurl($curlArgs, CacheService::formatTransientKey($bsn)); + } } diff --git a/src/PrefillGravityForms/Controllers/PinkRoccadeController.php b/src/PrefillGravityForms/Controllers/PinkRoccadeController.php index e56c0c6..73bf12e 100644 --- a/src/PrefillGravityForms/Controllers/PinkRoccadeController.php +++ b/src/PrefillGravityForms/Controllers/PinkRoccadeController.php @@ -4,9 +4,10 @@ namespace OWC\PrefillGravityForms\Controllers; +use OWC\PrefillGravityForms\Abstracts\GetController; use OWC\PrefillGravityForms\Services\CacheService; -class PinkRoccadeController extends BaseController +class PinkRoccadeController extends GetController { public function handle(array $form): array { @@ -65,6 +66,10 @@ protected function fetchApiResponse(string $bsn, string $doelBinding = '', strin return []; } + foreach (array_filter(explode(',', $expand)) as $expandItem) { + $apiResponse = $this->supplementEmbeddedByLinks($apiResponse, trim($expandItem), $doelBinding); + } + return $apiResponse; } @@ -79,4 +84,19 @@ protected function request(string $bsn = '', string $doelBinding = '', string $e return $this->handleCurl($curlArgs, CacheService::formatTransientKey($bsn)); } + + protected function requestEmbedded(string $url, string $doelBinding): array + { + $curlArgs = [ + CURLOPT_URL => $url, + CURLOPT_HTTPHEADER => $this->getCurlHeaders($doelBinding), + CURLOPT_SSLCERT => $this->settings->getPublicCertificate(), + CURLOPT_SSLKEY => $this->settings->getPrivateCertificate(), + ]; + + $urlParts = explode('/', $url); + $bsn = is_array($urlParts) && 0 < count($urlParts) ? end($urlParts) : ''; + + return $this->handleCurl($curlArgs, CacheService::formatTransientKey($bsn)); + } } diff --git a/src/PrefillGravityForms/Controllers/VrijBRPController.php b/src/PrefillGravityForms/Controllers/VrijBRPController.php index 770cbbe..a824130 100644 --- a/src/PrefillGravityForms/Controllers/VrijBRPController.php +++ b/src/PrefillGravityForms/Controllers/VrijBRPController.php @@ -4,9 +4,10 @@ namespace OWC\PrefillGravityForms\Controllers; +use OWC\PrefillGravityForms\Abstracts\GetController; use OWC\PrefillGravityForms\Services\CacheService; -class VrijBRPController extends BaseController +class VrijBRPController extends GetController { public function handle(array $form): array { @@ -15,6 +16,7 @@ public function handle(array $form): array } $bsn = $this->getBSN(); + // $bsn = '900231038'; if ('' === $bsn) { return $form; @@ -65,6 +67,10 @@ protected function fetchApiResponse(string $bsn, string $doelBinding = '', strin return []; } + foreach (array_filter(explode(',', $expand)) as $expandItem) { + $apiResponse = $this->supplementEmbeddedByLinks($apiResponse, trim($expandItem), $doelBinding); + } + return $apiResponse; } @@ -79,4 +85,19 @@ protected function request(string $bsn = '', string $doelBinding = '', string $e return $this->handleCurl($curlArgs, CacheService::formatTransientKey($bsn)); } + + protected function requestEmbedded(string $url, string $doelBinding): array + { + $curlArgs = [ + CURLOPT_URL => $url, + CURLOPT_HTTPHEADER => $this->getCurlHeaders($doelBinding), + CURLOPT_SSLCERT => $this->settings->getPublicCertificate(), + CURLOPT_SSLKEY => $this->settings->getPrivateCertificate(), + ]; + + $urlParts = explode('/', $url); + $bsn = is_array($urlParts) && 0 < count($urlParts) ? end($urlParts) : ''; + + return $this->handleCurl($curlArgs, CacheService::formatTransientKey($bsn)); + } } diff --git a/src/PrefillGravityForms/Controllers/WeAreFrankController.php b/src/PrefillGravityForms/Controllers/WeAreFrankController.php index c9ba2ee..3c90299 100644 --- a/src/PrefillGravityForms/Controllers/WeAreFrankController.php +++ b/src/PrefillGravityForms/Controllers/WeAreFrankController.php @@ -5,9 +5,10 @@ namespace OWC\PrefillGravityForms\Controllers; use Exception; +use OWC\PrefillGravityForms\Abstracts\PostController; use OWC\PrefillGravityForms\Services\CacheService; -class WeAreFrankController extends BaseController +class WeAreFrankController extends PostController { public function handle(array $form): array { @@ -22,9 +23,7 @@ public function handle(array $form): array } $expand = rgar($form, 'owc-iconnect-expand', ''); - $preparedData = $this->prepareData($bsn, $expand); - - $firstPerson = $this->fetchPersonData($preparedData, $bsn); + $firstPerson = $this->fetchPersonData($bsn, $expand); if (empty($firstPerson)) { return $form; @@ -45,7 +44,7 @@ protected function makeRequest(): array $preparedData = $this->prepareData($bsn); - return $this->fetchPersonData($preparedData, $bsn); + return $this->fetchPersonData($bsn); } /** @@ -120,9 +119,9 @@ protected function extractBSN(array $response): string return (string) $bsn; } - protected function fetchPersonData(array $preparedData, string $bsn): array + protected function fetchPersonData(string $bsn, string $expand = ''): array { - $apiResponse = $this->request($preparedData, $bsn); + $apiResponse = $this->request($bsn, $expand); $personData = $apiResponse['personen'] ?? []; $firstPerson = reset($personData); // Response is in a multidimensional array which differs from other suppliers. @@ -138,14 +137,36 @@ protected function fetchPersonData(array $preparedData, string $bsn): array return []; } + foreach (array_filter(explode(',', $expand)) as $expandItem) { + $firstPerson = $this->supplementEmbeddedByLinks($firstPerson, trim($expandItem)); + } + return $firstPerson; } - protected function request(array $data = [], string $bsn = ''): array + protected function request(string $bsn = '', string $expand = ''): array + { + $curlArgs = [ + CURLOPT_URL => $this->settings->getBaseURL(), + CURLOPT_POSTFIELDS => json_encode($this->prepareData($bsn, $expand)), + CURLOPT_HTTPHEADER => [ + 'Content-Type: application/json', + 'Accept: application/json', + sprintf('%s: %s', $this->settings->getAPITokenUsername(), $this->settings->getAPITokenPassword()), + ], + ]; + + return $this->handleCurl($curlArgs, CacheService::formatTransientKey($bsn)); + } + + /** + * This one breaks the contract, fix later. + */ + protected function requestEmbedded(string $bsn = ''): array { $curlArgs = [ CURLOPT_URL => $this->settings->getBaseURL(), - CURLOPT_POSTFIELDS => json_encode($data), + CURLOPT_POSTFIELDS => json_encode($this->prepareData($bsn)), CURLOPT_HTTPHEADER => [ 'Content-Type: application/json', 'Accept: application/json',