From a71b2976af750791e94eaac73924f6127e38d087 Mon Sep 17 00:00:00 2001 From: w33b Date: Tue, 26 May 2026 13:45:13 +0200 Subject: [PATCH] Add ability for mods to edit episode & Refactor code --- .../Controllers/Admin/EpisodeController.php | 12 ++++ app/Services/EpisodeService.php | 55 ++++++++++++++++--- .../views/admin/modals/edit-episode.blade.php | 32 ++++++++--- resources/views/admin/stream.blade.php | 23 -------- resources/views/stream/index.blade.php | 13 ++--- .../views/stream/partials/info.blade.php | 30 ++++++++++ routes/admin.php | 5 +- 7 files changed, 123 insertions(+), 47 deletions(-) delete mode 100644 resources/views/admin/stream.blade.php diff --git a/app/Http/Controllers/Admin/EpisodeController.php b/app/Http/Controllers/Admin/EpisodeController.php index 963ca4e..101c8b9 100644 --- a/app/Http/Controllers/Admin/EpisodeController.php +++ b/app/Http/Controllers/Admin/EpisodeController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers\Admin; +use App\Enums\UserRole; use App\Http\Controllers\Controller; use App\Jobs\DiscordReleaseNotification; use App\Models\Episode; @@ -63,6 +64,17 @@ class EpisodeController extends Controller public function update(Request $request): RedirectResponse { $episode = Episode::with('hentai')->where('id', $request->input('episode_id'))->firstOrFail(); + + if ($request->user()->hasRole(UserRole::MODERATOR)) { + $this->episodeService->updateEpisodeModerator($request, $episode->id); + + cache()->flush(); + + return to_route('hentai.index', [ + 'title' => $episode->slug, + ]); + } + $studio = $this->episodeService->getOrCreateStudio(json_decode($request->input('studio'))[0]->value); $oldinterpolated = $episode->interpolated; diff --git a/app/Services/EpisodeService.php b/app/Services/EpisodeService.php index 2be96e7..a9dc2c4 100644 --- a/app/Services/EpisodeService.php +++ b/app/Services/EpisodeService.php @@ -5,6 +5,7 @@ namespace App\Services; use App\Models\Episode; use App\Models\Hentai; use App\Models\Studios; +use App\Models\ModLog; use Illuminate\Http\Request; use Illuminate\Support\Carbon; use Illuminate\Support\Facades\Storage; @@ -62,6 +63,34 @@ class EpisodeService return $episode; } + private function applyTags(Request $request, Episode $episode): void + { + $tags = json_decode($request->input('tags')); + $newtags = []; + foreach ($tags as $t) { + $newtags[] = $t->value; + } + + $newTagsTemp = $newtags; + $oldTagsTemp = $episode->tagNames(); + + sort($newTagsTemp); + sort($oldTagsTemp); + + if ($newTagsTemp !== $oldTagsTemp) { + ModLog::create([ + 'moderator' => $request->user()->name, + 'data' => sprintf( + 'Updated Episode tags from %s to %s', + implode(', ', $oldTagsTemp), + implode(', ', $newTagsTemp), + ), + ]); + } + + $episode->retag($newtags); + } + public function updateEpisode(Request $request, Studios $studio, int $episodeId): Episode { $episode = Episode::where('id', $episodeId)->firstOrFail(); @@ -75,17 +104,29 @@ class EpisodeService $episode->dmca_takedown = $request->input('dmca_takedown') == 'true'; $episode->save(); - // Tagging - $tags = json_decode($request->input('tags')); - $newtags = []; - foreach ($tags as $t) { - $newtags[] = $t->value; - } - $episode->retag($newtags); + $this->applyTags($request, $episode); return $episode; } + public function updateEpisodeModerator(Request $request, int $episodeId): void + { + $episode = Episode::where('id', $episodeId)->firstOrFail(); + $oldDescription = $episode->description; + $episode->description = $request->input('description'); + $episode->save(); + + if ($episode->description !== $oldDescription) { + // Log to ModLog + ModLog::create([ + 'moderator' => $request->user()->name, + 'data' => "Updated Episode description from {$oldDescription} to {$episode->description}", + ]); + } + + $this->applyTags($request, $episode); + } + public function getOrCreateStudio(string $studioName): Studios { return Studios::firstOrCreate( diff --git a/resources/views/admin/modals/edit-episode.blade.php b/resources/views/admin/modals/edit-episode.blade.php index 32ef781..3089663 100644 --- a/resources/views/admin/modals/edit-episode.blade.php +++ b/resources/views/admin/modals/edit-episode.blade.php @@ -5,17 +5,18 @@
-
+ @csrf
- -
- - -
+ +
+ + +
+ @if(auth()->user()->hasRole(\App\Enums\UserRole::ADMINISTRATOR))
@@ -47,13 +48,16 @@
+ @endif
+ @if(auth()->user()->hasRole(\App\Enums\UserRole::ADMINISTRATOR))
+ @endif @@ -62,6 +66,7 @@ + @if(auth()->user()->hasRole(\App\Enums\UserRole::ADMINISTRATOR))
@@ -95,8 +100,10 @@
+ @endif -
+
+ @if(auth()->user()->hasRole(\App\Enums\UserRole::ADMINISTRATOR))
@@ -111,10 +118,17 @@ DMCA Takedown
- -
diff --git a/resources/views/admin/stream.blade.php b/resources/views/admin/stream.blade.php deleted file mode 100644 index 0781371..0000000 --- a/resources/views/admin/stream.blade.php +++ /dev/null @@ -1,23 +0,0 @@ -@auth -@if(Auth::user()->hasRole(\App\Enums\UserRole::ADMINISTRATOR) || Auth::user()->hasRole(\App\Enums\UserRole::MODERATOR)) -
- @if(Auth::user()->hasRole(\App\Enums\UserRole::ADMINISTRATOR)) - - @endif -
- @if(Auth::user()->hasRole(\App\Enums\UserRole::ADMINISTRATOR)) - - Add Subtitles - - @endif - - Edit Episode - -
-
-@endif -@endauth diff --git a/resources/views/stream/index.blade.php b/resources/views/stream/index.blade.php index 63f63be..bc61f5a 100644 --- a/resources/views/stream/index.blade.php +++ b/resources/views/stream/index.blade.php @@ -15,7 +15,6 @@
@endif - @include('admin.stream') @include('stream.partials.info') @@ -38,18 +37,18 @@ @include('modals.add-to-playlist') @include('modals.share') + @auth - - @if(Auth::user()->hasRole(\App\Enums\UserRole::ADMINISTRATOR) || Auth::user()->hasRole(\App\Enums\UserRole::MODERATOR)) - @include('admin.modals.edit-episode') - @endif - - @if(Auth::user()->hasRole(\App\Enums\UserRole::ADMINISTRATOR)) + @if (auth()->user()->hasRole(\App\Enums\UserRole::ADMINISTRATOR)) @include('admin.modals.upload-episode') @include('admin.modals.add-subtitles') @endif + @if (auth()->user()->hasRole(\App\Enums\UserRole::ADMINISTRATOR) || auth()->user()->hasRole(\App\Enums\UserRole::MODERATOR)) + @include('admin.modals.edit-episode') + @endif @endauth + @vite(['resources/js/player.js']) diff --git a/resources/views/stream/partials/info.blade.php b/resources/views/stream/partials/info.blade.php index 5bd9ef3..4821b1d 100644 --- a/resources/views/stream/partials/info.blade.php +++ b/resources/views/stream/partials/info.blade.php @@ -148,6 +148,36 @@ @endauth + + @if(auth()->check() && (auth()->user()->hasRole(\App\Enums\UserRole::ADMINISTRATOR) || auth()->user()->hasRole(\App\Enums\UserRole::MODERATOR))) +
+ @if(auth()->user()->hasRole(\App\Enums\UserRole::ADMINISTRATOR)) + + + Add Subtitles + + + + + Add Episode + + @endif + + + + Edit Episode + +
+ @endif @endif diff --git a/routes/admin.php b/routes/admin.php index 55f3edc..4e9ac3a 100644 --- a/routes/admin.php +++ b/routes/admin.php @@ -45,7 +45,7 @@ Route::group(['middleware' => ['auth', 'auth.admin']], function () { // Episode Route::post('/admin/episode/upload', [EpisodeController::class, 'store'])->name('admin.upload.episode'); - Route::post('/admin/episode/edit', [EpisodeController::class, 'update'])->name('admin.edit'); + // Get Tags used for Upload Form Route::get('/admin/tags', [AdminApiController::class, 'getTags'])->name('admin.tags'); @@ -66,4 +66,7 @@ Route::group(['middleware' => ['auth', 'auth.moderator']], function () { // Get Tags for editing Episode Route::get('/admin/tags/{episode_id}', [AdminApiController::class, 'getEpisodeTags'])->name('admin.tags.episode'); Route::get('/admin/studio/{episode_id}', [AdminApiController::class, 'getEpisodeStudio'])->name('admin.studio.episode'); + + // Edit Episode + Route::post('/admin/episode/edit', [EpisodeController::class, 'update'])->name('admin.episode.edit'); }); \ No newline at end of file