From d77268540569b2be9d91d5e09aefb3ff5ac2b071 Mon Sep 17 00:00:00 2001
From: Yassine Doghri <yassine@doghri.fr>
Date: Fri, 11 Jun 2021 14:51:14 +0000
Subject: [PATCH] fix(analytics): set duration field to precise decimal as
 episode's audio file duration

---
 .../Migrations/2017-12-01-120000_add_analytics_podcasts.php  | 5 ++++-
 .../2017-12-01-210000_add_analytics_podcasts_procedure.php   | 2 +-
 app/Libraries/Analytics/Entities/AnalyticsPodcasts.php       | 4 ++--
 app/Libraries/Analytics/Helpers/analytics_helper.php         | 4 ++--
 4 files changed, 9 insertions(+), 6 deletions(-)

diff --git a/app/Libraries/Analytics/Database/Migrations/2017-12-01-120000_add_analytics_podcasts.php b/app/Libraries/Analytics/Database/Migrations/2017-12-01-120000_add_analytics_podcasts.php
index 8a4914f200..1db9da1a38 100644
--- a/app/Libraries/Analytics/Database/Migrations/2017-12-01-120000_add_analytics_podcasts.php
+++ b/app/Libraries/Analytics/Database/Migrations/2017-12-01-120000_add_analytics_podcasts.php
@@ -27,7 +27,10 @@ class AddAnalyticsPodcasts extends Migration
                 'type' => 'DATE',
             ],
             'duration' => [
-                'type' => 'INT',
+                // a hit in analytics podcast increments this value when a podcast is listened to in a given date.
+                // Here, the "cumulative listening time" on a podcast per day
+                // cannot surpass 999,999,999,999.999 seconds (~277,777,777 hours) - should be enough.
+                'type' => 'DECIMAL(15,3)',
                 'unsigned' => true,
             ],
             'bandwidth' => [
diff --git a/app/Libraries/Analytics/Database/Migrations/2017-12-01-210000_add_analytics_podcasts_procedure.php b/app/Libraries/Analytics/Database/Migrations/2017-12-01-210000_add_analytics_podcasts_procedure.php
index 03c5fae434..c6baebef82 100644
--- a/app/Libraries/Analytics/Database/Migrations/2017-12-01-210000_add_analytics_podcasts_procedure.php
+++ b/app/Libraries/Analytics/Database/Migrations/2017-12-01-210000_add_analytics_podcasts_procedure.php
@@ -36,7 +36,7 @@ class AddAnalyticsPodcastsProcedure extends Migration
             IN `p_os` VARCHAR(32),
             IN `p_bot` TINYINT(1) UNSIGNED,
             IN `p_filesize` INT UNSIGNED,
-            IN `p_duration` INT UNSIGNED,
+            IN `p_duration` DECIMAL(8,3) UNSIGNED,
             IN `p_age` INT UNSIGNED,
             IN `p_new_listener` TINYINT(1) UNSIGNED
             )  MODIFIES SQL DATA
diff --git a/app/Libraries/Analytics/Entities/AnalyticsPodcasts.php b/app/Libraries/Analytics/Entities/AnalyticsPodcasts.php
index 3912b72931..12c9fc66e8 100644
--- a/app/Libraries/Analytics/Entities/AnalyticsPodcasts.php
+++ b/app/Libraries/Analytics/Entities/AnalyticsPodcasts.php
@@ -17,7 +17,7 @@ use CodeIgniter\Entity\Entity;
 /**
  * @property int $podcast_id
  * @property Time $date
- * @property int $duration
+ * @property double $duration
  * @property int $bandwidth
  * @property int $unique_listeners
  * @property int $hits
@@ -36,7 +36,7 @@ class AnalyticsPodcasts extends Entity
      */
     protected $casts = [
         'podcast_id' => 'integer',
-        'duration' => 'integer',
+        'duration' => 'double',
         'bandwidth' => 'integer',
         'unique_listeners' => 'integer',
         'hits' => 'integer',
diff --git a/app/Libraries/Analytics/Helpers/analytics_helper.php b/app/Libraries/Analytics/Helpers/analytics_helper.php
index 789cb4092f..ae215d52b6 100644
--- a/app/Libraries/Analytics/Helpers/analytics_helper.php
+++ b/app/Libraries/Analytics/Helpers/analytics_helper.php
@@ -252,7 +252,7 @@ if (! function_exists('podcast_hit')) {
      * @param integer $episodeId The Episode ID
      * @param integer $bytesThreshold The minimum total number of bytes that must be downloaded so that an episode is counted (>1mn)
      * @param integer $fileSize The podcast complete file size
-     * @param integer $duration The episode duration in seconds
+     * @param double $duration The episode duration in seconds
      * @param int $publicationTime The episode's publication time as a UNIX timestamp
      * @param string $serviceName The name of the service that had fetched the RSS feed
      */
@@ -261,7 +261,7 @@ if (! function_exists('podcast_hit')) {
         int $episodeId,
         int $bytesThreshold,
         int $fileSize,
-        int $duration,
+        float $duration,
         int $publicationTime,
         string $serviceName
     ): void {
-- 
GitLab