diff --git a/src/php/src/Front/Api/ApiVersionService.php b/src/php/src/Front/Api/ApiVersionService.php index 5b889d2..2e23593 100644 --- a/src/php/src/Front/Api/ApiVersionService.php +++ b/src/php/src/Front/Api/ApiVersionService.php @@ -54,6 +54,69 @@ use Illuminate\Http\Request; */ class ApiVersionService { + /** + * Normalise a list of API versions to unique positive integers. + * + * @param array $versions + * @return array + */ + protected function normaliseVersions(array $versions): array + { + $normalised = []; + + foreach ($versions as $version) { + if (! is_numeric($version)) { + continue; + } + + $version = (int) $version; + if ($version <= 0) { + continue; + } + + $normalised[] = $version; + } + + return array_values(array_unique($normalised)); + } + + /** + * Normalise sunset dates to an integer-keyed map. + * + * @param array $sunsets + * @return array + */ + protected function normaliseSunsetDates(array $sunsets): array + { + $normalised = []; + + foreach ($sunsets as $version => $date) { + if (! is_numeric($version)) { + continue; + } + + $version = (int) $version; + if ($version <= 0) { + continue; + } + + if ($date === null) { + continue; + } + + $date = trim((string) $date); + if ($date === '') { + continue; + } + + $normalised[$version] = $date; + } + + ksort($normalised); + + return $normalised; + } + /** * Get the current API version from the request. * @@ -116,7 +179,7 @@ class ApiVersionService public function isDeprecated(?Request $request = null): bool { $current = $this->current($request); - $deprecated = config('api.versioning.deprecated', []); + $deprecated = $this->deprecatedVersions(); return $current !== null && in_array($current, $deprecated, true); } @@ -144,7 +207,7 @@ class ApiVersionService */ public function supportedVersions(): array { - return config('api.versioning.supported', [1]); + return $this->normaliseVersions((array) config('api.versioning.supported', [1])); } /** @@ -154,7 +217,7 @@ class ApiVersionService */ public function deprecatedVersions(): array { - return config('api.versioning.deprecated', []); + return $this->normaliseVersions((array) config('api.versioning.deprecated', [])); } /** @@ -164,7 +227,7 @@ class ApiVersionService */ public function sunsetDates(): array { - return config('api.versioning.sunset', []); + return $this->normaliseSunsetDates((array) config('api.versioning.sunset', [])); } /** diff --git a/src/php/tests/Feature/ApiVersionServiceTest.php b/src/php/tests/Feature/ApiVersionServiceTest.php new file mode 100644 index 0000000..b9b299d --- /dev/null +++ b/src/php/tests/Feature/ApiVersionServiceTest.php @@ -0,0 +1,40 @@ + '2025-06-01', + '02' => '2025-12-31', + 'ignored' => '2026-01-01', + 0 => '2024-01-01', + -1 => '2024-06-01', + 3 => '', + ]); + + $versions = new ApiVersionService(); + + expect($versions->supportedVersions())->toBe([1, 2]); + expect($versions->deprecatedVersions())->toBe([1, 3]); + expect($versions->sunsetDates())->toBe([ + 1 => '2025-06-01', + 2 => '2025-12-31', + ]); + expect($versions->isSupported(1))->toBeTrue(); + expect($versions->isSupported(2))->toBeTrue(); + expect($versions->isSupported(3))->toBeFalse(); + expect($versions->isDeprecated())->toBeFalse(); +});