AzuraCast/src/Entity/Repository/StationMountRepository.php

117 lines
3.1 KiB
PHP

<?php
declare(strict_types=1);
namespace App\Entity\Repository;
use App\Entity;
use App\Flysystem\StationFilesystems;
use App\Service\Flow\UploadedFile;
use Azura\Files\ExtendedFilesystemInterface;
/**
* @extends AbstractStationBasedRepository<Entity\StationMount>
*/
final class StationMountRepository extends AbstractStationBasedRepository
{
public function setIntro(
Entity\StationMount $mount,
UploadedFile $file,
?ExtendedFilesystemInterface $fs = null
): void {
$fs ??= (new StationFilesystems($mount->getStation()))->getConfigFilesystem();
if (!empty($mount->getIntroPath())) {
$this->doDeleteIntro($mount, $fs);
$mount->setIntroPath(null);
}
$originalPath = $file->getClientFilename();
$originalExt = pathinfo($originalPath, PATHINFO_EXTENSION);
$introPath = 'mount_' . $mount->getIdRequired() . '_intro.' . $originalExt;
$fs->uploadAndDeleteOriginal($file->getUploadedPath(), $introPath);
$mount->setIntroPath($introPath);
$this->em->persist($mount);
$this->em->flush();
}
protected function doDeleteIntro(
Entity\StationMount $mount,
?ExtendedFilesystemInterface $fs = null
): void {
$fs ??= (new StationFilesystems($mount->getStation()))->getConfigFilesystem();
$introPath = $mount->getIntroPath();
if (empty($introPath)) {
return;
}
$fs->delete($introPath);
}
public function clearIntro(
Entity\StationMount $mount,
?ExtendedFilesystemInterface $fs = null
): void {
$this->doDeleteIntro($mount, $fs);
$mount->setIntroPath(null);
$this->em->persist($mount);
$this->em->flush();
}
public function destroy(
Entity\StationMount $mount
): void {
$this->doDeleteIntro($mount);
$this->em->remove($mount);
$this->em->flush();
}
/**
* @param Entity\Station $station
*
* @return mixed[]
*/
public function getDisplayNames(Entity\Station $station): array
{
$mounts = $this->repository->findBy(['station' => $station]);
$displayNames = [];
foreach ($mounts as $mount) {
/** @var Entity\StationMount $mount */
$displayNames[$mount->getId()] = $mount->getDisplayName();
}
return $displayNames;
}
/**
* @param Entity\Station $station
*/
public function getDefaultMount(Entity\Station $station): ?Entity\StationMount
{
$mount = $this->repository->findOneBy(['station_id' => $station->getId(), 'is_default' => true]);
if ($mount instanceof Entity\StationMount) {
return $mount;
}
// Use the first mount if none is specified as default.
$mount = $station->getMounts()->first();
if ($mount instanceof Entity\StationMount) {
$mount->setIsDefault(true);
$this->em->persist($mount);
$this->em->flush();
return $mount;
}
return null;
}
}