diff --git a/app/Config/Routes.php b/app/Config/Routes.php index b8900309..b4888a04 100644 --- a/app/Config/Routes.php +++ b/app/Config/Routes.php @@ -161,7 +161,7 @@ $routes->group('@(:podcastHandle)', static function ($routes): void { $routes->get('comments/(:uuid)/replies', 'EpisodeCommentController::replies/$1/$2/$3', [ 'as' => 'episode-comment-replies', ]); - $routes->post('comments/(:uuid)/like', 'EpisodeCommentController::attemptLike/$1/$2/$3', [ + $routes->post('comments/(:uuid)/like', 'EpisodeCommentController::likeAction/$1/$2/$3', [ 'as' => 'episode-comment-attempt-like', ]); $routes->get('oembed.json', 'EpisodeController::oembedJSON/$1/$2', [ @@ -229,7 +229,7 @@ $routes->get('/pages/(:slug)', 'PageController::index/$1', [ * Overwriting Fediverse routes file */ $routes->group('@(:podcastHandle)', static function ($routes): void { - $routes->post('posts/new', 'PostController::attemptCreate/$1', [ + $routes->post('posts/new', 'PostController::createAction/$1', [ 'as' => 'post-attempt-create', 'filter' => 'permission:podcast$1.manage-publications', ]); @@ -266,13 +266,13 @@ $routes->group('@(:podcastHandle)', static function ($routes): void { 'filter' => 'allow-cors', ]); // Actions - $routes->post('action', 'PostController::attemptAction/$1/$2', [ + $routes->post('action', 'PostController::actionAction/$1/$2', [ 'as' => 'post-attempt-action', 'filter' => 'permission:podcast$1.interact-as', ]); $routes->post( 'block-actor', - 'PostController::attemptBlockActor/$1/$2', + 'PostController::blockActorAction/$1/$2', [ 'as' => 'post-attempt-block-actor', 'filter' => 'permission:fediverse.manage-blocks', @@ -280,13 +280,13 @@ $routes->group('@(:podcastHandle)', static function ($routes): void { ); $routes->post( 'block-domain', - 'PostController::attemptBlockDomain/$1/$2', + 'PostController::blockDomainAction/$1/$2', [ 'as' => 'post-attempt-block-domain', 'filter' => 'permission:fediverse.manage-blocks', ], ); - $routes->post('delete', 'PostController::attemptDelete/$1/$2', [ + $routes->post('delete', 'PostController::deleteAction/$1/$2', [ 'as' => 'post-attempt-delete', 'filter' => 'permission:podcast$1.manage-publications', ]); diff --git a/app/Controllers/ActorController.php b/app/Controllers/ActorController.php index 233c5f44..dcc8d74c 100644 --- a/app/Controllers/ActorController.php +++ b/app/Controllers/ActorController.php @@ -22,13 +22,10 @@ class ActorController extends FediverseActorController */ protected $helpers = ['svg', 'components', 'misc', 'seo']; - public function follow(): string + public function followView(): string { - // Prevent analytics hit when authenticated - if (! auth()->loggedIn()) { - // @phpstan-ignore-next-line - $this->registerPodcastWebpageHit($this->actor->podcast->id); - } + // @phpstan-ignore-next-line + $this->registerPodcastWebpageHit($this->actor->podcast->id); helper(['form', 'components', 'svg']); // @phpstan-ignore-next-line diff --git a/app/Controllers/BaseController.php b/app/Controllers/BaseController.php index 3c19f927..2d589a1f 100644 --- a/app/Controllers/BaseController.php +++ b/app/Controllers/BaseController.php @@ -5,9 +5,7 @@ declare(strict_types=1); namespace App\Controllers; use CodeIgniter\Controller; -use CodeIgniter\HTTP\IncomingRequest; use CodeIgniter\HTTP\RequestInterface; -use CodeIgniter\HTTP\Response; use CodeIgniter\HTTP\ResponseInterface; use Override; use Psr\Log\LoggerInterface; @@ -21,20 +19,6 @@ use ViewThemes\Theme; */ abstract class BaseController extends Controller { - /** - * Instance of the main Request object. - * - * @var IncomingRequest - */ - protected $request; - - /** - * Instance of the main response object. - * - * @var Response - */ - protected $response; - /** * An array of helpers to be loaded automatically upon * class instantiation. These helpers will be available diff --git a/app/Controllers/ColorsController.php b/app/Controllers/ColorsController.php index 82d6eed9..8cb27173 100644 --- a/app/Controllers/ColorsController.php +++ b/app/Controllers/ColorsController.php @@ -11,18 +11,11 @@ declare(strict_types=1); namespace App\Controllers; use CodeIgniter\Controller; -use CodeIgniter\HTTP\Response; +use CodeIgniter\HTTP\ResponseInterface; class ColorsController extends Controller { - /** - * Instance of the main response object. - * - * @var Response - */ - protected $response; - - public function index(): Response + public function index(): ResponseInterface { $cacheName = 'colors.css'; if ( diff --git a/app/Controllers/EpisodeAudioController.php b/app/Controllers/EpisodeAudioController.php index d5acee07..68fdb292 100644 --- a/app/Controllers/EpisodeAudioController.php +++ b/app/Controllers/EpisodeAudioController.php @@ -16,7 +16,6 @@ use App\Models\EpisodeModel; use App\Models\PodcastModel; use CodeIgniter\Controller; use CodeIgniter\Exceptions\PageNotFoundException; -use CodeIgniter\HTTP\IncomingRequest; use CodeIgniter\HTTP\RedirectResponse; use CodeIgniter\HTTP\RequestInterface; use CodeIgniter\HTTP\ResponseInterface; @@ -30,13 +29,6 @@ use Psr\Log\LoggerInterface; class EpisodeAudioController extends Controller { - /** - * Instance of the main Request object. - * - * @var IncomingRequest - */ - protected $request; - /** * An array of helpers to be loaded automatically upon class instantiation. These helpers will be available to all * other controllers that extend Analytics. diff --git a/app/Controllers/EpisodeCommentController.php b/app/Controllers/EpisodeCommentController.php index 673b370f..3da77458 100644 --- a/app/Controllers/EpisodeCommentController.php +++ b/app/Controllers/EpisodeCommentController.php @@ -19,7 +19,7 @@ use App\Models\EpisodeModel; use App\Models\PodcastModel; use CodeIgniter\Exceptions\PageNotFoundException; use CodeIgniter\HTTP\RedirectResponse; -use CodeIgniter\HTTP\Response; +use CodeIgniter\HTTP\ResponseInterface; use Modules\Analytics\AnalyticsTrait; use Modules\Fediverse\Entities\Actor; use Modules\Fediverse\Objects\OrderedCollectionObject; @@ -77,10 +77,7 @@ class EpisodeCommentController extends BaseController public function view(): string { - // Prevent analytics hit when authenticated - if (! auth()->loggedIn()) { - $this->registerPodcastWebpageHit($this->podcast->id); - } + $this->registerPodcastWebpageHit($this->podcast->id); $cacheName = implode( '_', @@ -119,7 +116,7 @@ class EpisodeCommentController extends BaseController return $cachedView; } - public function commentObject(): Response + public function commentObject(): ResponseInterface { $commentObject = new CommentObject($this->comment); @@ -128,7 +125,7 @@ class EpisodeCommentController extends BaseController ->setBody($commentObject->toJSON()); } - public function replies(): Response + public function replies(): ResponseInterface { /** * get comment replies @@ -163,7 +160,7 @@ class EpisodeCommentController extends BaseController ->setBody($collection->toJSON()); } - public function attemptLike(): RedirectResponse + public function likeAction(): RedirectResponse { if (! ($interactAsActor = interact_as_actor()) instanceof Actor) { return redirect()->back(); @@ -175,7 +172,7 @@ class EpisodeCommentController extends BaseController return redirect()->back(); } - public function attemptReply(): RedirectResponse + public function replyAction(): RedirectResponse { if (! ($interactAsActor = interact_as_actor()) instanceof Actor) { return redirect()->back(); diff --git a/app/Controllers/EpisodeController.php b/app/Controllers/EpisodeController.php index c1ceb9fd..93dfe2b2 100644 --- a/app/Controllers/EpisodeController.php +++ b/app/Controllers/EpisodeController.php @@ -18,7 +18,6 @@ use App\Models\EpisodeModel; use App\Models\PodcastModel; use CodeIgniter\Database\BaseBuilder; use CodeIgniter\Exceptions\PageNotFoundException; -use CodeIgniter\HTTP\Response; use CodeIgniter\HTTP\ResponseInterface; use Config\Embed; use Config\Services; @@ -66,10 +65,7 @@ class EpisodeController extends BaseController public function index(): string { - // Prevent analytics hit when authenticated - if (! auth()->loggedIn()) { - $this->registerPodcastWebpageHit($this->episode->podcast_id); - } + $this->registerPodcastWebpageHit($this->episode->podcast_id); $cacheName = implode( '_', @@ -114,10 +110,7 @@ class EpisodeController extends BaseController public function activity(): string { - // Prevent analytics hit when authenticated - if (! auth()->loggedIn()) { - $this->registerPodcastWebpageHit($this->episode->podcast_id); - } + $this->registerPodcastWebpageHit($this->episode->podcast_id); $cacheName = implode( '_', @@ -163,10 +156,7 @@ class EpisodeController extends BaseController public function chapters(): string { - // Prevent analytics hit when authenticated - if (! auth()->loggedIn()) { - $this->registerPodcastWebpageHit($this->episode->podcast_id); - } + $this->registerPodcastWebpageHit($this->episode->podcast_id); $cacheName = implode( '_', @@ -222,10 +212,7 @@ class EpisodeController extends BaseController public function transcript(): string { - // Prevent analytics hit when authenticated - if (! auth()->loggedIn()) { - $this->registerPodcastWebpageHit($this->episode->podcast_id); - } + $this->registerPodcastWebpageHit($this->episode->podcast_id); $cacheName = implode( '_', @@ -288,10 +275,7 @@ class EpisodeController extends BaseController { header('Content-Security-Policy: frame-ancestors http://*:* https://*:*'); - // Prevent analytics hit when authenticated - if (! auth()->loggedIn()) { - $this->registerPodcastWebpageHit($this->episode->podcast_id); - } + $this->registerPodcastWebpageHit($this->episode->podcast_id); $session = Services::session(); @@ -393,7 +377,7 @@ class EpisodeController extends BaseController return $this->response->setXML($oembed); } - public function episodeObject(): Response + public function episodeObject(): ResponseInterface { $podcastObject = new PodcastEpisode($this->episode); @@ -402,7 +386,7 @@ class EpisodeController extends BaseController ->setBody($podcastObject->toJSON()); } - public function comments(): Response + public function comments(): ResponseInterface { /** * get comments: aggregated replies from posts referring to the episode diff --git a/app/Controllers/PodcastController.php b/app/Controllers/PodcastController.php index aaf60ce0..907724aa 100644 --- a/app/Controllers/PodcastController.php +++ b/app/Controllers/PodcastController.php @@ -17,7 +17,7 @@ use App\Models\EpisodeModel; use App\Models\PodcastModel; use App\Models\PostModel; use CodeIgniter\Exceptions\PageNotFoundException; -use CodeIgniter\HTTP\Response; +use CodeIgniter\HTTP\ResponseInterface; use Modules\Analytics\AnalyticsTrait; use Modules\Fediverse\Objects\OrderedCollectionObject; use Modules\Fediverse\Objects\OrderedCollectionPage; @@ -47,7 +47,7 @@ class PodcastController extends BaseController return $this->{$method}(...$params); } - public function podcastActor(): Response + public function podcastActor(): ResponseInterface { $podcastActor = new PodcastActor($this->podcast); @@ -58,10 +58,7 @@ class PodcastController extends BaseController public function activity(): string { - // Prevent analytics hit when authenticated - if (! auth()->loggedIn()) { - $this->registerPodcastWebpageHit($this->podcast->id); - } + $this->registerPodcastWebpageHit($this->podcast->id); $cacheName = implode( '_', @@ -106,10 +103,7 @@ class PodcastController extends BaseController public function about(): string { - // Prevent analytics hit when authenticated - if (! auth()->loggedIn()) { - $this->registerPodcastWebpageHit($this->podcast->id); - } + $this->registerPodcastWebpageHit($this->podcast->id); $cacheName = implode( '_', @@ -156,10 +150,7 @@ class PodcastController extends BaseController public function episodes(): string { - // Prevent analytics hit when authenticated - if (! auth()->loggedIn()) { - $this->registerPodcastWebpageHit($this->podcast->id); - } + $this->registerPodcastWebpageHit($this->podcast->id); $yearQuery = $this->request->getGet('year'); $seasonQuery = $this->request->getGet('season'); @@ -274,7 +265,7 @@ class PodcastController extends BaseController return $cachedView; } - public function episodeCollection(): Response + public function episodeCollection(): ResponseInterface { if ($this->podcast->type === 'serial') { // podcast is serial diff --git a/app/Controllers/PostController.php b/app/Controllers/PostController.php index 27eb5f77..ba788293 100644 --- a/app/Controllers/PostController.php +++ b/app/Controllers/PostController.php @@ -75,10 +75,7 @@ class PostController extends FediversePostController public function view(): string { - // Prevent analytics hit when authenticated - if (! auth()->loggedIn()) { - $this->registerPodcastWebpageHit($this->podcast->id); - } + $this->registerPodcastWebpageHit($this->podcast->id); $cacheName = implode( '_', @@ -115,7 +112,7 @@ class PostController extends FediversePostController } #[Override] - public function attemptCreate(): RedirectResponse + public function createAction(): RedirectResponse { $rules = [ 'message' => 'required|max_length[500]', @@ -167,7 +164,7 @@ class PostController extends FediversePostController } #[Override] - public function attemptReply(): RedirectResponse + public function replyAction(): RedirectResponse { $rules = [ 'message' => 'required|max_length[500]', @@ -207,7 +204,7 @@ class PostController extends FediversePostController } #[Override] - public function attemptFavourite(): RedirectResponse + public function favouriteAction(): RedirectResponse { model('FavouriteModel')->toggleFavourite(interact_as_actor(), $this->post); @@ -215,14 +212,14 @@ class PostController extends FediversePostController } #[Override] - public function attemptReblog(): RedirectResponse + public function reblogAction(): RedirectResponse { (new PostModel())->toggleReblog(interact_as_actor(), $this->post); return redirect()->back(); } - public function attemptAction(): RedirectResponse + public function action(): RedirectResponse { $rules = [ 'action' => 'required|in_list[favourite,reblog,reply]', @@ -239,9 +236,9 @@ class PostController extends FediversePostController $action = $validData['action']; return match ($action) { - 'favourite' => $this->attemptFavourite(), - 'reblog' => $this->attemptReblog(), - 'reply' => $this->attemptReply(), + 'favourite' => $this->favouriteAction(), + 'reblog' => $this->reblogAction(), + 'reply' => $this->replyAction(), default => redirect() ->back() ->withInput() @@ -249,12 +246,9 @@ class PostController extends FediversePostController }; } - public function remoteAction(string $action): string + public function remoteActionView(string $action): string { - // Prevent analytics hit when authenticated - if (! auth()->loggedIn()) { - $this->registerPodcastWebpageHit($this->podcast->id); - } + $this->registerPodcastWebpageHit($this->podcast->id); set_remote_actions_metatags($this->post, $action); $data = [ diff --git a/app/Models/PersonModel.php b/app/Models/PersonModel.php index 8a4a71e4..1c78007d 100644 --- a/app/Models/PersonModel.php +++ b/app/Models/PersonModel.php @@ -178,9 +178,8 @@ class PersonModel extends Model foreach ($personsTaxonomy as $group_key => $group) { foreach ($group['roles'] as $role_key => $role) { $options[] = [ - 'value' => "{$group_key}, -{$role_key}", - 'label' => "{$group['label']} › {$role['label']}", + 'value' => sprintf('%s,%s', $group_key, $role_key), + 'label' => sprintf('%s › %s', $group['label'], $role['label']), ]; } } diff --git a/app/Resources/js/modules/permalink-edit.ts b/app/Resources/js/modules/permalink-edit.ts index 6a8efad6..c0ea0224 100644 --- a/app/Resources/js/modules/permalink-edit.ts +++ b/app/Resources/js/modules/permalink-edit.ts @@ -72,6 +72,8 @@ export class PermalinkEdit extends LitElement { } firstUpdated(): void { + console.log(this._slugInput); + this.permalinkBase += this.permalinkBase.endsWith("/") ? "" : "/"; // set permalink value @@ -145,7 +147,7 @@ export class PermalinkEdit extends LitElement { border-color: transparent !important; padding-left: 0 !important; margin-left: -0.25rem !important; - font-weight: 600; + font-weight: 600 !important; } ::slotted([slot="domain"]) { diff --git a/app/Views/Components/Forms/PermalinkEditor.php b/app/Views/Components/Forms/PermalinkEditor.php new file mode 100644 index 00000000..ea269c98 --- /dev/null +++ b/app/Views/Components/Forms/PermalinkEditor.php @@ -0,0 +1,41 @@ +mergeClass('flex-1 text-xs border-contrast rounded-lg focus:border-contrast border-3 focus-within:ring-accent'); + + $this->attributes['slot'] = 'slug-input'; + $input = form_input($this->attributes, old($this->name, (string) $this->value)); + + $editLabel = lang('Common.edit'); + $copyLabel = lang('Common.copy'); + $copiedLabel = lang('Common.copied'); + + return << + {$this->label} + + {$this->prefix} + {$input} + + + HTML; + } +} diff --git a/modules/Admin/Config/Routes.php b/modules/Admin/Config/Routes.php index e11a8ead..fc290913 100644 --- a/modules/Admin/Config/Routes.php +++ b/modules/Admin/Config/Routes.php @@ -29,41 +29,41 @@ $routes->group( 'as' => 'settings-general', 'filter' => 'permission:admin.settings', ]); - $routes->post('instance', 'SettingsController::attemptInstanceEdit', [ + $routes->post('instance', 'SettingsController::instanceEditAction', [ 'as' => 'settings-instance', 'filter' => 'permission:admin.settings', ]); - $routes->get('instance-delete-icon', 'SettingsController::deleteIcon', [ + $routes->get('instance-delete-icon', 'SettingsController::deleteIconAction', [ 'as' => 'settings-instance-delete-icon', 'filter' => 'permission:admin.settings', ]); - $routes->post('instance-images-regenerate', 'SettingsController::regenerateImages', [ + $routes->post('instance-images-regenerate', 'SettingsController::regenerateImagesAction', [ 'as' => 'settings-images-regenerate', 'filter' => 'permission:admin.settings', ]); - $routes->post('instance-housekeeping-run', 'SettingsController::runHousekeeping', [ + $routes->post('instance-housekeeping-run', 'SettingsController::housekeepingAction', [ 'as' => 'settings-housekeeping-run', 'filter' => 'permission:admin.settings', ]); - $routes->get('theme', 'SettingsController::theme', [ + $routes->get('theme', 'SettingsController::themeView', [ 'as' => 'settings-theme', 'filter' => 'permission:admin.settings', ]); - $routes->post('theme', 'SettingsController::attemptSetInstanceTheme', [ + $routes->post('theme', 'SettingsController::themeAction', [ 'as' => 'settings-theme', 'filter' => 'permission:admin.settings', ]); }); $routes->group('persons', static function ($routes): void { - $routes->get('/', 'PersonController', [ + $routes->get('/', 'PersonController::list', [ 'as' => 'person-list', 'filter' => 'permission:persons.manage', ]); - $routes->get('new', 'PersonController::create', [ + $routes->get('new', 'PersonController::createView', [ 'as' => 'person-create', 'filter' => 'permission:persons.manage', ]); - $routes->post('new', 'PersonController::attemptCreate', [ + $routes->post('new', 'PersonController::createAction', [ 'filter' => 'permission:persons.manage', ]); $routes->group('(:num)', static function ($routes): void { @@ -71,14 +71,14 @@ $routes->group( 'as' => 'person-view', 'filter' => 'permission:persons.manage', ]); - $routes->get('edit', 'PersonController::edit/$1', [ + $routes->get('edit', 'PersonController::editView/$1', [ 'as' => 'person-edit', 'filter' => 'permission:persons.manage', ]); - $routes->post('edit', 'PersonController::attemptEdit/$1', [ + $routes->post('edit', 'PersonController::editAction/$1', [ 'filter' => 'permission:persons.manage', ]); - $routes->add('delete', 'PersonController::delete/$1', [ + $routes->add('delete', 'PersonController::deleteAction/$1', [ 'as' => 'person-delete', 'filter' => 'permission:persons.manage', ]); @@ -89,11 +89,11 @@ $routes->group( $routes->get('/', 'PodcastController::list', [ 'as' => 'podcast-list', ]); - $routes->get('new', 'PodcastController::create', [ + $routes->get('new', 'PodcastController::createView', [ 'as' => 'podcast-create', 'filter' => 'permission:podcasts.create', ]); - $routes->post('new', 'PodcastController::attemptCreate', [ + $routes->post('new', 'PodcastController::createAction', [ 'filter' => 'permission:podcasts.create', ]); // Podcast @@ -103,16 +103,16 @@ $routes->group( 'as' => 'podcast-view', 'filter' => 'permission:podcast$1.view', ]); - $routes->get('edit', 'PodcastController::edit/$1', [ + $routes->get('edit', 'PodcastController::editView/$1', [ 'as' => 'podcast-edit', 'filter' => 'permission:podcast$1.edit', ]); - $routes->post('edit', 'PodcastController::attemptEdit/$1', [ + $routes->post('edit', 'PodcastController::editAction/$1', [ 'filter' => 'permission:podcast$1.edit', ]); $routes->get( 'publish', - 'PodcastController::publish/$1', + 'PodcastController::publishView/$1', [ 'as' => 'podcast-publish', 'filter' => 'permission:podcast$1.manage-publications', @@ -120,14 +120,14 @@ $routes->group( ); $routes->post( 'publish', - 'PodcastController::attemptPublish/$1', + 'PodcastController::publishAction/$1', [ 'filter' => 'permission:podcast$1.manage-publications', ], ); $routes->get( 'publish-edit', - 'PodcastController::publishEdit/$1', + 'PodcastController::publishEditView/$1', [ 'as' => 'podcast-publish_edit', 'filter' => 'permission:podcast$1.manage-publications', @@ -135,28 +135,28 @@ $routes->group( ); $routes->post( 'publish-edit', - 'PodcastController::attemptPublishEdit/$1', + 'PodcastController::publishEditAction/$1', [ 'filter' => 'permission:podcast$1.manage-publications', ], ); $routes->get( 'publish-cancel', - 'PodcastController::publishCancel/$1', + 'PodcastController::publishCancelAction/$1', [ 'as' => 'podcast-publish-cancel', 'filter' => 'permission:podcast$1.manage-publications', ], ); - $routes->get('edit/delete-banner', 'PodcastController::deleteBanner/$1', [ + $routes->get('edit/delete-banner', 'PodcastController::deleteBannerAction/$1', [ 'as' => 'podcast-banner-delete', 'filter' => 'permission:podcast$1.edit', ]); - $routes->get('delete', 'PodcastController::delete/$1', [ + $routes->get('delete', 'PodcastController::deleteView/$1', [ 'as' => 'podcast-delete', 'filter' => 'permission:podcast$1.delete', ]); - $routes->post('delete', 'PodcastController::attemptDelete/$1', [ + $routes->post('delete', 'PodcastController::deleteAction/$1', [ 'filter' => 'permission:podcast$1.delete', ]); $routes->group('persons', static function ($routes): void { @@ -166,14 +166,14 @@ $routes->group( ]); $routes->post( '/', - 'PodcastPersonController::attemptCreate/$1', + 'PodcastPersonController::createAction/$1', [ 'filter' => 'permission:podcast$1.manage-persons', ], ); $routes->get( '(:num)/remove', - 'PodcastPersonController::remove/$1/$2', + 'PodcastPersonController::deleteAction/$1/$2', [ 'as' => 'podcast-person-remove', 'filter' => 'permission:podcast$1.manage-persons', @@ -181,13 +181,13 @@ $routes->group( ); }); $routes->group('analytics', static function ($routes): void { - $routes->get('/', 'PodcastController::viewAnalytics/$1', [ + $routes->get('/', 'PodcastController::analyticsView/$1', [ 'as' => 'podcast-analytics', 'filter' => 'permission:podcast$1.view', ]); $routes->get( 'webpages', - 'PodcastController::viewAnalyticsWebpages/$1', + 'PodcastController::analyticsWebpagesView/$1', [ 'as' => 'podcast-analytics-webpages', 'filter' => 'permission:podcast$1.view', @@ -195,7 +195,7 @@ $routes->group( ); $routes->get( 'locations', - 'PodcastController::viewAnalyticsLocations/$1', + 'PodcastController::analyticsLocationsView/$1', [ 'as' => 'podcast-analytics-locations', 'filter' => 'permission:podcast$1.view', @@ -203,7 +203,7 @@ $routes->group( ); $routes->get( 'unique-listeners', - 'PodcastController::viewAnalyticsUniqueListeners/$1', + 'PodcastController::analyticsUniqueListenersView/$1', [ 'as' => 'podcast-analytics-unique-listeners', 'filter' => 'permission:podcast$1.view', @@ -211,7 +211,7 @@ $routes->group( ); $routes->get( 'listening-time', - 'PodcastController::viewAnalyticsListeningTime/$1', + 'PodcastController::analyticsListeningTimeView/$1', [ 'as' => 'podcast-analytics-listening-time', 'filter' => 'permission:podcast$1.view', @@ -219,7 +219,7 @@ $routes->group( ); $routes->get( 'time-periods', - 'PodcastController::viewAnalyticsTimePeriods/$1', + 'PodcastController::analyticsTimePeriodsView/$1', [ 'as' => 'podcast-analytics-time-periods', 'filter' => 'permission:podcast$1.view', @@ -227,7 +227,7 @@ $routes->group( ); $routes->get( 'players', - 'PodcastController::viewAnalyticsPlayers/$1', + 'PodcastController::analyticsPlayersView/$1', [ 'as' => 'podcast-analytics-players', 'filter' => 'permission:podcast$1.view', @@ -240,13 +240,13 @@ $routes->group( 'as' => 'episode-list', 'filter' => 'permission:podcast$1.episodes.view', ]); - $routes->get('new', 'EpisodeController::create/$1', [ + $routes->get('new', 'EpisodeController::createView/$1', [ 'as' => 'episode-create', 'filter' => 'permission:podcast$1.episodes.create', ]); $routes->post( 'new', - 'EpisodeController::attemptCreate/$1', + 'EpisodeController::createAction/$1', [ 'filter' => 'permission:podcast$1.episodes.create', ], @@ -257,20 +257,20 @@ $routes->group( 'as' => 'episode-view', 'filter' => 'permission:podcast$1.episodes.view', ]); - $routes->get('edit', 'EpisodeController::edit/$1/$2', [ + $routes->get('edit', 'EpisodeController::editView/$1/$2', [ 'as' => 'episode-edit', 'filter' => 'permission:podcast$1.episodes.edit', ]); $routes->post( 'edit', - 'EpisodeController::attemptEdit/$1/$2', + 'EpisodeController::editAction/$1/$2', [ 'filter' => 'permission:podcast$1.episodes.edit', ], ); $routes->get( 'publish', - 'EpisodeController::publish/$1/$2', + 'EpisodeController::publishView/$1/$2', [ 'as' => 'episode-publish', 'filter' => 'permission:podcast$1.episodes.manage-publications', @@ -278,14 +278,14 @@ $routes->group( ); $routes->post( 'publish', - 'EpisodeController::attemptPublish/$1/$2', + 'EpisodeController::publishAction/$1/$2', [ 'filter' => 'permission:podcast$1.episodes.manage-publications', ], ); $routes->get( 'publish-edit', - 'EpisodeController::publishEdit/$1/$2', + 'EpisodeController::publishEditView/$1/$2', [ 'as' => 'episode-publish_edit', 'filter' => 'permission:podcast$1.episodes.manage-publications', @@ -293,14 +293,14 @@ $routes->group( ); $routes->post( 'publish-edit', - 'EpisodeController::attemptPublishEdit/$1/$2', + 'EpisodeController::publishEditAction/$1/$2', [ 'filter' => 'permission:podcast$1.episodes.manage-publications', ], ); $routes->get( 'publish-cancel', - 'EpisodeController::publishCancel/$1/$2', + 'EpisodeController::publishCancelAction/$1/$2', [ 'as' => 'episode-publish-cancel', 'filter' => 'permission:podcast$1.episodes.manage-publications', @@ -308,7 +308,7 @@ $routes->group( ); $routes->get( 'publish-date-edit', - 'EpisodeController::publishDateEdit/$1/$2', + 'EpisodeController::publishDateEditView/$1/$2', [ 'as' => 'episode-publish_date_edit', 'filter' => 'permission:podcast$1.episodes.manage-publications', @@ -316,14 +316,14 @@ $routes->group( ); $routes->post( 'publish-date-edit', - 'EpisodeController::attemptPublishDateEdit/$1/$2', + 'EpisodeController::publishDateEditAction/$1/$2', [ 'filter' => 'permission:podcast$1.episodes.manage-publications', ], ); $routes->get( 'unpublish', - 'EpisodeController::unpublish/$1/$2', + 'EpisodeController::unpublishView/$1/$2', [ 'as' => 'episode-unpublish', 'filter' => 'permission:podcast$1.episodes.manage-publications', @@ -331,14 +331,14 @@ $routes->group( ); $routes->post( 'unpublish', - 'EpisodeController::attemptUnpublish/$1/$2', + 'EpisodeController::unpublishAction/$1/$2', [ 'filter' => 'permission:podcast$1.episodes.manage-publications', ], ); $routes->get( 'delete', - 'EpisodeController::delete/$1/$2', + 'EpisodeController::deleteView/$1/$2', [ 'as' => 'episode-delete', 'filter' => 'permission:podcast$1.episodes.delete', @@ -346,7 +346,7 @@ $routes->group( ); $routes->post( 'delete', - 'EpisodeController::attemptDelete/$1/$2', + 'EpisodeController::deleteAction/$1/$2', [ 'filter' => 'permission:podcast$1.episodes.delete', ], @@ -377,7 +377,7 @@ $routes->group( ); $routes->get( 'soundbites/new', - 'SoundbiteController::create/$1/$2', + 'SoundbiteController::createView/$1/$2', [ 'as' => 'soundbites-create', 'filter' => 'permission:podcast$1.episodes.manage-clips', @@ -385,7 +385,7 @@ $routes->group( ); $routes->post( 'soundbites/new', - 'SoundbiteController::attemptCreate/$1/$2', + 'SoundbiteController::createAction/$1/$2', [ 'as' => 'soundbites-create', 'filter' => 'permission:podcast$1.episodes.manage-clips', @@ -393,7 +393,7 @@ $routes->group( ); $routes->get( 'soundbites/(:num)/delete', - 'SoundbiteController::delete/$1/$2/$3', + 'SoundbiteController::deleteAction/$1/$2/$3', [ 'as' => 'soundbites-delete', 'filter' => 'permission:podcast$1.episodes.manage-clips', @@ -409,7 +409,7 @@ $routes->group( ); $routes->get( 'video-clips/new', - 'VideoClipsController::create/$1/$2', + 'VideoClipsController::createView/$1/$2', [ 'as' => 'video-clips-create', 'filter' => 'permission:podcast$1.episodes.manage-clips', @@ -417,7 +417,7 @@ $routes->group( ); $routes->post( 'video-clips/new', - 'VideoClipsController::attemptCreate/$1/$2', + 'VideoClipsController::createAction/$1/$2', [ 'as' => 'video-clips-create', 'filter' => 'permission:podcast$1.episodes.manage-clips', @@ -433,7 +433,7 @@ $routes->group( ); $routes->get( 'video-clips/(:num)/retry', - 'VideoClipsController::retry/$1/$2/$3', + 'VideoClipsController::retryAction/$1/$2/$3', [ 'as' => 'video-clip-retry', 'filter' => 'permission:podcast$1.episodes.manage-clips', @@ -441,7 +441,7 @@ $routes->group( ); $routes->get( 'video-clips/(:num)/delete', - 'VideoClipsController::delete/$1/$2/$3', + 'VideoClipsController::deleteAction/$1/$2/$3', [ 'as' => 'video-clip-delete', 'filter' => 'permission:podcast$1.episodes.manage-clips', @@ -449,7 +449,7 @@ $routes->group( ); $routes->get( 'embed', - 'EpisodeController::embed/$1/$2', + 'EpisodeController::embedView/$1/$2', [ 'as' => 'embed-add', 'filter' => 'permission:podcast$1.episodes.edit', @@ -462,14 +462,14 @@ $routes->group( ]); $routes->post( '/', - 'EpisodePersonController::attemptCreate/$1/$2', + 'EpisodePersonController::createAction/$1/$2', [ 'filter' => 'permission:podcast$1.episodes.manage-persons', ], ); $routes->get( '(:num)/remove', - 'EpisodePersonController::remove/$1/$2/$3', + 'EpisodePersonController::deleteAction/$1/$2/$3', [ 'as' => 'episode-person-remove', 'filter' => 'permission:podcast$1.episodes.manage-persons', @@ -479,7 +479,7 @@ $routes->group( $routes->group('comments', static function ($routes): void { $routes->post( 'new', - 'EpisodeController::attemptCommentCreate/$1/$2', + 'EpisodeController::commentCreateAction/$1/$2', [ 'as' => 'comment-attempt-create', 'filter' => 'permission:podcast$1.episodes.manage-comments', @@ -487,7 +487,7 @@ $routes->group( ); $routes->post( '(:uuid)/reply', - 'EpisodeController::attemptCommentReply/$1/$2/$3', + 'EpisodeController::commentReplyAction/$1/$2/$3', [ 'as' => 'comment-attempt-reply', 'filter' => 'permission:podcast$1.episodes.manage-comments', @@ -495,7 +495,7 @@ $routes->group( ); $routes->post( 'delete', - 'EpisodeController::attemptCommentDelete/$1/$2', + 'EpisodeController::commentDeleteAction/$1/$2', [ 'as' => 'comment-attempt-delete', 'filter' => 'permission:podcast$1.episodes.manage-comments', @@ -510,11 +510,11 @@ $routes->group( 'as' => 'notification-list', 'filter' => 'permission:podcast$1.manage-notifications', ]); - $routes->get('(:num)/mark-as-read', 'NotificationController::markAsRead/$1/$2', [ + $routes->get('(:num)/mark-as-read', 'NotificationController::markAsReadAction/$1/$2', [ 'as' => 'notification-mark-as-read', 'filter' => 'permission:podcast$1.manage-notifications', ]); - $routes->get('mark-all-as-read', 'NotificationController::markAllAsRead/$1', [ + $routes->get('mark-all-as-read', 'NotificationController::markAllAsReadAction/$1', [ 'as' => 'notification-mark-all-as-read', 'filter' => 'permission:podcast$1.manage-notifications', ]); @@ -528,7 +528,7 @@ $routes->group( ]); $routes->get( 'blocked-actors', - 'FediverseController::blockedActors', + 'FediverseController::blockedActorsView', [ 'as' => 'fediverse-blocked-actors', 'filter' => 'permission:fediverse.manage-blocks', @@ -536,7 +536,7 @@ $routes->group( ); $routes->get( 'blocked-domains', - 'FediverseController::blockedDomains', + 'FediverseController::blockedDomainsView', [ 'as' => 'fediverse-blocked-domains', 'filter' => 'permission:fediverse.manage-blocks', @@ -549,25 +549,25 @@ $routes->group( 'as' => 'page-list', 'filter' => 'permission:pages.manage', ]); - $routes->get('new', 'PageController::create', [ + $routes->get('new', 'PageController::createView', [ 'as' => 'page-create', 'filter' => 'permission:pages.manage', ]); - $routes->post('new', 'PageController::attemptCreate', [ + $routes->post('new', 'PageController::createAction', [ 'filter' => 'permission:pages.manage', ]); $routes->group('(:num)', static function ($routes): void { $routes->get('/', 'PageController::view/$1', [ 'as' => 'page-view', ]); - $routes->get('edit', 'PageController::edit/$1', [ + $routes->get('edit', 'PageController::editView/$1', [ 'as' => 'page-edit', 'filter' => 'permission:pages.manage', ]); - $routes->post('edit', 'PageController::attemptEdit/$1', [ + $routes->post('edit', 'PageController::editAction/$1', [ 'filter' => 'permission:pages.manage', ]); - $routes->get('delete', 'PageController::delete/$1', [ + $routes->get('delete', 'PageController::deleteAction/$1', [ 'as' => 'page-delete', 'filter' => 'permission:pages.manage', ]); diff --git a/modules/Admin/Controllers/EpisodeController.php b/modules/Admin/Controllers/EpisodeController.php index ffa82b31..ad5b628e 100644 --- a/modules/Admin/Controllers/EpisodeController.php +++ b/modules/Admin/Controllers/EpisodeController.php @@ -35,36 +35,31 @@ class EpisodeController extends BaseController public function _remap(string $method, string ...$params): mixed { + if ($params === []) { + throw PageNotFoundException::forPageNotFound(); + } + + if (count($params) === 1) { + if (! ($podcast = (new PodcastModel())->getPodcastById((int) $params[0])) instanceof Podcast) { + throw PageNotFoundException::forPageNotFound(); + } + + return $this->{$method}($podcast); + } + if ( - ! ($podcast = (new PodcastModel())->getPodcastById((int) $params[0])) instanceof Podcast + ! ($episode = (new EpisodeModel())->getEpisodeById((int) $params[1]) instanceof Episode) ) { throw PageNotFoundException::forPageNotFound(); } - $this->podcast = $podcast; + unset($params[0]); + unset($params[1]); - if (count($params) > 1) { - if ( - ! ($episode = (new EpisodeModel()) - ->where([ - 'id' => $params[1], - 'podcast_id' => $params[0], - ]) - ->first()) instanceof Episode - ) { - throw PageNotFoundException::forPageNotFound(); - } - - $this->episode = $episode; - - unset($params[1]); - unset($params[0]); - } - - return $this->{$method}(...$params); + return $this->{$method}($episode, ...$params); } - public function list(): string + public function list(Podcast $podcast): string { /** @var ?string $query */ $query = $this->request->getGet('q'); @@ -77,7 +72,7 @@ class EpisodeController extends BaseController $episodes = $episodeModel ->select('episodes.*, IFNULL(SUM(ape.hits),0) as downloads') ->join('analytics_podcasts_by_episode ape', 'episodes.id=ape.episode_id', 'left') - ->where('episodes.podcast_id', $this->podcast->id) + ->where('episodes.podcast_id', $podcast->id) ->like('title', $episodeModel->db->escapeLikeString($query)) ->orLike('description_markdown', $episodeModel->db->escapeLikeString($query)) ->orLike('slug', $episodeModel->db->escapeLikeString($query)) @@ -89,7 +84,7 @@ class EpisodeController extends BaseController $episodes = $episodeModel ->select('episodes.*, IFNULL(SUM(ape.hits),0) as downloads') ->join('analytics_podcasts_by_episode ape', 'episodes.id=ape.episode_id', 'left') - ->where('episodes.podcast_id', $this->podcast->id) + ->where('episodes.podcast_id', $podcast->id) ->where( "MATCH (title, description_markdown, slug, location_name) AGAINST ('{$episodeModel->db->escapeString( $query @@ -101,7 +96,7 @@ class EpisodeController extends BaseController $episodes = $episodeModel ->select('episodes.*, IFNULL(SUM(ape.hits),0) as downloads') ->join('analytics_podcasts_by_episode ape', 'episodes.id=ape.episode_id', 'left') - ->where('episodes.podcast_id', $this->podcast->id) + ->where('episodes.podcast_id', $podcast->id) ->groupBy('episodes.id') ->orderBy('-`published_at`', '', false) ->orderBy('created_at', 'desc'); @@ -109,7 +104,7 @@ class EpisodeController extends BaseController helper('form'); $data = [ - 'podcast' => $this->podcast, + 'podcast' => $podcast, 'episodes' => $episodes->paginate(10), 'pager' => $episodes->pager, 'query' => $query, @@ -117,48 +112,45 @@ class EpisodeController extends BaseController $this->setHtmlHead(lang('Episode.all_podcast_episodes')); replace_breadcrumb_params([ - 0 => $this->podcast->at_handle, + 0 => $podcast->at_handle, ]); return view('episode/list', $data); } - public function view(): string + public function view(Episode $episode): string { $data = [ - 'podcast' => $this->podcast, - 'episode' => $this->episode, + 'podcast' => $episode->podcast, + 'episode' => $episode, ]; - $this->setHtmlHead($this->episode->title); + $this->setHtmlHead($episode->title); replace_breadcrumb_params([ - 0 => $this->podcast->at_handle, - 1 => $this->episode->title, + 0 => $episode->podcast->at_handle, + 1 => $episode->title, ]); return view('episode/view', $data); } - public function create(): string + public function createView(Podcast $podcast): string { helper(['form']); - $currentSeasonNumber = (new EpisodeModel())->getCurrentSeasonNumber($this->podcast->id); + $currentSeasonNumber = (new EpisodeModel())->getCurrentSeasonNumber($podcast->id); $data = [ - 'podcast' => $this->podcast, + 'podcast' => $podcast, 'currentSeasonNumber' => $currentSeasonNumber, - 'nextEpisodeNumber' => (new EpisodeModel())->getNextEpisodeNumber( - $this->podcast->id, - $currentSeasonNumber - ), + 'nextEpisodeNumber' => (new EpisodeModel())->getNextEpisodeNumber($podcast->id, $currentSeasonNumber), ]; $this->setHtmlHead(lang('Episode.create')); replace_breadcrumb_params([ - 0 => $this->podcast->at_handle, + 0 => $podcast->at_handle, ]); return view('episode/create', $data); } - public function attemptCreate(): RedirectResponse + public function createAction(Podcast $podcast): RedirectResponse { $rules = [ 'title' => 'required', @@ -169,7 +161,7 @@ class EpisodeController extends BaseController 'chapters_file' => 'ext_in[chapters_file,json]|is_json[chapters_file]', ]; - if ($this->podcast->type === 'serial' && $this->request->getPost('type') === 'full') { + if ($podcast->type === 'serial' && $this->request->getPost('type') === 'full') { $rules['episode_number'] = 'required'; } @@ -185,7 +177,7 @@ class EpisodeController extends BaseController if ((new EpisodeModel()) ->where([ 'slug' => $validData['slug'], - 'podcast_id' => $this->podcast->id, + 'podcast_id' => $podcast->id, ]) ->first() instanceof Episode) { return redirect() @@ -197,7 +189,7 @@ class EpisodeController extends BaseController $newEpisode = new Episode([ 'created_by' => user_id(), 'updated_by' => user_id(), - 'podcast_id' => $this->podcast->id, + 'podcast_id' => $podcast->id, 'title' => $this->request->getPost('title'), 'slug' => $this->request->getPost('slug'), 'guid' => null, @@ -250,30 +242,30 @@ class EpisodeController extends BaseController ->with('errors', $episodeModel->errors()); } - return redirect()->route('episode-view', [$this->podcast->id, $newEpisodeId])->with( + return redirect()->route('episode-view', [$podcast->id, $newEpisodeId])->with( 'message', lang('Episode.messages.createSuccess') ); } - public function edit(): string + public function editView(Episode $episode): string { helper(['form']); $data = [ - 'podcast' => $this->podcast, - 'episode' => $this->episode, + 'podcast' => $episode->podcast, + 'episode' => $episode, ]; $this->setHtmlHead(lang('Episode.edit')); replace_breadcrumb_params([ - 0 => $this->podcast->at_handle, - 1 => $this->episode->title, + 0 => $episode->podcast->at_handle, + 1 => $episode->title, ]); return view('episode/edit', $data); } - public function attemptEdit(): RedirectResponse + public function editAction(Episode $episode): RedirectResponse { $rules = [ 'title' => 'required', @@ -284,7 +276,7 @@ class EpisodeController extends BaseController 'chapters_file' => 'ext_in[chapters_file,json]|is_json[chapters_file]', ]; - if ($this->podcast->type === 'serial' && $this->request->getPost('type') === 'full') { + if ($episode->podcast->type === 'serial' && $this->request->getPost('type') === 'full') { $rules['episode_number'] = 'required'; } @@ -297,87 +289,87 @@ class EpisodeController extends BaseController $validData = $this->validator->getValidated(); - $this->episode->title = $this->request->getPost('title'); - $this->episode->slug = $validData['slug']; - $this->episode->description_markdown = $this->request->getPost('description'); - $this->episode->location = $this->request->getPost('location_name') === '' ? null : new Location( + $episode->title = $this->request->getPost('title'); + $episode->slug = $validData['slug']; + $episode->description_markdown = $this->request->getPost('description'); + $episode->location = $this->request->getPost('location_name') === '' ? null : new Location( $this->request->getPost('location_name') ); - $this->episode->parental_advisory = + $episode->parental_advisory = $this->request->getPost('parental_advisory') !== 'undefined' ? $this->request->getPost('parental_advisory') : null; - $this->episode->number = $this->request->getPost('episode_number') ?: null; - $this->episode->season_number = $this->request->getPost('season_number') ?: null; - $this->episode->type = $this->request->getPost('type'); - $this->episode->is_blocked = $this->request->getPost('block') === 'yes'; - $this->episode->is_premium = $this->request->getPost('premium') === 'yes'; + $episode->number = $this->request->getPost('episode_number') ?: null; + $episode->season_number = $this->request->getPost('season_number') ?: null; + $episode->type = $this->request->getPost('type'); + $episode->is_blocked = $this->request->getPost('block') === 'yes'; + $episode->is_premium = $this->request->getPost('premium') === 'yes'; - $this->episode->updated_by = (int) user_id(); - $this->episode->setAudio($this->request->getFile('audio_file')); - $this->episode->setCover($this->request->getFile('cover')); + $episode->updated_by = (int) user_id(); + $episode->setAudio($this->request->getFile('audio_file')); + $episode->setCover($this->request->getFile('cover')); // republish on websub hubs upon edit - $this->episode->is_published_on_hubs = false; + $episode->is_published_on_hubs = false; $transcriptChoice = $this->request->getPost('transcript-choice'); if ($transcriptChoice === 'upload-file') { $transcriptFile = $this->request->getFile('transcript_file'); if ($transcriptFile instanceof UploadedFile && $transcriptFile->isValid()) { - $this->episode->setTranscript($transcriptFile); - $this->episode->transcript_remote_url = null; + $episode->setTranscript($transcriptFile); + $episode->transcript_remote_url = null; } } elseif ($transcriptChoice === 'remote-url') { if ( ($transcriptRemoteUrl = $this->request->getPost('transcript_remote_url')) && - (($transcriptFile = $this->episode->transcript_id) !== null) + (($transcriptFile = $episode->transcript_id) !== null) ) { - (new MediaModel())->deleteMedia($this->episode->transcript); + (new MediaModel())->deleteMedia($episode->transcript); } - $this->episode->transcript_remote_url = $transcriptRemoteUrl === '' ? null : $transcriptRemoteUrl; + $episode->transcript_remote_url = $transcriptRemoteUrl === '' ? null : $transcriptRemoteUrl; } $chaptersChoice = $this->request->getPost('chapters-choice'); if ($chaptersChoice === 'upload-file') { $chaptersFile = $this->request->getFile('chapters_file'); if ($chaptersFile instanceof UploadedFile && $chaptersFile->isValid()) { - $this->episode->setChapters($chaptersFile); - $this->episode->chapters_remote_url = null; + $episode->setChapters($chaptersFile); + $episode->chapters_remote_url = null; } } elseif ($chaptersChoice === 'remote-url') { if ( ($chaptersRemoteUrl = $this->request->getPost('chapters_remote_url')) && - (($chaptersFile = $this->episode->chapters) instanceof Chapters) + (($chaptersFile = $episode->chapters) instanceof Chapters) ) { - (new MediaModel())->deleteMedia($this->episode->chapters); + (new MediaModel())->deleteMedia($episode->chapters); } - $this->episode->chapters_remote_url = $chaptersRemoteUrl === '' ? null : $chaptersRemoteUrl; + $episode->chapters_remote_url = $chaptersRemoteUrl === '' ? null : $chaptersRemoteUrl; } $episodeModel = new EpisodeModel(); - if (! $episodeModel->update($this->episode->id, $this->episode)) { + if (! $episodeModel->update($episode->id, $episode)) { return redirect() ->back() ->withInput() ->with('errors', $episodeModel->errors()); } - return redirect()->route('episode-edit', [$this->podcast->id, $this->episode->id])->with( + return redirect()->route('episode-edit', [$episode->podcast_id, $episode->id])->with( 'message', lang('Episode.messages.editSuccess') ); } - public function transcriptDelete(): RedirectResponse + public function transcriptDelete(Episode $episode): RedirectResponse { - if (! $this->episode->transcript instanceof Transcript) { + if (! $episode->transcript instanceof Transcript) { return redirect()->back(); } $mediaModel = new MediaModel(); - if (! $mediaModel->deleteMedia($this->episode->transcript)) { + if (! $mediaModel->deleteMedia($episode->transcript)) { return redirect() ->back() ->withInput() @@ -387,14 +379,14 @@ class EpisodeController extends BaseController return redirect()->back(); } - public function chaptersDelete(): RedirectResponse + public function chaptersDelete(Episode $episode): RedirectResponse { - if (! $this->episode->chapters instanceof Chapters) { + if (! $episode->chapters instanceof Chapters) { return redirect()->back(); } $mediaModel = new MediaModel(); - if (! $mediaModel->deleteMedia($this->episode->chapters)) { + if (! $mediaModel->deleteMedia($episode->chapters)) { return redirect() ->back() ->withInput() @@ -404,33 +396,33 @@ class EpisodeController extends BaseController return redirect()->back(); } - public function publish(): string | RedirectResponse + public function publishView(Episode $episode): string | RedirectResponse { - if ($this->episode->publication_status === 'not_published') { + if ($episode->publication_status === 'not_published') { helper(['form']); $data = [ - 'podcast' => $this->podcast, - 'episode' => $this->episode, + 'podcast' => $episode->podcast, + 'episode' => $episode, ]; $this->setHtmlHead(lang('Episode.publish')); replace_breadcrumb_params([ - 0 => $this->podcast->at_handle, - 1 => $this->episode->title, + 0 => $episode->podcast->at_handle, + 1 => $episode->title, ]); return view('episode/publish', $data); } - return redirect()->route('episode-view', [$this->podcast->id, $this->episode->id])->with( + return redirect()->route('episode-view', [$episode->podcast_id, $episode->id])->with( 'error', lang('Episode.publish_error') ); } - public function attemptPublish(): RedirectResponse + public function publishAction(Episode $episode): RedirectResponse { - if ($this->podcast->publication_status === 'published') { + if ($episode->podcast->publication_status === 'published') { $rules = [ 'publication_method' => 'required', 'scheduled_publication_date' => 'valid_date[Y-m-d H:i]|permit_empty', @@ -448,18 +440,18 @@ class EpisodeController extends BaseController $db->transStart(); $newPost = new Post([ - 'actor_id' => $this->podcast->actor_id, - 'episode_id' => $this->episode->id, + 'actor_id' => $episode->podcast->actor_id, + 'episode_id' => $episode->id, 'message' => $this->request->getPost('message'), 'created_by' => user_id(), ]); - if ($this->podcast->publication_status === 'published') { + if ($episode->podcast->publication_status === 'published') { $publishMethod = $this->request->getPost('publication_method'); if ($publishMethod === 'schedule') { $scheduledPublicationDate = $this->request->getPost('scheduled_publication_date'); if ($scheduledPublicationDate) { - $this->episode->published_at = Time::createFromFormat( + $episode->published_at = Time::createFromFormat( 'Y-m-d H:i', $scheduledPublicationDate, $this->request->getPost('client_timezone'), @@ -472,16 +464,16 @@ class EpisodeController extends BaseController ->with('error', lang('Episode.messages.scheduleDateError')); } } else { - $this->episode->published_at = Time::now(); + $episode->published_at = Time::now(); } - } elseif ($this->podcast->publication_status === 'scheduled') { + } elseif ($episode->podcast->publication_status === 'scheduled') { // podcast publication date has already been set - $this->episode->published_at = $this->podcast->published_at->addSeconds(1); + $episode->published_at = $episode->podcast->published_at->addSeconds(1); } else { - $this->episode->published_at = Time::now(); + $episode->published_at = Time::now(); } - $newPost->published_at = $this->episode->published_at; + $newPost->published_at = $episode->published_at; $postModel = new PostModel(); if (! $postModel->addPost($newPost)) { @@ -493,7 +485,7 @@ class EpisodeController extends BaseController } $episodeModel = new EpisodeModel(); - if (! $episodeModel->update($this->episode->id, $this->episode)) { + if (! $episodeModel->update($episode->id, $episode)) { $db->transRollback(); return redirect() ->back() @@ -503,47 +495,47 @@ class EpisodeController extends BaseController $db->transComplete(); - return redirect()->route('episode-view', [$this->podcast->id, $this->episode->id])->with( + return redirect()->route('episode-view', [$episode->podcast_id, $episode->id])->with( 'message', lang('Episode.messages.publishSuccess', [ - 'publication_status' => $this->episode->publication_status, + 'publication_status' => $episode->publication_status, ]) ); } - public function publishEdit(): string | RedirectResponse + public function publishEditView(Episode $episode): string | RedirectResponse { - if (in_array($this->episode->publication_status, ['scheduled', 'with_podcast'], true)) { + if (in_array($episode->publication_status, ['scheduled', 'with_podcast'], true)) { helper(['form']); $data = [ - 'podcast' => $this->podcast, - 'episode' => $this->episode, + 'podcast' => $episode->podcast, + 'episode' => $episode, 'post' => (new PostModel()) ->where([ - 'actor_id' => $this->podcast->actor_id, - 'episode_id' => $this->episode->id, + 'actor_id' => $episode->podcast->actor_id, + 'episode_id' => $episode->id, ]) ->first(), ]; $this->setHtmlHead(lang('Episode.publish_edit')); replace_breadcrumb_params([ - 0 => $this->podcast->at_handle, - 1 => $this->episode->title, + 0 => $episode->podcast->at_handle, + 1 => $episode->title, ]); return view('episode/publish_edit', $data); } - return redirect()->route('episode-view', [$this->podcast->id, $this->episode->id])->with( + return redirect()->route('episode-view', [$episode->podcast_id, $episode->id])->with( 'error', lang('Episode.publish_edit_error') ); } - public function attemptPublishEdit(): RedirectResponse + public function publishEditAction(Episode $episode): RedirectResponse { - if ($this->podcast->publication_status === 'published') { + if ($episode->podcast->publication_status === 'published') { $rules = [ 'post_id' => 'required', 'publication_method' => 'required', @@ -561,12 +553,12 @@ class EpisodeController extends BaseController $db = db_connect(); $db->transStart(); - if ($this->podcast->publication_status === 'published') { + if ($episode->podcast->publication_status === 'published') { $publishMethod = $this->request->getPost('publication_method'); if ($publishMethod === 'schedule') { $scheduledPublicationDate = $this->request->getPost('scheduled_publication_date'); if ($scheduledPublicationDate) { - $this->episode->published_at = Time::createFromFormat( + $episode->published_at = Time::createFromFormat( 'Y-m-d H:i', $scheduledPublicationDate, $this->request->getPost('client_timezone'), @@ -579,20 +571,20 @@ class EpisodeController extends BaseController ->with('error', lang('Episode.messages.scheduleDateError')); } } else { - $this->episode->published_at = Time::now(); + $episode->published_at = Time::now(); } - } elseif ($this->podcast->publication_status === 'scheduled') { + } elseif ($episode->podcast->publication_status === 'scheduled') { // podcast publication date has already been set - $this->episode->published_at = $this->podcast->published_at->addSeconds(1); + $episode->published_at = $episode->podcast->published_at->addSeconds(1); } else { - $this->episode->published_at = Time::now(); + $episode->published_at = Time::now(); } $post = (new PostModel())->getPostById($this->request->getPost('post_id')); if ($post instanceof Post) { $post->message = $this->request->getPost('message'); - $post->published_at = $this->episode->published_at; + $post->published_at = $episode->published_at; $postModel = new PostModel(); if (! $postModel->editPost($post)) { @@ -605,7 +597,7 @@ class EpisodeController extends BaseController } $episodeModel = new EpisodeModel(); - if (! $episodeModel->update($this->episode->id, $this->episode)) { + if (! $episodeModel->update($episode->id, $episode)) { $db->transRollback(); return redirect() ->back() @@ -615,33 +607,33 @@ class EpisodeController extends BaseController $db->transComplete(); - return redirect()->route('episode-view', [$this->podcast->id, $this->episode->id])->with( + return redirect()->route('episode-view', [$episode->podcast_id, $episode->id])->with( 'message', lang('Episode.messages.publishSuccess', [ - 'publication_status' => $this->episode->publication_status, + 'publication_status' => $episode->publication_status, ]) ); } - public function publishCancel(): RedirectResponse + public function publishCancelAction(Episode $episode): RedirectResponse { - if (in_array($this->episode->publication_status, ['scheduled', 'with_podcast'], true)) { + if (in_array($episode->publication_status, ['scheduled', 'with_podcast'], true)) { $db = db_connect(); $db->transStart(); $postModel = new PostModel(); $post = $postModel ->where([ - 'actor_id' => $this->podcast->actor_id, - 'episode_id' => $this->episode->id, + 'actor_id' => $episode->podcast->actor_id, + 'episode_id' => $episode->id, ]) ->first(); $postModel->removePost($post); - $this->episode->published_at = null; + $episode->published_at = null; $episodeModel = new EpisodeModel(); - if (! $episodeModel->update($this->episode->id, $this->episode)) { + if (! $episodeModel->update($episode->id, $episode)) { $db->transRollback(); return redirect() ->back() @@ -651,20 +643,20 @@ class EpisodeController extends BaseController $db->transComplete(); - return redirect()->route('episode-view', [$this->podcast->id, $this->episode->id])->with( + return redirect()->route('episode-view', [$episode->podcast_id, $episode->id])->with( 'message', lang('Episode.messages.publishCancelSuccess') ); } - return redirect()->route('episode-view', [$this->podcast->id, $this->episode->id]); + return redirect()->route('episode-view', [$episode->podcast_id, $episode->id]); } - public function publishDateEdit(): string|RedirectResponse + public function publishDateEditView(Episode $episode): string|RedirectResponse { // only accessible if episode is already published - if ($this->episode->publication_status !== 'published') { - return redirect()->route('episode-view', [$this->podcast->id, $this->episode->id])->with( + if ($episode->publication_status !== 'published') { + return redirect()->route('episode-view', [$episode->podcast_id, $episode->id])->with( 'error', lang('Episode.publish_date_edit_error') ); @@ -673,14 +665,14 @@ class EpisodeController extends BaseController helper('form'); $data = [ - 'podcast' => $this->podcast, - 'episode' => $this->episode, + 'podcast' => $episode->podcast, + 'episode' => $episode, ]; $this->setHtmlHead(lang('Episode.publish_date_edit')); replace_breadcrumb_params([ - 0 => $this->podcast->title, - 1 => $this->episode->title, + 0 => $episode->podcast->title, + 1 => $episode->title, ]); return view('episode/publish_date_edit', $data); } @@ -691,7 +683,7 @@ class EpisodeController extends BaseController * Prevents setting a future date as it does not make sense to set a future published date to an already published * episode. This also prevents any side-effects from occurring. */ - public function attemptPublishDateEdit(): RedirectResponse + public function publishDateEditAction(Episode $episode): RedirectResponse { $rules = [ 'new_publication_date' => 'valid_date[Y-m-d H:i]', @@ -721,26 +713,26 @@ class EpisodeController extends BaseController ->with('error', lang('Episode.publish_date_edit_future_error')); } - $this->episode->published_at = $newPublicationDate; + $episode->published_at = $newPublicationDate; $episodeModel = new EpisodeModel(); - if (! $episodeModel->update($this->episode->id, $this->episode)) { + if (! $episodeModel->update($episode->id, $episode)) { return redirect() ->back() ->withInput() ->with('errors', $episodeModel->errors()); } - return redirect()->route('episode-view', [$this->podcast->id, $this->episode->id])->with( + return redirect()->route('episode-view', [$episode->podcast_id, $episode->id])->with( 'message', lang('Episode.publish_date_edit_success') ); } - public function unpublish(): string | RedirectResponse + public function unpublishView(Episode $episode): string | RedirectResponse { - if ($this->episode->publication_status !== 'published') { - return redirect()->route('episode-view', [$this->podcast->id, $this->episode->id])->with( + if ($episode->publication_status !== 'published') { + return redirect()->route('episode-view', [$episode->podcast_id, $episode->id])->with( 'error', lang('Episode.unpublish_error') ); @@ -749,19 +741,19 @@ class EpisodeController extends BaseController helper(['form']); $data = [ - 'podcast' => $this->podcast, - 'episode' => $this->episode, + 'podcast' => $episode->podcast, + 'episode' => $episode, ]; $this->setHtmlHead(lang('Episode.unpublish')); replace_breadcrumb_params([ - 0 => $this->podcast->title, - 1 => $this->episode->title, + 0 => $episode->podcast->title, + 1 => $episode->title, ]); return view('episode/unpublish', $data); } - public function attemptUnpublish(): RedirectResponse + public function unpublishAction(Episode $episode): RedirectResponse { $rules = [ 'understand' => 'required', @@ -780,7 +772,7 @@ class EpisodeController extends BaseController $allPostsLinkedToEpisode = (new PostModel()) ->where([ - 'episode_id' => $this->episode->id, + 'episode_id' => $episode->id, 'in_reply_to_id' => null, 'reblog_of_id' => null, ]) @@ -791,7 +783,7 @@ class EpisodeController extends BaseController $allCommentsLinkedToEpisode = (new EpisodeCommentModel()) ->where([ - 'episode_id' => $this->episode->id, + 'episode_id' => $episode->id, 'in_reply_to_id' => null, ]) ->findAll(); @@ -800,10 +792,10 @@ class EpisodeController extends BaseController } // set episode published_at to null to unpublish - $this->episode->published_at = null; + $episode->published_at = null; $episodeModel = new EpisodeModel(); - if (! $episodeModel->update($this->episode->id, $this->episode)) { + if (! $episodeModel->update($episode->id, $episode)) { $db->transRollback(); return redirect() ->back() @@ -812,33 +804,33 @@ class EpisodeController extends BaseController } // set podcast is_published_on_hubs to false to trigger websub push - (new PodcastModel())->update($this->episode->podcast->id, [ + (new PodcastModel())->update($episode->podcast_id, [ 'is_published_on_hubs' => 0, ]); $db->transComplete(); - return redirect()->route('episode-view', [$this->podcast->id, $this->episode->id]); + return redirect()->route('episode-view', [$episode->podcast_id, $episode->id]); } - public function delete(): string + public function deleteView(Episode $episode): string { helper(['form']); $data = [ - 'podcast' => $this->podcast, - 'episode' => $this->episode, + 'podcast' => $episode->podcast, + 'episode' => $episode, ]; $this->setHtmlHead(lang('Episode.delete')); replace_breadcrumb_params([ - 0 => $this->podcast->at_handle, - 1 => $this->episode->title, + 0 => $episode->podcast->at_handle, + 1 => $episode->title, ]); return view('episode/delete', $data); } - public function attemptDelete(): RedirectResponse + public function deleteAction(Episode $episode): RedirectResponse { $rules = [ 'understand' => 'required', @@ -851,7 +843,7 @@ class EpisodeController extends BaseController ->with('errors', $this->validator->getErrors()); } - if ($this->episode->published_at instanceof Time) { + if ($episode->published_at instanceof Time) { return redirect() ->back() ->withInput() @@ -864,7 +856,7 @@ class EpisodeController extends BaseController $episodeModel = new EpisodeModel(); - if (! $episodeModel->delete($this->episode->id)) { + if (! $episodeModel->delete($episode->id)) { $db->transRollback(); return redirect() ->back() @@ -872,11 +864,11 @@ class EpisodeController extends BaseController ->with('errors', $episodeModel->errors()); } - $episodeMediaList = [$this->episode->transcript, $this->episode->chapters, $this->episode->audio]; + $episodeMediaList = [$episode->transcript, $episode->chapters, $episode->audio]; //only delete episode cover if different from podcast's - if ($this->episode->cover_id !== null) { - $episodeMediaList[] = $this->episode->cover; + if ($episode->cover_id !== null) { + $episodeMediaList[] = $episode->cover; } $mediaModel = new MediaModel(); @@ -916,36 +908,36 @@ class EpisodeController extends BaseController if ($warnings !== []) { return redirect() - ->route('episode-list', [$this->podcast->id]) + ->route('episode-list', [$episode->podcast_id]) ->with('message', lang('Episode.messages.deleteSuccess')) ->with('warnings', $warnings); } - return redirect()->route('episode-list', [$this->podcast->id])->with( + return redirect()->route('episode-list', [$episode->podcast_id])->with( 'message', lang('Episode.messages.deleteSuccess') ); } - public function embed(): string + public function embedView(Episode $episode): string { helper(['form']); $data = [ - 'podcast' => $this->podcast, - 'episode' => $this->episode, + 'podcast' => $episode->podcast, + 'episode' => $episode, 'themes' => EpisodeModel::$themes, ]; $this->setHtmlHead(lang('Episode.embed.title')); replace_breadcrumb_params([ - 0 => $this->podcast->at_handle, - 1 => $this->episode->title, + 0 => $episode->podcast->at_handle, + 1 => $episode->title, ]); return view('episode/embed', $data); } - public function attemptCommentCreate(): RedirectResponse + public function commentCreateAction(Episode $episode): RedirectResponse { $rules = [ 'message' => 'required|max_length[500]', @@ -962,7 +954,7 @@ class EpisodeController extends BaseController $newComment = new EpisodeComment([ 'actor_id' => interact_as_actor_id(), - 'episode_id' => $this->episode->id, + 'episode_id' => $episode->id, 'message' => $validData['message'], 'created_at' => new Time('now'), 'created_by' => user_id(), @@ -982,7 +974,7 @@ class EpisodeController extends BaseController return redirect()->back(); } - public function attemptCommentReply(string $commentId): RedirectResponse + public function commentReplyAction(Episode $episode, string $commentId): RedirectResponse { $rules = [ 'message' => 'required|max_length[500]', @@ -999,7 +991,7 @@ class EpisodeController extends BaseController $newReply = new EpisodeComment([ 'actor_id' => interact_as_actor_id(), - 'episode_id' => $this->episode->id, + 'episode_id' => $episode->id, 'message' => $validData['message'], 'in_reply_to_id' => $commentId, 'created_at' => new Time('now'), diff --git a/modules/Admin/Controllers/EpisodePersonController.php b/modules/Admin/Controllers/EpisodePersonController.php index a60df018..47e0180d 100644 --- a/modules/Admin/Controllers/EpisodePersonController.php +++ b/modules/Admin/Controllers/EpisodePersonController.php @@ -20,54 +20,52 @@ use CodeIgniter\HTTP\RedirectResponse; class EpisodePersonController extends BaseController { - protected Podcast $podcast; - - protected Episode $episode; - public function _remap(string $method, string ...$params): mixed { - if (count($params) < 2) { + if ($params === []) { throw PageNotFoundException::forPageNotFound(); } - if ( - ($this->podcast = (new PodcastModel())->getPodcastById((int) $params[0])) && - ($this->episode = (new EpisodeModel()) - ->where([ - 'id' => $params[1], - 'podcast_id' => $params[0], - ]) - ->first()) - ) { - unset($params[1]); - unset($params[0]); + if (count($params) === 1) { + if (! ($podcast = (new PodcastModel())->getPodcastById((int) $params[0])) instanceof Podcast) { + throw PageNotFoundException::forPageNotFound(); + } - return $this->{$method}(...$params); + return $this->{$method}($podcast); } - throw PageNotFoundException::forPageNotFound(); + if ( + ! ($episode = (new EpisodeModel())->getEpisodeById((int) $params[1]) instanceof Episode) + ) { + throw PageNotFoundException::forPageNotFound(); + } + + unset($params[0]); + unset($params[1]); + + return $this->{$method}($episode, ...$params); } - public function index(): string + public function index(Episode $episode): string { helper('form'); $data = [ - 'episode' => $this->episode, - 'podcast' => $this->podcast, + 'episode' => $episode, + 'podcast' => $episode->podcast, 'personOptions' => (new PersonModel())->getPersonOptions(), 'taxonomyOptions' => (new PersonModel())->getTaxonomyOptions(), ]; $this->setHtmlHead(lang('Person.episode_form.title')); replace_breadcrumb_params([ - 0 => $this->podcast->at_handle, - 1 => $this->episode->title, + 0 => $episode->podcast->at_handle, + 1 => $episode->title, ]); return view('episode/persons', $data); } - public function attemptCreate(): RedirectResponse + public function createAction(Episode $episode): RedirectResponse { $rules = [ 'persons' => 'required', @@ -83,8 +81,8 @@ class EpisodePersonController extends BaseController $validData = $this->validator->getValidated(); (new PersonModel())->addEpisodePersons( - $this->podcast->id, - $this->episode->id, + $episode->podcast_id, + $episode->id, $validData['persons'], $this->request->getPost('roles') ?? [], ); @@ -92,9 +90,9 @@ class EpisodePersonController extends BaseController return redirect()->back(); } - public function remove(string $personId): RedirectResponse + public function deleteAction(Episode $episode, string $personId): RedirectResponse { - (new PersonModel())->removePersonFromEpisode($this->podcast->id, $this->episode->id, (int) $personId); + (new PersonModel())->removePersonFromEpisode($episode->podcast_id, $episode->id, (int) $personId); return redirect()->back(); } diff --git a/modules/Admin/Controllers/FediverseController.php b/modules/Admin/Controllers/FediverseController.php index a19545e5..55b9ffcd 100644 --- a/modules/Admin/Controllers/FediverseController.php +++ b/modules/Admin/Controllers/FediverseController.php @@ -19,7 +19,7 @@ class FediverseController extends BaseController return redirect()->route('fediverse-blocked-actors'); } - public function blockedActors(): string + public function blockedActorsView(): string { helper(['form']); @@ -32,7 +32,7 @@ class FediverseController extends BaseController ]); } - public function blockedDomains(): string + public function blockedDomainsView(): string { helper(['form']); diff --git a/modules/Admin/Controllers/NotificationController.php b/modules/Admin/Controllers/NotificationController.php index 16c755f4..627a4a3a 100644 --- a/modules/Admin/Controllers/NotificationController.php +++ b/modules/Admin/Controllers/NotificationController.php @@ -27,70 +27,52 @@ class NotificationController extends BaseController public function _remap(string $method, string ...$params): mixed { + if ($params === []) { + throw PageNotFoundException::forPageNotFound(); + } + if ( ! ($podcast = (new PodcastModel())->getPodcastById((int) $params[0])) instanceof Podcast ) { throw PageNotFoundException::forPageNotFound(); } - $this->podcast = $podcast; + $params[0] = $podcast; if (count($params) > 1) { if ( - ! ($notification = (new NotificationModel()) - ->where([ - 'id' => $params[1], - ]) - ->first()) instanceof Notification + ! ($notification = (new NotificationModel())->find($params[1])) instanceof Notification ) { throw PageNotFoundException::forPageNotFound(); } - $this->notification = $notification; - - unset($params[1]); - unset($params[0]); + $params[1] = $notification; } return $this->{$method}(...$params); } - public function list(): string + public function list(Podcast $podcast): string { - $notifications = (new NotificationModel())->where('target_actor_id', $this->podcast->actor_id) + $notifications = (new NotificationModel())->where('target_actor_id', $podcast->actor_id) ->orderBy('created_at', 'desc'); $data = [ - 'podcast' => $this->podcast, + 'podcast' => $podcast, 'notifications' => $notifications->paginate(10), 'pager' => $notifications->pager, ]; $this->setHtmlHead(lang('Notifications.title')); replace_breadcrumb_params([ - 0 => $this->podcast->at_handle, + 0 => $podcast->at_handle, ]); return view('podcast/notifications', $data); } - public function markAsRead(): RedirectResponse + public function markAllAsReadAction(Podcast $podcast): RedirectResponse { - $this->notification->read_at = new Time('now'); - $notificationModel = new NotificationModel(); - $notificationModel->update($this->notification->id, $this->notification); - - if ($this->notification->post_id === null) { - return redirect()->route('podcast-activity', [esc($this->podcast->handle)]); - } - - $post = (new PostModel())->getPostById($this->notification->post_id); - - return redirect()->route('post', [$this->podcast->handle, $post->id]); - } - - public function markAllAsRead(): RedirectResponse - { - $notifications = (new NotificationModel())->where('target_actor_id', $this->podcast->actor_id) + $notifications = (new NotificationModel())->where('target_actor_id', $podcast->actor_id) ->where('read_at', null) ->findAll(); @@ -101,4 +83,19 @@ class NotificationController extends BaseController return redirect()->back(); } + + public function markAsReadAction(Podcast $podcast, Notification $notification): RedirectResponse + { + $notification->read_at = new Time('now'); + $notificationModel = new NotificationModel(); + $notificationModel->update($notification->id, $notification); + + if ($notification->post_id === null) { + return redirect()->route('podcast-activity', [esc($podcast->handle)]); + } + + $post = (new PostModel())->getPostById($notification->post_id); + + return redirect()->route('post', [$podcast->handle, $post->id]); + } } diff --git a/modules/Admin/Controllers/PageController.php b/modules/Admin/Controllers/PageController.php index f2df5e62..895d8f9c 100644 --- a/modules/Admin/Controllers/PageController.php +++ b/modules/Admin/Controllers/PageController.php @@ -17,16 +17,14 @@ use CodeIgniter\HTTP\RedirectResponse; class PageController extends BaseController { - protected ?Page $page = null; - public function _remap(string $method, string ...$params): mixed { if ($params === []) { return $this->{$method}(); } - if (($this->page = (new PageModel())->find($params[0])) instanceof Page) { - return $this->{$method}(); + if (($page = (new PageModel())->find($params[0])) instanceof Page) { + return $this->{$method}($page); } throw PageNotFoundException::forPageNotFound(); @@ -42,15 +40,15 @@ class PageController extends BaseController return view('page/list', $data); } - public function view(): string + public function view(Page $page): string { - $this->setHtmlHead($this->page->title); + $this->setHtmlHead($page->title); return view('page/view', [ - 'page' => $this->page, + 'page' => $page, ]); } - public function create(): string + public function createView(): string { helper('form'); @@ -58,7 +56,7 @@ class PageController extends BaseController return view('page/create'); } - public function attemptCreate(): RedirectResponse + public function createAction(): RedirectResponse { $page = new Page([ 'title' => $this->request->getPost('title'), @@ -82,40 +80,40 @@ class PageController extends BaseController ])); } - public function edit(): string + public function editView(Page $page): string { helper('form'); $this->setHtmlHead(lang('Page.edit')); replace_breadcrumb_params([ - 0 => $this->page->title, + 0 => $page->title, ]); return view('page/edit', [ - 'page' => $this->page, + 'page' => $page, ]); } - public function attemptEdit(): RedirectResponse + public function editAction(Page $page): RedirectResponse { - $this->page->title = $this->request->getPost('title'); - $this->page->slug = $this->request->getPost('slug'); - $this->page->content_markdown = $this->request->getPost('content'); + $page->title = $this->request->getPost('title'); + $page->slug = $this->request->getPost('slug'); + $page->content_markdown = $this->request->getPost('content'); $pageModel = new PageModel(); - if (! $pageModel->update($this->page->id, $this->page)) { + if (! $pageModel->update($page->id, $page)) { return redirect() ->back() ->withInput() ->with('errors', $pageModel->errors()); } - return redirect()->route('page-edit', [$this->page->id])->with('message', lang('Page.messages.editSuccess')); + return redirect()->route('page-edit', [$page->id])->with('message', lang('Page.messages.editSuccess')); } - public function delete(): RedirectResponse + public function deleteAction(Page $page): RedirectResponse { - (new PageModel())->delete($this->page->id); + (new PageModel())->delete($page->id); return redirect()->route('page-list'); } diff --git a/modules/Admin/Controllers/PersonController.php b/modules/Admin/Controllers/PersonController.php index 7f37e4ab..f41b6097 100644 --- a/modules/Admin/Controllers/PersonController.php +++ b/modules/Admin/Controllers/PersonController.php @@ -18,8 +18,6 @@ use Modules\Media\Models\MediaModel; class PersonController extends BaseController { - protected ?Person $person = null; - public function _remap(string $method, string ...$params): mixed { if ($params === []) { @@ -27,15 +25,15 @@ class PersonController extends BaseController } if ( - ($this->person = (new PersonModel())->getPersonById((int) $params[0])) instanceof Person + ($person = (new PersonModel())->getPersonById((int) $params[0])) instanceof Person ) { - return $this->{$method}(); + return $this->{$method}($person); } throw PageNotFoundException::forPageNotFound(); } - public function index(): string + public function list(): string { $data = [ 'persons' => (new PersonModel())->orderBy('full_name') @@ -46,20 +44,20 @@ class PersonController extends BaseController return view('person/list', $data); } - public function view(): string + public function view(Person $person): string { $data = [ - 'person' => $this->person, + 'person' => $person, ]; - $this->setHtmlHead($this->person->full_name); + $this->setHtmlHead($person->full_name); replace_breadcrumb_params([ - 0 => $this->person->full_name, + 0 => $person->full_name, ]); return view('person/view', $data); } - public function create(): string + public function createView(): string { helper(['form']); @@ -67,7 +65,7 @@ class PersonController extends BaseController return view('person/create'); } - public function attemptCreate(): RedirectResponse + public function createAction(): RedirectResponse { $rules = [ 'avatar' => 'is_image[avatar]|ext_in[avatar,jpg,jpeg,png]|min_dims[avatar,400,400]|is_image_ratio[avatar,1,1]', @@ -107,22 +105,22 @@ class PersonController extends BaseController ->with('message', lang('Person.messages.createSuccess')); } - public function edit(): string + public function editView(Person $person): string { helper('form'); $data = [ - 'person' => $this->person, + 'person' => $person, ]; $this->setHtmlHead(lang('Person.edit')); replace_breadcrumb_params([ - 0 => $this->person->full_name, + 0 => $person->full_name, ]); return view('person/edit', $data); } - public function attemptEdit(): RedirectResponse + public function editAction(Person $person): RedirectResponse { $rules = [ 'avatar' => 'is_image[avatar]|ext_in[avatar,jpg,jpeg,png]|min_dims[avatar,400,400]|is_image_ratio[avatar,1,1]', @@ -135,34 +133,34 @@ class PersonController extends BaseController ->with('errors', $this->validator->getErrors()); } - $this->person->updated_by = user_id(); - $this->person->full_name = $this->request->getPost('full_name'); - $this->person->unique_name = $this->request->getPost('unique_name'); - $this->person->information_url = $this->request->getPost('information_url'); - $this->person->setAvatar($this->request->getFile('avatar')); + $person->updated_by = user_id(); + $person->full_name = $this->request->getPost('full_name'); + $person->unique_name = $this->request->getPost('unique_name'); + $person->information_url = $this->request->getPost('information_url'); + $person->setAvatar($this->request->getFile('avatar')); $personModel = new PersonModel(); - if (! $personModel->update($this->person->id, $this->person)) { + if (! $personModel->update($person->id, $person)) { return redirect() ->back() ->withInput() ->with('errors', $personModel->errors()); } - return redirect()->route('person-edit', [$this->person->id])->with( + return redirect()->route('person-edit', [$person->id])->with( 'message', lang('Person.messages.editSuccess') ); } - public function delete(): RedirectResponse + public function deleteAction(Person $person): RedirectResponse { - if ($this->person->avatar_id !== null) { + if ($person->avatar_id !== null) { // delete avatar to prevent collision if recreating person - (new MediaModel())->deleteMedia($this->person->avatar); + (new MediaModel())->deleteMedia($person->avatar); } - (new PersonModel())->delete($this->person->id); + (new PersonModel())->delete($person->id); return redirect()->route('person-list') ->with('message', lang('Person.messages.deleteSuccess')); diff --git a/modules/Admin/Controllers/PodcastController.php b/modules/Admin/Controllers/PodcastController.php index 5075a26f..bcc0caed 100644 --- a/modules/Admin/Controllers/PodcastController.php +++ b/modules/Admin/Controllers/PodcastController.php @@ -38,8 +38,6 @@ use Modules\Media\Models\MediaModel; class PodcastController extends BaseController { - protected Podcast $podcast; - public function _remap(string $method, string ...$params): mixed { if ($params === []) { @@ -49,8 +47,7 @@ class PodcastController extends BaseController if ( ($podcast = (new PodcastModel())->getPodcastById((int) $params[0])) instanceof Podcast ) { - $this->podcast = $podcast; - return $this->{$method}(); + return $this->{$method}($podcast); } throw PageNotFoundException::forPageNotFound(); @@ -72,111 +69,111 @@ class PodcastController extends BaseController return view('podcast/list', $data); } - public function view(): string + public function view(Podcast $podcast): string { $data = [ - 'podcast' => $this->podcast, + 'podcast' => $podcast, ]; - $this->setHtmlHead($this->podcast->title); + $this->setHtmlHead($podcast->title); replace_breadcrumb_params([ - 0 => $this->podcast->at_handle, + 0 => $podcast->at_handle, ]); return view('podcast/view', $data); } - public function viewAnalytics(): string + public function analyticsView(Podcast $podcast): string { $data = [ - 'podcast' => $this->podcast, + 'podcast' => $podcast, ]; - $this->setHtmlHead($this->podcast->title); + $this->setHtmlHead($podcast->title); replace_breadcrumb_params([ - 0 => $this->podcast->at_handle, + 0 => $podcast->at_handle, ]); return view('podcast/analytics/index', $data); } - public function viewAnalyticsWebpages(): string + public function analyticsWebpagesView(Podcast $podcast): string { $data = [ - 'podcast' => $this->podcast, + 'podcast' => $podcast, ]; - $this->setHtmlHead($this->podcast->title); + $this->setHtmlHead($podcast->title); replace_breadcrumb_params([ - 0 => $this->podcast->at_handle, + 0 => $podcast->at_handle, ]); return view('podcast/analytics/webpages', $data); } - public function viewAnalyticsLocations(): string + public function analyticsLocationsView(Podcast $podcast): string { $data = [ - 'podcast' => $this->podcast, + 'podcast' => $podcast, ]; - $this->setHtmlHead($this->podcast->title); + $this->setHtmlHead($podcast->title); replace_breadcrumb_params([ - 0 => $this->podcast->at_handle, + 0 => $podcast->at_handle, ]); return view('podcast/analytics/locations', $data); } - public function viewAnalyticsUniqueListeners(): string + public function analyticsUniqueListenersView(Podcast $podcast): string { $data = [ - 'podcast' => $this->podcast, + 'podcast' => $podcast, ]; - $this->setHtmlHead($this->podcast->title); + $this->setHtmlHead($podcast->title); replace_breadcrumb_params([ - 0 => $this->podcast->at_handle, + 0 => $podcast->at_handle, ]); return view('podcast/analytics/unique_listeners', $data); } - public function viewAnalyticsListeningTime(): string + public function analyticsListeningTimeView(Podcast $podcast): string { $data = [ - 'podcast' => $this->podcast, + 'podcast' => $podcast, ]; - $this->setHtmlHead($this->podcast->title); + $this->setHtmlHead($podcast->title); replace_breadcrumb_params([ - 0 => $this->podcast->at_handle, + 0 => $podcast->at_handle, ]); return view('podcast/analytics/listening_time', $data); } - public function viewAnalyticsTimePeriods(): string + public function analyticsTimePeriodsView(Podcast $podcast): string { $data = [ - 'podcast' => $this->podcast, + 'podcast' => $podcast, ]; - $this->setHtmlHead($this->podcast->title); + $this->setHtmlHead($podcast->title); replace_breadcrumb_params([ - 0 => $this->podcast->at_handle, + 0 => $podcast->at_handle, ]); return view('podcast/analytics/time_periods', $data); } - public function viewAnalyticsPlayers(): string + public function analyticsPlayersView(Podcast $podcast): string { $data = [ - 'podcast' => $this->podcast, + 'podcast' => $podcast, ]; - $this->setHtmlHead($this->podcast->title); + $this->setHtmlHead($podcast->title); replace_breadcrumb_params([ - 0 => $this->podcast->at_handle, + 0 => $podcast->at_handle, ]); return view('podcast/analytics/players', $data); } - public function create(): string + public function createView(): string { helper(['form', 'misc']); @@ -193,7 +190,7 @@ class PodcastController extends BaseController return view('podcast/create', $data); } - public function attemptCreate(): RedirectResponse + public function createAction(): RedirectResponse { $rules = [ 'cover' => 'uploaded[cover]|is_image[cover]|ext_in[cover,jpg,jpeg,png]|min_dims[cover,1400,1400]|is_image_ratio[cover,1,1]', @@ -267,7 +264,7 @@ class PodcastController extends BaseController ); } - public function edit(): string + public function editView(Podcast $podcast): string { helper('form'); @@ -275,19 +272,19 @@ class PodcastController extends BaseController $categoryOptions = (new CategoryModel())->getCategoryOptions(); $data = [ - 'podcast' => $this->podcast, + 'podcast' => $podcast, 'languageOptions' => $languageOptions, 'categoryOptions' => $categoryOptions, ]; $this->setHtmlHead(lang('Podcast.edit')); replace_breadcrumb_params([ - 0 => $this->podcast->at_handle, + 0 => $podcast->at_handle, ]); return view('podcast/edit', $data); } - public function attemptEdit(): RedirectResponse + public function editAction(Podcast $podcast): RedirectResponse { $rules = [ 'cover' => 'is_image[cover]|ext_in[cover,jpg,jpeg,png]|min_dims[cover,1400,1400]|is_image_ratio[cover,1,1]', @@ -301,46 +298,46 @@ class PodcastController extends BaseController ->with('errors', $this->validator->getErrors()); } - $this->podcast->updated_by = (int) user_id(); + $podcast->updated_by = (int) user_id(); - $this->podcast->title = $this->request->getPost('title'); - $this->podcast->description_markdown = $this->request->getPost('description'); - $this->podcast->setCover($this->request->getFile('cover')); - $this->podcast->setBanner($this->request->getFile('banner')); + $podcast->title = $this->request->getPost('title'); + $podcast->description_markdown = $this->request->getPost('description'); + $podcast->setCover($this->request->getFile('cover')); + $podcast->setBanner($this->request->getFile('banner')); - $this->podcast->language_code = $this->request->getPost('language'); - $this->podcast->category_id = $this->request->getPost('category'); - $this->podcast->parental_advisory = + $podcast->language_code = $this->request->getPost('language'); + $podcast->category_id = $this->request->getPost('category'); + $podcast->parental_advisory = $this->request->getPost('parental_advisory') !== 'undefined' ? $this->request->getPost('parental_advisory') : null; - $this->podcast->publisher = $this->request->getPost('publisher'); - $this->podcast->owner_name = $this->request->getPost('owner_name'); - $this->podcast->owner_email = $this->request->getPost('owner_email'); - $this->podcast->type = $this->request->getPost('type'); - $this->podcast->copyright = $this->request->getPost('copyright'); - $this->podcast->location = $this->request->getPost('location_name') === '' ? null : new Location( + $podcast->publisher = $this->request->getPost('publisher'); + $podcast->owner_name = $this->request->getPost('owner_name'); + $podcast->owner_email = $this->request->getPost('owner_email'); + $podcast->type = $this->request->getPost('type'); + $podcast->copyright = $this->request->getPost('copyright'); + $podcast->location = $this->request->getPost('location_name') === '' ? null : new Location( $this->request->getPost('location_name') ); - $this->podcast->new_feed_url = $this->request->getPost('new_feed_url') === '' ? null : $this->request->getPost( + $podcast->new_feed_url = $this->request->getPost('new_feed_url') === '' ? null : $this->request->getPost( 'new_feed_url' ); - $this->podcast->is_blocked = $this->request->getPost('block') === 'yes'; - $this->podcast->is_completed = + $podcast->is_blocked = $this->request->getPost('block') === 'yes'; + $podcast->is_completed = $this->request->getPost('complete') === 'yes'; - $this->podcast->is_locked = $this->request->getPost('lock') === 'yes'; - $this->podcast->is_premium_by_default = $this->request->getPost('premium_by_default') === 'yes'; + $podcast->is_locked = $this->request->getPost('lock') === 'yes'; + $podcast->is_premium_by_default = $this->request->getPost('premium_by_default') === 'yes'; // republish on websub hubs upon edit - $this->podcast->is_published_on_hubs = false; + $podcast->is_published_on_hubs = false; $db = db_connect(); $db->transStart(); $podcastModel = new PodcastModel(); - if (! $podcastModel->update($this->podcast->id, $this->podcast)) { + if (! $podcastModel->update($podcast->id, $podcast)) { $db->transRollback(); return redirect() ->back() @@ -350,21 +347,21 @@ class PodcastController extends BaseController // set Podcast categories (new CategoryModel())->setPodcastCategories( - $this->podcast->id, + $podcast->id, $this->request->getPost('other_categories') ?? [], ); $db->transComplete(); - return redirect()->route('podcast-edit', [$this->podcast->id])->with( + return redirect()->route('podcast-edit', [$podcast->id])->with( 'message', lang('Podcast.messages.editSuccess') ); } - public function deleteBanner(): RedirectResponse + public function deleteBannerAction(Podcast $podcast): RedirectResponse { - if (! $this->podcast->banner instanceof Image) { + if (! $podcast->banner instanceof Image) { return redirect()->back(); } @@ -373,7 +370,7 @@ class PodcastController extends BaseController $db->transStart(); $mediaModel = new MediaModel(); - if (! $mediaModel->deleteMedia($this->podcast->banner)) { + if (! $mediaModel->deleteMedia($podcast->banner)) { return redirect() ->back() ->withInput() @@ -381,11 +378,11 @@ class PodcastController extends BaseController } (new PodcastModel())->clearCache([ - 'id' => $this->podcast->id, + 'id' => $podcast->id, ]); // remove banner url from actor - $actor = (new ActorModel())->getActorById($this->podcast->actor_id); + $actor = (new ActorModel())->getActorById($podcast->actor_id); if ($actor instanceof Actor) { $actor->cover_image_url = null; @@ -399,7 +396,7 @@ class PodcastController extends BaseController return redirect()->back(); } - public function latestEpisodes(int $limit, int $podcastId): string + public function latestEpisodesView(int $limit, int $podcastId): string { $episodes = (new EpisodeModel()) ->where('podcast_id', $podcastId) @@ -413,22 +410,22 @@ class PodcastController extends BaseController ]); } - public function delete(): string + public function deleteView(Podcast $podcast): string { helper(['form']); $data = [ - 'podcast' => $this->podcast, + 'podcast' => $podcast, ]; $this->setHtmlHead(lang('Podcast.delete')); replace_breadcrumb_params([ - 0 => $this->podcast->at_handle, + 0 => $podcast->at_handle, ]); return view('podcast/delete', $data); } - public function attemptDelete(): RedirectResponse + public function deleteAction(Podcast $podcast): RedirectResponse { $rules = [ 'understand' => 'required', @@ -446,7 +443,7 @@ class PodcastController extends BaseController $db->transStart(); //delete podcast episodes - $podcastEpisodes = (new EpisodeModel())->where('podcast_id', $this->podcast->id) + $podcastEpisodes = (new EpisodeModel())->where('podcast_id', $podcast->id) ->findAll(); foreach ($podcastEpisodes as $podcastEpisode) { @@ -486,7 +483,7 @@ class PodcastController extends BaseController //delete podcast $podcastModel = new PodcastModel(); - if (! $podcastModel->delete($this->podcast->id)) { + if (! $podcastModel->delete($podcast->id)) { $db->transRollback(); return redirect() ->back() @@ -498,15 +495,15 @@ class PodcastController extends BaseController $podcastMediaList = [ [ 'type' => 'cover', - 'file' => $this->podcast->cover, + 'file' => $podcast->cover, ], ]; - if ($this->podcast->banner_id !== null) { + if ($podcast->banner_id !== null) { $podcastMediaList[] = [ 'type' => 'banner', - 'file' => $this->podcast->banner, + 'file' => $podcast->banner, ]; } @@ -527,7 +524,7 @@ class PodcastController extends BaseController //delete podcast actor $actorModel = new ActorModel(); - if (! $actorModel->delete($this->podcast->actor_id)) { + if (! $actorModel->delete($podcast->actor_id)) { $db->transRollback(); return redirect() ->back() @@ -549,7 +546,7 @@ class PodcastController extends BaseController ]; foreach ($analyticsModels as $analyticsModel) { if (! $analyticsModel->where([ - 'podcast_id' => $this->podcast->id, + 'podcast_id' => $podcast->id, ])->delete()) { $db->transRollback(); return redirect() @@ -565,11 +562,11 @@ class PodcastController extends BaseController $fileManager = service('file_manager'); //delete podcast media files and folder - $folder = 'podcasts/' . $this->podcast->handle; + $folder = 'podcasts/' . $podcast->handle; if (! $fileManager->deleteAll($folder)) { return redirect()->route('podcast-list') ->with('message', lang('Podcast.messages.deleteSuccess', [ - 'podcast_handle' => $this->podcast->handle, + 'podcast_handle' => $podcast->handle, ])) ->with('warning', lang('Podcast.messages.deletePodcastMediaFolderError', [ 'folder_path' => $folder, @@ -578,29 +575,29 @@ class PodcastController extends BaseController return redirect()->route('podcast-list') ->with('message', lang('Podcast.messages.deleteSuccess', [ - 'podcast_handle' => $this->podcast->handle, + 'podcast_handle' => $podcast->handle, ])); } - public function publish(): string | RedirectResponse + public function publishView(Podcast $podcast): string | RedirectResponse { helper(['form']); $data = [ - 'podcast' => $this->podcast, + 'podcast' => $podcast, ]; $this->setHtmlHead(lang('Podcast.publish')); replace_breadcrumb_params([ - 0 => $this->podcast->at_handle, + 0 => $podcast->at_handle, ]); return view('podcast/publish', $data); } - public function attemptPublish(): RedirectResponse + public function publishAction(Podcast $podcast): RedirectResponse { - if ($this->podcast->publication_status !== 'not_published') { - return redirect()->route('podcast-view', [$this->podcast->id])->with( + if ($podcast->publication_status !== 'not_published') { + return redirect()->route('podcast-view', [$podcast->id])->with( 'error', lang('Podcast.messages.publishError') ); @@ -627,7 +624,7 @@ class PodcastController extends BaseController if ($publishMethod === 'schedule') { $scheduledPublicationDate = $validData['scheduled_publication_date']; if ($scheduledPublicationDate) { - $this->podcast->published_at = Time::createFromFormat( + $podcast->published_at = Time::createFromFormat( 'Y-m-d H:i', $scheduledPublicationDate, $this->request->getPost('client_timezone'), @@ -640,19 +637,19 @@ class PodcastController extends BaseController ->with('error', lang('Podcast.messages.scheduleDateError')); } } else { - $this->podcast->published_at = Time::now(); + $podcast->published_at = Time::now(); } $message = $this->request->getPost('message'); // only create post if message is not empty if ($message !== '') { $newPost = new Post([ - 'actor_id' => $this->podcast->actor_id, + 'actor_id' => $podcast->actor_id, 'message' => $message, 'created_by' => user_id(), ]); - $newPost->published_at = $this->podcast->published_at; + $newPost->published_at = $podcast->published_at; $postModel = new PostModel(); if (! $postModel->addPost($newPost)) { @@ -665,12 +662,12 @@ class PodcastController extends BaseController } $episodes = (new EpisodeModel()) - ->where('podcast_id', $this->podcast->id) + ->where('podcast_id', $podcast->id) ->where('published_at !=', null) ->findAll(); foreach ($episodes as $episode) { - $episode->published_at = $this->podcast->published_at->addSeconds(1); + $episode->published_at = $podcast->published_at->addSeconds(1); $episodeModel = new EpisodeModel(); if (! $episodeModel->update($episode->id, $episode)) { @@ -698,7 +695,7 @@ class PodcastController extends BaseController } $podcastModel = new PodcastModel(); - if (! $podcastModel->update($this->podcast->id, $this->podcast)) { + if (! $podcastModel->update($podcast->id, $podcast)) { $db->transRollback(); return redirect() ->back() @@ -708,18 +705,18 @@ class PodcastController extends BaseController $db->transComplete(); - return redirect()->route('podcast-view', [$this->podcast->id]); + return redirect()->route('podcast-view', [$podcast->id]); } - public function publishEdit(): string | RedirectResponse + public function publishEditView(Podcast $podcast): string | RedirectResponse { helper(['form']); $data = [ - 'podcast' => $this->podcast, + 'podcast' => $podcast, 'post' => (new PostModel()) ->where([ - 'actor_id' => $this->podcast->actor_id, + 'actor_id' => $podcast->actor_id, 'episode_id' => null, ]) ->first(), @@ -727,15 +724,15 @@ class PodcastController extends BaseController $this->setHtmlHead(lang('Podcast.publish_edit')); replace_breadcrumb_params([ - 0 => $this->podcast->at_handle, + 0 => $podcast->at_handle, ]); return view('podcast/publish_edit', $data); } - public function attemptPublishEdit(): RedirectResponse + public function publishEditAction(Podcast $podcast): RedirectResponse { - if ($this->podcast->publication_status !== 'scheduled') { - return redirect()->route('podcast-view', [$this->podcast->id])->with( + if ($podcast->publication_status !== 'scheduled') { + return redirect()->route('podcast-view', [$podcast->id])->with( 'error', lang('Podcast.messages.publishEditError') ); @@ -762,7 +759,7 @@ class PodcastController extends BaseController if ($publishMethod === 'schedule') { $scheduledPublicationDate = $validData['scheduled_publication_date']; if ($scheduledPublicationDate) { - $this->podcast->published_at = Time::createFromFormat( + $podcast->published_at = Time::createFromFormat( 'Y-m-d H:i', $scheduledPublicationDate, $this->request->getPost('client_timezone'), @@ -775,12 +772,12 @@ class PodcastController extends BaseController ->with('error', lang('Podcast.messages.scheduleDateError')); } } else { - $this->podcast->published_at = Time::now(); + $podcast->published_at = Time::now(); } $post = (new PostModel()) ->where([ - 'actor_id' => $this->podcast->actor_id, + 'actor_id' => $podcast->actor_id, 'episode_id' => null, ]) ->first(); @@ -791,7 +788,7 @@ class PodcastController extends BaseController if ($newPostMessage !== '') { // edit post if post exists and message is not empty $post->message = $newPostMessage; - $post->published_at = $this->podcast->published_at; + $post->published_at = $podcast->published_at; $postModel = new PostModel(); if (! $postModel->editPost($post)) { @@ -806,7 +803,7 @@ class PodcastController extends BaseController $postModel = new PostModel(); $post = $postModel ->where([ - 'actor_id' => $this->podcast->actor_id, + 'actor_id' => $podcast->actor_id, 'episode_id' => null, ]) ->first(); @@ -815,12 +812,12 @@ class PodcastController extends BaseController } elseif ($newPostMessage !== '') { // create post if there is no post and message is not empty $newPost = new Post([ - 'actor_id' => $this->podcast->actor_id, + 'actor_id' => $podcast->actor_id, 'message' => $newPostMessage, 'created_by' => user_id(), ]); - $newPost->published_at = $this->podcast->published_at; + $newPost->published_at = $podcast->published_at; $postModel = new PostModel(); if (! $postModel->addPost($newPost)) { @@ -833,12 +830,12 @@ class PodcastController extends BaseController } $episodes = (new EpisodeModel()) - ->where('podcast_id', $this->podcast->id) + ->where('podcast_id', $podcast->id) ->where('published_at !=', null) ->findAll(); foreach ($episodes as $episode) { - $episode->published_at = $this->podcast->published_at->addSeconds(1); + $episode->published_at = $podcast->published_at->addSeconds(1); $episodeModel = new EpisodeModel(); if (! $episodeModel->update($episode->id, $episode)) { @@ -866,7 +863,7 @@ class PodcastController extends BaseController } $podcastModel = new PodcastModel(); - if (! $podcastModel->update($this->podcast->id, $this->podcast)) { + if (! $podcastModel->update($podcast->id, $podcast)) { $db->transRollback(); return redirect() ->back() @@ -876,13 +873,13 @@ class PodcastController extends BaseController $db->transComplete(); - return redirect()->route('podcast-view', [$this->podcast->id]); + return redirect()->route('podcast-view', [$podcast->id]); } - public function publishCancel(): RedirectResponse + public function publishCancelAction(Podcast $podcast): RedirectResponse { - if ($this->podcast->publication_status !== 'scheduled') { - return redirect()->route('podcast-view', [$this->podcast->id]); + if ($podcast->publication_status !== 'scheduled') { + return redirect()->route('podcast-view', [$podcast->id]); } $db = db_connect(); @@ -891,7 +888,7 @@ class PodcastController extends BaseController $postModel = new PostModel(); $post = $postModel ->where([ - 'actor_id' => $this->podcast->actor_id, + 'actor_id' => $podcast->actor_id, 'episode_id' => null, ]) ->first(); @@ -900,7 +897,7 @@ class PodcastController extends BaseController } $episodes = (new EpisodeModel()) - ->where('podcast_id', $this->podcast->id) + ->where('podcast_id', $podcast->id) ->where('published_at !=', null) ->findAll(); @@ -922,10 +919,10 @@ class PodcastController extends BaseController $postModel->removePost($post); } - $this->podcast->published_at = null; + $podcast->published_at = null; $podcastModel = new PodcastModel(); - if (! $podcastModel->update($this->podcast->id, $this->podcast)) { + if (! $podcastModel->update($podcast->id, $podcast)) { $db->transRollback(); return redirect() ->back() @@ -935,7 +932,7 @@ class PodcastController extends BaseController $db->transComplete(); - return redirect()->route('podcast-view', [$this->podcast->id])->with( + return redirect()->route('podcast-view', [$podcast->id])->with( 'message', lang('Podcast.messages.publishCancelSuccess') ); diff --git a/modules/Admin/Controllers/PodcastPersonController.php b/modules/Admin/Controllers/PodcastPersonController.php index bdb03a4b..b0b93539 100644 --- a/modules/Admin/Controllers/PodcastPersonController.php +++ b/modules/Admin/Controllers/PodcastPersonController.php @@ -27,34 +27,34 @@ class PodcastPersonController extends BaseController } if ( - ($this->podcast = (new PodcastModel())->getPodcastById((int) $params[0])) instanceof Podcast + ($podcast = (new PodcastModel())->getPodcastById((int) $params[0])) instanceof Podcast ) { unset($params[0]); - return $this->{$method}(...$params); + return $this->{$method}($podcast, ...$params); } throw PageNotFoundException::forPageNotFound(); } - public function index(): string + public function index(Podcast $podcast): string { helper('form'); $data = [ - 'podcast' => $this->podcast, - 'podcastPersons' => (new PersonModel())->getPodcastPersons($this->podcast->id), + 'podcast' => $podcast, + 'podcastPersons' => (new PersonModel())->getPodcastPersons($podcast->id), 'personOptions' => (new PersonModel())->getPersonOptions(), 'taxonomyOptions' => (new PersonModel())->getTaxonomyOptions(), ]; $this->setHtmlHead(lang('Person.podcast_form.title')); replace_breadcrumb_params([ - 0 => $this->podcast->at_handle, + 0 => $podcast->at_handle, ]); return view('podcast/persons', $data); } - public function attemptCreate(): RedirectResponse + public function createAction(Podcast $podcast): RedirectResponse { $rules = [ 'persons' => 'required', @@ -70,7 +70,7 @@ class PodcastPersonController extends BaseController $validData = $this->validator->getValidated(); (new PersonModel())->addPodcastPersons( - $this->podcast->id, + $podcast->id, $validData['persons'], $this->request->getPost('roles') ?? [], ); @@ -78,9 +78,9 @@ class PodcastPersonController extends BaseController return redirect()->back(); } - public function remove(string $personId): RedirectResponse + public function deleteAction(Podcast $podcast, string $personId): RedirectResponse { - (new PersonModel())->removePersonFromPodcast($this->podcast->id, (int) $personId); + (new PersonModel())->removePersonFromPodcast($podcast->id, (int) $personId); return redirect()->back(); } diff --git a/modules/Admin/Controllers/SettingsController.php b/modules/Admin/Controllers/SettingsController.php index 0262b3fb..e3e1ce7a 100644 --- a/modules/Admin/Controllers/SettingsController.php +++ b/modules/Admin/Controllers/SettingsController.php @@ -34,7 +34,7 @@ class SettingsController extends BaseController return view('settings/general'); } - public function attemptInstanceEdit(): RedirectResponse + public function instanceEditAction(): RedirectResponse { $rules = [ 'site_icon' => 'is_image[site_icon]|ext_in[site_icon,png,jpeg]|is_image_ratio[site_icon,1,1]|min_dims[image,512,512]|permit_empty', @@ -119,7 +119,7 @@ class SettingsController extends BaseController return redirect('settings-general')->with('message', lang('Settings.instance.editSuccess')); } - public function deleteIcon(): RedirectResponse + public function deleteIconAction(): RedirectResponse { /** @var FileManagerInterface $fileManager */ $fileManager = service('file_manager'); @@ -133,7 +133,7 @@ class SettingsController extends BaseController return redirect('settings-general')->with('message', lang('Settings.instance.deleteIconSuccess')); } - public function regenerateImages(): RedirectResponse + public function regenerateImagesAction(): RedirectResponse { /** @var Podcast[] $allPodcasts */ $allPodcasts = (new PodcastModel())->findAll(); @@ -168,7 +168,7 @@ class SettingsController extends BaseController return redirect('settings-general')->with('message', lang('Settings.images.regenerationSuccess')); } - public function runHousekeeping(): RedirectResponse + public function housekeepingAction(): RedirectResponse { if ($this->request->getPost('reset_counts') === 'yes') { // recalculate fediverse counts @@ -200,14 +200,14 @@ class SettingsController extends BaseController return redirect('settings-general')->with('message', lang('Settings.housekeeping.runSuccess')); } - public function theme(): string + public function themeView(): string { helper('form'); $this->setHtmlHead(lang('Settings.theme.title')); return view('settings/theme'); } - public function attemptSetInstanceTheme(): RedirectResponse + public function themeAction(): RedirectResponse { $theme = $this->request->getPost('theme'); service('settings') diff --git a/modules/Admin/Controllers/SoundbiteController.php b/modules/Admin/Controllers/SoundbiteController.php index 1d6f5ae9..14ea790d 100644 --- a/modules/Admin/Controllers/SoundbiteController.php +++ b/modules/Admin/Controllers/SoundbiteController.php @@ -22,47 +22,38 @@ use Modules\Media\Models\MediaModel; class SoundbiteController extends BaseController { - protected Podcast $podcast; - - protected Episode $episode; - public function _remap(string $method, string ...$params): mixed { + if ($params === []) { + throw PageNotFoundException::forPageNotFound(); + } + + if (count($params) === 1) { + if (! ($podcast = (new PodcastModel())->getPodcastById((int) $params[0])) instanceof Podcast) { + throw PageNotFoundException::forPageNotFound(); + } + + return $this->{$method}($podcast); + } + if ( - ! ($podcast = (new PodcastModel())->getPodcastById((int) $params[0])) instanceof Podcast + ! ($episode = (new EpisodeModel())->getEpisodeById((int) $params[1]) instanceof Episode) ) { throw PageNotFoundException::forPageNotFound(); } - $this->podcast = $podcast; + unset($params[0]); + unset($params[1]); - if (count($params) > 1) { - if ( - ! ($episode = (new EpisodeModel()) - ->where([ - 'id' => $params[1], - 'podcast_id' => $params[0], - ]) - ->first()) instanceof Episode - ) { - throw PageNotFoundException::forPageNotFound(); - } - - $this->episode = $episode; - - unset($params[1]); - unset($params[0]); - } - - return $this->{$method}(...$params); + return $this->{$method}($episode, ...$params); } - public function list(): string + public function list(Episode $episode): string { $soundbitesBuilder = (new ClipModel('audio')) ->where([ - 'podcast_id' => $this->podcast->id, - 'episode_id' => $this->episode->id, + 'podcast_id' => $episode->podcast_id, + 'episode_id' => $episode->id, 'type' => 'audio', ]) ->orderBy('created_at', 'desc'); @@ -70,38 +61,38 @@ class SoundbiteController extends BaseController $soundbites = $soundbitesBuilder->paginate(10); $data = [ - 'podcast' => $this->podcast, - 'episode' => $this->episode, + 'podcast' => $episode->podcast, + 'episode' => $episode, 'soundbites' => $soundbites, 'pager' => $soundbitesBuilder->pager, ]; $this->setHtmlHead(lang('Soundbite.list.title')); replace_breadcrumb_params([ - 0 => $this->podcast->at_handle, - 1 => $this->episode->title, + 0 => $episode->podcast->at_handle, + 1 => $episode->title, ]); return view('episode/soundbites_list', $data); } - public function create(): string + public function createView(Episode $episode): string { helper(['form']); $data = [ - 'podcast' => $this->podcast, - 'episode' => $this->episode, + 'podcast' => $episode->podcast, + 'episode' => $episode, ]; $this->setHtmlHead(lang('Soundbite.form.title')); replace_breadcrumb_params([ - 0 => $this->podcast->at_handle, - 1 => $this->episode->title, + 0 => $episode->podcast->at_handle, + 1 => $episode->title, ]); return view('episode/soundbites_new', $data); } - public function attemptCreate(): RedirectResponse + public function createAction(Episode $episode): RedirectResponse { $rules = [ 'title' => 'required', @@ -124,8 +115,8 @@ class SoundbiteController extends BaseController 'duration' => (float) $validData['duration'], 'type' => 'audio', 'status' => '', - 'podcast_id' => $this->podcast->id, - 'episode_id' => $this->episode->id, + 'podcast_id' => $episode->podcast_id, + 'episode_id' => $episode->id, 'created_by' => user_id(), 'updated_by' => user_id(), ]); @@ -138,13 +129,13 @@ class SoundbiteController extends BaseController ->with('errors', $clipModel->errors()); } - return redirect()->route('soundbites-list', [$this->podcast->id, $this->episode->id])->with( + return redirect()->route('soundbites-list', [$episode->podcast_id, $episode->id])->with( 'message', lang('Soundbite.messages.createSuccess') ); } - public function delete(string $soundbiteId): RedirectResponse + public function deleteAction(Episode $episode, string $soundbiteId): RedirectResponse { $soundbite = (new ClipModel())->getSoundbiteById((int) $soundbiteId); @@ -154,9 +145,9 @@ class SoundbiteController extends BaseController if ($soundbite->media === null) { // delete Clip directly - (new ClipModel())->deleteSoundbite($this->podcast->id, $this->episode->id, $soundbite->id); + (new ClipModel())->deleteSoundbite($episode->podcast_id, $episode->id, $soundbite->id); } else { - (new ClipModel())->clearSoundbiteCache($this->podcast->id, $this->episode->id, $soundbite->id); + (new ClipModel())->clearSoundbiteCache($episode->podcast_id, $episode->id, $soundbite->id); $mediaModel = new MediaModel(); // delete the soundbite file, the clip will be deleted on cascade @@ -168,7 +159,7 @@ class SoundbiteController extends BaseController } } - return redirect()->route('soundbites-list', [$this->podcast->id, $this->episode->id])->with( + return redirect()->route('soundbites-list', [$episode->podcast_id, $episode->id])->with( 'message', lang('Soundbite.messages.deleteSuccess') ); diff --git a/modules/Admin/Controllers/VideoClipsController.php b/modules/Admin/Controllers/VideoClipsController.php index 848cee8d..2c6c1d02 100644 --- a/modules/Admin/Controllers/VideoClipsController.php +++ b/modules/Admin/Controllers/VideoClipsController.php @@ -23,47 +23,38 @@ use Modules\Media\Models\MediaModel; class VideoClipsController extends BaseController { - protected Podcast $podcast; - - protected Episode $episode; - public function _remap(string $method, string ...$params): mixed { + if ($params === []) { + throw PageNotFoundException::forPageNotFound(); + } + + if (count($params) === 1) { + if (! ($podcast = (new PodcastModel())->getPodcastById((int) $params[0])) instanceof Podcast) { + throw PageNotFoundException::forPageNotFound(); + } + + return $this->{$method}($podcast); + } + if ( - ! ($podcast = (new PodcastModel())->getPodcastById((int) $params[0])) instanceof Podcast + ! ($episode = (new EpisodeModel())->getEpisodeById((int) $params[1]) instanceof Episode) ) { throw PageNotFoundException::forPageNotFound(); } - $this->podcast = $podcast; + unset($params[0]); + unset($params[1]); - if (count($params) > 1) { - if ( - ! ($episode = (new EpisodeModel()) - ->where([ - 'id' => $params[1], - 'podcast_id' => $params[0], - ]) - ->first()) instanceof Episode - ) { - throw PageNotFoundException::forPageNotFound(); - } - - $this->episode = $episode; - - unset($params[1]); - unset($params[0]); - } - - return $this->{$method}(...$params); + return $this->{$method}($episode, ...$params); } - public function list(): string + public function list(Episode $episode): string { $videoClipsBuilder = (new ClipModel('video')) ->where([ - 'podcast_id' => $this->podcast->id, - 'episode_id' => $this->episode->id, + 'podcast_id' => $episode->podcast_id, + 'episode_id' => $episode->id, 'type' => 'video', ]) ->orderBy('created_at', 'desc'); @@ -76,27 +67,27 @@ class VideoClipsController extends BaseController } $data = [ - 'podcast' => $this->podcast, - 'episode' => $this->episode, + 'podcast' => $episode->podcast, + 'episode' => $episode, 'videoClips' => $videoClips, 'pager' => $videoClipsBuilder->pager, ]; $this->setHtmlHead(lang('VideoClip.list.title')); replace_breadcrumb_params([ - 0 => $this->podcast->at_handle, - 1 => $this->episode->title, + 0 => $episode->podcast->at_handle, + 1 => $episode->title, ]); return view('episode/video_clips_list', $data); } - public function view(string $videoClipId): string + public function view(Episode $episode, string $videoClipId): string { $videoClip = (new ClipModel())->getVideoClipById((int) $videoClipId); $data = [ - 'podcast' => $this->podcast, - 'episode' => $this->episode, + 'podcast' => $episode->podcast, + 'episode' => $episode, 'videoClip' => $videoClip, ]; @@ -104,23 +95,23 @@ class VideoClipsController extends BaseController 'videoClipLabel' => esc($videoClip->title), ])); replace_breadcrumb_params([ - 0 => $this->podcast->at_handle, - 1 => $this->episode->title, + 0 => $episode->podcast->at_handle, + 1 => $episode->title, 2 => $videoClip->title, ]); return view('episode/video_clip', $data); } - public function create(): string + public function createView(Episode $episode): string { $data = [ - 'podcast' => $this->podcast, - 'episode' => $this->episode, + 'podcast' => $episode->podcast, + 'episode' => $episode, ]; replace_breadcrumb_params([ - 0 => $this->podcast->at_handle, - 1 => $this->episode->title, + 0 => $episode->podcast->at_handle, + 1 => $episode->title, ]); // First, check that requirements to create a video clip are met @@ -129,7 +120,7 @@ class VideoClipsController extends BaseController 'ffmpeg' => $ffmpeg !== null, 'gd' => extension_loaded('gd'), 'freetype' => extension_loaded('gd') && gd_info()['FreeType Support'], - 'transcript' => $this->episode->transcript instanceof Transcript, + 'transcript' => $episode->transcript instanceof Transcript, ]; $this->setHtmlHead(lang('VideoClip.form.title')); @@ -143,7 +134,7 @@ class VideoClipsController extends BaseController return view('episode/video_clips_new', $data); } - public function attemptCreate(): RedirectResponse + public function createAction(Episode $episode): RedirectResponse { $rules = [ 'title' => 'required', @@ -178,8 +169,8 @@ class VideoClipsController extends BaseController 'format' => $validData['format'], 'type' => 'video', 'status' => 'queued', - 'podcast_id' => $this->podcast->id, - 'episode_id' => $this->episode->id, + 'podcast_id' => $episode->podcast_id, + 'episode_id' => $episode->id, 'created_by' => user_id(), 'updated_by' => user_id(), ]); @@ -195,13 +186,13 @@ class VideoClipsController extends BaseController (new ClipModel())->insert($videoClip); - return redirect()->route('video-clips-list', [$this->podcast->id, $this->episode->id])->with( + return redirect()->route('video-clips-list', [$episode->podcast_id, $episode->id])->with( 'message', lang('VideoClip.messages.addToQueueSuccess') ); } - public function retry(string $videoClipId): RedirectResponse + public function retryAction(Episode $episode, string $videoClipId): RedirectResponse { $videoClip = (new ClipModel())->getVideoClipById((int) $videoClipId); @@ -218,7 +209,7 @@ class VideoClipsController extends BaseController return redirect()->back(); } - public function delete(string $videoClipId): RedirectResponse + public function deleteAction(Episode $episode, string $videoClipId): RedirectResponse { $videoClip = (new ClipModel())->getVideoClipById((int) $videoClipId); @@ -228,7 +219,7 @@ class VideoClipsController extends BaseController if ($videoClip->media === null) { // delete Clip directly - (new ClipModel())->deleteVideoClip($this->podcast->id, $this->episode->id, $videoClip->id); + (new ClipModel())->deleteVideoClip($episode->podcast_id, $episode->id, $videoClip->id); } else { (new ClipModel())->clearVideoClipCache($videoClip->id); diff --git a/modules/Analytics/AnalyticsTrait.php b/modules/Analytics/AnalyticsTrait.php index 53aa13ef..e7d8a949 100644 --- a/modules/Analytics/AnalyticsTrait.php +++ b/modules/Analytics/AnalyticsTrait.php @@ -16,6 +16,11 @@ trait AnalyticsTrait { protected function registerPodcastWebpageHit(int $podcastId): void { + // Prevent analytics hit when authenticated + if (auth()->loggedIn()) { + return; + } + helper('analytics'); set_user_session_deny_list_ip(); diff --git a/modules/Auth/Config/Routes.php b/modules/Auth/Config/Routes.php index 46c8e324..c33aba71 100644 --- a/modules/Auth/Config/Routes.php +++ b/modules/Auth/Config/Routes.php @@ -26,7 +26,7 @@ $routes->group( ]); $routes->post('magic-link-set-password', 'MagicLinkController::setPasswordAction'); - $routes->post('interact-as-actor', 'InteractController::attemptInteractAsActor', [ + $routes->post('interact-as-actor', 'InteractController::interactAsActorAction', [ 'as' => 'interact-as-actor', ]); @@ -36,11 +36,11 @@ $routes->group( 'as' => 'user-list', 'filter' => 'permission:users.manage', ]); - $routes->get('new', 'UserController::create', [ + $routes->get('new', 'UserController::createView', [ 'as' => 'user-create', 'filter' => 'permission:users.manage', ]); - $routes->post('new', 'UserController::attemptCreate', [ + $routes->post('new', 'UserController::createAction', [ 'filter' => 'permission:users.manage', ]); // User @@ -49,18 +49,18 @@ $routes->group( 'as' => 'user-view', 'filter' => 'permission:users.manage', ]); - $routes->get('edit', 'UserController::edit/$1', [ + $routes->get('edit', 'UserController::editView/$1', [ 'as' => 'user-edit', 'filter' => 'permission:users.manage', ]); - $routes->post('edit', 'UserController::attemptEdit/$1', [ + $routes->post('edit', 'UserController::editAction/$1', [ 'filter' => 'permission:users.manage', ]); $routes->get('delete', 'UserController::delete/$1', [ 'as' => 'user-delete', 'filter' => 'permission:users.manage', ]); - $routes->post('delete', 'UserController::attemptDelete/$1', [ + $routes->post('delete', 'UserController::deleteAction/$1', [ 'as' => 'user-delete', 'filter' => 'permission:users.manage', ]); @@ -74,7 +74,7 @@ $routes->group( $routes->get('change-password', 'MyAccountController::changePassword', [ 'as' => 'change-password', ],); - $routes->post('change-password', 'MyAccountController::attemptChange'); + $routes->post('change-password', 'MyAccountController::changeAction'); }); // Podcast contributors @@ -83,13 +83,13 @@ $routes->group( 'as' => 'contributor-list', 'filter' => 'permission:podcast$1.manage-contributors', ]); - $routes->get('add', 'ContributorController::create/$1', [ + $routes->get('add', 'ContributorController::createView/$1', [ 'as' => 'contributor-add', 'filter' => 'permission:podcast$1.manage-contributors', ]); $routes->post( 'add', - 'ContributorController::attemptCreate/$1', + 'ContributorController::createAction/$1', [ 'filter' => 'permission:podcast$1.manage-contributors', ], @@ -102,7 +102,7 @@ $routes->group( ]); $routes->get( 'edit', - 'ContributorController::edit/$1/$2', + 'ContributorController::editView/$1/$2', [ 'as' => 'contributor-edit', 'filter' => 'permission:podcast$1.manage-contributors', @@ -110,7 +110,7 @@ $routes->group( ); $routes->post( 'edit', - 'ContributorController::attemptEdit/$1/$2', + 'ContributorController::editAction/$1/$2', [ 'filter' => 'permission:podcast$1.manage-contributors', ], @@ -125,7 +125,7 @@ $routes->group( ); $routes->post( 'remove', - 'ContributorController::attemptRemove/$1/$2', + 'ContributorController::removeAction/$1/$2', [ 'filter' => 'permission:podcast$1.manage-contributors', ], diff --git a/modules/Auth/Controllers/ContributorController.php b/modules/Auth/Controllers/ContributorController.php index 2c5c7961..b8df9866 100644 --- a/modules/Auth/Controllers/ContributorController.php +++ b/modules/Auth/Controllers/ContributorController.php @@ -81,7 +81,7 @@ class ContributorController extends BaseController return view('contributor/view', $data); } - public function create(): string + public function createView(): string { helper('form'); @@ -125,7 +125,7 @@ class ContributorController extends BaseController return view('contributor/create', $data); } - public function attemptCreate(): RedirectResponse + public function createAction(): RedirectResponse { /** @var User $user */ $user = (new UserModel())->find((int) $this->request->getPost('user')); @@ -142,7 +142,7 @@ class ContributorController extends BaseController return redirect()->route('contributor-list', [$this->podcast->id]); } - public function edit(): string|RedirectResponse + public function editView(): string|RedirectResponse { helper('form'); @@ -184,7 +184,7 @@ class ContributorController extends BaseController return view('contributor/edit', $data); } - public function attemptEdit(): RedirectResponse + public function editAction(): RedirectResponse { // forbid updating a podcast owner if ($this->podcast->created_by === $this->contributor->id) { @@ -206,7 +206,7 @@ class ContributorController extends BaseController ); } - public function remove(): string + public function deleteView(): string { helper('form'); @@ -225,7 +225,7 @@ class ContributorController extends BaseController return view('contributor/delete', $data); } - public function attemptRemove(): RedirectResponse + public function deleteAction(): RedirectResponse { if ($this->podcast->created_by === $this->contributor->id) { return redirect() diff --git a/modules/Auth/Controllers/InteractController.php b/modules/Auth/Controllers/InteractController.php index b760b9d7..d8281b62 100644 --- a/modules/Auth/Controllers/InteractController.php +++ b/modules/Auth/Controllers/InteractController.php @@ -12,7 +12,7 @@ use CodeIgniter\HTTP\RedirectResponse; */ class InteractController extends Controller { - public function attemptInteractAsActor(): RedirectResponse + public function interactAsActorAction(): RedirectResponse { $rules = [ 'actor_id' => 'required|numeric', diff --git a/modules/Auth/Controllers/MyAccountController.php b/modules/Auth/Controllers/MyAccountController.php index 9c7fef2d..844b0112 100644 --- a/modules/Auth/Controllers/MyAccountController.php +++ b/modules/Auth/Controllers/MyAccountController.php @@ -30,7 +30,7 @@ class MyAccountController extends BaseController return view('my_account/change_password'); } - public function attemptChange(): RedirectResponse + public function changeAction(): RedirectResponse { $rules = [ 'password' => 'required', diff --git a/modules/Auth/Controllers/UserController.php b/modules/Auth/Controllers/UserController.php index dd242f41..0911133f 100644 --- a/modules/Auth/Controllers/UserController.php +++ b/modules/Auth/Controllers/UserController.php @@ -61,7 +61,7 @@ class UserController extends BaseController return view('user/view', $data); } - public function create(): string + public function createView(): string { helper('form'); @@ -70,7 +70,10 @@ class UserController extends BaseController array_walk( $roles, static function (array $role, $key) use (&$roleOptions): array { - $roleOptions[$key] = $role['title']; + $roleOptions[] = [ + 'value' => $key, + 'label' => $role['title'], + ]; return $roleOptions; }, [], @@ -88,7 +91,7 @@ class UserController extends BaseController * Create the user with the provided username and email. The password is set as a random string and a magic link is * sent to the user to allow them setting their password. */ - public function attemptCreate(): RedirectResponse + public function createAction(): RedirectResponse { helper(['text', 'email']); @@ -167,7 +170,7 @@ class UserController extends BaseController ])); } - public function edit(): string + public function editView(): string { helper('form'); @@ -176,7 +179,10 @@ class UserController extends BaseController array_walk( $roles, static function (array $role, $key) use (&$roleOptions): array { - $roleOptions[$key] = $role['title']; + $roleOptions[] = [ + 'value' => $key, + 'label' => $role['title'], + ]; return $roleOptions; }, [], @@ -196,7 +202,7 @@ class UserController extends BaseController return view('user/edit', $data); } - public function attemptEdit(): RedirectResponse + public function editAction(): RedirectResponse { // The instance owner is a superadmin and the only user that cannot be demoted. if ((bool) $this->user->is_owner) { @@ -221,7 +227,7 @@ class UserController extends BaseController ])); } - public function delete(): string + public function deleteView(): string { helper(['form']); @@ -238,7 +244,7 @@ class UserController extends BaseController return view('user/delete', $data); } - public function attemptDelete(): RedirectResponse + public function deleteAction(): RedirectResponse { // You cannot delete the instance owner. if ((bool) $this->user->is_owner) { diff --git a/modules/Fediverse/Config/Routes.php b/modules/Fediverse/Config/Routes.php index b4c469fc..1fb7fe0c 100644 --- a/modules/Fediverse/Config/Routes.php +++ b/modules/Fediverse/Config/Routes.php @@ -52,7 +52,7 @@ $routes->group('', [ 'as' => 'followers', 'filter' => 'fediverse::activity-stream', ]); - $routes->post('follow', 'ActorController::attemptFollow/$1', [ + $routes->post('follow', 'ActorController::followAction/$1', [ 'as' => 'attempt-follow', ]); $routes->get('activities/(:uuid)', 'ActorController::activity/$1/$2', [ @@ -60,7 +60,7 @@ $routes->group('', [ ]); }); // Post - $routes->post('posts/create', 'PostController::attemptCreate/$1', [ + $routes->post('posts/create', 'PostController::createAction/$1', [ 'as' => 'post-attempt-create', ]); $routes->get('posts/(:uuid)', 'PostController::index/$1', [ @@ -71,7 +71,7 @@ $routes->group('', [ ]); $routes->post( 'posts/(:uuid)/remote/(:postAction)', - 'PostController::attemptRemoteAction/$1/$2/$3', + 'PostController::remoteActionAction/$1/$2/$3', [ 'as' => 'post-attempt-remote-action', ], @@ -79,28 +79,28 @@ $routes->group('', [ // Blocking actors and domains $routes->post( 'fediverse-block-actor', - 'BlockController::attemptBlockActor', + 'BlockController::blockActorAction', [ 'as' => 'fediverse-attempt-block-actor', ], ); $routes->post( 'fediverse-block-domain', - 'BlockController::attemptBlockDomain', + 'BlockController::blockDomainAction', [ 'as' => 'fediverse-attempt-block-domain', ], ); $routes->post( 'fediverse-unblock-actor', - 'BlockController::attemptUnblockActor', + 'BlockController::unblockActorAction', [ 'as' => 'fediverse-attempt-unblock-actor', ], ); $routes->post( 'fediverse-unblock-domain', - 'BlockController::attemptUnblockDomain', + 'BlockController::unblockDomainAction', [ 'as' => 'fediverse-attempt-unblock-domain', ], diff --git a/modules/Fediverse/Controllers/ActorController.php b/modules/Fediverse/Controllers/ActorController.php index f5b6d186..90031eaa 100644 --- a/modules/Fediverse/Controllers/ActorController.php +++ b/modules/Fediverse/Controllers/ActorController.php @@ -319,7 +319,7 @@ class ActorController extends Controller ->setBody($followersCollection->toJSON()); } - public function attemptFollow(): RedirectResponse + public function followAction(): RedirectResponse { $rules = [ 'handle' => 'regex_match[/^@?(?P[\w\.\-]+)@(?P[\w\.\-]+)(?P:[\d]+)?$/]', diff --git a/modules/Fediverse/Controllers/BlockController.php b/modules/Fediverse/Controllers/BlockController.php index c279ce4e..e5304b0b 100644 --- a/modules/Fediverse/Controllers/BlockController.php +++ b/modules/Fediverse/Controllers/BlockController.php @@ -21,7 +21,7 @@ class BlockController extends Controller */ protected $helpers = ['fediverse']; - public function attemptBlockActor(): RedirectResponse + public function blockActorAction(): RedirectResponse { $rules = [ 'handle' => 'required|regex_match[/^@?([\w\.\-]+)@([\w\.\-]+)(:[\d]+)?$/]', @@ -58,7 +58,7 @@ class BlockController extends Controller ])); } - public function attemptUnblockActor(): RedirectResponse + public function unblockActorAction(): RedirectResponse { $rules = [ 'actor_id' => 'required', @@ -80,7 +80,7 @@ class BlockController extends Controller ->with('message', lang('Fediverse.messages.unblockActorSuccess')); } - public function attemptBlockDomain(): RedirectResponse + public function blockDomainAction(): RedirectResponse { $rules = [ 'domain' => 'required|regex_match[/^[\w\-\.]+[\w]+(:[\d]+)?/]', @@ -105,7 +105,7 @@ class BlockController extends Controller ])); } - public function attemptUnblockDomain(): RedirectResponse + public function unblockDomainAction(): RedirectResponse { $rules = [ 'domain' => 'required', diff --git a/modules/Fediverse/Controllers/PostController.php b/modules/Fediverse/Controllers/PostController.php index c67ed66c..68d87146 100644 --- a/modules/Fediverse/Controllers/PostController.php +++ b/modules/Fediverse/Controllers/PostController.php @@ -112,7 +112,7 @@ class PostController extends Controller ->setBody($collection->toJSON()); } - public function attemptCreate(): RedirectResponse + public function createAction(): RedirectResponse { $rules = [ 'actor_id' => 'required|is_natural_no_zero', @@ -147,7 +147,7 @@ class PostController extends Controller return redirect()->back(); } - public function attemptFavourite(): RedirectResponse + public function favouriteAction(): RedirectResponse { $rules = [ 'actor_id' => 'required|is_natural_no_zero', @@ -171,7 +171,7 @@ class PostController extends Controller return redirect()->back(); } - public function attemptReblog(): RedirectResponse + public function reblogAction(): RedirectResponse { $rules = [ 'actor_id' => 'required|is_natural_no_zero', @@ -195,7 +195,7 @@ class PostController extends Controller return redirect()->back(); } - public function attemptReply(): RedirectResponse + public function replyAction(): RedirectResponse { $rules = [ 'actor_id' => 'required|is_natural_no_zero', @@ -230,7 +230,7 @@ class PostController extends Controller return redirect()->back(); } - public function attemptRemoteAction(string $action): RedirectResponse | ResponseInterface + public function remoteActionAction(string $action): RedirectResponse | ResponseInterface { $rules = [ 'handle' => 'regex_match[/^@?(?P[\w\.\-]+)@(?P[\w\.\-]+)(?P:[\d]+)?$/]', @@ -277,21 +277,21 @@ class PostController extends Controller ); } - public function attemptBlockActor(): RedirectResponse + public function blockActorAction(): RedirectResponse { model('ActorModel', false)->blockActor($this->post->actor->id); return redirect()->back(); } - public function attemptBlockDomain(): RedirectResponse + public function blockDomainAction(): RedirectResponse { model('BlockedDomainModel', false)->blockDomain($this->post->actor->domain); return redirect()->back(); } - public function attemptDelete(): RedirectResponse + public function deleteAction(): RedirectResponse { model('PostModel', false)->removePost($this->post); diff --git a/modules/Install/Config/Routes.php b/modules/Install/Config/Routes.php index 42aec944..b8620f85 100644 --- a/modules/Install/Config/Routes.php +++ b/modules/Install/Config/Routes.php @@ -19,18 +19,18 @@ $routes->group( $routes->get('/', 'InstallController', [ 'as' => 'install', ]); - $routes->post('instance-config', 'InstallController::attemptInstanceConfig', [ + $routes->post('instance-config', 'InstallController::instanceConfigAction', [ 'as' => 'instance-config', ]); - $routes->post('database-config', 'InstallController::attemptDatabaseConfig', [ + $routes->post('database-config', 'InstallController::databaseConfigAction', [ 'as' => 'database-config', ]); - $routes->post('cache-config', 'InstallController::attemptCacheConfig', [ + $routes->post('cache-config', 'InstallController::cacheConfigAction', [ 'as' => 'cache-config', ]); $routes->post( 'create-superadmin', - 'InstallController::attemptCreateSuperAdmin', + 'InstallController::createSuperAdminAction', [ 'as' => 'create-superadmin', ], diff --git a/modules/Install/Controllers/InstallController.php b/modules/Install/Controllers/InstallController.php index 8c421285..587dca32 100644 --- a/modules/Install/Controllers/InstallController.php +++ b/modules/Install/Controllers/InstallController.php @@ -75,7 +75,7 @@ class InstallController extends Controller $dotenv->required(['app.baseURL', 'analytics.salt', 'admin.gateway', 'auth.gateway']); } catch (ValidationException) { // form to input instance configuration - return $this->instanceConfig(); + return $this->instanceConfigView(); } try { @@ -87,13 +87,13 @@ class InstallController extends Controller 'database.default.DBPrefix', ]); } catch (ValidationException) { - return $this->databaseConfig(); + return $this->databaseConfigView(); } try { $dotenv->required('cache.handler'); } catch (ValidationException) { - return $this->cacheConfig(); + return $this->cacheConfigView(); } } else { try { @@ -130,7 +130,7 @@ class InstallController extends Controller session() ->setFlashdata('error', lang('Install.messages.databaseConnectError')); - return $this->databaseConfig(); + return $this->databaseConfigView(); } // migrate if no user has been created @@ -139,15 +139,15 @@ class InstallController extends Controller // Check if all seeds have succeeded $this->seed(); - return $this->createSuperAdmin(); + return $this->createSuperAdminView(); } - public function instanceConfig(): string + public function instanceConfigView(): string { return view('instance_config'); } - public function attemptInstanceConfig(): RedirectResponse + public function instanceConfigAction(): RedirectResponse { $rules = [ 'hostname' => 'required|valid_url_strict', @@ -181,12 +181,12 @@ class InstallController extends Controller return redirect()->to(reduce_double_slashes($baseUrl . '/' . config('Install')->gateway)); } - public function databaseConfig(): string + public function databaseConfigView(): string { return view('database_config'); } - public function attemptDatabaseConfig(): RedirectResponse + public function databaseConfigAction(): RedirectResponse { $rules = [ 'db_hostname' => 'required', @@ -215,12 +215,12 @@ class InstallController extends Controller return redirect()->back(); } - public function cacheConfig(): string + public function cacheConfigView(): string { return view('cache_config'); } - public function attemptCacheConfig(): RedirectResponse + public function cacheConfigAction(): RedirectResponse { $rules = [ 'cache_handler' => 'required', @@ -267,7 +267,7 @@ class InstallController extends Controller /** * Returns the form to create a the first superadmin user for the instance. */ - public function createSuperAdmin(): string + public function createSuperAdminView(): string { return view('create_superadmin'); } @@ -277,7 +277,7 @@ class InstallController extends Controller * * After creation, user is redirected to login page to input its credentials. */ - public function attemptCreateSuperAdmin(): RedirectResponse + public function createSuperAdminAction(): RedirectResponse { // validate user password $rules = [ diff --git a/modules/Platforms/Config/Routes.php b/modules/Platforms/Config/Routes.php index fd017434..fb64efc7 100644 --- a/modules/Platforms/Config/Routes.php +++ b/modules/Platforms/Config/Routes.php @@ -21,7 +21,7 @@ $routes->group( $routes->group('podcasts/(:num)/platforms', static function ($routes): void { $routes->get( '/', - 'PlatformController::platforms/$1/podcasting', + 'PlatformController::list/$1/podcasting', [ 'as' => 'platforms-podcasting', 'filter' => 'permission:podcast$1.manage-platforms', @@ -29,7 +29,7 @@ $routes->group( ); $routes->get( 'social', - 'PlatformController::platforms/$1/social', + 'PlatformController::list/$1/social', [ 'as' => 'platforms-social', 'filter' => 'permission:podcast$1.manage-platforms', @@ -37,7 +37,7 @@ $routes->group( ); $routes->get( 'funding', - 'PlatformController::platforms/$1/funding', + 'PlatformController::list/$1/funding', [ 'as' => 'platforms-funding', 'filter' => 'permission:podcast$1.manage-platforms', @@ -45,7 +45,7 @@ $routes->group( ); $routes->post( 'save/(:platformType)', - 'PlatformController::attemptPlatformsUpdate/$1/$2', + 'PlatformController::updateAction/$1/$2', [ 'as' => 'platforms-save', 'filter' => 'permission:podcast$1.manage-platforms', @@ -53,7 +53,7 @@ $routes->group( ); $routes->get( '(:platformType)/(:slug)/podcast-platform-remove', - 'PlatformController::removePlatform/$1/$2/$3', + 'PlatformController::removeAction/$1/$2/$3', [ 'as' => 'podcast-platform-remove', 'filter' => 'permission:podcast$1.manage-platforms', diff --git a/modules/Platforms/Controllers/PlatformController.php b/modules/Platforms/Controllers/PlatformController.php index b104ec7a..1140f748 100644 --- a/modules/Platforms/Controllers/PlatformController.php +++ b/modules/Platforms/Controllers/PlatformController.php @@ -45,7 +45,7 @@ class PlatformController extends BaseController return view('podcast/platforms/dashboard'); } - public function platforms(string $platformType): string + public function list(string $platformType): string { helper('form'); @@ -62,7 +62,7 @@ class PlatformController extends BaseController return view('podcast/platforms', $data); } - public function attemptPlatformsUpdate(string $platformType): RedirectResponse + public function updateAction(string $platformType): RedirectResponse { $platformModel = new PlatformModel(); $validation = Services::validation(); @@ -99,7 +99,7 @@ class PlatformController extends BaseController ->with('message', lang('Platforms.messages.updateSuccess')); } - public function removePlatform(string $platformType, string $platformSlug): RedirectResponse + public function removeAction(string $platformType, string $platformSlug): RedirectResponse { (new PlatformModel())->removePlatform($this->podcast->id, $platformType, $platformSlug); diff --git a/modules/PremiumPodcasts/Config/Routes.php b/modules/PremiumPodcasts/Config/Routes.php index b8060be3..e9501417 100644 --- a/modules/PremiumPodcasts/Config/Routes.php +++ b/modules/PremiumPodcasts/Config/Routes.php @@ -23,18 +23,18 @@ $routes->group( 'as' => 'subscription-list', 'filter' => 'permission:podcast$1.manage-subscriptions', ]); - $routes->get('new', 'SubscriptionController::create/$1', [ + $routes->get('new', 'SubscriptionController::createView/$1', [ 'as' => 'subscription-create', 'filter' => 'permission:podcast$1.manage-subscriptions', ]); $routes->post( 'new', - 'SubscriptionController::attemptCreate/$1', + 'SubscriptionController::createAction/$1', [ 'filter' => 'permission:podcast$1.manage-subscriptions', ], ); - $routes->post('save-link', 'SubscriptionController::attemptLinkSave/$1', [ + $routes->post('save-link', 'SubscriptionController::linkSaveAction/$1', [ 'as' => 'subscription-link-save', 'filter' => 'permission:podcast$1.manage-subscriptions', ]); @@ -46,7 +46,7 @@ $routes->group( ]); $routes->get( 'edit', - 'SubscriptionController::edit/$1/$2', + 'SubscriptionController::editView/$1/$2', [ 'as' => 'subscription-edit', 'filter' => 'permission:podcast$1.manage-subscriptions', @@ -54,7 +54,7 @@ $routes->group( ); $routes->post( 'edit', - 'SubscriptionController::attemptEdit/$1/$2', + 'SubscriptionController::editAction/$1/$2', [ 'as' => 'subscription-edit', 'filter' => 'permission:podcast$1.manage-subscriptions', @@ -78,7 +78,7 @@ $routes->group( ); $routes->post( 'suspend', - 'SubscriptionController::attemptSuspend/$1/$2', + 'SubscriptionController::suspendAction/$1/$2', [ 'filter' => 'permission:podcast$1.manage-subscriptions', ], @@ -101,7 +101,7 @@ $routes->group( ); $routes->post( 'delete', - 'SubscriptionController::attemptDelete/$1/$2', + 'SubscriptionController::deleteAction/$1/$2', [ 'filter' => 'permission:podcast$1.manage-subscriptions', ], @@ -120,10 +120,10 @@ $routes->group( $routes->get('unlock', 'LockController::index/$1', [ 'as' => 'premium-podcast-unlock', ]); - $routes->post('unlock', 'LockController::attemptUnlock/$1', [ + $routes->post('unlock', 'LockController::unlockAction/$1', [ 'as' => 'premium-podcast-unlock', ]); - $routes->get('lock', 'LockController::attemptLock/$1', [ + $routes->get('lock', 'LockController::lockAction/$1', [ 'as' => 'premium-podcast-lock', ]); } diff --git a/modules/PremiumPodcasts/Controllers/LockController.php b/modules/PremiumPodcasts/Controllers/LockController.php index bcd53e22..5b91fcf2 100644 --- a/modules/PremiumPodcasts/Controllers/LockController.php +++ b/modules/PremiumPodcasts/Controllers/LockController.php @@ -58,7 +58,7 @@ class LockController extends BaseController return view('podcast/unlock', $data); } - public function attemptUnlock(): RedirectResponse + public function unlockAction(): RedirectResponse { $rules = [ 'token' => 'required', @@ -91,7 +91,7 @@ class LockController extends BaseController ->with('message', lang('PremiumPodcasts.messages.unlockSuccess')); } - public function attemptLock(): RedirectResponse + public function lockAction(): RedirectResponse { $this->premiumPodcasts->lock($this->podcast->handle); diff --git a/modules/PremiumPodcasts/Controllers/SubscriptionController.php b/modules/PremiumPodcasts/Controllers/SubscriptionController.php index 54182140..1088a331 100644 --- a/modules/PremiumPodcasts/Controllers/SubscriptionController.php +++ b/modules/PremiumPodcasts/Controllers/SubscriptionController.php @@ -66,7 +66,7 @@ class SubscriptionController extends BaseController return view('subscription/list', $data); } - public function attemptLinkSave(): RedirectResponse + public function linkSaveAction(): RedirectResponse { $rules = [ 'subscription_link' => 'valid_url_strict|permit_empty', @@ -118,7 +118,7 @@ class SubscriptionController extends BaseController return view('subscription/view', $data); } - public function create(): string + public function createView(): string { helper('form'); @@ -133,7 +133,7 @@ class SubscriptionController extends BaseController return view('subscription/create', $data); } - public function attemptCreate(): RedirectResponse + public function createAction(): RedirectResponse { helper('text'); @@ -244,7 +244,7 @@ class SubscriptionController extends BaseController ); } - public function edit(): string + public function editView(): string { helper('form'); @@ -261,7 +261,7 @@ class SubscriptionController extends BaseController return view('subscription/edit', $data); } - public function attemptEdit(): RedirectResponse + public function editAction(): RedirectResponse { $expiresAt = null; $expirationDate = $this->request->getPost('expiration_date'); @@ -330,7 +330,7 @@ class SubscriptionController extends BaseController return view('subscription/suspend', $data); } - public function attemptSuspend(): RedirectResponse + public function suspendAction(): RedirectResponse { $db = db_connect(); $db->transStart(); @@ -426,7 +426,7 @@ class SubscriptionController extends BaseController return view('subscription/delete', $data); } - public function attemptDelete(): RedirectResponse + public function deleteAction(): RedirectResponse { $db = db_connect(); $db->transStart(); diff --git a/tests/modules/Plugins/PluginsTest.php b/tests/modules/Plugins/PluginsTest.php index a27e232c..3e087131 100644 --- a/tests/modules/Plugins/PluginsTest.php +++ b/tests/modules/Plugins/PluginsTest.php @@ -117,7 +117,11 @@ final class PluginsTest extends CIUnitTestCase $this->assertEquals( (string) $head, - ' foo foo