ldc-file-storage-service/src/Config/StorageServiceConfig.php

124 lines
3.6 KiB
PHP
Raw Normal View History

2026-11-03 12:26:17 +01:00
<?php
declare(strict_types=1);
namespace Uwil\Storage\Config;
use Uwil\Storage\Exceptions\StorageException;
use Uwil\Storage\Lib\Utils;
use Uwil\Storage\Lib\ValueObjects\DiskName;
final class StorageServiceConfig
{
private DiskName $default;
/** @var DiskName[] */
private array $eligibles;
/**
* @param string[] $eligibleDisks
* @param object{'disk':string,'driver':string}[] $laravelExistingDisks
* @param string[] $allowedExtensions
*/
public function __construct(
private string $defaultDisk,
private array $eligibleDisks,
private array $laravelExistingDisks,
private array $allowedExtensions
) {
if (Utils::diskExists($this->defaultDisk) === false) {
throw new StorageException('Default disk does not exist');
}
array_map(
fn ($disk) => Utils::diskExists($disk)
|| throw new StorageException("Eligible disk {$disk} does not exist"),
$this->eligibleDisks
);
array_map(
fn ($disk) => Utils::diskExists($disk->disk)
|| throw new StorageException("Laravel existing disk {$disk->disk} does not exist"),
$this->laravelExistingDisks
);
if (empty($this->laravelExistingDisks)) {
throw new StorageException('Laravel existing disks cannot be empty');
}
if (empty($this->eligibleDisks)) {
throw new StorageException('Eligible disks cannot be empty');
}
$intersect = array_intersect(
$this->eligibleDisks,
array_map(fn ($disk) => $disk->disk, $this->laravelExistingDisks)
);
if (empty($intersect)) {
throw new StorageException('No eligible disks exist in Laravel existing disks');
}
$intersectWithDrivers = array_map(
fn ($disk) => $disk,
array_filter(
$this->laravelExistingDisks,
fn ($disk) => in_array($disk->disk, $intersect, true)
)
);
$defaultDiskWithDriver = array_filter(
$this->laravelExistingDisks,
fn ($disk) => $disk->disk === $this->defaultDisk
);
if (empty($defaultDiskWithDriver)) {
throw new StorageException('Default disk does not exist in Laravel existing disks');
}
$defaultDiskWithDriver = array_values($defaultDiskWithDriver)[0];
$this->default = new DiskName($defaultDiskWithDriver->disk, $defaultDiskWithDriver->driver);
$this->eligibles = array_map(fn ($disk) => new DiskName(
$disk->disk,
$disk->driver
), $intersectWithDrivers);
if (empty($this->allowedExtensions)) {
throw new StorageException('Allowed extensions cannot be empty');
}
foreach ($this->allowedExtensions as $extension) {
if (! is_string($extension) || empty(mb_trim($extension))) {
throw new StorageException("Allowed extension {$extension} is not valid");
}
}
}
public function getDefaultDisk(): DiskName
{
return $this->default;
}
/** @return DiskName[] */
public function getEligiblesDisks(): array
{
return array_map(fn ($disk) => $disk, $this->eligibles);
}
public function isExtensionAllowed(string $extension): bool
{
return in_array(
strtolower(ltrim($extension, '.')),
array_map('strtolower', $this->allowedExtensions),
true
);
}
/** @return string[] */
public function getAllowedExtensions(): array
{
return $this->allowedExtensions;
}
}