2026-03-29 03:03:47 +00:00
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
namespace App\Support;
|
|
|
|
|
|
|
|
|
|
class ServiceComposeUrl
|
|
|
|
|
{
|
|
|
|
|
/**
|
|
|
|
|
* Validate a comma-separated URL string like `urls[].url` on PATCH /services/{uuid}.
|
|
|
|
|
*
|
|
|
|
|
* @return array{errors: array<int, string>, normalized: ?string}
|
|
|
|
|
*/
|
|
|
|
|
public static function validateUrlString(?string $urlValue, bool $forceDomainOverride = false): array
|
|
|
|
|
{
|
|
|
|
|
$errors = [];
|
|
|
|
|
|
|
|
|
|
if ($urlValue === null || $urlValue === '') {
|
|
|
|
|
return ['errors' => [], 'normalized' => null];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$urls = str($urlValue)
|
|
|
|
|
->replaceStart(',', '')
|
|
|
|
|
->replaceEnd(',', '')
|
|
|
|
|
->trim()
|
|
|
|
|
->explode(',')
|
|
|
|
|
->map(fn ($url) => trim((string) $url))
|
|
|
|
|
->filter();
|
|
|
|
|
|
2026-09-02 17:39:19 +00:00
|
|
|
$errors = ValidationPatterns::validateApplicationDomains($urls->implode(','));
|
2026-03-29 03:03:47 +00:00
|
|
|
|
|
|
|
|
$duplicates = $urls->duplicates()->unique()->values();
|
|
|
|
|
if ($duplicates->isNotEmpty() && ! $forceDomainOverride) {
|
|
|
|
|
$errors[] = 'The current request contains duplicate URLs: '.implode(', ', $duplicates->toArray()).'. Use force_domain_override=true to proceed.';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (count($errors) > 0) {
|
|
|
|
|
return ['errors' => $errors, 'normalized' => null];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$normalized = $urls
|
|
|
|
|
->map(fn ($u) => str($u)->lower()->value())
|
|
|
|
|
->unique()
|
|
|
|
|
->filter(fn ($u) => filled($u))
|
|
|
|
|
->implode(',');
|
|
|
|
|
|
|
|
|
|
return ['errors' => [], 'normalized' => $normalized !== '' ? $normalized : null];
|
|
|
|
|
}
|
|
|
|
|
}
|