Skip to content

Commit

Permalink
Add PHPStan
Browse files Browse the repository at this point in the history
  • Loading branch information
Baspa committed Aug 30, 2024
1 parent b4d1134 commit e210d6b
Show file tree
Hide file tree
Showing 7 changed files with 156 additions and 60 deletions.
29 changes: 29 additions & 0 deletions .github/workflows/phpstan.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
name: PHPStan

on:
pull_request:
paths:
- "**.php"
- "phpstan.neon.dist"
push:
branches:
- main

jobs:
phpstan:
name: phpstan
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: "8.2"
coverage: none

- name: Install composer dependencies
uses: ramsey/composer-install@v3

- name: Run PHPStan
run: ./vendor/bin/phpstan analyse --error-format=github --debug
1 change: 1 addition & 0 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
"require-dev": {
"friendsofphp/php-cs-fixer": "^3.0",
"pestphp/pest": "^1.20",
"phpstan/phpstan": "^1.12",
"spatie/ray": "^1.28"
},
"autoload": {
Expand Down
7 changes: 7 additions & 0 deletions phpstan.neon.dist
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
parameters:
level: 8
paths:
- src
tmpDir: build/phpstan
parallel:
maximumNumberOfProcesses: 1
125 changes: 81 additions & 44 deletions src/Client.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,137 +2,174 @@

namespace Vormkracht10\KvKApi;

use GuzzleHttp\ClientInterface;
use GuzzleHttp\Psr7\Response;
use Illuminate\Support\Collection;
use Psr\Http\Message\ResponseInterface;
use stdClass;
use Vormkracht10\KvKApi\Company\Company;

class Client
{
private $httpClient;
private $baseUrl;
private array $results;
private int $page;
private int $resultsPerPage;

public function __construct($httpClient)
private ClientInterface $httpClient;
private string $baseUrl;
/** @var array<Company> */
private array $results = [];
private int $page = 1;
private int $resultsPerPage = 10;

public function __construct(ClientInterface $httpClient)
{
$this->httpClient = $httpClient;
$this->baseUrl = 'https://api.kvk.nl/api/v2/';
}

public function search(string $search, array $params = [])
/**
* @param array<string, mixed> $params
* @return array<Company>
*/
public function search(string $search, array $params = []): array
{
$queryParams = array_merge([
'naam' => $search,
'pagina' => $this->page ?? 1,
'resultatenPerPagina' => $this->resultsPerPage ?? 10,
'pagina' => $this->page,
'resultatenPerPagina' => $this->resultsPerPage,
], $params);
$data = $this->getData($queryParams);

$parsedData = $this->parseData($this->decodeJson($data));

$parsedData->each(function ($item) {
$data = json_decode($this->getRelatedData($item));
foreach ($parsedData as $item) {
$data = $this->decodeJson($this->getRelatedData($item));

$this->results[] = new Company(
$data->kvkNummer ?? null,
$data->kvkNummer ?? '',
$data->vestigingsnummer ?? null,
$data->naam ?? null,
$data->adres ?? null,
$data->websites ?? null
);
});
};

return $this->results;
}

private function getData(array $params)
/**
* @param array<string, mixed> $params
*/
private function getData(array $params): string
{
$url = $this->baseUrl . 'zoeken?' . http_build_query($params);

$response = $this->httpClient->get($url);
$response = $this->httpClient->request('GET', $url);

return $this->getJson($response);
}

private function getJson(object $response)
private function getJson(ResponseInterface $response): string
{
return $response->getBody()->getContents();
return (string) $response->getBody()->getContents();
}

private function decodeJson(string $json)
/**
* @return stdClass
*/
private function decodeJson(string $json): stdClass
{
return json_decode($json);
return json_decode($json, false) ?: new stdClass();
}

public function setPage(int $page)
public function setPage(int $page): self
{
$this->page = $page;

return $this;
}

public function setResultsPerPage(int $resultsPerPage)
public function setResultsPerPage(int $resultsPerPage): self
{
$this->resultsPerPage = $resultsPerPage;

return $this;
}

public function searchByKvkNumber(string $kvkNumber, array $params = [])
/**
* @param array<string, mixed> $params
* @return array<Company>
*/
public function searchByKvkNumber(string $kvkNumber, array $params = []): array
{
return $this->search('', array_merge(['kvkNummer' => $kvkNumber], $params));
}

public function searchByRsin(string $rsin, array $params = [])
/**
* @param array<string, mixed> $params
* @return array<Company>
*/
public function searchByRsin(string $rsin, array $params = []): array
{
return $this->search('', array_merge(['rsin' => $rsin], $params));
}

public function searchByVestigingsnummer(string $vestigingsnummer, array $params = [])
/**
* @param array<string, mixed> $params
* @return array<Company>
*/
public function searchByVestigingsnummer(string $vestigingsnummer, array $params = []): array
{
return $this->search('', array_merge(['vestigingsnummer' => $vestigingsnummer], $params));
}

private function parseData(object $data)
/**
* @return array<int, stdClass>
*/
private function parseData(stdClass $data): array
{
$data = collect($data->resultaten);
$resultaten = $data->resultaten ?? [];
/** @var array<int, stdClass> $resultatenArray */
$resultatenArray = is_array($resultaten) ? $resultaten : [];

$data = $data->map(function ($value) {
return array_map(function ($value) {
$value = (object) $value;
$value->attributes = collect((array) $value)->except(['type', 'links']);
/** @var array<string, mixed> $attributes */
$attributes = array_diff_key((array) $value, array_flip(['type', 'links']));
$value->attributes = $attributes;
$value->id = uniqid();

if (isset($value->links)) {
$links = collect($value->links);
$links = $links->mapWithKeys(function ($linkObj) {
return [$linkObj->rel => $linkObj->href];
});
$value->links = $links;
/** @var array<stdClass> $links */
$links = $value->links;
/** @var array<string, string> $mappedLinks */
$mappedLinks = array_column($links, 'href', 'rel');
$value->links = $mappedLinks;
} else {
$value->links = collect();
/** @var array<string, string> $emptyLinks */
$emptyLinks = [];
$value->links = $emptyLinks;
}

$value->actief = $value->actief ?? null;
$value->vervallenNaam = $value->vervallenNaam ?? null;

return $value;
});

return $data;
}, $resultatenArray);
}

private function getRelatedData($parsedData): Collection
private function getRelatedData(stdClass $parsedData): string
{
$relatedData = collect();
$relatedData = [];

/** @var Collection<string, string> $links */
$links = collect((array)($parsedData->links ?? []));

collect($parsedData->links)->each(function ($link, $key) use (&$relatedData) {
$response = $this->httpClient->get($link);
$links->each(function (string $link) use (&$relatedData) {
$response = $this->httpClient->request('GET', $link);

$data = $this->decodeJson($this->getJson($response));

$relatedData = $relatedData->merge($data);
$relatedData = array_merge($relatedData, (array) $data);
});

return $relatedData;
return json_encode($relatedData) ?: '{}';
}
}
4 changes: 2 additions & 2 deletions src/ClientFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ public static function create(string $apiKey, ?string $rootCertificate = null):
private static function createHttpClient(
string $apiKey,
?string $rootCertificate = null
) {
): Client {
if ($rootCertificate === null) {
return new Client([
'headers' => [
Expand All @@ -33,4 +33,4 @@ private static function createHttpClient(
'verify' => $rootCertificate,
]);
}
}
}
12 changes: 11 additions & 1 deletion src/Company/Address.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,13 @@

class Address
{
private string $type;
private ?string $street;
private ?int $houseNumber;
private string $postalCode;
private string $city;
private string $country;

public function __construct(
string $type,
?string $street,
Expand Down Expand Up @@ -50,6 +57,9 @@ public function getCountry(): string
return $this->country;
}

/**
* @return array<string, string|int|null>
*/
public function get(): array
{
return [
Expand All @@ -61,4 +71,4 @@ public function get(): array
'country' => $this->country,
];
}
}
}
38 changes: 25 additions & 13 deletions src/Company/Company.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,18 @@

class Company
{
private $kvkNumber;

private $establishmentNumber;

private $tradeName;

private $addresses;

private $websites;
private string $kvkNumber;
private ?string $establishmentNumber;
private ?string $tradeName;
/** @var array<mixed>|null */
private ?array $addresses;
/** @var array<string>|null */
private ?array $websites;

/**
* @param array<mixed>|null $addresses
* @param array<string>|null $websites
*/
public function __construct(
string $kvkNumber,
?string $establishmentNumber,
Expand All @@ -33,7 +35,7 @@ public function getKvkNumber(): string
return $this->kvkNumber;
}

public function getEstablishmentNumber(): string
public function getEstablishmentNumber(): ?string
{
return $this->establishmentNumber;
}
Expand All @@ -44,10 +46,14 @@ public function getTradeName(): ?string
}

/**
* @return Address[]
* @return array<Address>|null
*/
public function getAddresses(): ?array
{
if ($this->addresses === null) {
return null;
}

$addresses = [];

foreach ($this->addresses as $address) {
Expand All @@ -64,11 +70,17 @@ public function getAddresses(): ?array
return $addresses;
}

public function getWebsites(): array
/**
* @return array<string>|null
*/
public function getWebsites(): ?array
{
return $this->websites;
}

/**
* @return array<string, mixed>
*/
public function get(): array
{
return [
Expand All @@ -79,4 +91,4 @@ public function get(): array
'websites' => $this->websites,
];
}
}
}

0 comments on commit e210d6b

Please # to comment.