From 07d740b79f9283e389e723954f680f909ce5de4a Mon Sep 17 00:00:00 2001
From: Yassine Doghri <yassine@doghri.fr>
Date: Wed, 5 Jan 2022 16:01:44 +0000
Subject: [PATCH] feat: prefill season and episode numbers + set episode number
 as mandatory for serial podcasts

closes #134, #136
---
 app/Models/EpisodeModel.php                   | 26 +++++++++++++++++++
 .../Admin/Controllers/EpisodeController.php   | 12 ++++++++-
 themes/cp_admin/episode/create.php            |  7 +++--
 themes/cp_admin/episode/edit.php              |  5 ++--
 4 files changed, 45 insertions(+), 5 deletions(-)

diff --git a/app/Models/EpisodeModel.php b/app/Models/EpisodeModel.php
index 44ec3b26c0..4edebdecd3 100644
--- a/app/Models/EpisodeModel.php
+++ b/app/Models/EpisodeModel.php
@@ -268,6 +268,32 @@ class EpisodeModel extends Model
             : false;
     }
 
+    public function getCurrentSeasonNumber(int $podcastId): ?int
+    {
+        $result = $this->select('MAX(season_number) as current_season_number')
+            ->where([
+                'podcast_id' => $podcastId,
+                $this->deletedField => null,
+            ])
+            ->get()
+            ->getResultArray();
+
+        return $result[0]['current_season_number'] ? (int) $result[0]['current_season_number'] : null;
+    }
+
+    public function getNextEpisodeNumber(int $podcastId, ?int $seasonNumber): int
+    {
+        $result = $this->select('MAX(number) as next_episode_number')
+            ->where([
+                'podcast_id' => $podcastId,
+                'season_number' => $seasonNumber,
+                $this->deletedField => null,
+            ])->get()
+            ->getResultArray();
+
+        return (int) $result[0]['next_episode_number'] + 1;
+    }
+
     /**
      * @param mixed[] $data
      *
diff --git a/modules/Admin/Controllers/EpisodeController.php b/modules/Admin/Controllers/EpisodeController.php
index 2d297ff98d..01dbb051a6 100644
--- a/modules/Admin/Controllers/EpisodeController.php
+++ b/modules/Admin/Controllers/EpisodeController.php
@@ -97,10 +97,12 @@ class EpisodeController extends BaseController
     {
         helper(['form']);
 
+        $currentSeasonNumber = (new EpisodeModel())->getCurrentSeasonNumber($this->podcast->id);
         $data = [
             'podcast' => $this->podcast,
+            'currentSeasonNumber' => $currentSeasonNumber,
+            'nextEpisodeNumber' => (new EpisodeModel())->getNextEpisodeNumber($this->podcast->id, $currentSeasonNumber),
         ];
-
         replace_breadcrumb_params([
             0 => $this->podcast->title,
         ]);
@@ -118,6 +120,10 @@ class EpisodeController extends BaseController
             'chapters_file' => 'ext_in[chapters,json]|permit_empty',
         ];
 
+        if ($this->podcast->type === 'serial') {
+            $rules['episode_number'] = 'required';
+        }
+
         if (! $this->validate($rules)) {
             return redirect()
                 ->back()
@@ -239,6 +245,10 @@ class EpisodeController extends BaseController
             'chapters_file' => 'ext_in[chapters_file,json]|permit_empty',
         ];
 
+        if ($this->podcast->type === 'serial') {
+            $rules['episode_number'] = 'required';
+        }
+
         if (! $this->validate($rules)) {
             return redirect()
                 ->back()
diff --git a/themes/cp_admin/episode/create.php b/themes/cp_admin/episode/create.php
index fdc2032695..39a440cf5c 100644
--- a/themes/cp_admin/episode/create.php
+++ b/themes/cp_admin/episode/create.php
@@ -51,17 +51,20 @@
 </div>
 
 <div class="flex flex-col gap-x-2 gap-y-4 md:flex-row">
-    <Forms.Field 
+    <Forms.Field
         class="flex-1 w-0"
         name="season_number"
         label="<?= lang('Episode.form.season_number') ?>"
         type="number"
+        value="<?= $currentSeasonNumber ?>"
     />
-    <Forms.Field 
+    <Forms.Field
         class="flex-1 w-0"
         name="episode_number"
         label="<?= lang('Episode.form.episode_number') ?>"
         type="number"
+        value="<?= $nextEpisodeNumber ?>"
+        required="<?= $podcast->type === 'serial' ? 'true' : 'false' ?>"
     />
 </div>
 
diff --git a/themes/cp_admin/episode/edit.php b/themes/cp_admin/episode/edit.php
index acc4eb4236..b693cb9a09 100644
--- a/themes/cp_admin/episode/edit.php
+++ b/themes/cp_admin/episode/edit.php
@@ -55,19 +55,20 @@
 </div>
 
 <div class="flex flex-col gap-x-2 gap-y-4 md:flex-row">
-    <Forms.Field 
+    <Forms.Field
         class="flex-1 w-0"
         name="season_number"
         label="<?= lang('Episode.form.season_number') ?>"
         type="number"
         value="<?= $episode->season_number ?>"
     />
-    <Forms.Field 
+    <Forms.Field
         class="flex-1 w-0"
         name="episode_number"
         label="<?= lang('Episode.form.episode_number') ?>"
         type="number"
         value="<?= $episode->number ?>"
+        required="<?= $podcast->type === 'serial' ? 'true' : 'false' ?>"
     />
 </div>
 
-- 
GitLab