Modify ControllerInvoker and all controllers; other code cleanup.

This commit is contained in:
Buster "Silver Eagle" Neece 2022-05-22 02:39:00 -05:00
parent 2ffbcba510
commit 4b0139e3cb
No known key found for this signature in database
GPG Key ID: F1D2E64A0005E80E
169 changed files with 537 additions and 552 deletions

View File

@ -13,7 +13,7 @@ return static function (RouteCollectorProxy $app) {
function (RouteCollectorProxy $group) {
$group->options(
'/{routes:.+}',
function (ServerRequest $request, Response $response) {
function (ServerRequest $request, Response $response, ...$params) {
return $response
->withHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS')
->withHeader(
@ -26,7 +26,7 @@ return static function (RouteCollectorProxy $app) {
$group->get(
'',
function (ServerRequest $request, Response $response): ResponseInterface {
function (ServerRequest $request, Response $response, ...$params): ResponseInterface {
return $response->withRedirect('/static/api/index.html');
}
)->setName('api:index:index');

View File

@ -55,10 +55,10 @@ return static function (RouteCollectorProxy $group) {
}
)->add(new Middleware\Permissions(GlobalPermissions::Backups));
$group->get('/server/stats', Controller\Api\Admin\ServerStatsController::class)
$group->get('/server/stats', Controller\Api\Admin\ServerStatsAction::class)
->setName('api:admin:server:stats');
$group->get('/permissions', Controller\Api\Admin\PermissionsController::class)
$group->get('/permissions', Controller\Api\Admin\PermissionsAction::class)
->add(new Middleware\Permissions(GlobalPermissions::All));
$group->map(

View File

@ -7,8 +7,9 @@ use App\Middleware;
use Slim\Routing\RouteCollectorProxy;
return static function (RouteCollectorProxy $app) {
$app->get('/public/sw.js',
function (ServerRequest $request, Response $response) {
$app->get(
'/public/sw.js',
function (ServerRequest $request, Response $response, ...$params) {
return $response
->withHeader('Content-Type', 'text/javascript')
->write(
@ -52,13 +53,19 @@ return static function (RouteCollectorProxy $app) {
$group->get('/podcasts', Controller\Frontend\PublicPages\PodcastsController::class)
->setName('public:podcasts');
$group->get('/podcast/{podcast_id}/episodes', Controller\Frontend\PublicPages\PodcastEpisodesController::class)
$group->get(
'/podcast/{podcast_id}/episodes',
Controller\Frontend\PublicPages\PodcastEpisodesAction::class
)
->setName('public:podcast:episodes');
$group->get('/podcast/{podcast_id}/episode/{episode_id}', Controller\Frontend\PublicPages\PodcastEpisodeController::class)
$group->get(
'/podcast/{podcast_id}/episode/{episode_id}',
Controller\Frontend\PublicPages\PodcastEpisodeAction::class
)
->setName('public:podcast:episode');
$group->get('/podcast/{podcast_id}/feed', Controller\Frontend\PublicPages\PodcastFeedController::class)
$group->get('/podcast/{podcast_id}/feed', Controller\Frontend\PublicPages\PodcastFeedAction::class)
->setName('public:podcast:feed');
}
)

View File

@ -13,7 +13,7 @@ return static function (RouteCollectorProxy $app) {
function (RouteCollectorProxy $group) {
$group->get(
'',
function (ServerRequest $request, Response $response) {
function (ServerRequest $request, Response $response, ...$params) {
return $response->withRedirect(
(string)$request->getRouter()->fromHere('stations:profile:index')
);

View File

@ -365,7 +365,7 @@ return [
Symfony\Component\Messenger\MessageBus::class => static function (
App\MessageQueue\QueueManager $queueManager,
App\LockFactory $lockFactory,
\App\Lock\LockFactory $lockFactory,
Monolog\Logger $logger,
ContainerInterface $di,
App\Plugins $plugins,
@ -530,4 +530,13 @@ return [
);
},
App\Assets::class => static fn(Environment $env) => new App\Assets(
$env,
require __DIR__ . '/assets.php'
),
App\Webhook\ConnectorLocator::class => static fn(ContainerInterface $di) => new App\Webhook\ConnectorLocator(
$di,
require __DIR__ . '/webhooks.php'
),
];

View File

@ -9,22 +9,13 @@ use App\Enums\SupportedLocales;
use App\Http\Factory\ResponseFactory;
use App\Http\Factory\ServerRequestFactory;
use DI;
use Invoker\Invoker;
use Invoker\ParameterResolver\AssociativeArrayResolver;
use Invoker\ParameterResolver\Container\TypeHintContainerResolver;
use Invoker\ParameterResolver\DefaultValueResolver;
use Invoker\ParameterResolver\ResolverChain;
use Monolog\ErrorHandler;
use Monolog\Registry;
use Psr\EventDispatcher\EventDispatcherInterface;
use Psr\Log\LoggerInterface;
use Slim\App;
use Slim\Factory\ServerRequestCreatorFactory;
use const E_COMPILE_ERROR;
use const E_CORE_ERROR;
use const E_ERROR;
use const E_PARSE;
use const E_USER_ERROR;
use Slim\Handlers\Strategies\RequestResponseNamedArgs;
class AppFactory
{
@ -62,21 +53,7 @@ class AppFactory
$container->set(App::class, $app);
$routeCollector = $app->getRouteCollector();
// Use the PHP-DI Bridge's action invocation helper.
$resolvers = [
// Inject parameters by name first
new AssociativeArrayResolver(),
// Then inject services by type-hints for those that weren't resolved
new TypeHintContainerResolver($container),
// Then fall back on parameters default values for optional route parameters
new DefaultValueResolver(),
];
$invoker = new Invoker(new ResolverChain($resolvers), $container);
$controllerInvoker = new ControllerInvoker($invoker);
$routeCollector->setDefaultInvocationStrategy($controllerInvoker);
$routeCollector->setDefaultInvocationStrategy(new RequestResponseNamedArgs());
$environment = $container->get(Environment::class);
if ($environment->isProduction()) {
@ -123,33 +100,10 @@ class AppFactory
$di = $containerBuilder->build();
// Monolog setup
$logger = $di->get(LoggerInterface::class);
register_shutdown_function(
static function (LoggerInterface $logger): void {
$error = error_get_last();
if (null === $error) {
return;
}
$errno = $error["type"];
$errfile = $error["file"];
$errline = $error["line"];
$errstr = $error["message"];
if ($errno &= E_PARSE | E_ERROR | E_USER_ERROR | E_CORE_ERROR | E_COMPILE_ERROR) {
$logger->critical(
sprintf(
'Fatal error: %s in %s on line %d',
$errstr,
$errfile,
$errline
)
);
}
},
$logger
);
$errorHandler = new ErrorHandler($logger);
$errorHandler->registerFatalHandler();
Registry::addLogger($logger, 'app', true);

View File

@ -45,9 +45,9 @@ class Assets
public function __construct(
protected Environment $environment,
Config $config
array $libraries,
) {
foreach ($config->get('assets') as $library_name => $library) {
foreach ($libraries as $library_name => $library) {
$this->addLibrary($library, $library_name);
}

View File

@ -1,60 +0,0 @@
<?php
declare(strict_types=1);
namespace App;
use const EXTR_OVERWRITE;
class Config
{
protected string $baseFolder;
public function __construct(Environment $environment)
{
$this->baseFolder = $environment->getConfigDirectory();
}
/**
* @param string $name
* @param array $inject_vars Variables to pass into the scope of the configuration.
*
* @return array<mixed>
* @noinspection PhpIncludeInspection
* @noinspection UselessUnsetInspection
*/
public function get(string $name, array $inject_vars = []): array
{
$path = $this->getPath($name);
if (is_file($path)) {
unset($name);
extract($inject_vars, EXTR_OVERWRITE);
unset($inject_vars);
return require $path;
}
return [];
}
/**
* Return the configuration path resolved by the specified name.
*
* @param string $name
*/
public function getPath(string $name): string
{
return $this->baseFolder . DIRECTORY_SEPARATOR . str_replace(['.', '..'], ['', ''], $name) . '.php';
}
/**
* Indicate whether a given configuration file name exists.
*
* @param string $name
*/
public function has(string $name): bool
{
return file_exists($this->getPath($name));
}
}

View File

@ -6,7 +6,7 @@ namespace App\Console\Command\Sync;
use App\Console\Command\CommandAbstract;
use App\Environment;
use App\LockFactory;
use App\Lock\LockFactory;
use Psr\Log\LoggerInterface;
use Symfony\Component\Console\Style\SymfonyStyle;
use Symfony\Component\Lock\Lock;
@ -95,7 +95,7 @@ abstract class AbstractSyncCommand extends CommandAbstract
$this->processes[$processKey] = [
'process' => $process,
'lock' => $lock,
'lock' => $lock,
];
}
}

View File

@ -6,7 +6,7 @@ namespace App\Console\Command\Sync;
use App\Entity\Repository\SettingsRepository;
use App\Environment;
use App\LockFactory;
use App\Lock\LockFactory;
use Doctrine\ORM\EntityManagerInterface;
use Psr\Log\LoggerInterface;
use Symfony\Component\Console\Attribute\AsCommand;

View File

@ -7,7 +7,7 @@ namespace App\Console\Command\Sync;
use App\Entity\Repository\SettingsRepository;
use App\Environment;
use App\Event\GetSyncTasks;
use App\LockFactory;
use App\Lock\LockFactory;
use App\Sync\Task\AbstractTask;
use Carbon\CarbonImmutable;
use Cron\CronExpression;

View File

@ -25,7 +25,7 @@ final class ClearStationQueueAction
public function __invoke(
ServerRequest $request,
Response $response,
int|string $station_id,
int|string $station_id
): ResponseInterface {
$testHandler = new TestHandler(Level::Debug, false);
$this->logger->pushHandler($testHandler);

View File

@ -30,7 +30,8 @@ final class IndexAction
public function __invoke(
ServerRequest $request,
Response $response
Response $response,
int|string $station_id
): ResponseInterface {
$queues = AbstractQueueManager::getAllQueues();

View File

@ -23,7 +23,7 @@ final class NextSongAction
public function __invoke(
ServerRequest $request,
Response $response,
int|string $station_id,
int|string $station_id
): ResponseInterface {
$testHandler = new TestHandler(Level::Debug, false);
$this->logger->pushHandler($testHandler);

View File

@ -23,7 +23,7 @@ final class NowPlayingAction
public function __invoke(
ServerRequest $request,
Response $response,
int|string $station_id,
int|string $station_id
): ResponseInterface {
$testHandler = new TestHandler(Level::Debug, false);
$this->logger->pushHandler($testHandler);

View File

@ -22,7 +22,7 @@ final class TelnetAction
public function __invoke(
ServerRequest $request,
Response $response,
int|string $station_id,
int|string $station_id
): ResponseInterface {
$testHandler = new TestHandler(Level::Debug, false);
$this->logger->pushHandler($testHandler);

View File

@ -49,7 +49,7 @@ final class LogsController extends AbstractLogViewerController
/**
* @return array<string, array>
*/
protected function getGlobalLogs(): array
private function getGlobalLogs(): array
{
$tempDir = $this->environment->getTempDirectory();
$logPaths = [];

View File

@ -19,7 +19,7 @@ final class RelaysAction
public function __invoke(
ServerRequest $request,
Response $response,
Response $response
): ResponseInterface {
$relays = $this->em->createQueryBuilder()
->select('e')

View File

@ -19,7 +19,7 @@ final class SettingsAction
public function __invoke(
ServerRequest $request,
Response $response,
Response $response
): ResponseInterface {
$router = $request->getRouter();

View File

@ -20,7 +20,7 @@ final class StationsAction
public function __invoke(
ServerRequest $request,
Response $response,
Response $response
): ResponseInterface {
$router = $request->getRouter();

View File

@ -18,7 +18,7 @@ final class UsersAction
public function __invoke(
ServerRequest $request,
Response $response,
Response $response
): ResponseInterface {
$router = $request->getRouter();

View File

@ -6,7 +6,6 @@ namespace App\Controller\Api\Admin;
use App\Controller\Api\AbstractApiCrudController;
use App\Entity;
use App\Exception;
use App\Http\Response;
use App\Http\ServerRequest;
use Psr\Http\Message\ResponseInterface;
@ -17,21 +16,19 @@ use Psr\Http\Message\ResponseInterface;
*/
abstract class AbstractAdminApiCrudController extends AbstractApiCrudController
{
public function listAction(ServerRequest $request, Response $response): ResponseInterface
{
public function listAction(
ServerRequest $request,
Response $response
): ResponseInterface {
$query = $this->em->createQuery('SELECT e FROM ' . $this->entityClass . ' e');
return $this->listPaginatedFromQuery($request, $response, $query);
}
/**
* @param ServerRequest $request
* @param Response $response
*
* @throws Exception
*/
public function createAction(ServerRequest $request, Response $response): ResponseInterface
{
public function createAction(
ServerRequest $request,
Response $response
): ResponseInterface {
$row = $this->createRecord((array)$request->getParsedBody());
$return = $this->viewRecord($row, $request);
@ -40,7 +37,6 @@ abstract class AbstractAdminApiCrudController extends AbstractApiCrudController
/**
* @param array $data
*
* @return TEntity
*/
protected function createRecord(array $data): object
@ -48,13 +44,11 @@ abstract class AbstractAdminApiCrudController extends AbstractApiCrudController
return $this->editRecord($data);
}
/**
* @param ServerRequest $request
* @param Response $response
* @param mixed $id
*/
public function getAction(ServerRequest $request, Response $response, mixed $id): ResponseInterface
{
public function getAction(
ServerRequest $request,
Response $response,
mixed $id
): ResponseInterface {
$record = $this->getRecord($id);
if (null === $record) {
@ -76,13 +70,11 @@ abstract class AbstractAdminApiCrudController extends AbstractApiCrudController
return $this->em->find($this->entityClass, $id);
}
/**
* @param ServerRequest $request
* @param Response $response
* @param mixed $id
*/
public function editAction(ServerRequest $request, Response $response, mixed $id): ResponseInterface
{
public function editAction(
ServerRequest $request,
Response $response,
mixed $id
): ResponseInterface {
$record = $this->getRecord($id);
if (null === $record) {
@ -95,13 +87,11 @@ abstract class AbstractAdminApiCrudController extends AbstractApiCrudController
return $response->withJson(Entity\Api\Status::updated());
}
/**
* @param ServerRequest $request
* @param Response $response
* @param mixed $id
*/
public function deleteAction(ServerRequest $request, Response $response, mixed $id): ResponseInterface
{
public function deleteAction(
ServerRequest $request,
Response $response,
mixed $id
): ResponseInterface {
$record = $this->getRecord($id);
if (null === $record) {

View File

@ -28,10 +28,10 @@ final class AuditLogAction
): ResponseInterface {
$tz = new DateTimeZone('UTC');
$params = $request->getParams();
if (!empty($params['start']) && !empty($params['end'])) {
$start = CarbonImmutable::parse($params['start'], $tz)->setSecond(0);
$end = CarbonImmutable::parse($params['end'], $tz)->setSecond(59);
$allParams = $request->getParams();
if (!empty($allParams['start']) && !empty($allParams['end'])) {
$start = CarbonImmutable::parse($allParams['start'], $tz)->setSecond(0);
$end = CarbonImmutable::parse($allParams['end'], $tz)->setSecond(59);
} else {
$start = CarbonImmutable::parse('-2 weeks', $tz);
$end = CarbonImmutable::now($tz);
@ -45,7 +45,7 @@ final class AuditLogAction
->setParameter('start', $start->getTimestamp())
->setParameter('end', $end->getTimestamp());
$search_phrase = trim($params['searchPhrase'] ?? '');
$search_phrase = trim($allParams['searchPhrase'] ?? '');
if (!empty($search_phrase)) {
$qb->andWhere('(a.user LIKE :query OR a.identifier LIKE :query OR a.target LIKE :query)')
->setParameter('query', '%' . $search_phrase . '%');

View File

@ -21,7 +21,7 @@ final class GetAction
public function __invoke(
ServerRequest $request,
Response $response,
Response $response
): ResponseInterface {
$router = $request->getRouter();

View File

@ -20,7 +20,7 @@ final class RunAction
public function __invoke(
ServerRequest $request,
Response $response,
Response $response
): ResponseInterface {
$data = (array)$request->getParsedBody();

View File

@ -19,7 +19,7 @@ final class GetAction
public function __invoke(
ServerRequest $request,
Response $response,
Response $response
): ResponseInterface {
$version = GeoLite::getVersion();
$settings = $this->settingsRepo->readSettings();

View File

@ -21,7 +21,7 @@ final class PostAction
public function __invoke(
ServerRequest $request,
Response $response,
Response $response
): ResponseInterface {
$newKey = trim($request->getParsedBodyParam('geolite_license_key', ''));

View File

@ -29,7 +29,7 @@ use Psr\Http\Message\ResponseInterface;
]
)
]
final class PermissionsController
final class PermissionsAction
{
public function __construct(
private readonly Acl $acl,
@ -38,7 +38,7 @@ final class PermissionsController
public function __invoke(
ServerRequest $request,
Response $response,
Response $response
): ResponseInterface {
$permissions = [];
foreach ($this->acl->listPermissions() as $group => $actions) {

View File

@ -154,10 +154,6 @@ final class RolesController extends AbstractAdminApiCrudController
$this->superAdminRole = $permissionRepo->ensureSuperAdministratorRole();
}
/**
* @param ServerRequest $request
* @param Response $response
*/
public function listAction(
ServerRequest $request,
Response $response

View File

@ -25,7 +25,7 @@ final class SendTestMessageAction
public function __invoke(
ServerRequest $request,
Response $response,
Response $response
): ResponseInterface {
$emailAddress = $request->getParam('email', '');

View File

@ -35,7 +35,7 @@ use Psr\Http\Message\ResponseInterface;
]
)
]
final class ServerStatsController
final class ServerStatsAction
{
public function __construct(
private readonly Environment $environment,
@ -44,7 +44,7 @@ final class ServerStatsController
public function __invoke(
ServerRequest $request,
Response $response,
Response $response
): ResponseInterface {
$firstCpuMeasurement = CpuStats::getCurrentLoad();
$firstNetworkMeasurement = NetworkStats::getNetworkUsage();

View File

@ -18,7 +18,7 @@ final class GetAction
public function __invoke(
ServerRequest $request,
Response $response,
Response $response
): ResponseInterface {
return $response->withJson(
[

View File

@ -14,7 +14,7 @@ final class StorageLocationsAction extends StationsController
{
public function __invoke(
ServerRequest $request,
Response $response,
Response $response
): ResponseInterface {
$newStorageLocationMessage = __('Create a new storage location based on the base directory.');

View File

@ -156,12 +156,10 @@ class StationsController extends AbstractAdminApiCrudController
parent::__construct($reloadableEm, $serializer, $validator);
}
/**
* @param ServerRequest $request
* @param Response $response
*/
public function listAction(ServerRequest $request, Response $response): ResponseInterface
{
public function listAction(
ServerRequest $request,
Response $response
): ResponseInterface {
$qb = $this->em->createQueryBuilder()
->select('e')
->from(Entity\Station::class, 'e');

View File

@ -144,8 +144,10 @@ final class StorageLocationsController extends AbstractAdminApiCrudController
parent::__construct($em, $serializer, $validator);
}
public function listAction(ServerRequest $request, Response $response): ResponseInterface
{
public function listAction(
ServerRequest $request,
Response $response
): ResponseInterface {
$qb = $this->em->createQueryBuilder();
$qb->select('sl')

View File

@ -135,12 +135,10 @@ class UsersController extends AbstractAdminApiCrudController
protected string $entityClass = Entity\User::class;
protected string $resourceRouteName = 'api:admin:user';
/**
* @param ServerRequest $request
* @param Response $response
*/
public function listAction(ServerRequest $request, Response $response): ResponseInterface
{
public function listAction(
ServerRequest $request,
Response $response
): ResponseInterface {
$qb = $this->em->createQueryBuilder()
->select('e')
->from(Entity\User::class, 'e');
@ -197,8 +195,11 @@ class UsersController extends AbstractAdminApiCrudController
return $return;
}
public function editAction(ServerRequest $request, Response $response, mixed $id): ResponseInterface
{
public function editAction(
ServerRequest $request,
Response $response,
mixed $id
): ResponseInterface {
$record = $this->getRecord($id);
if (null === $record) {
@ -217,8 +218,11 @@ class UsersController extends AbstractAdminApiCrudController
return $response->withJson(Entity\Api\Status::updated());
}
public function deleteAction(ServerRequest $request, Response $response, mixed $id): ResponseInterface
{
public function deleteAction(
ServerRequest $request,
Response $response,
mixed $id
): ResponseInterface {
$record = $this->getRecord($id);
if (null === $record) {

View File

@ -6,7 +6,6 @@ namespace App\Controller\Api\Frontend\Account;
use App\Controller\Api\AbstractApiCrudController;
use App\Entity;
use App\Exception;
use App\Http\Response;
use App\Http\ServerRequest;
use App\Security\SplitToken;
@ -22,8 +21,10 @@ final class ApiKeysController extends AbstractApiCrudController
protected string $entityClass = Entity\ApiKey::class;
protected string $resourceRouteName = 'api:frontend:api-key';
public function listAction(ServerRequest $request, Response $response): ResponseInterface
{
public function listAction(
ServerRequest $request,
Response $response
): ResponseInterface {
$query = $this->em->createQuery(
<<<'DQL'
SELECT e FROM App\Entity\ApiKey e WHERE e.user = :user
@ -33,14 +34,10 @@ final class ApiKeysController extends AbstractApiCrudController
return $this->listPaginatedFromQuery($request, $response, $query);
}
/**
* @param ServerRequest $request
* @param Response $response
*
* @throws Exception
*/
public function createAction(ServerRequest $request, Response $response): ResponseInterface
{
public function createAction(
ServerRequest $request,
Response $response
): ResponseInterface {
$newKey = SplitToken::generate();
$record = new Entity\ApiKey(
@ -57,13 +54,11 @@ final class ApiKeysController extends AbstractApiCrudController
return $response->withJson($return);
}
/**
* @param ServerRequest $request
* @param Response $response
* @param mixed $id
*/
public function getAction(ServerRequest $request, Response $response, mixed $id): ResponseInterface
{
public function getAction(
ServerRequest $request,
Response $response,
mixed $id
): ResponseInterface {
$record = $this->getRecord($request->getUser(), $id);
if (null === $record) {
@ -75,13 +70,11 @@ final class ApiKeysController extends AbstractApiCrudController
return $response->withJson($return);
}
/**
* @param ServerRequest $request
* @param Response $response
* @param mixed $id
*/
public function deleteAction(ServerRequest $request, Response $response, mixed $id): ResponseInterface
{
public function deleteAction(
ServerRequest $request,
Response $response,
mixed $id
): ResponseInterface {
$record = $this->getRecord($request->getUser(), $id);
if (null === $record) {
@ -99,7 +92,7 @@ final class ApiKeysController extends AbstractApiCrudController
*
* @return TEntity|null
*/
protected function getRecord(Entity\User $user, string $id): ?object
private function getRecord(Entity\User $user, string $id): ?object
{
/** @var TEntity|null $record */
$record = $this->em->getRepository(Entity\ApiKey::class)->findOneBy([

View File

@ -18,8 +18,10 @@ final class DeleteTwoFactorAction
}
public function __invoke(ServerRequest $request, Response $response): ResponseInterface
{
public function __invoke(
ServerRequest $request,
Response $response
): ResponseInterface {
$user = $request->getUser();
$user = $this->em->refetch($user);

View File

@ -25,7 +25,7 @@ final class ChartsAction
public function __invoke(
ServerRequest $request,
Response $response,
Response $response
): ResponseInterface {
if (!$this->settingsRepo->readSettings()->isAnalyticsEnabled()) {
return $response->withStatus(403, 'Forbidden')

View File

@ -19,7 +19,7 @@ final class NotificationsAction
public function __invoke(
ServerRequest $request,
Response $response,
Response $response
): ResponseInterface {
$event = new Event\GetNotifications($request);
$this->eventDispatcher->dispatch($event);

View File

@ -23,7 +23,7 @@ final class StationsAction
public function __invoke(
ServerRequest $request,
Response $response,
Response $response
): ResponseInterface {
$router = $request->getRouter();
$acl = $request->getAcl();

View File

@ -25,8 +25,10 @@ final class IndexController
),
]
)]
public function statusAction(ServerRequest $request, Response $response): ResponseInterface
{
public function statusAction(
ServerRequest $request,
Response $response
): ResponseInterface {
return $response->withJson(new Entity\Api\SystemStatus());
}
@ -43,8 +45,10 @@ final class IndexController
),
]
)]
public function timeAction(ServerRequest $request, Response $response): ResponseInterface
{
public function timeAction(
ServerRequest $request,
Response $response
): ResponseInterface {
return $response->withJson(new Entity\Api\Time());
}
}

View File

@ -27,6 +27,7 @@ final class LiquidsoapAction
public function __invoke(
ServerRequest $request,
Response $response,
int|string $station_id,
string $action
): ResponseInterface {
$station = $request->getStation();

View File

@ -23,6 +23,7 @@ final class ListenerAuthAction
public function __invoke(
ServerRequest $request,
Response $response,
int|string $station_id
): ResponseInterface {
$station = $request->getStation();

View File

@ -18,7 +18,7 @@ final class OpenApiAction
public function __invoke(
ServerRequest $request,
Response $response,
Response $response
): ResponseInterface {
$apiBaseUrl = str_replace(
'/openapi.yml',

View File

@ -6,7 +6,6 @@ namespace App\Controller\Api\Stations;
use App\Controller\Api\AbstractApiCrudController;
use App\Entity;
use App\Exception;
use App\Http\Response;
use App\Http\ServerRequest;
use Psr\Http\Message\ResponseInterface;
@ -18,17 +17,18 @@ use Symfony\Component\Serializer\Normalizer\AbstractNormalizer;
*/
abstract class AbstractStationApiCrudController extends AbstractApiCrudController
{
/**
* @param ServerRequest $request
* @param Response $response
*/
public function listAction(ServerRequest $request, Response $response): ResponseInterface
{
public function listAction(
ServerRequest $request,
Response $response,
int|string $station_id
): ResponseInterface {
$station = $this->getStation($request);
$query = $this->em->createQuery('SELECT e
$query = $this->em->createQuery(
'SELECT e
FROM ' . $this->entityClass . ' e
WHERE e.station = :station')
WHERE e.station = :station'
)
->setParameter('station', $station);
return $this->listPaginatedFromQuery($request, $response, $query);
@ -45,12 +45,11 @@ abstract class AbstractStationApiCrudController extends AbstractApiCrudControlle
return $request->getStation();
}
/**
* @param ServerRequest $request
* @param Response $response
*/
public function createAction(ServerRequest $request, Response $response): ResponseInterface
{
public function createAction(
ServerRequest $request,
Response $response,
int|string $station_id
): ResponseInterface {
$station = $this->getStation($request);
$row = $this->createRecord((array)$request->getParsedBody(), $station);
@ -80,18 +79,10 @@ abstract class AbstractStationApiCrudController extends AbstractApiCrudControlle
);
}
/**
* @param ServerRequest $request
* @param Response $response
* @param string|int $station_id
* @param string|int $id
*
* @throws Exception
*/
public function getAction(
ServerRequest $request,
Response $response,
mixed $station_id,
int|string $station_id,
mixed $id
): ResponseInterface {
$station = $this->getStation($request);
@ -122,16 +113,10 @@ abstract class AbstractStationApiCrudController extends AbstractApiCrudControlle
);
}
/**
* @param ServerRequest $request
* @param Response $response
* @param string|int $station_id
* @param string|int $id
*/
public function editAction(
ServerRequest $request,
Response $response,
mixed $station_id,
int|string $station_id,
mixed $id
): ResponseInterface {
$record = $this->getRecord($this->getStation($request), $id);
@ -146,16 +131,10 @@ abstract class AbstractStationApiCrudController extends AbstractApiCrudControlle
return $response->withJson(Entity\Api\Status::updated());
}
/**
* @param ServerRequest $request
* @param Response $response
* @param string|int $station_id
* @param string|int $id
*/
public function deleteAction(
ServerRequest $request,
Response $response,
mixed $station_id,
int|string $station_id,
mixed $id
): ResponseInterface {
$record = $this->getRecord($this->getStation($request), $id);

View File

@ -48,6 +48,7 @@ final class DeleteArtAction
public function __invoke(
ServerRequest $request,
Response $response,
int|string $station_id,
int|string $media_id
): ResponseInterface {
$station = $request->getStation();

View File

@ -48,6 +48,7 @@ final class GetArtAction
public function __invoke(
ServerRequest $request,
Response $response,
int|string $station_id,
string $media_id
): ResponseInterface {
$station = $request->getStation();

View File

@ -51,6 +51,7 @@ final class PostArtAction
public function __invoke(
ServerRequest $request,
Response $response,
int|string $station_id,
int|string $media_id
): ResponseInterface {
$station = $request->getStation();

View File

@ -12,7 +12,8 @@ final class GetSettingsAction
{
public function __invoke(
ServerRequest $request,
Response $response
Response $response,
int|string $station_id
): ResponseInterface {
$station = $request->getStation();

View File

@ -20,6 +20,7 @@ final class PutSettingsAction
public function __invoke(
ServerRequest $request,
Response $response,
int|string $station_id
): ResponseInterface {
$station = $request->getStation();

View File

@ -37,7 +37,8 @@ final class RunAction
public function __invoke(
ServerRequest $request,
Response $response
Response $response,
int|string $station_id
): ResponseInterface {
$station = $request->getStation();

View File

@ -8,8 +8,8 @@ use App\Entity\Repository\CustomFieldRepository;
use App\Entity\Repository\StationPlaylistRepository;
use App\Http\Response;
use App\Http\ServerRequest;
use App\Service\CsvWriterTempFile;
use Doctrine\ORM\EntityManagerInterface;
use League\Csv\Writer;
use Psr\Http\Message\ResponseInterface;
final class DownloadAction
@ -24,6 +24,7 @@ final class DownloadAction
public function __invoke(
ServerRequest $request,
Response $response,
int|string $station_id
): ResponseInterface {
$station = $request->getStation();
@ -50,8 +51,10 @@ final class DownloadAction
$filename = $station->getShortName() . '_all_media.csv';
$tempFile = new CsvWriterTempFile();
$csv = $tempFile->getWriter();
if (!($tempFile = tmpfile())) {
throw new \RuntimeException('Could not create temp file.');
}
$csv = Writer::createFromStream($tempFile);
/*
* NOTE: These field names should correspond with DB property names when converted into short_names.
@ -119,6 +122,6 @@ final class DownloadAction
$csv->insertOne($bodyRow);
}
return $response->withFileDownload($tempFile->getTempPath(), $filename, 'text/csv');
return $response->withFileDownload($tempFile, $filename, 'text/csv');
}
}

View File

@ -15,13 +15,14 @@ use Psr\Http\Message\ResponseInterface;
use Symfony\Component\Serializer\Normalizer\AbstractNormalizer;
use Symfony\Component\Serializer\Serializer;
use Symfony\Component\Validator\Validator\ValidatorInterface;
use Throwable;
use function count;
use function str_starts_with;
final class UploadAction
{
protected const ALLOWED_MEDIA_FIELDS = [
private const ALLOWED_MEDIA_FIELDS = [
'title',
'artist',
'album',
@ -48,7 +49,8 @@ final class UploadAction
public function __invoke(
ServerRequest $request,
Response $response
Response $response,
int|string $station_id
): ResponseInterface {
$station = $request->getStation();
@ -138,7 +140,7 @@ final class UploadAction
if ($rowResult) {
$processed++;
}
} catch (\Throwable $e) {
} catch (Throwable $e) {
$importResult['success'] = false;
$importResult['error'] = $e->getMessage();
}

View File

@ -35,7 +35,8 @@ final class DeleteFallbackAction
public function __invoke(
ServerRequest $request,
Response $response
Response $response,
int|string $station_id
): ResponseInterface {
$station = $request->getStation();
$this->stationRepo->clearFallback($station);

View File

@ -35,6 +35,7 @@ final class GetFallbackAction
public function __invoke(
ServerRequest $request,
Response $response,
int|string $station_id
): ResponseInterface {
set_time_limit(600);

View File

@ -36,7 +36,8 @@ final class PostFallbackAction
public function __invoke(
ServerRequest $request,
Response $response
Response $response,
int|string $station_id
): ResponseInterface {
$station = $request->getStation();

View File

@ -45,7 +45,8 @@ final class BatchAction
public function __invoke(
ServerRequest $request,
Response $response
Response $response,
int|string $station_id
): ResponseInterface {
$station = $request->getStation();
$storageLocation = $station->getMediaStorageLocation();

View File

@ -14,7 +14,8 @@ final class DownloadAction
{
public function __invoke(
ServerRequest $request,
Response $response
Response $response,
int|string $station_id
): ResponseInterface {
set_time_limit(600);

View File

@ -27,8 +27,9 @@ final class FlowUploadAction
public function __invoke(
ServerRequest $request,
Response $response,
int|string $station_id
): ResponseInterface {
$params = $request->getParams();
$allParams = $request->getParams();
$station = $request->getStation();
$mediaStorage = $station->getMediaStorageLocation();
@ -66,8 +67,8 @@ final class FlowUploadAction
}
// If the user is looking at a playlist's contents, add uploaded media to that playlist.
if (!empty($params['searchPhrase'])) {
$search_phrase = $params['searchPhrase'];
if (!empty($allParams['searchPhrase'])) {
$search_phrase = $allParams['searchPhrase'];
if (str_starts_with($search_phrase, 'playlist:')) {
$playlist_name = substr($search_phrase, 9);

View File

@ -33,6 +33,7 @@ final class ListAction
public function __invoke(
ServerRequest $request,
Response $response,
int|string $station_id
): ResponseInterface {
$router = $request->getRouter();

View File

@ -15,7 +15,8 @@ final class ListDirectoriesAction
{
public function __invoke(
ServerRequest $request,
Response $response
Response $response,
int|string $station_id
): ResponseInterface {
$station = $request->getStation();

View File

@ -15,7 +15,8 @@ final class MakeDirectoryAction
{
public function __invoke(
ServerRequest $request,
Response $response
Response $response,
int|string $station_id
): ResponseInterface {
$currentDir = $request->getParam('currentDirectory', '');
$newDirName = $request->getParam('name', '');

View File

@ -20,7 +20,8 @@ final class PlayAction
public function __invoke(
ServerRequest $request,
Response $response,
int|string $id,
int|string $station_id,
int|string $id
): ResponseInterface {
set_time_limit(600);

View File

@ -21,6 +21,7 @@ final class RenameAction
public function __invoke(
ServerRequest $request,
Response $response,
int|string $station_id
): ResponseInterface {
$from = $request->getParam('file');
if (empty($from)) {

View File

@ -163,8 +163,11 @@ final class FilesController extends AbstractStationApiCrudController
parent::__construct($em, $serializer, $validator);
}
public function listAction(ServerRequest $request, Response $response): ResponseInterface
{
public function listAction(
ServerRequest $request,
Response $response,
int|string $station_id
): ResponseInterface {
$storageLocation = $this->getStation($request)->getMediaStorageLocation();
$query = $this->em->createQuery(
@ -177,8 +180,11 @@ final class FilesController extends AbstractStationApiCrudController
return $this->listPaginatedFromQuery($request, $response, $query);
}
public function createAction(ServerRequest $request, Response $response): ResponseInterface
{
public function createAction(
ServerRequest $request,
Response $response,
int|string $station_id
): ResponseInterface {
$station = $this->getStation($request);
$mediaStorage = $station->getMediaStorageLocation();
@ -214,7 +220,7 @@ final class FilesController extends AbstractStationApiCrudController
public function editAction(
ServerRequest $request,
Response $response,
mixed $station_id,
int|string $station_id,
mixed $id
): ResponseInterface {
$station = $this->getStation($request);

View File

@ -20,6 +20,7 @@ final class GetQuotaAction
public function __invoke(
ServerRequest $request,
Response $response,
int|string $station_id,
string $type = null
): ResponseInterface {
$typeEnum = Entity\Enums\StorageLocationTypes::tryFrom($type ?? '')

View File

@ -12,7 +12,8 @@ final class GetRestartStatusAction
{
public function __invoke(
ServerRequest $request,
Response $response
Response $response,
int|string $station_id
): ResponseInterface {
$station = $request->getStation();
return $response->withJson([

View File

@ -10,11 +10,11 @@ use App\Environment;
use App\Http\Response;
use App\Http\ServerRequest;
use App\OpenApi;
use App\Service\CsvWriterTempFile;
use Azura\DoctrineBatchUtils\ReadOnlyBatchIteratorAggregate;
use Carbon\CarbonImmutable;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\Query;
use League\Csv\Writer;
use OpenApi\Attributes as OA;
use Psr\Http\Message\ResponseInterface;
@ -66,12 +66,11 @@ final class HistoryController
) {
}
/**
* @param ServerRequest $request
* @param Response $response
*/
public function __invoke(ServerRequest $request, Response $response): ResponseInterface
{
public function __invoke(
ServerRequest $request,
Response $response,
int|string $station_id
): ResponseInterface {
set_time_limit($this->environment->getSyncLongExecutionTime());
$station = $request->getStation();
@ -149,8 +148,10 @@ final class HistoryController
Query $query,
string $filename
): ResponseInterface {
$tempFile = new CsvWriterTempFile();
$csv = $tempFile->getWriter();
if (!($tempFile = tmpfile())) {
throw new \RuntimeException('Could not create temp file.');
}
$csv = Writer::createFromStream($tempFile);
$csv->insertOne([
'Date',
@ -192,6 +193,6 @@ final class HistoryController
]);
}
return $response->withFileDownload($tempFile->getTempPath(), $filename, 'text/csv');
return $response->withFileDownload($tempFile, $filename, 'text/csv');
}
}

View File

@ -58,7 +58,8 @@ final class IndexController
public function indexAction(
ServerRequest $request,
Response $response
Response $response,
int|string $station_id
): ResponseInterface {
$station = $request->getStation();

View File

@ -13,7 +13,8 @@ final class GetAction
{
public function __invoke(
ServerRequest $request,
Response $response
Response $response,
int|string $station_id
): ResponseInterface {
$backendConfig = $request->getStation()->getBackendConfig();

View File

@ -27,6 +27,7 @@ final class PutAction
public function __invoke(
ServerRequest $request,
Response $response,
int|string $station_id
): ResponseInterface {
$body = (array)$request->getParsedBody();

View File

@ -8,10 +8,10 @@ use App\Entity;
use App\Http\Response;
use App\Http\ServerRequest;
use App\OpenApi;
use App\Service\CsvWriterTempFile;
use Carbon\CarbonImmutable;
use Doctrine\ORM\AbstractQuery;
use Doctrine\ORM\EntityManagerInterface;
use League\Csv\Writer;
use OpenApi\Attributes as OA;
use Psr\Http\Message\ResponseInterface;
@ -53,13 +53,14 @@ final class ListenersAction
public function __invoke(
ServerRequest $request,
Response $response,
int|string $station_id
): ResponseInterface {
$station = $request->getStation();
$stationTz = $station->getTimezoneObject();
$params = $request->getQueryParams();
$queryParams = $request->getQueryParams();
$isLive = empty($params['start']);
$isLive = empty($queryParams['start']);
$now = CarbonImmutable::now($stationTz);
if ($isLive) {
@ -69,11 +70,11 @@ final class ListenersAction
$listenersIterator = $this->listenerRepo->iterateLiveListenersArray($station);
} else {
$start = CarbonImmutable::parse($params['start'], $stationTz)
$start = CarbonImmutable::parse($queryParams['start'], $stationTz)
->setSecond(0);
$startTimestamp = $start->getTimestamp();
$end = CarbonImmutable::parse($params['end'] ?? $params['start'], $stationTz)
$end = CarbonImmutable::parse($queryParams['end'] ?? $queryParams['start'], $stationTz)
->setSecond(59);
$endTimestamp = $end->getTimestamp();
@ -101,7 +102,7 @@ final class ListenersAction
$listeners = [];
$listenersByHash = [];
$groupByUnique = ('false' !== ($params['unique'] ?? 'true'));
$groupByUnique = ('false' !== ($queryParams['unique'] ?? 'true'));
$nowTimestamp = $now->getTimestamp();
foreach ($listenersIterator as $listener) {
@ -178,7 +179,7 @@ final class ListenersAction
}
}
$format = $params['format'] ?? 'json';
$format = $queryParams['format'] ?? 'json';
if ('csv' === $format) {
return $this->exportReportAsCsv(
@ -204,8 +205,10 @@ final class ListenersAction
array $listeners,
string $filename
): ResponseInterface {
$tempFile = new CsvWriterTempFile();
$csv = $tempFile->getWriter();
if (!($tempFile = tmpfile())) {
throw new \RuntimeException('Could not create temp file.');
}
$csv = Writer::createFromStream($tempFile);
$tz = $station->getTimezoneObject();
@ -262,6 +265,6 @@ final class ListenersAction
$csv->insertOne($exportRow);
}
return $response->withFileDownload($tempFile->getTempPath(), $filename, 'text/csv');
return $response->withFileDownload($tempFile, $filename, 'text/csv');
}
}

View File

@ -43,6 +43,7 @@ final class DeleteIntroAction
public function __invoke(
ServerRequest $request,
Response $response,
int|string $station_id,
int $id
): ResponseInterface {
$station = $request->getStation();

View File

@ -47,6 +47,7 @@ final class GetIntroAction
public function __invoke(
ServerRequest $request,
Response $response,
int|string $station_id,
int $id
): ResponseInterface {
set_time_limit(600);

View File

@ -44,6 +44,7 @@ final class PostIntroAction
public function __invoke(
ServerRequest $request,
Response $response,
int|string $station_id,
?int $id = null
): ResponseInterface {
$station = $request->getStation();

View File

@ -157,12 +157,11 @@ final class MountsController extends AbstractStationApiCrudController
parent::__construct($em, $serializer, $validator);
}
/**
* @param ServerRequest $request
* @param Response $response
*/
public function listAction(ServerRequest $request, Response $response): ResponseInterface
{
public function listAction(
ServerRequest $request,
Response $response,
int|string $station_id
): ResponseInterface {
$station = $request->getStation();
$qb = $this->em->createQueryBuilder()
@ -216,7 +215,8 @@ final class MountsController extends AbstractStationApiCrudController
public function createAction(
ServerRequest $request,
Response $response
Response $response,
int|string $station_id
): ResponseInterface {
$station = $request->getStation();
@ -237,8 +237,8 @@ final class MountsController extends AbstractStationApiCrudController
public function deleteAction(
ServerRequest $request,
Response $response,
mixed $station_id,
mixed $id
int|string $station_id,
mixed $id,
): ResponseInterface {
$record = $this->getRecord($this->getStation($request), $id);

View File

@ -20,7 +20,8 @@ final class DownloadAction
public function __invoke(
ServerRequest $request,
Response $response,
string $media_id,
int|string $station_id,
string $media_id
): ResponseInterface {
$station = $request->getStation();

View File

@ -31,6 +31,7 @@ final class ListAction
public function __invoke(
ServerRequest $request,
Response $response,
int|string $station_id
): ResponseInterface {
$station = $request->getStation();
@ -51,9 +52,9 @@ final class ListAction
$trackList = new ArrayCollection($trackList);
$params = $request->getQueryParams();
$queryParams = $request->getQueryParams();
$searchPhrase = trim($params['searchPhrase'] ?? '');
$searchPhrase = trim($queryParams['searchPhrase'] ?? '');
if (!empty($searchPhrase)) {
$searchFields = [
'media_title',
@ -79,9 +80,9 @@ final class ListAction
);
}
if (!empty($params['sort'])) {
$sortField = $params['sort'];
$sortDirection = $params['sortOrder'] ?? Criteria::ASC;
if (!empty($queryParams['sort'])) {
$sortField = $queryParams['sort'];
$sortDirection = $queryParams['sortOrder'] ?? Criteria::ASC;
$criteria = new Criteria();
$criteria->orderBy([$sortField => $sortDirection]);

View File

@ -16,6 +16,7 @@ final class CloneAction extends AbstractPlaylistsAction
public function __invoke(
ServerRequest $request,
Response $response,
int|string $station_id,
int $id
): ResponseInterface {
$record = $this->requireRecord($request->getStation(), $id);

View File

@ -7,19 +7,27 @@ namespace App\Controller\Api\Stations\Playlists;
use App\Entity;
use App\Http\Response;
use App\Http\ServerRequest;
use Doctrine\ORM\EntityManagerInterface;
use Psr\Http\Message\ResponseInterface;
final class DeleteQueueAction extends AbstractPlaylistsAction
{
public function __construct(
EntityManagerInterface $em,
private readonly Entity\Repository\StationPlaylistMediaRepository $spmRepo,
) {
parent::__construct($em);
}
public function __invoke(
ServerRequest $request,
Response $response,
Entity\Repository\StationPlaylistMediaRepository $spmRepo,
int|string $station_id,
int $id
): ResponseInterface {
$record = $this->requireRecord($request->getStation(), $id);
$spmRepo->resetQueue($record);
$this->spmRepo->resetQueue($record);
return $response->withJson(
new Entity\Api\Status(

View File

@ -14,6 +14,7 @@ final class ExportAction extends AbstractPlaylistsAction
public function __invoke(
ServerRequest $request,
Response $response,
int|string $station_id,
int $id,
string $format = 'pls'
): ResponseInterface {

View File

@ -15,6 +15,7 @@ final class GetOrderAction extends AbstractPlaylistsAction
public function __invoke(
ServerRequest $request,
Response $response,
int|string $station_id,
int $id
): ResponseInterface {
$station = $request->getStation();

View File

@ -24,6 +24,7 @@ final class GetQueueAction extends AbstractPlaylistsAction
public function __invoke(
ServerRequest $request,
Response $response,
int|string $station_id,
int $id
): ResponseInterface {
$record = $this->requireRecord($request->getStation(), $id);

View File

@ -25,6 +25,7 @@ final class ImportAction extends AbstractPlaylistsAction
public function __invoke(
ServerRequest $request,
Response $response,
int|string $station_id,
int $id
): ResponseInterface {
$playlist = $this->requireRecord($request->getStation(), $id);

View File

@ -23,6 +23,7 @@ final class PutOrderAction extends AbstractPlaylistsAction
public function __invoke(
ServerRequest $request,
Response $response,
int|string $station_id,
int $id
): ResponseInterface {
$record = $this->requireRecord($request->getStation(), $id);

View File

@ -22,6 +22,7 @@ final class ReshuffleAction extends AbstractPlaylistsAction
public function __invoke(
ServerRequest $request,
Response $response,
int|string $station_id,
int $id
): ResponseInterface {
$record = $this->requireRecord($request->getStation(), $id);

View File

@ -14,6 +14,7 @@ final class ToggleAction extends AbstractPlaylistsAction
public function __invoke(
ServerRequest $request,
Response $response,
int|string $station_id,
int $id
): ResponseInterface {
$record = $this->requireRecord($request->getStation(), $id);

View File

@ -145,11 +145,11 @@ final class PlaylistsController extends AbstractScheduledEntityController
protected string $entityClass = Entity\StationPlaylist::class;
protected string $resourceRouteName = 'api:stations:playlist';
/**
* @inheritDoc
*/
public function listAction(ServerRequest $request, Response $response): ResponseInterface
{
public function listAction(
ServerRequest $request,
Response $response,
int|string $station_id
): ResponseInterface {
$station = $request->getStation();
$qb = $this->em->createQueryBuilder()
@ -183,8 +183,11 @@ final class PlaylistsController extends AbstractScheduledEntityController
* @param ServerRequest $request
* @param Response $response
*/
public function scheduleAction(ServerRequest $request, Response $response): ResponseInterface
{
public function scheduleAction(
ServerRequest $request,
Response $response,
int|string $station_id
): ResponseInterface {
$station = $request->getStation();
$scheduleItems = $this->em->createQuery(

View File

@ -198,6 +198,7 @@ final class PodcastEpisodesController extends AbstractApiCrudController
public function listAction(
ServerRequest $request,
Response $response,
int|string $station_id,
string $podcast_id
): ResponseInterface {
$station = $request->getStation();
@ -225,6 +226,8 @@ final class PodcastEpisodesController extends AbstractApiCrudController
public function getAction(
ServerRequest $request,
Response $response,
int|string $station_id,
string $podcast_id,
string $episode_id
): ResponseInterface {
$station = $request->getStation();
@ -242,6 +245,7 @@ final class PodcastEpisodesController extends AbstractApiCrudController
public function createAction(
ServerRequest $request,
Response $response,
int|string $station_id,
string $podcast_id
): ResponseInterface {
$station = $request->getStation();
@ -285,6 +289,8 @@ final class PodcastEpisodesController extends AbstractApiCrudController
public function editAction(
ServerRequest $request,
Response $response,
int|string $station_id,
string $podcast_id,
string $episode_id
): ResponseInterface {
$podcast = $this->getRecord($request->getStation(), $episode_id);
@ -302,6 +308,8 @@ final class PodcastEpisodesController extends AbstractApiCrudController
public function deleteAction(
ServerRequest $request,
Response $response,
int|string $station_id,
string $podcast_id,
string $episode_id
): ResponseInterface {
$station = $request->getStation();

View File

@ -45,7 +45,8 @@ final class DeleteArtAction
public function __invoke(
ServerRequest $request,
Response $response,
string $podcast_id,
int|string $station_id,
string $podcast_id
): ResponseInterface {
$station = $request->getStation();

View File

@ -47,7 +47,8 @@ final class GetArtAction
public function __invoke(
ServerRequest $request,
Response $response,
string $podcast_id,
int|string $station_id,
string $podcast_id
): ResponseInterface {
$station = $request->getStation();

View File

@ -46,7 +46,8 @@ final class PostArtAction
public function __invoke(
ServerRequest $request,
Response $response,
?string $podcast_id
int|string $station_id,
?string $podcast_id = null
): ResponseInterface {
$station = $request->getStation();

View File

@ -63,6 +63,8 @@ final class DeleteArtAction
public function __invoke(
ServerRequest $request,
Response $response,
int|string $station_id,
string $podcast_id,
string $episode_id
): ResponseInterface {
$station = $request->getStation();

View File

@ -54,8 +54,9 @@ final class GetArtAction
public function __invoke(
ServerRequest $request,
Response $response,
int|string $station_id,
string $podcast_id,
string $episode_id,
string $episode_id
): ResponseInterface {
$station = $request->getStation();

View File

@ -53,7 +53,9 @@ final class PostArtAction
public function __invoke(
ServerRequest $request,
Response $response,
?string $episode_id
int|string $station_id,
string $podcast_id,
?string $episode_id = null
): ResponseInterface {
$station = $request->getStation();

View File

@ -50,6 +50,8 @@ final class DeleteMediaAction
public function __invoke(
ServerRequest $request,
Response $response,
int|string $station_id,
string $podcast_id,
string $episode_id
): ResponseInterface {
$station = $request->getStation();

View File

@ -54,6 +54,8 @@ final class GetMediaAction
public function __invoke(
ServerRequest $request,
Response $response,
int|string $station_id,
string $podcast_id,
string $episode_id
): ResponseInterface {
set_time_limit(600);

View File

@ -52,6 +52,7 @@ final class PostMediaAction
public function __invoke(
ServerRequest $request,
Response $response,
int|string $station_id,
string $podcast_id,
?string $episode_id = null
): ResponseInterface {

View File

@ -159,8 +159,11 @@ final class PodcastsController extends AbstractApiCrudController
parent::__construct($em, $serializer, $validator);
}
public function listAction(ServerRequest $request, Response $response): ResponseInterface
{
public function listAction(
ServerRequest $request,
Response $response,
int|string $station_id
): ResponseInterface {
$station = $request->getStation();
$queryBuilder = $this->em->createQueryBuilder()
@ -183,7 +186,8 @@ final class PodcastsController extends AbstractApiCrudController
public function getAction(
ServerRequest $request,
Response $response,
string $podcast_id
int|string $station_id,
string $podcast_id,
): ResponseInterface {
$station = $request->getStation();
$record = $this->getRecord($station, $podcast_id);
@ -197,8 +201,11 @@ final class PodcastsController extends AbstractApiCrudController
return $response->withJson($return);
}
public function createAction(ServerRequest $request, Response $response): ResponseInterface
{
public function createAction(
ServerRequest $request,
Response $response,
int|string $station_id
): ResponseInterface {
$station = $request->getStation();
$parsedBody = (array)$request->getParsedBody();
@ -226,6 +233,7 @@ final class PodcastsController extends AbstractApiCrudController
public function editAction(
ServerRequest $request,
Response $response,
int|string $station_id,
string $podcast_id
): ResponseInterface {
$podcast = $this->getRecord($request->getStation(), $podcast_id);
@ -243,6 +251,7 @@ final class PodcastsController extends AbstractApiCrudController
public function deleteAction(
ServerRequest $request,
Response $response,
int|string $station_id,
string $podcast_id
): ResponseInterface {
$station = $request->getStation();

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