Switch request/response invocation strategy on controllers.

This commit is contained in:
Buster Neece 2023-06-10 21:21:00 -05:00
parent 9f7825eba8
commit f83ff18f6c
No known key found for this signature in database
215 changed files with 1163 additions and 1018 deletions

View File

@ -585,7 +585,7 @@ return static function (RouteCollectorProxy $group) {
* Reports
*/
$group->get('/history', Controller\Api\Stations\HistoryController::class)
$group->get('/history', Controller\Api\Stations\HistoryAction::class)
->setName('api:stations:history')
->add(new Middleware\Permissions(StationPermissions::Reports, true));

View File

@ -52,7 +52,7 @@ return static function (RouteCollectorProxy $app) {
$group->get('/schedule[/{embed:embed}]', Controller\Frontend\PublicPages\ScheduleAction::class)
->setName('public:schedule');
$group->get('/podcasts', Controller\Frontend\PublicPages\PodcastsController::class)
$group->get('/podcasts', Controller\Frontend\PublicPages\PodcastsAction::class)
->setName('public:podcasts');
$group->get(

View File

@ -16,7 +16,7 @@ use Monolog\Registry;
use Psr\EventDispatcher\EventDispatcherInterface;
use Slim\App;
use Slim\Factory\ServerRequestCreatorFactory;
use Slim\Handlers\Strategies\RequestResponseNamedArgs;
use Slim\Handlers\Strategies\RequestResponse;
final class AppFactory
{
@ -54,8 +54,7 @@ final class AppFactory
$container->set(App::class, $app);
$routeCollector = $app->getRouteCollector();
$routeCollector->setDefaultInvocationStrategy(new RequestResponseNamedArgs());
$routeCollector->setDefaultInvocationStrategy(new RequestResponse());
$environment = $container->get(Environment::class);
if ($environment->isProduction()) {

View File

@ -4,15 +4,17 @@ declare(strict_types=1);
namespace App\Controller\Admin;
use App\Controller\SingleActionInterface;
use App\Http\Response;
use App\Http\ServerRequest;
use Psr\Http\Message\ResponseInterface;
final class ApiKeysAction
final class ApiKeysAction implements SingleActionInterface
{
public function __invoke(
ServerRequest $request,
Response $response
Response $response,
array $params
): ResponseInterface {
$router = $request->getRouter();

View File

@ -4,15 +4,17 @@ declare(strict_types=1);
namespace App\Controller\Admin;
use App\Controller\SingleActionInterface;
use App\Http\Response;
use App\Http\ServerRequest;
use Psr\Http\Message\ResponseInterface;
final class AuditLogAction
final class AuditLogAction implements SingleActionInterface
{
public function __invoke(
ServerRequest $request,
Response $response
Response $response,
array $params
): ResponseInterface {
$router = $request->getRouter();

View File

@ -5,6 +5,7 @@ declare(strict_types=1);
namespace App\Controller\Admin;
use App\Container\EnvironmentAwareTrait;
use App\Controller\SingleActionInterface;
use App\Entity\Enums\StorageLocationTypes;
use App\Entity\Repository\StorageLocationRepository;
use App\Entity\Settings;
@ -12,7 +13,7 @@ use App\Http\Response;
use App\Http\ServerRequest;
use Psr\Http\Message\ResponseInterface;
final class BackupsAction
final class BackupsAction implements SingleActionInterface
{
use EnvironmentAwareTrait;
@ -23,7 +24,8 @@ final class BackupsAction
public function __invoke(
ServerRequest $request,
Response $response
Response $response,
array $params
): ResponseInterface {
$router = $request->getRouter();

View File

@ -5,16 +5,18 @@ declare(strict_types=1);
namespace App\Controller\Admin;
use App\Assets\AssetTypes;
use App\Controller\SingleActionInterface;
use App\Entity\Settings;
use App\Http\Response;
use App\Http\ServerRequest;
use Psr\Http\Message\ResponseInterface;
final class BrandingAction
final class BrandingAction implements SingleActionInterface
{
public function __invoke(
ServerRequest $request,
Response $response
Response $response,
array $params
): ResponseInterface {
$router = $request->getRouter();

View File

@ -4,16 +4,18 @@ declare(strict_types=1);
namespace App\Controller\Admin;
use App\Controller\SingleActionInterface;
use App\Http\Response;
use App\Http\ServerRequest;
use App\Media\Enums\MetadataTags;
use Psr\Http\Message\ResponseInterface;
final class CustomFieldsAction
final class CustomFieldsAction implements SingleActionInterface
{
public function __invoke(
ServerRequest $request,
Response $response
Response $response,
array $params
): ResponseInterface {
$router = $request->getRouter();

View File

@ -5,11 +5,12 @@ declare(strict_types=1);
namespace App\Controller\Admin\Debug;
use App\Console\Application;
use App\Controller\SingleActionInterface;
use App\Http\Response;
use App\Http\ServerRequest;
use Psr\Http\Message\ResponseInterface;
final class ClearCacheAction
final class ClearCacheAction implements SingleActionInterface
{
public function __construct(
private readonly Application $console,
@ -18,7 +19,8 @@ final class ClearCacheAction
public function __invoke(
ServerRequest $request,
Response $response
Response $response,
array $params
): ResponseInterface {
[, $resultOutput] = $this->console->runCommandWithArgs(
'cache:clear'

View File

@ -4,13 +4,14 @@ declare(strict_types=1);
namespace App\Controller\Admin\Debug;
use App\Controller\SingleActionInterface;
use App\Http\Response;
use App\Http\ServerRequest;
use App\MessageQueue\QueueManagerInterface;
use App\MessageQueue\QueueNames;
use Psr\Http\Message\ResponseInterface;
final class ClearQueueAction
final class ClearQueueAction implements SingleActionInterface
{
public function __construct(
private readonly QueueManagerInterface $queueManager
@ -20,8 +21,11 @@ final class ClearQueueAction
public function __invoke(
ServerRequest $request,
Response $response,
?string $queue = null
array $params
): ResponseInterface {
/** @var string|null $queue */
$queue = $params['queue'] ?? null;
if (!empty($queue)) {
$this->queueManager->clearQueue(
QueueNames::from($queue)

View File

@ -5,6 +5,7 @@ declare(strict_types=1);
namespace App\Controller\Admin\Debug;
use App\Container\LoggerAwareTrait;
use App\Controller\SingleActionInterface;
use App\Entity\Repository\StationQueueRepository;
use App\Http\Response;
use App\Http\ServerRequest;
@ -13,7 +14,7 @@ use Monolog\Handler\TestHandler;
use Monolog\Level;
use Psr\Http\Message\ResponseInterface;
final class ClearStationQueueAction
final class ClearStationQueueAction implements SingleActionInterface
{
use LoggerAwareTrait;
@ -26,7 +27,7 @@ final class ClearStationQueueAction
public function __invoke(
ServerRequest $request,
Response $response,
string $station_id
array $params
): ResponseInterface {
$testHandler = new TestHandler(Level::Debug, false);
$this->logger->pushHandler($testHandler);

View File

@ -5,6 +5,7 @@ declare(strict_types=1);
namespace App\Controller\Admin\Debug;
use App\Console\Command\Sync\SingleTaskCommand;
use App\Controller\SingleActionInterface;
use App\Entity\Repository\StationRepository;
use App\Event\GetSyncTasks;
use App\Http\Response;
@ -18,7 +19,7 @@ use Psr\EventDispatcher\EventDispatcherInterface;
use Psr\Http\Message\ResponseInterface;
use Psr\SimpleCache\CacheInterface;
final class IndexAction
final class IndexAction implements SingleActionInterface
{
public function __construct(
private readonly StationRepository $stationRepo,
@ -30,7 +31,8 @@ final class IndexAction
public function __invoke(
ServerRequest $request,
Response $response
Response $response,
array $params
): ResponseInterface {
$router = $request->getRouter();

View File

@ -5,6 +5,7 @@ declare(strict_types=1);
namespace App\Controller\Admin\Debug;
use App\Container\LoggerAwareTrait;
use App\Controller\SingleActionInterface;
use App\Http\Response;
use App\Http\ServerRequest;
use App\Radio\AutoDJ\Annotations;
@ -12,7 +13,7 @@ use Monolog\Handler\TestHandler;
use Monolog\Level;
use Psr\Http\Message\ResponseInterface;
final class NextSongAction
final class NextSongAction implements SingleActionInterface
{
use LoggerAwareTrait;
@ -24,7 +25,7 @@ final class NextSongAction
public function __invoke(
ServerRequest $request,
Response $response,
string $station_id
array $params
): ResponseInterface {
$testHandler = new TestHandler(Level::Debug, false);
$this->logger->pushHandler($testHandler);

View File

@ -5,6 +5,7 @@ declare(strict_types=1);
namespace App\Controller\Admin\Debug;
use App\Container\LoggerAwareTrait;
use App\Controller\SingleActionInterface;
use App\Http\Response;
use App\Http\ServerRequest;
use App\Sync\NowPlaying\Task\NowPlayingTask;
@ -12,7 +13,7 @@ use Monolog\Handler\TestHandler;
use Monolog\Level;
use Psr\Http\Message\ResponseInterface;
final class NowPlayingAction
final class NowPlayingAction implements SingleActionInterface
{
use LoggerAwareTrait;
@ -24,7 +25,7 @@ final class NowPlayingAction
public function __invoke(
ServerRequest $request,
Response $response,
string $station_id
array $params
): ResponseInterface {
$testHandler = new TestHandler(Level::Debug, false);
$this->logger->pushHandler($testHandler);

View File

@ -6,6 +6,7 @@ namespace App\Controller\Admin\Debug;
use App\Console\Command\Sync\SingleTaskCommand;
use App\Container\LoggerAwareTrait;
use App\Controller\SingleActionInterface;
use App\Event\GetSyncTasks;
use App\Http\Response;
use App\Http\ServerRequest;
@ -14,7 +15,7 @@ use Monolog\Level;
use Psr\EventDispatcher\EventDispatcherInterface;
use Psr\Http\Message\ResponseInterface;
final class SyncAction
final class SyncAction implements SingleActionInterface
{
use LoggerAwareTrait;
@ -24,14 +25,14 @@ final class SyncAction
) {
}
/**
* @param class-string|string $task
*/
public function __invoke(
ServerRequest $request,
Response $response,
string $task
array $params
): ResponseInterface {
/** @var class-string|string $task */
$task = $params['task'];
$testHandler = new TestHandler(Level::Debug, false);
$this->logger->pushHandler($testHandler);

View File

@ -5,6 +5,7 @@ declare(strict_types=1);
namespace App\Controller\Admin\Debug;
use App\Container\LoggerAwareTrait;
use App\Controller\SingleActionInterface;
use App\Exception\StationUnsupportedException;
use App\Http\Response;
use App\Http\ServerRequest;
@ -13,7 +14,7 @@ use Monolog\Handler\TestHandler;
use Monolog\Level;
use Psr\Http\Message\ResponseInterface;
final class TelnetAction
final class TelnetAction implements SingleActionInterface
{
use LoggerAwareTrait;
@ -25,7 +26,7 @@ final class TelnetAction
public function __invoke(
ServerRequest $request,
Response $response,
string $station_id
array $params
): ResponseInterface {
$testHandler = new TestHandler(Level::Debug, false);
$this->logger->pushHandler($testHandler);

View File

@ -4,15 +4,17 @@ declare(strict_types=1);
namespace App\Controller\Admin;
use App\Controller\SingleActionInterface;
use App\Http\Response;
use App\Http\ServerRequest;
use Psr\Http\Message\ResponseInterface;
final class GeoLiteAction
final class GeoLiteAction implements SingleActionInterface
{
public function __invoke(
ServerRequest $request,
Response $response
Response $response,
array $params
): ResponseInterface {
$router = $request->getRouter();

View File

@ -4,15 +4,17 @@ declare(strict_types=1);
namespace App\Controller\Admin;
use App\Controller\SingleActionInterface;
use App\Http\Response;
use App\Http\ServerRequest;
use Psr\Http\Message\ResponseInterface;
final class IndexAction
final class IndexAction implements SingleActionInterface
{
public function __invoke(
ServerRequest $request,
Response $response
Response $response,
array $params
): ResponseInterface {
$router = $request->getRouter();
$view = $request->getView();

View File

@ -4,13 +4,14 @@ declare(strict_types=1);
namespace App\Controller\Admin;
use App\Controller\SingleActionInterface;
use App\Entity\Repository\StationRepository;
use App\Enums\StationPermissions;
use App\Http\Response;
use App\Http\ServerRequest;
use Psr\Http\Message\ResponseInterface;
final class LogsAction
final class LogsAction implements SingleActionInterface
{
public function __construct(
private readonly StationRepository $stationRepo
@ -19,7 +20,8 @@ final class LogsAction
public function __invoke(
ServerRequest $request,
Response $response
Response $response,
array $params
): ResponseInterface {
$router = $request->getRouter();

View File

@ -4,12 +4,13 @@ declare(strict_types=1);
namespace App\Controller\Admin;
use App\Controller\SingleActionInterface;
use App\Entity\Repository\StationRepository;
use App\Http\Response;
use App\Http\ServerRequest;
use Psr\Http\Message\ResponseInterface;
final class PermissionsAction
final class PermissionsAction implements SingleActionInterface
{
public function __construct(
private readonly StationRepository $stationRepo,
@ -18,7 +19,8 @@ final class PermissionsAction
public function __invoke(
ServerRequest $request,
Response $response
Response $response,
array $params
): ResponseInterface {
$router = $request->getRouter();

View File

@ -4,15 +4,17 @@ declare(strict_types=1);
namespace App\Controller\Admin;
use App\Controller\SingleActionInterface;
use App\Http\Response;
use App\Http\ServerRequest;
use Psr\Http\Message\ResponseInterface;
final class RelaysAction
final class RelaysAction implements SingleActionInterface
{
public function __invoke(
ServerRequest $request,
Response $response
Response $response,
array $params
): ResponseInterface {
$router = $request->getRouter();

View File

@ -4,13 +4,14 @@ declare(strict_types=1);
namespace App\Controller\Admin;
use App\Controller\SingleActionInterface;
use App\Entity\Settings;
use App\Http\Response;
use App\Http\ServerRequest;
use App\Version;
use Psr\Http\Message\ResponseInterface;
final class SettingsAction
final class SettingsAction implements SingleActionInterface
{
public function __construct(
private readonly Version $version,
@ -19,7 +20,8 @@ final class SettingsAction
public function __invoke(
ServerRequest $request,
Response $response
Response $response,
array $params
): ResponseInterface {
$router = $request->getRouter();

View File

@ -4,16 +4,18 @@ declare(strict_types=1);
namespace App\Controller\Admin;
use App\Controller\SingleActionInterface;
use App\Http\Response;
use App\Http\ServerRequest;
use Psr\Http\Message\ResponseInterface;
use RuntimeException;
final class ShoutcastAction
final class ShoutcastAction implements SingleActionInterface
{
public function __invoke(
ServerRequest $request,
Response $response
Response $response,
array $params
): ResponseInterface {
if ('x86_64' !== php_uname('m')) {
throw new RuntimeException('Shoutcast cannot be installed on non-X86_64 systems.');

View File

@ -4,13 +4,14 @@ declare(strict_types=1);
namespace App\Controller\Admin;
use App\Controller\SingleActionInterface;
use App\Http\Response;
use App\Http\ServerRequest;
use App\Radio\Adapters;
use App\VueComponent\StationFormComponent;
use Psr\Http\Message\ResponseInterface;
final class StationsAction
final class StationsAction implements SingleActionInterface
{
public function __construct(
private readonly StationFormComponent $stationFormComponent,
@ -20,7 +21,8 @@ final class StationsAction
public function __invoke(
ServerRequest $request,
Response $response
Response $response,
array $params
): ResponseInterface {
$router = $request->getRouter();

View File

@ -4,15 +4,17 @@ declare(strict_types=1);
namespace App\Controller\Admin;
use App\Controller\SingleActionInterface;
use App\Http\Response;
use App\Http\ServerRequest;
use Psr\Http\Message\ResponseInterface;
final class StereoToolAction
final class StereoToolAction implements SingleActionInterface
{
public function __invoke(
ServerRequest $request,
Response $response
Response $response,
array $params
): ResponseInterface {
$router = $request->getRouter();

View File

@ -4,15 +4,17 @@ declare(strict_types=1);
namespace App\Controller\Admin;
use App\Controller\SingleActionInterface;
use App\Http\Response;
use App\Http\ServerRequest;
use Psr\Http\Message\ResponseInterface;
final class StorageLocationsAction
final class StorageLocationsAction implements SingleActionInterface
{
public function __invoke(
ServerRequest $request,
Response $response
Response $response,
array $params
): ResponseInterface {
$router = $request->getRouter();

View File

@ -6,12 +6,13 @@ namespace App\Controller\Admin;
use App\Container\EnvironmentAwareTrait;
use App\Container\SettingsAwareTrait;
use App\Controller\SingleActionInterface;
use App\Http\Response;
use App\Http\ServerRequest;
use App\Version;
use Psr\Http\Message\ResponseInterface;
final class UpdatesAction
final class UpdatesAction implements SingleActionInterface
{
use EnvironmentAwareTrait;
use SettingsAwareTrait;
@ -23,7 +24,8 @@ final class UpdatesAction
public function __invoke(
ServerRequest $request,
Response $response
Response $response,
array $params
): ResponseInterface {
$settings = $this->readSettings();

View File

@ -4,12 +4,13 @@ declare(strict_types=1);
namespace App\Controller\Admin;
use App\Controller\SingleActionInterface;
use App\Entity\Repository\RoleRepository;
use App\Http\Response;
use App\Http\ServerRequest;
use Psr\Http\Message\ResponseInterface;
final class UsersAction
final class UsersAction implements SingleActionInterface
{
public function __construct(
private readonly RoleRepository $roleRepo,
@ -18,7 +19,8 @@ final class UsersAction
public function __invoke(
ServerRequest $request,
Response $response
Response $response,
array $params
): ResponseInterface {
$router = $request->getRouter();

View File

@ -5,6 +5,8 @@ declare(strict_types=1);
namespace App\Controller\Api;
use App\Container\EntityManagerAwareTrait;
use App\Entity\Api\Error;
use App\Entity\Api\Status;
use App\Entity\Interfaces\IdentifiableEntityInterface;
use App\Exception\ValidationException;
use App\Http\Response;
@ -38,6 +40,16 @@ abstract class AbstractApiCrudController
) {
}
public function listAction(
ServerRequest $request,
Response $response,
array $params
): ResponseInterface {
$query = $this->em->createQuery('SELECT e FROM ' . $this->entityClass . ' e');
return $this->listPaginatedFromQuery($request, $response, $query);
}
protected function listPaginatedFromQuery(
ServerRequest $request,
Response $response,
@ -52,6 +64,53 @@ abstract class AbstractApiCrudController
return $paginator->write($response);
}
public function createAction(
ServerRequest $request,
Response $response,
array $params
): ResponseInterface {
$row = $this->createRecord($request, (array)$request->getParsedBody());
$return = $this->viewRecord($row, $request);
return $response->withJson($return);
}
/**
* @param array $data
* @return TEntity
*/
protected function createRecord(ServerRequest $request, array $data): object
{
return $this->editRecord($data);
}
public function getAction(
ServerRequest $request,
Response $response,
array $params
): ResponseInterface {
$record = $this->getRecord($request, $params);
if (null === $record) {
return $response->withStatus(404)
->withJson(Error::notFound());
}
$return = $this->viewRecord($record, $request);
return $response->withJson($return);
}
/**
* @return TEntity|null
*/
protected function getRecord(ServerRequest $request, array $params): ?object
{
/** @var string $id */
$id = $params['id'];
return $this->em->find($this->entityClass, $id);
}
/**
* @param TEntity $record
* @param ServerRequest $request
@ -128,6 +187,23 @@ abstract class AbstractApiCrudController
return get_class($object) . ': ' . spl_object_hash($object);
}
public function editAction(
ServerRequest $request,
Response $response,
array $params
): ResponseInterface {
$record = $this->getRecord($request, $params);
if (null === $record) {
return $response->withStatus(404)
->withJson(Error::notFound());
}
$this->editRecord((array)$request->getParsedBody(), $record);
return $response->withJson(Status::updated());
}
/**
* @param array<mixed>|null $data
* @param TEntity|null $record
@ -170,6 +246,23 @@ abstract class AbstractApiCrudController
return $this->serializer->denormalize($data, $this->entityClass, null, $context);
}
public function deleteAction(
ServerRequest $request,
Response $response,
array $params
): ResponseInterface {
$record = $this->getRecord($request, $params);
if (null === $record) {
return $response->withStatus(404)
->withJson(Error::notFound());
}
$this->deleteRecord($record);
return $response->withJson(Status::deleted());
}
/**
* @param TEntity $record
*/

View File

@ -1,107 +0,0 @@
<?php
declare(strict_types=1);
namespace App\Controller\Api\Admin;
use App\Controller\Api\AbstractApiCrudController;
use App\Entity\Api\Error;
use App\Entity\Api\Status;
use App\Http\Response;
use App\Http\ServerRequest;
use Psr\Http\Message\ResponseInterface;
/**
* @template TEntity as object
* @extends AbstractApiCrudController<TEntity>
*/
abstract class AbstractAdminApiCrudController extends AbstractApiCrudController
{
public function listAction(
ServerRequest $request,
Response $response
): ResponseInterface {
$query = $this->em->createQuery('SELECT e FROM ' . $this->entityClass . ' e');
return $this->listPaginatedFromQuery($request, $response, $query);
}
public function createAction(
ServerRequest $request,
Response $response
): ResponseInterface {
$row = $this->createRecord((array)$request->getParsedBody());
$return = $this->viewRecord($row, $request);
return $response->withJson($return);
}
/**
* @param array $data
* @return TEntity
*/
protected function createRecord(array $data): object
{
return $this->editRecord($data);
}
public function getAction(
ServerRequest $request,
Response $response,
string $id
): ResponseInterface {
$record = $this->getRecord($id);
if (null === $record) {
return $response->withStatus(404)
->withJson(Error::notFound());
}
$return = $this->viewRecord($record, $request);
return $response->withJson($return);
}
/**
* @param string $id
*
* @return TEntity|null
*/
protected function getRecord(string $id): ?object
{
return $this->em->find($this->entityClass, $id);
}
public function editAction(
ServerRequest $request,
Response $response,
string $id
): ResponseInterface {
$record = $this->getRecord($id);
if (null === $record) {
return $response->withStatus(404)
->withJson(Error::notFound());
}
$this->editRecord((array)$request->getParsedBody(), $record);
return $response->withJson(Status::updated());
}
public function deleteAction(
ServerRequest $request,
Response $response,
string $id
): ResponseInterface {
$record = $this->getRecord($id);
if (null === $record) {
return $response->withStatus(404)
->withJson(Error::notFound());
}
$this->deleteRecord($record);
return $response->withJson(Status::deleted());
}
}

View File

@ -5,20 +5,24 @@ declare(strict_types=1);
namespace App\Controller\Api\Admin\Acme;
use App\Controller\Api\Traits\HasLogViewer;
use App\Controller\SingleActionInterface;
use App\Http\Response;
use App\Http\ServerRequest;
use App\Utilities\File;
use Psr\Http\Message\ResponseInterface;
final class CertificateLogAction
final class CertificateLogAction implements SingleActionInterface
{
use HasLogViewer;
public function __invoke(
ServerRequest $request,
Response $response,
string $path
array $params
): ResponseInterface {
/** @var string $path */
$path = $params['path'];
$tempPath = File::validateTempPath($path);
return $this->streamLogToResponse(

View File

@ -4,6 +4,7 @@ declare(strict_types=1);
namespace App\Controller\Api\Admin\Acme;
use App\Controller\SingleActionInterface;
use App\Http\Response;
use App\Http\ServerRequest;
use App\Message\GenerateAcmeCertificate;
@ -11,7 +12,7 @@ use App\Utilities\File;
use Psr\Http\Message\ResponseInterface;
use Symfony\Component\Messenger\MessageBus;
final class GenerateCertificateAction
final class GenerateCertificateAction implements SingleActionInterface
{
public function __construct(
private readonly MessageBus $messageBus
@ -20,7 +21,8 @@ final class GenerateCertificateAction
public function __invoke(
ServerRequest $request,
Response $response
Response $response,
array $params
): ResponseInterface {
$tempFile = File::generateTempPath('acme_test.log');

View File

@ -4,12 +4,13 @@ declare(strict_types=1);
namespace App\Controller\Api\Admin;
use App\Controller\Api\AbstractApiCrudController;
use App\Entity\ApiKey;
/**
* @extends AbstractAdminApiCrudController<ApiKey>
* @extends AbstractApiCrudController<ApiKey>
*/
final class ApiKeysController extends AbstractAdminApiCrudController
final class ApiKeysController extends AbstractApiCrudController
{
protected string $entityClass = ApiKey::class;
protected string $resourceRouteName = 'api:admin:api-key';

View File

@ -4,13 +4,14 @@ declare(strict_types=1);
namespace App\Controller\Api\Admin\Backups;
use App\Controller\SingleActionInterface;
use App\Entity\Enums\StorageLocationTypes;
use App\Entity\Repository\StorageLocationRepository;
use App\Entity\StorageLocation;
use App\Exception\NotFoundException;
use InvalidArgumentException;
abstract class AbstractFileAction
abstract class AbstractFileAction implements SingleActionInterface
{
public function __construct(
protected readonly StorageLocationRepository $storageLocationRepo

View File

@ -15,8 +15,11 @@ final class DeleteAction extends AbstractFileAction
public function __invoke(
ServerRequest $request,
Response $response,
string $path
array $params
): ResponseInterface {
/** @var string $path */
$path = $params['path'];
[$path, $fs] = $this->getFile($path);
/** @var ExtendedFilesystemInterface $fs */

View File

@ -14,8 +14,11 @@ final class DownloadAction extends AbstractFileAction
public function __invoke(
ServerRequest $request,
Response $response,
string $path
array $params
): ResponseInterface {
/** @var string $path */
$path = $params['path'];
[$path, $fs] = $this->getFile($path);
/** @var ExtendedFilesystemInterface $fs */

View File

@ -4,6 +4,7 @@ declare(strict_types=1);
namespace App\Controller\Api\Admin\Backups;
use App\Controller\SingleActionInterface;
use App\Entity\Enums\StorageLocationTypes;
use App\Entity\Repository\StorageLocationRepository;
use App\Flysystem\Attributes\FileAttributes;
@ -13,7 +14,7 @@ use App\Paginator;
use League\Flysystem\StorageAttributes;
use Psr\Http\Message\ResponseInterface;
final class GetAction
final class GetAction implements SingleActionInterface
{
public function __construct(
private readonly StorageLocationRepository $storageLocationRepo,
@ -22,7 +23,8 @@ final class GetAction
public function __invoke(
ServerRequest $request,
Response $response
Response $response,
array $params
): ResponseInterface {
$router = $request->getRouter();

View File

@ -5,20 +5,24 @@ declare(strict_types=1);
namespace App\Controller\Api\Admin\Backups;
use App\Controller\Api\Traits\HasLogViewer;
use App\Controller\SingleActionInterface;
use App\Http\Response;
use App\Http\ServerRequest;
use App\Utilities\File;
use Psr\Http\Message\ResponseInterface;
final class GetLogAction
final class GetLogAction implements SingleActionInterface
{
use HasLogViewer;
public function __invoke(
ServerRequest $request,
Response $response,
string $path
array $params
): ResponseInterface {
/** @var string $path */
$path = $params['path'];
$logPath = File::validateTempPath($path);
return $this->streamLogToResponse($request, $response, $logPath);

View File

@ -4,6 +4,7 @@ declare(strict_types=1);
namespace App\Controller\Api\Admin\Backups;
use App\Controller\SingleActionInterface;
use App\Http\Response;
use App\Http\ServerRequest;
use App\Message\BackupMessage;
@ -11,7 +12,7 @@ use App\Utilities\File;
use Psr\Http\Message\ResponseInterface;
use Symfony\Component\Messenger\MessageBus;
final class RunAction
final class RunAction implements SingleActionInterface
{
public function __construct(
private readonly MessageBus $messageBus,
@ -20,7 +21,8 @@ final class RunAction
public function __invoke(
ServerRequest $request,
Response $response
Response $response,
array $params
): ResponseInterface {
$data = (array)$request->getParsedBody();

View File

@ -6,20 +6,24 @@ namespace App\Controller\Api\Admin\CustomAssets;
use App\Assets\AssetTypes;
use App\Container\EnvironmentAwareTrait;
use App\Controller\SingleActionInterface;
use App\Entity\Api\Status;
use App\Http\Response;
use App\Http\ServerRequest;
use Psr\Http\Message\ResponseInterface;
final class DeleteCustomAssetAction
final class DeleteCustomAssetAction implements SingleActionInterface
{
use EnvironmentAwareTrait;
public function __invoke(
ServerRequest $request,
Response $response,
string $type
array $params
): ResponseInterface {
/** @var string $type */
$type = $params['type'];
$customAsset = AssetTypes::from($type)->createObject($this->environment);
$customAsset->delete();

View File

@ -6,19 +6,23 @@ namespace App\Controller\Api\Admin\CustomAssets;
use App\Assets\AssetTypes;
use App\Container\EnvironmentAwareTrait;
use App\Controller\SingleActionInterface;
use App\Http\Response;
use App\Http\ServerRequest;
use Psr\Http\Message\ResponseInterface;
final class GetCustomAssetAction
final class GetCustomAssetAction implements SingleActionInterface
{
use EnvironmentAwareTrait;
public function __invoke(
ServerRequest $request,
Response $response,
string $type
array $params
): ResponseInterface {
/** @var string $type */
$type = $params['type'];
$customAsset = AssetTypes::from($type)->createObject($this->environment);
return $response->withJson(

View File

@ -6,6 +6,7 @@ namespace App\Controller\Api\Admin\CustomAssets;
use App\Assets\AssetTypes;
use App\Container\EnvironmentAwareTrait;
use App\Controller\SingleActionInterface;
use App\Entity\Api\Status;
use App\Http\Response;
use App\Http\ServerRequest;
@ -13,15 +14,18 @@ use App\Media\AlbumArt;
use App\Service\Flow;
use Psr\Http\Message\ResponseInterface;
final class PostCustomAssetAction
final class PostCustomAssetAction implements SingleActionInterface
{
use EnvironmentAwareTrait;
public function __invoke(
ServerRequest $request,
Response $response,
string $type
array $params
): ResponseInterface {
/** @var string $type */
$type = $params['type'];
$customAsset = AssetTypes::from($type)->createObject($this->environment);
$flowResponse = Flow::process($request, $response);

View File

@ -4,11 +4,12 @@ declare(strict_types=1);
namespace App\Controller\Api\Admin;
use App\Controller\Api\AbstractApiCrudController;
use App\Entity\CustomField;
use App\OpenApi;
use OpenApi\Attributes as OA;
/** @extends AbstractAdminApiCrudController<CustomField> */
/** @extends AbstractApiCrudController<CustomField> */
#[
OA\Get(
path: '/admin/custom_fields',
@ -119,7 +120,7 @@ use OpenApi\Attributes as OA;
]
)
]
final class CustomFieldsController extends AbstractAdminApiCrudController
final class CustomFieldsController extends AbstractApiCrudController
{
protected string $entityClass = CustomField::class;
protected string $resourceRouteName = 'api:admin:custom_field';

View File

@ -5,18 +5,20 @@ declare(strict_types=1);
namespace App\Controller\Api\Admin\GeoLite;
use App\Container\SettingsAwareTrait;
use App\Controller\SingleActionInterface;
use App\Http\Response;
use App\Http\ServerRequest;
use App\Service\IpGeolocator\GeoLite;
use Psr\Http\Message\ResponseInterface;
final class GetAction
final class GetAction implements SingleActionInterface
{
use SettingsAwareTrait;
public function __invoke(
ServerRequest $request,
Response $response
Response $response,
array $params
): ResponseInterface {
$version = GeoLite::getVersion();
$settings = $this->readSettings();

View File

@ -5,13 +5,14 @@ declare(strict_types=1);
namespace App\Controller\Api\Admin\GeoLite;
use App\Container\SettingsAwareTrait;
use App\Controller\SingleActionInterface;
use App\Http\Response;
use App\Http\ServerRequest;
use App\Service\IpGeolocator\GeoLite;
use App\Sync\Task\UpdateGeoLiteTask;
use Psr\Http\Message\ResponseInterface;
final class PostAction
final class PostAction implements SingleActionInterface
{
use SettingsAwareTrait;
@ -22,7 +23,8 @@ final class PostAction
public function __invoke(
ServerRequest $request,
Response $response
Response $response,
array $params
): ResponseInterface {
$newKey = trim($request->getParsedBodyParam('geolite_license_key', ''));

View File

@ -25,8 +25,11 @@ final class LogsAction
public function __invoke(
ServerRequest $request,
Response $response,
?string $log = null
array $params
): ResponseInterface {
/** @var string|null $log */
$log = $params['log'] ?? null;
$logPaths = $this->getGlobalLogs();
if (null === $log) {

View File

@ -5,6 +5,7 @@ declare(strict_types=1);
namespace App\Controller\Api\Admin;
use App\Acl;
use App\Controller\SingleActionInterface;
use App\Http\Response;
use App\Http\ServerRequest;
use App\OpenApi;
@ -29,7 +30,7 @@ use Psr\Http\Message\ResponseInterface;
]
)
]
final class PermissionsAction
final class PermissionsAction implements SingleActionInterface
{
public function __construct(
private readonly Acl $acl,
@ -38,7 +39,8 @@ final class PermissionsAction
public function __invoke(
ServerRequest $request,
Response $response
Response $response,
array $params
): ResponseInterface {
$permissions = [];
foreach ($this->acl->listPermissions() as $group => $actions) {

View File

@ -5,18 +5,20 @@ declare(strict_types=1);
namespace App\Controller\Api\Admin;
use App\Container\EntityManagerAwareTrait;
use App\Controller\SingleActionInterface;
use App\Entity\Relay;
use App\Http\Response;
use App\Http\ServerRequest;
use Psr\Http\Message\ResponseInterface;
final class RelaysAction
final class RelaysAction implements SingleActionInterface
{
use EntityManagerAwareTrait;
public function __invoke(
ServerRequest $request,
Response $response
Response $response,
array $params
): ResponseInterface {
$relays = $this->em->createQueryBuilder()
->select('e')

View File

@ -5,6 +5,7 @@ declare(strict_types=1);
namespace App\Controller\Api\Admin;
use App\Acl;
use App\Controller\Api\AbstractApiCrudController;
use App\Controller\Api\Traits\CanSortResults;
use App\Entity\Repository\RolePermissionRepository;
use App\Entity\Role;
@ -20,7 +21,7 @@ use RuntimeException;
use Symfony\Component\Serializer\Serializer;
use Symfony\Component\Validator\Validator\ValidatorInterface;
/** @extends AbstractAdminApiCrudController<Role> */
/** @extends AbstractApiCrudController<Role> */
#[
OA\Get(
path: '/admin/roles',
@ -134,7 +135,7 @@ use Symfony\Component\Validator\Validator\ValidatorInterface;
]
)
]
final class RolesController extends AbstractAdminApiCrudController
final class RolesController extends AbstractApiCrudController
{
use CanSortResults;
@ -156,7 +157,8 @@ final class RolesController extends AbstractAdminApiCrudController
public function listAction(
ServerRequest $request,
Response $response
Response $response,
array $params
): ResponseInterface {
$qb = $this->em->createQueryBuilder()
->select('r, rp')

View File

@ -4,6 +4,7 @@ declare(strict_types=1);
namespace App\Controller\Api\Admin;
use App\Controller\SingleActionInterface;
use App\Entity\Api\Error;
use App\Entity\Api\Status;
use App\Exception\ValidationException;
@ -16,7 +17,7 @@ use Symfony\Component\Validator\Constraints\Email;
use Symfony\Component\Validator\Constraints\Required;
use Symfony\Component\Validator\Validator\ValidatorInterface;
final class SendTestMessageAction
final class SendTestMessageAction implements SingleActionInterface
{
public function __construct(
private readonly ValidatorInterface $validator,
@ -26,7 +27,8 @@ final class SendTestMessageAction
public function __invoke(
ServerRequest $request,
Response $response
Response $response,
array $params
): ResponseInterface {
$emailAddress = $request->getParam('email', '');

View File

@ -5,6 +5,7 @@ declare(strict_types=1);
namespace App\Controller\Api\Admin;
use App\Container\EnvironmentAwareTrait;
use App\Controller\SingleActionInterface;
use App\Http\Response;
use App\Http\ServerRequest;
use App\OpenApi;
@ -35,13 +36,14 @@ use Psr\Http\Message\ResponseInterface;
]
)
]
final class ServerStatsAction
final class ServerStatsAction implements SingleActionInterface
{
use EnvironmentAwareTrait;
public function __invoke(
ServerRequest $request,
Response $response
Response $response,
array $params
): ResponseInterface {
$firstCpuMeasurement = CpuStats::getCurrentLoad();
$firstNetworkMeasurement = NetworkStats::getNetworkUsage();

View File

@ -48,8 +48,11 @@ final class ServiceControlController
public function restartAction(
ServerRequest $request,
Response $response,
string $service
array $params
): ResponseInterface {
/** @var string $service */
$service = $params['service'];
$this->serviceControl->restart($service);
return $response->withJson(Status::success());

View File

@ -67,8 +67,11 @@ final class SettingsController extends AbstractApiCrudController
public function listAction(
ServerRequest $request,
Response $response,
?string $group = null
array $params
): ResponseInterface {
/** @var string|null $group */
$group = $params['group'] ?? null;
$context = [];
if (null !== $group && in_array($group, Settings::VALID_GROUPS, true)) {
$context[AbstractNormalizer::GROUPS] = [$group];
@ -81,8 +84,11 @@ final class SettingsController extends AbstractApiCrudController
public function updateAction(
ServerRequest $request,
Response $response,
?string $group = null
array $params
): ResponseInterface {
/** @var string|null $group */
$group = $params['group'] ?? null;
$context = [];
if (null !== $group && in_array($group, Settings::VALID_GROUPS, true)) {
$context[AbstractNormalizer::GROUPS] = [$group];

View File

@ -4,12 +4,13 @@ declare(strict_types=1);
namespace App\Controller\Api\Admin\Shoutcast;
use App\Controller\SingleActionInterface;
use App\Http\Response;
use App\Http\ServerRequest;
use App\Radio\Frontend\Shoutcast;
use Psr\Http\Message\ResponseInterface;
final class GetAction
final class GetAction implements SingleActionInterface
{
public function __construct(
private readonly Shoutcast $shoutcast,
@ -18,7 +19,8 @@ final class GetAction
public function __invoke(
ServerRequest $request,
Response $response
Response $response,
array $params
): ResponseInterface {
return $response->withJson(
[

View File

@ -5,6 +5,7 @@ declare(strict_types=1);
namespace App\Controller\Api\Admin\Shoutcast;
use App\Container\EnvironmentAwareTrait;
use App\Controller\SingleActionInterface;
use App\Entity\Api\Status;
use App\Http\Response;
use App\Http\ServerRequest;
@ -13,13 +14,14 @@ use Psr\Http\Message\ResponseInterface;
use RuntimeException;
use Symfony\Component\Process\Process;
final class PostAction
final class PostAction implements SingleActionInterface
{
use EnvironmentAwareTrait;
public function __invoke(
ServerRequest $request,
Response $response
Response $response,
array $params
): ResponseInterface {
if ('x86_64' !== php_uname('m')) {
throw new RuntimeException('Shoutcast cannot be installed on non-X86_64 systems.');

View File

@ -6,6 +6,7 @@ namespace App\Controller\Api\Admin\Stations;
use App\Container\EnvironmentAwareTrait;
use App\Controller\Api\Admin\StationsController;
use App\Controller\SingleActionInterface;
use App\Entity\Api\Status;
use App\Entity\Interfaces\StationCloneAwareInterface;
use App\Entity\RolePermission;
@ -22,7 +23,7 @@ use Doctrine\Common\Collections\Collection;
use Psr\Http\Message\ResponseInterface;
use Throwable;
final class CloneAction extends StationsController
final class CloneAction extends StationsController implements SingleActionInterface
{
use EnvironmentAwareTrait;
@ -40,9 +41,9 @@ final class CloneAction extends StationsController
public function __invoke(
ServerRequest $request,
Response $response,
string $id
array $params
): ResponseInterface {
$record = $this->getRecord($id);
$record = $this->getRecord($request, $params);
$data = (array)$request->getParsedBody();
$toClone = $data['clone'];

View File

@ -5,16 +5,18 @@ declare(strict_types=1);
namespace App\Controller\Api\Admin\Stations;
use App\Controller\Api\Admin\StationsController;
use App\Controller\SingleActionInterface;
use App\Entity\Station;
use App\Http\Response;
use App\Http\ServerRequest;
use Psr\Http\Message\ResponseInterface;
final class StorageLocationsAction extends StationsController
final class StorageLocationsAction extends StationsController implements SingleActionInterface
{
public function __invoke(
ServerRequest $request,
Response $response
Response $response,
array $params
): ResponseInterface {
$newStorageLocationMessage = __('Create a new storage location based on the base directory.');

View File

@ -4,6 +4,7 @@ declare(strict_types=1);
namespace App\Controller\Api\Admin;
use App\Controller\Api\AbstractApiCrudController;
use App\Controller\Api\Traits\CanSortResults;
use App\Entity\Repository\StationQueueRepository;
use App\Entity\Repository\StationRepository;
@ -24,7 +25,7 @@ use Symfony\Component\Serializer\Serializer;
use Symfony\Component\Validator\Validator\ValidatorInterface;
use Throwable;
/** @extends AbstractAdminApiCrudController<Station> */
/** @extends AbstractApiCrudController<Station> */
#[
OA\Get(
path: '/admin/stations',
@ -138,7 +139,7 @@ use Throwable;
]
)
]
class StationsController extends AbstractAdminApiCrudController
class StationsController extends AbstractApiCrudController
{
use CanSortResults;
@ -158,7 +159,8 @@ class StationsController extends AbstractAdminApiCrudController
public function listAction(
ServerRequest $request,
Response $response
Response $response,
array $params
): ResponseInterface {
$qb = $this->em->createQueryBuilder()
->select('e')

View File

@ -4,16 +4,18 @@ declare(strict_types=1);
namespace App\Controller\Api\Admin\StereoTool;
use App\Controller\SingleActionInterface;
use App\Http\Response;
use App\Http\ServerRequest;
use App\Radio\StereoTool;
use Psr\Http\Message\ResponseInterface;
final class GetAction
final class GetAction implements SingleActionInterface
{
public function __invoke(
ServerRequest $request,
Response $response
Response $response,
array $params
): ResponseInterface {
return $response->withJson(
[

View File

@ -4,6 +4,7 @@ declare(strict_types=1);
namespace App\Controller\Api\Admin\StereoTool;
use App\Controller\SingleActionInterface;
use App\Entity\Api\Error;
use App\Entity\Api\Status;
use App\Http\Response;
@ -12,11 +13,12 @@ use App\Radio\StereoTool;
use App\Service\Flow;
use Psr\Http\Message\ResponseInterface;
final class PostAction
final class PostAction implements SingleActionInterface
{
public function __invoke(
ServerRequest $request,
Response $response,
array $params
): ResponseInterface {
$flowResponse = Flow::process($request, $response);
if ($flowResponse instanceof ResponseInterface) {

View File

@ -4,6 +4,7 @@ declare(strict_types=1);
namespace App\Controller\Api\Admin;
use App\Controller\Api\AbstractApiCrudController;
use App\Entity\Api\Admin\StorageLocation as ApiStorageLocation;
use App\Entity\Repository\StorageLocationRepository;
use App\Entity\StorageLocation;
@ -17,7 +18,7 @@ use RuntimeException;
use Symfony\Component\Serializer\Serializer;
use Symfony\Component\Validator\Validator\ValidatorInterface;
/** @extends AbstractAdminApiCrudController<StorageLocation> */
/** @extends AbstractApiCrudController<StorageLocation> */
#[
OA\Get(
path: '/admin/storage_locations',
@ -131,7 +132,7 @@ use Symfony\Component\Validator\Validator\ValidatorInterface;
]
)
]
final class StorageLocationsController extends AbstractAdminApiCrudController
final class StorageLocationsController extends AbstractApiCrudController
{
protected string $entityClass = StorageLocation::class;
protected string $resourceRouteName = 'api:admin:storage_location';
@ -146,7 +147,8 @@ final class StorageLocationsController extends AbstractAdminApiCrudController
public function listAction(
ServerRequest $request,
Response $response
Response $response,
array $params
): ResponseInterface {
$qb = $this->em->createQueryBuilder();

View File

@ -5,6 +5,7 @@ declare(strict_types=1);
namespace App\Controller\Api\Admin\Updates;
use App\Container\SettingsAwareTrait;
use App\Controller\SingleActionInterface;
use App\Http\Response;
use App\Http\ServerRequest;
use App\Service\AzuraCastCentral;
@ -12,7 +13,7 @@ use GuzzleHttp\Exception\TransferException;
use Psr\Http\Message\ResponseInterface;
use RuntimeException;
final class GetUpdatesAction
final class GetUpdatesAction implements SingleActionInterface
{
use SettingsAwareTrait;
@ -23,7 +24,8 @@ final class GetUpdatesAction
public function __invoke(
ServerRequest $request,
Response $response
Response $response,
array $params
): ResponseInterface {
$settings = $this->readSettings();

View File

@ -4,13 +4,14 @@ declare(strict_types=1);
namespace App\Controller\Api\Admin\Updates;
use App\Controller\SingleActionInterface;
use App\Entity\Api\Status;
use App\Http\Response;
use App\Http\ServerRequest;
use App\Service\WebUpdater;
use Psr\Http\Message\ResponseInterface;
final class PutUpdatesAction
final class PutUpdatesAction implements SingleActionInterface
{
public function __construct(
private readonly WebUpdater $webUpdater
@ -19,7 +20,8 @@ final class PutUpdatesAction
public function __invoke(
ServerRequest $request,
Response $response
Response $response,
array $params
): ResponseInterface {
$this->webUpdater->triggerUpdate();

View File

@ -4,6 +4,7 @@ declare(strict_types=1);
namespace App\Controller\Api\Admin;
use App\Controller\Api\AbstractApiCrudController;
use App\Controller\Api\Traits\CanSortResults;
use App\Controller\Frontend\Account\MasqueradeAction;
use App\Entity\Api\Error;
@ -16,7 +17,7 @@ use InvalidArgumentException;
use OpenApi\Attributes as OA;
use Psr\Http\Message\ResponseInterface;
/** @extends AbstractAdminApiCrudController<User> */
/** @extends AbstractApiCrudController<User> */
#[
OA\Get(
path: '/admin/users',
@ -130,7 +131,7 @@ use Psr\Http\Message\ResponseInterface;
]
)
]
class UsersController extends AbstractAdminApiCrudController
class UsersController extends AbstractApiCrudController
{
use CanSortResults;
@ -139,7 +140,8 @@ class UsersController extends AbstractAdminApiCrudController
public function listAction(
ServerRequest $request,
Response $response
Response $response,
array $params
): ResponseInterface {
$qb = $this->em->createQueryBuilder()
->select('e')
@ -200,9 +202,9 @@ class UsersController extends AbstractAdminApiCrudController
public function editAction(
ServerRequest $request,
Response $response,
string $id
array $params
): ResponseInterface {
$record = $this->getRecord($id);
$record = $this->getRecord($request, $params);
if (null === $record) {
return $response->withStatus(404)
@ -223,9 +225,9 @@ class UsersController extends AbstractAdminApiCrudController
public function deleteAction(
ServerRequest $request,
Response $response,
string $id
array $params
): ResponseInterface {
$record = $this->getRecord($id);
$record = $this->getRecord($request, $params);
if (null === $record) {
return $response->withStatus(404)

View File

@ -5,11 +5,8 @@ declare(strict_types=1);
namespace App\Controller\Api\Frontend\Account;
use App\Controller\Api\AbstractApiCrudController;
use App\Entity\Api\Error;
use App\Entity\Api\Status;
use App\Entity\ApiKey;
use App\Entity\Interfaces\EntityGroupsInterface;
use App\Entity\User;
use App\Http\Response;
use App\Http\ServerRequest;
use App\Security\SplitToken;
@ -27,7 +24,8 @@ final class ApiKeysController extends AbstractApiCrudController
public function listAction(
ServerRequest $request,
Response $response
Response $response,
array $params
): ResponseInterface {
$query = $this->em->createQuery(
<<<'DQL'
@ -40,7 +38,8 @@ final class ApiKeysController extends AbstractApiCrudController
public function createAction(
ServerRequest $request,
Response $response
Response $response,
array $params
): ResponseInterface {
$newKey = SplitToken::generate();
@ -58,50 +57,18 @@ final class ApiKeysController extends AbstractApiCrudController
return $response->withJson($return);
}
public function getAction(
ServerRequest $request,
Response $response,
string $id
): ResponseInterface {
$record = $this->getRecord($request->getUser(), $id);
if (null === $record) {
return $response->withStatus(404)
->withJson(Error::notFound());
}
$return = $this->viewRecord($record, $request);
return $response->withJson($return);
}
public function deleteAction(
ServerRequest $request,
Response $response,
string $id
): ResponseInterface {
$record = $this->getRecord($request->getUser(), $id);
if (null === $record) {
return $response->withStatus(404)
->withJson(Error::notFound());
}
$this->deleteRecord($record);
return $response->withJson(Status::deleted());
}
/**
* @param string $id
*
* @return TEntity|null
*/
private function getRecord(User $user, string $id): ?object
protected function getRecord(ServerRequest $request, array $params): ?object
{
/** @var string $id */
$id = $params['id'];
/** @var TEntity|null $record */
$record = $this->em->getRepository(ApiKey::class)->findOneBy([
'id' => $id,
'user' => $user,
'user' => $request->getUser(),
]);
return $record;
}

View File

@ -5,18 +5,20 @@ declare(strict_types=1);
namespace App\Controller\Api\Frontend\Account;
use App\Container\EntityManagerAwareTrait;
use App\Controller\SingleActionInterface;
use App\Entity\Api\Status;
use App\Http\Response;
use App\Http\ServerRequest;
use Psr\Http\Message\ResponseInterface;
final class DeleteTwoFactorAction
final class DeleteTwoFactorAction implements SingleActionInterface
{
use EntityManagerAwareTrait;
public function __invoke(
ServerRequest $request,
Response $response
Response $response,
array $params
): ResponseInterface {
$user = $request->getUser();
$user = $this->em->refetch($user);

View File

@ -6,6 +6,7 @@ namespace App\Controller\Api\Frontend\Account;
use App\Container\EntityManagerAwareTrait;
use App\Controller\Api\Admin\UsersController;
use App\Controller\SingleActionInterface;
use App\Entity\Interfaces\EntityGroupsInterface;
use App\Http\Response;
use App\Http\ServerRequest;
@ -15,7 +16,7 @@ use Symfony\Component\Serializer\Normalizer\AbstractNormalizer;
use Symfony\Component\Serializer\Serializer;
use Symfony\Component\Validator\Validator\ValidatorInterface;
final class GetMeAction extends UsersController
final class GetMeAction extends UsersController implements SingleActionInterface
{
use EntityManagerAwareTrait;
@ -29,7 +30,8 @@ final class GetMeAction extends UsersController
public function __invoke(
ServerRequest $request,
Response $response
Response $response,
array $params
): ResponseInterface {
$user = $request->getUser();
$user = $this->em->refetch($user);

View File

@ -4,15 +4,17 @@ declare(strict_types=1);
namespace App\Controller\Api\Frontend\Account;
use App\Controller\SingleActionInterface;
use App\Http\Response;
use App\Http\ServerRequest;
use Psr\Http\Message\ResponseInterface;
final class GetTwoFactorAction
final class GetTwoFactorAction implements SingleActionInterface
{
public function __invoke(
ServerRequest $request,
Response $response
Response $response,
array $params
): ResponseInterface {
$user = $request->getUser();

View File

@ -5,6 +5,7 @@ declare(strict_types=1);
namespace App\Controller\Api\Frontend\Account;
use App\Controller\Api\Admin\UsersController;
use App\Controller\SingleActionInterface;
use App\Entity\Api\Status;
use App\Entity\Interfaces\EntityGroupsInterface;
use App\Http\Response;
@ -12,11 +13,12 @@ use App\Http\ServerRequest;
use Psr\Http\Message\ResponseInterface;
use Symfony\Component\Serializer\Normalizer\AbstractNormalizer;
final class PutMeAction extends UsersController
final class PutMeAction extends UsersController implements SingleActionInterface
{
public function __invoke(
ServerRequest $request,
Response $response
Response $response,
array $params
): ResponseInterface {
$user = $request->getUser();
$user = $this->em->refetch($user);

View File

@ -4,7 +4,8 @@ declare(strict_types=1);
namespace App\Controller\Api\Frontend\Account;
use App\Controller\Api\Admin\UsersController;
use App\Container\EntityManagerAwareTrait;
use App\Controller\SingleActionInterface;
use App\Entity\Api\Error;
use App\Entity\Api\Status;
use App\Http\Response;
@ -13,11 +14,14 @@ use InvalidArgumentException;
use Psr\Http\Message\ResponseInterface;
use Throwable;
final class PutPasswordAction extends UsersController
final class PutPasswordAction implements SingleActionInterface
{
use EntityManagerAwareTrait;
public function __invoke(
ServerRequest $request,
Response $response
Response $response,
array $params
): ResponseInterface {
$user = $request->getUser();
$body = (array)$request->getParsedBody();

View File

@ -5,7 +5,8 @@ declare(strict_types=1);
namespace App\Controller\Api\Frontend\Account;
use App\Auth;
use App\Controller\Api\Admin\UsersController;
use App\Container\EntityManagerAwareTrait;
use App\Controller\SingleActionInterface;
use App\Entity\Api\Error;
use App\Entity\Api\Status;
use App\Http\Response;
@ -17,11 +18,14 @@ use ParagonIE\ConstantTime\Base32;
use Psr\Http\Message\ResponseInterface;
use Throwable;
final class PutTwoFactorAction extends UsersController
final class PutTwoFactorAction implements SingleActionInterface
{
use EntityManagerAwareTrait;
public function __invoke(
ServerRequest $request,
Response $response
Response $response,
array $params
): ResponseInterface {
$params = (array)$request->getParsedBody();

View File

@ -6,6 +6,7 @@ namespace App\Controller\Api\Frontend\Dashboard;
use App\Container\EntityManagerAwareTrait;
use App\Container\SettingsAwareTrait;
use App\Controller\SingleActionInterface;
use App\Entity\Api\Error;
use App\Entity\Enums\AnalyticsIntervals;
use App\Entity\Station;
@ -17,7 +18,7 @@ use Carbon\CarbonImmutable;
use Psr\Http\Message\ResponseInterface;
use Psr\SimpleCache\CacheInterface;
final class ChartsAction
final class ChartsAction implements SingleActionInterface
{
use EntityManagerAwareTrait;
use SettingsAwareTrait;
@ -29,7 +30,8 @@ final class ChartsAction
public function __invoke(
ServerRequest $request,
Response $response
Response $response,
array $params
): ResponseInterface {
if (!$this->readSettings()->isAnalyticsEnabled()) {
return $response->withStatus(403, 'Forbidden')

View File

@ -5,12 +5,13 @@ declare(strict_types=1);
namespace App\Controller\Api\Frontend\Dashboard;
use App\CallableEventDispatcherInterface;
use App\Controller\SingleActionInterface;
use App\Event;
use App\Http\Response;
use App\Http\ServerRequest;
use Psr\Http\Message\ResponseInterface;
final class NotificationsAction
final class NotificationsAction implements SingleActionInterface
{
public function __construct(
private readonly CallableEventDispatcherInterface $eventDispatcher,
@ -19,7 +20,8 @@ final class NotificationsAction
public function __invoke(
ServerRequest $request,
Response $response
Response $response,
array $params
): ResponseInterface {
$event = new Event\GetNotifications($request);
$this->eventDispatcher->dispatch($event);

View File

@ -6,6 +6,7 @@ namespace App\Controller\Api\Frontend\Dashboard;
use App\Container\EntityManagerAwareTrait;
use App\Container\SettingsAwareTrait;
use App\Controller\SingleActionInterface;
use App\Entity\Api\Dashboard;
use App\Entity\ApiGenerator\NowPlayingApiGenerator;
use App\Entity\Station;
@ -15,7 +16,7 @@ use App\Http\ServerRequest;
use App\Paginator;
use Psr\Http\Message\ResponseInterface;
final class StationsAction
final class StationsAction implements SingleActionInterface
{
use EntityManagerAwareTrait;
use SettingsAwareTrait;
@ -27,7 +28,8 @@ final class StationsAction
public function __invoke(
ServerRequest $request,
Response $response
Response $response,
array $params
): ResponseInterface {
$router = $request->getRouter();
$acl = $request->getAcl();

View File

@ -6,6 +6,7 @@ namespace App\Controller\Api\Internal;
use App\Container\ContainerAwareTrait;
use App\Container\LoggerAwareTrait;
use App\Controller\SingleActionInterface;
use App\Enums\StationPermissions;
use App\Http\Response;
use App\Http\ServerRequest;
@ -16,7 +17,7 @@ use Psr\Http\Message\ResponseInterface;
use RuntimeException;
use Throwable;
final class LiquidsoapAction
final class LiquidsoapAction implements SingleActionInterface
{
use LoggerAwareTrait;
use ContainerAwareTrait;
@ -24,9 +25,11 @@ final class LiquidsoapAction
public function __invoke(
ServerRequest $request,
Response $response,
string $station_id,
string $action
array $params
): ResponseInterface {
/** @var string $action */
$action = $params['action'];
$station = $request->getStation();
$asAutoDj = $request->hasHeader('X-Liquidsoap-Api-Key');
$payload = (array)$request->getParsedBody();

View File

@ -5,6 +5,7 @@ declare(strict_types=1);
namespace App\Controller\Api\Internal;
use App\Container\LoggerAwareTrait;
use App\Controller\SingleActionInterface;
use App\Enums\StationPermissions;
use App\Exception\PermissionDeniedException;
use App\Http\Response;
@ -12,7 +13,7 @@ use App\Http\ServerRequest;
use App\Radio\Frontend\Blocklist\BlocklistParser;
use Psr\Http\Message\ResponseInterface;
final class ListenerAuthAction
final class ListenerAuthAction implements SingleActionInterface
{
use LoggerAwareTrait;
@ -24,7 +25,7 @@ final class ListenerAuthAction
public function __invoke(
ServerRequest $request,
Response $response,
string $station_id
array $params
): ResponseInterface {
$station = $request->getStation();

View File

@ -6,19 +6,21 @@ namespace App\Controller\Api\Internal;
use App\Container\EntityManagerAwareTrait;
use App\Container\LoggerAwareTrait;
use App\Controller\SingleActionInterface;
use App\Entity\SftpUser;
use App\Http\Response;
use App\Http\ServerRequest;
use Psr\Http\Message\ResponseInterface;
final class SftpAuthAction
final class SftpAuthAction implements SingleActionInterface
{
use LoggerAwareTrait;
use EntityManagerAwareTrait;
public function __invoke(
ServerRequest $request,
Response $response
Response $response,
array $params
): ResponseInterface {
$errorResponse = $response
->withStatus(500)

View File

@ -6,6 +6,7 @@ namespace App\Controller\Api\Internal;
use App\Container\EntityManagerAwareTrait;
use App\Container\LoggerAwareTrait;
use App\Controller\SingleActionInterface;
use App\Entity\Repository\StorageLocationRepository;
use App\Entity\SftpUser;
use App\Entity\StorageLocation;
@ -19,7 +20,7 @@ use Psr\Http\Message\ResponseInterface;
use Symfony\Component\Messenger\MessageBus;
use Throwable;
final class SftpEventAction
final class SftpEventAction implements SingleActionInterface
{
use LoggerAwareTrait;
use EntityManagerAwareTrait;
@ -33,7 +34,8 @@ final class SftpEventAction
public function __invoke(
ServerRequest $request,
Response $response
Response $response,
array $params
): ResponseInterface {
$errorResponse = $response->withStatus(500)->withJson(['success' => false]);

View File

@ -57,12 +57,15 @@ final class NowPlayingController
public function getAction(
ServerRequest $request,
Response $response,
?string $station_id = null
array $params
): ResponseInterface {
/** @var string|null $stationId */
$stationId = $params['station_id'] ?? null;
$router = $request->getRouter();
if (!empty($station_id)) {
$np = $this->nowPlayingCache->getForStation($station_id);
if (!empty($stationId)) {
$np = $this->nowPlayingCache->getForStation($stationId);
if ($np instanceof NowPlaying) {
$np->resolveUrls($router->getBaseUrl());
@ -97,10 +100,12 @@ final class NowPlayingController
public function getArtAction(
ServerRequest $request,
Response $response,
string $station_id,
?string $timestamp = null
array $params
): ResponseInterface {
$np = $this->nowPlayingCache->getForStation($station_id);
/** @var string $stationId */
$stationId = $params['station_id'];
$np = $this->nowPlayingCache->getForStation($stationId);
if ($np instanceof NowPlaying) {
$np->resolveUrls($request->getRouter()->getBaseUrl());

View File

@ -5,11 +5,12 @@ declare(strict_types=1);
namespace App\Controller\Api;
use App\Console\Command\GenerateApiDocsCommand;
use App\Controller\SingleActionInterface;
use App\Http\Response;
use App\Http\ServerRequest;
use Psr\Http\Message\ResponseInterface;
final class OpenApiAction
final class OpenApiAction implements SingleActionInterface
{
public function __construct(
private readonly GenerateApiDocsCommand $apiDocsCommand
@ -18,7 +19,8 @@ final class OpenApiAction
public function __invoke(
ServerRequest $request,
Response $response
Response $response,
array $params
): ResponseInterface {
$apiBaseUrl = str_replace(
'/openapi.yml',

View File

@ -5,6 +5,7 @@ declare(strict_types=1);
namespace App\Controller\Api\Stations;
use App\Container\EntityManagerAwareTrait;
use App\Controller\SingleActionInterface;
use App\Entity\ApiGenerator\SongApiGenerator;
use App\Entity\StationMedia;
use App\Http\ServerRequest;
@ -12,7 +13,7 @@ use App\Paginator;
use Psr\Cache\CacheItemPoolInterface;
use RuntimeException;
abstract class AbstractSearchableListAction
abstract class AbstractSearchableListAction implements SingleActionInterface
{
use EntityManagerAwareTrait;

View File

@ -5,8 +5,6 @@ declare(strict_types=1);
namespace App\Controller\Api\Stations;
use App\Controller\Api\AbstractApiCrudController;
use App\Entity\Api\Error;
use App\Entity\Api\Status;
use App\Entity\Station;
use App\Http\Response;
use App\Http\ServerRequest;
@ -22,7 +20,7 @@ abstract class AbstractStationApiCrudController extends AbstractApiCrudControlle
public function listAction(
ServerRequest $request,
Response $response,
string $station_id
array $params
): ResponseInterface {
$station = $this->getStation($request);
@ -36,6 +34,44 @@ abstract class AbstractStationApiCrudController extends AbstractApiCrudControlle
return $this->listPaginatedFromQuery($request, $response, $query);
}
/**
* @return TEntity
*/
protected function createRecord(ServerRequest $request, array $data): object
{
return $this->editRecord(
$data,
null,
[
AbstractNormalizer::DEFAULT_CONSTRUCTOR_ARGUMENTS => [
$this->entityClass => [
'station' => $request->getStation(),
],
],
]
);
}
/**
* @return TEntity
*/
protected function getRecord(
ServerRequest $request,
array $params
): ?object {
$station = $request->getStation();
/** @var int|string $id */
$id = $params['id'];
return $this->em->getRepository($this->entityClass)->findOneBy(
[
'station' => $station,
'id' => $id,
]
);
}
/**
* A placeholder function to retrieve the current station that some controllers can
* override to verify that the station can perform the specified task.
@ -46,108 +82,4 @@ abstract class AbstractStationApiCrudController extends AbstractApiCrudControlle
{
return $request->getStation();
}
public function createAction(
ServerRequest $request,
Response $response,
string $station_id
): ResponseInterface {
$station = $this->getStation($request);
$row = $this->createRecord((array)$request->getParsedBody(), $station);
$return = $this->viewRecord($row, $request);
return $response->withJson($return);
}
/**
* @param array $data
* @param Station $station
*
* @return TEntity
*/
protected function createRecord(array $data, Station $station): object
{
return $this->editRecord(
$data,
null,
[
AbstractNormalizer::DEFAULT_CONSTRUCTOR_ARGUMENTS => [
$this->entityClass => [
'station' => $station,
],
],
]
);
}
public function getAction(
ServerRequest $request,
Response $response,
string $station_id,
string $id
): ResponseInterface {
$station = $this->getStation($request);
$record = $this->getRecord($station, $id);
if (null === $record) {
return $response->withStatus(404)
->withJson(Error::notFound());
}
$return = $this->viewRecord($record, $request);
return $response->withJson($return);
}
/**
* @param Station $station
* @param int|string $id
*
* @return TEntity
*/
protected function getRecord(Station $station, int|string $id): ?object
{
return $this->em->getRepository($this->entityClass)->findOneBy(
[
'station' => $station,
'id' => $id,
]
);
}
public function editAction(
ServerRequest $request,
Response $response,
string $station_id,
string $id
): ResponseInterface {
$record = $this->getRecord($this->getStation($request), $id);
if (null === $record) {
return $response->withStatus(404)
->withJson(Error::notFound());
}
$this->editRecord((array)$request->getParsedBody(), $record);
return $response->withJson(Status::updated());
}
public function deleteAction(
ServerRequest $request,
Response $response,
string $station_id,
string $id
): ResponseInterface {
$record = $this->getRecord($this->getStation($request), $id);
if (null === $record) {
return $response->withStatus(404)
->withJson(Error::notFound());
}
$this->deleteRecord($record);
return $response->withJson(Status::deleted());
}
}

View File

@ -4,6 +4,7 @@ declare(strict_types=1);
namespace App\Controller\Api\Stations\Art;
use App\Controller\SingleActionInterface;
use App\Entity\Api\Status;
use App\Entity\Repository\StationMediaRepository;
use App\Http\Response;
@ -39,7 +40,7 @@ use Psr\Http\Message\ResponseInterface;
new OA\Response(ref: OpenApi::REF_RESPONSE_GENERIC_ERROR, response: 500),
]
)]
final class DeleteArtAction
final class DeleteArtAction implements SingleActionInterface
{
public function __construct(
private readonly StationMediaRepository $mediaRepo,
@ -49,12 +50,14 @@ final class DeleteArtAction
public function __invoke(
ServerRequest $request,
Response $response,
string $station_id,
string $media_id
array $params
): ResponseInterface {
/** @var string $mediaId */
$mediaId = $params['media_id'];
$station = $request->getStation();
$media = $this->mediaRepo->requireForStation($media_id, $station);
$media = $this->mediaRepo->requireForStation($mediaId, $station);
$this->mediaRepo->removeAlbumArt($media);
return $response->withJson(Status::deleted());

View File

@ -4,6 +4,7 @@ declare(strict_types=1);
namespace App\Controller\Api\Stations\Art;
use App\Controller\SingleActionInterface;
use App\Entity\Repository\StationMediaRepository;
use App\Entity\Repository\StationRepository;
use App\Entity\Station;
@ -41,7 +42,7 @@ use Psr\Http\Message\ResponseInterface;
),
]
)]
final class GetArtAction
final class GetArtAction implements SingleActionInterface
{
public function __construct(
private readonly StationRepository $stationRepo,
@ -53,21 +54,23 @@ final class GetArtAction
public function __invoke(
ServerRequest $request,
Response $response,
string $station_id,
string $media_id
array $params
): ResponseInterface {
/** @var string $mediaId */
$mediaId = $params['media_id'];
$station = $request->getStation();
if (str_contains($media_id, '-')) {
if (str_contains($mediaId, '-')) {
$response = $response->withCacheLifetime(Response::CACHE_ONE_YEAR);
}
// If a timestamp delimiter is added, strip it automatically.
$media_id = explode('-', $media_id, 2)[0];
$mediaId = explode('-', $mediaId, 2)[0];
$fsMedia = $this->stationFilesystems->getMediaFilesystem($station);
$mediaPath = $this->getMediaPath($station, $fsMedia, $media_id);
$mediaPath = $this->getMediaPath($station, $fsMedia, $mediaId);
if (null !== $mediaPath) {
return $response->streamFilesystemFile(
$fsMedia,
@ -84,17 +87,17 @@ final class GetArtAction
private function getMediaPath(
Station $station,
ExtendedFilesystemInterface $fsMedia,
string $media_id
string $mediaId
): ?string {
if (StationMedia::UNIQUE_ID_LENGTH === strlen($media_id)) {
$mediaPath = StationMedia::getArtPath($media_id);
if (StationMedia::UNIQUE_ID_LENGTH === strlen($mediaId)) {
$mediaPath = StationMedia::getArtPath($mediaId);
if ($fsMedia->fileExists($mediaPath)) {
return $mediaPath;
}
}
$media = $this->mediaRepo->findForStation($media_id, $station);
$media = $this->mediaRepo->findForStation($mediaId, $station);
if (!($media instanceof StationMedia)) {
return null;
}

View File

@ -5,6 +5,7 @@ declare(strict_types=1);
namespace App\Controller\Api\Stations\Art;
use App\Container\EntityManagerAwareTrait;
use App\Controller\SingleActionInterface;
use App\Entity\Api\Status;
use App\Entity\Repository\StationMediaRepository;
use App\Http\Response;
@ -41,7 +42,7 @@ use Psr\Http\Message\ResponseInterface;
new OA\Response(ref: OpenApi::REF_RESPONSE_GENERIC_ERROR, response: 500),
]
)]
final class PostArtAction
final class PostArtAction implements SingleActionInterface
{
use EntityManagerAwareTrait;
@ -53,12 +54,14 @@ final class PostArtAction
public function __invoke(
ServerRequest $request,
Response $response,
string $station_id,
string $media_id
array $params
): ResponseInterface {
/** @var string $mediaId */
$mediaId = $params['media_id'];
$station = $request->getStation();
$media = $this->mediaRepo->requireForStation($media_id, $station);
$media = $this->mediaRepo->requireForStation($mediaId, $station);
$flowResponse = Flow::process($request, $response, $station->getRadioTempDir());
if ($flowResponse instanceof ResponseInterface) {

View File

@ -5,6 +5,7 @@ declare(strict_types=1);
namespace App\Controller\Api\Stations\BulkMedia;
use App\Container\EntityManagerAwareTrait;
use App\Controller\SingleActionInterface;
use App\Entity\Repository\CustomFieldRepository;
use App\Entity\Repository\StationPlaylistRepository;
use App\Http\Response;
@ -13,7 +14,7 @@ use League\Csv\Writer;
use Psr\Http\Message\ResponseInterface;
use RuntimeException;
final class DownloadAction
final class DownloadAction implements SingleActionInterface
{
use EntityManagerAwareTrait;
@ -26,7 +27,7 @@ final class DownloadAction
public function __invoke(
ServerRequest $request,
Response $response,
string $station_id
array $params
): ResponseInterface {
$station = $request->getStation();

View File

@ -5,6 +5,7 @@ declare(strict_types=1);
namespace App\Controller\Api\Stations\BulkMedia;
use App\Container\EntityManagerAwareTrait;
use App\Controller\SingleActionInterface;
use App\Entity\Api\StationPlaylistImportResult;
use App\Entity\Repository\CustomFieldRepository;
use App\Entity\Repository\StationPlaylistMediaRepository;
@ -25,7 +26,7 @@ use Throwable;
use function count;
use function str_starts_with;
final class UploadAction
final class UploadAction implements SingleActionInterface
{
use EntityManagerAwareTrait;
@ -56,7 +57,7 @@ final class UploadAction
public function __invoke(
ServerRequest $request,
Response $response,
string $station_id
array $params
): ResponseInterface {
$station = $request->getStation();

View File

@ -6,21 +6,24 @@ namespace App\Controller\Api\Stations\CustomAssets;
use App\Assets\AssetTypes;
use App\Container\EnvironmentAwareTrait;
use App\Controller\SingleActionInterface;
use App\Entity\Api\Status;
use App\Http\Response;
use App\Http\ServerRequest;
use Psr\Http\Message\ResponseInterface;
final class DeleteCustomAssetAction
final class DeleteCustomAssetAction implements SingleActionInterface
{
use EnvironmentAwareTrait;
public function __invoke(
ServerRequest $request,
Response $response,
string $station_id,
string $type
array $params
): ResponseInterface {
/** @var string $type */
$type = $params['type'];
$customAsset = AssetTypes::from($type)->createObject(
$this->environment,
$request->getStation()

View File

@ -6,20 +6,23 @@ namespace App\Controller\Api\Stations\CustomAssets;
use App\Assets\AssetTypes;
use App\Container\EnvironmentAwareTrait;
use App\Controller\SingleActionInterface;
use App\Http\Response;
use App\Http\ServerRequest;
use Psr\Http\Message\ResponseInterface;
final class GetCustomAssetAction
final class GetCustomAssetAction implements SingleActionInterface
{
use EnvironmentAwareTrait;
public function __invoke(
ServerRequest $request,
Response $response,
string $station_id,
string $type
array $params
): ResponseInterface {
/** @var string $type */
$type = $params['type'];
$customAsset = AssetTypes::from($type)->createObject(
$this->environment,
$request->getStation()

View File

@ -6,6 +6,7 @@ namespace App\Controller\Api\Stations\CustomAssets;
use App\Assets\AssetTypes;
use App\Container\EnvironmentAwareTrait;
use App\Controller\SingleActionInterface;
use App\Entity\Api\Status;
use App\Http\Response;
use App\Http\ServerRequest;
@ -13,16 +14,18 @@ use App\Media\AlbumArt;
use App\Service\Flow;
use Psr\Http\Message\ResponseInterface;
final class PostCustomAssetAction
final class PostCustomAssetAction implements SingleActionInterface
{
use EnvironmentAwareTrait;
public function __invoke(
ServerRequest $request,
Response $response,
string $station_id,
string $type
array $params
): ResponseInterface {
/** @var string $type */
$type = $params['type'];
$customAsset = AssetTypes::from($type)->createObject(
$this->environment,
$request->getStation()

View File

@ -4,6 +4,7 @@ declare(strict_types=1);
namespace App\Controller\Api\Stations\Fallback;
use App\Controller\SingleActionInterface;
use App\Entity\Api\Status;
use App\Entity\Repository\StationRepository;
use App\Http\Response;
@ -27,7 +28,7 @@ use Psr\Http\Message\ResponseInterface;
new OA\Response(ref: OpenApi::REF_RESPONSE_GENERIC_ERROR, response: 500),
]
)]
final class DeleteFallbackAction
final class DeleteFallbackAction implements SingleActionInterface
{
public function __construct(
private readonly StationRepository $stationRepo,
@ -37,7 +38,7 @@ final class DeleteFallbackAction
public function __invoke(
ServerRequest $request,
Response $response,
string $station_id
array $params
): ResponseInterface {
$station = $request->getStation();
$this->stationRepo->clearFallback($station);

View File

@ -4,6 +4,7 @@ declare(strict_types=1);
namespace App\Controller\Api\Stations\Fallback;
use App\Controller\SingleActionInterface;
use App\Entity\Api\Error;
use App\Flysystem\StationFilesystems;
use App\Http\Response;
@ -30,12 +31,12 @@ use Psr\Http\Message\ResponseInterface;
new OA\Response(ref: OpenApi::REF_RESPONSE_GENERIC_ERROR, response: 500),
]
)]
final class GetFallbackAction
final class GetFallbackAction implements SingleActionInterface
{
public function __invoke(
ServerRequest $request,
Response $response,
string $station_id
array $params
): ResponseInterface {
set_time_limit(600);

View File

@ -4,6 +4,7 @@ declare(strict_types=1);
namespace App\Controller\Api\Stations\Fallback;
use App\Controller\SingleActionInterface;
use App\Entity\Api\Status;
use App\Entity\Repository\StationRepository;
use App\Http\Response;
@ -28,7 +29,7 @@ use Psr\Http\Message\ResponseInterface;
new OA\Response(ref: OpenApi::REF_RESPONSE_GENERIC_ERROR, response: 500),
]
)]
final class PostFallbackAction
final class PostFallbackAction implements SingleActionInterface
{
public function __construct(
private readonly StationRepository $stationRepo
@ -38,7 +39,7 @@ final class PostFallbackAction
public function __invoke(
ServerRequest $request,
Response $response,
string $station_id
array $params
): ResponseInterface {
$station = $request->getStation();

View File

@ -5,6 +5,7 @@ declare(strict_types=1);
namespace App\Controller\Api\Stations\Files;
use App\Container\EntityManagerAwareTrait;
use App\Controller\SingleActionInterface;
use App\Entity\Api\BatchResult;
use App\Entity\Interfaces\PathAwareInterface;
use App\Entity\Repository\StationPlaylistFolderRepository;
@ -36,7 +37,7 @@ use RuntimeException;
use Symfony\Component\Messenger\MessageBus;
use Throwable;
final class BatchAction
final class BatchAction implements SingleActionInterface
{
use EntityManagerAwareTrait;
@ -55,7 +56,7 @@ final class BatchAction
public function __invoke(
ServerRequest $request,
Response $response,
string $station_id
array $params
): ResponseInterface {
$station = $request->getStation();
$storageLocation = $station->getMediaStorageLocation();

View File

@ -4,13 +4,14 @@ declare(strict_types=1);
namespace App\Controller\Api\Stations\Files;
use App\Controller\SingleActionInterface;
use App\Entity\Api\Error;
use App\Flysystem\StationFilesystems;
use App\Http\Response;
use App\Http\ServerRequest;
use Psr\Http\Message\ResponseInterface;
final class DownloadAction
final class DownloadAction implements SingleActionInterface
{
public function __construct(
private readonly StationFilesystems $stationFilesystems
@ -20,7 +21,7 @@ final class DownloadAction
public function __invoke(
ServerRequest $request,
Response $response,
string $station_id
array $params
): ResponseInterface {
set_time_limit(600);

View File

@ -6,6 +6,7 @@ namespace App\Controller\Api\Stations\Files;
use App\Container\EntityManagerAwareTrait;
use App\Container\LoggerAwareTrait;
use App\Controller\SingleActionInterface;
use App\Entity\Api\Error;
use App\Entity\Api\Status;
use App\Entity\Repository\StationPlaylistMediaRepository;
@ -19,7 +20,7 @@ use App\Media\MediaProcessor;
use App\Service\Flow;
use Psr\Http\Message\ResponseInterface;
final class FlowUploadAction
final class FlowUploadAction implements SingleActionInterface
{
use LoggerAwareTrait;
use EntityManagerAwareTrait;
@ -33,7 +34,7 @@ final class FlowUploadAction
public function __invoke(
ServerRequest $request,
Response $response,
string $station_id
array $params
): ResponseInterface {
$allParams = $request->getParams();
$station = $request->getStation();

View File

@ -6,6 +6,7 @@ namespace App\Controller\Api\Stations\Files;
use App\Container\EntityManagerAwareTrait;
use App\Controller\Api\Traits\CanSortResults;
use App\Controller\SingleActionInterface;
use App\Entity\Api\FileList;
use App\Entity\Api\FileListMedia;
use App\Entity\Station;
@ -25,7 +26,7 @@ use Psr\Http\Message\ResponseInterface;
use Psr\SimpleCache\CacheInterface;
use Symfony\Component\PropertyAccess\PropertyAccessorInterface;
final class ListAction
final class ListAction implements SingleActionInterface
{
use CanSortResults;
use EntityManagerAwareTrait;
@ -39,7 +40,7 @@ final class ListAction
public function __invoke(
ServerRequest $request,
Response $response,
string $station_id
array $params
): ResponseInterface {
$router = $request->getRouter();

View File

@ -4,6 +4,7 @@ declare(strict_types=1);
namespace App\Controller\Api\Stations\Files;
use App\Controller\SingleActionInterface;
use App\Entity\StationMedia;
use App\Flysystem\StationFilesystems;
use App\Http\Response;
@ -11,7 +12,7 @@ use App\Http\ServerRequest;
use League\Flysystem\StorageAttributes;
use Psr\Http\Message\ResponseInterface;
final class ListDirectoriesAction
final class ListDirectoriesAction implements SingleActionInterface
{
public function __construct(
private readonly StationFilesystems $stationFilesystems
@ -21,7 +22,7 @@ final class ListDirectoriesAction
public function __invoke(
ServerRequest $request,
Response $response,
string $station_id
array $params
): ResponseInterface {
$station = $request->getStation();

View File

@ -4,6 +4,7 @@ declare(strict_types=1);
namespace App\Controller\Api\Stations\Files;
use App\Controller\SingleActionInterface;
use App\Entity\Api\Error;
use App\Entity\Api\Status;
use App\Flysystem\StationFilesystems;
@ -12,7 +13,7 @@ use App\Http\ServerRequest;
use League\Flysystem\UnableToCreateDirectory;
use Psr\Http\Message\ResponseInterface;
final class MakeDirectoryAction
final class MakeDirectoryAction implements SingleActionInterface
{
public function __construct(
private readonly StationFilesystems $stationFilesystems
@ -22,7 +23,7 @@ final class MakeDirectoryAction
public function __invoke(
ServerRequest $request,
Response $response,
string $station_id
array $params
): ResponseInterface {
$currentDir = $request->getParam('currentDirectory', '');
$newDirName = $request->getParam('name', '');

View File

@ -4,13 +4,14 @@ declare(strict_types=1);
namespace App\Controller\Api\Stations\Files;
use App\Controller\SingleActionInterface;
use App\Entity\Repository\StationMediaRepository;
use App\Flysystem\StationFilesystems;
use App\Http\Response;
use App\Http\ServerRequest;
use Psr\Http\Message\ResponseInterface;
final class PlayAction
final class PlayAction implements SingleActionInterface
{
public function __construct(
private readonly StationMediaRepository $mediaRepo,
@ -21,11 +22,13 @@ final class PlayAction
public function __invoke(
ServerRequest $request,
Response $response,
string $station_id,
string $id
array $params
): ResponseInterface {
set_time_limit(600);
/** @var string $id */
$id = $params['id'];
$station = $request->getStation();
$media = $this->mediaRepo->requireForStation($id, $station);

Some files were not shown because too many files have changed in this diff Show More