]> _ Git - fluidbook-toolbox.git/commitdiff
wip #7850 @1
authorVincent Vanwaelscappel <vincent@cubedesigners.com>
Tue, 18 Nov 2025 19:36:22 +0000 (20:36 +0100)
committerVincent Vanwaelscappel <vincent@cubedesigners.com>
Tue, 18 Nov 2025 19:36:22 +0000 (20:36 +0100)
app/Fluidbook/Link/LinksData.php
app/Jobs/AuditLinkRegister.php [new file with mode: 0644]
app/Jobs/registerLinksForAudit.php [deleted file]
app/Models/FluidbookAuditLink.php
app/Models/FluidbookCollection.php

index 5e4091271e5aa04090e135d3c5185d3c461fcabf..7d88d3a9410b73e309d75e1f9207b1336284d0aa 100644 (file)
@@ -29,6 +29,8 @@ class LinksData
 
     protected static $_aliases = [Link::PAGE_LABEL => Link::ANCHOR];
 
+    public static $UIDMissing = false;
+
     /**
      * @throws Exception
      */
@@ -45,7 +47,7 @@ class LinksData
             'tooltip' => __('Infobulle'), 'numerotation' => __('Numérotation'),
             'display_area' => __('Activer la surbrillance'), 'animation_type' => __('Animation à l\'affichage de la page'),
             'tracks' => __('Sous-titres'),
-            'video_loop' => __('Video : boucle'), 'video_auto_start' => __('Video : démarrage automatique'), 'video_controls' => __('Vidéo : afficher les contrôles'), 'video_sound_on' => __('Vidéo : activer le son'),'video_autohide'=>__('Video : masquer lorsque non jouée'), 'video_cc' => __('Vidéo : afficher les sous-titres'),
+            'video_loop' => __('Video : boucle'), 'video_auto_start' => __('Video : démarrage automatique'), 'video_controls' => __('Vidéo : afficher les contrôles'), 'video_sound_on' => __('Vidéo : activer le son'), 'video_autohide' => __('Video : masquer lorsque non jouée'), 'video_cc' => __('Vidéo : afficher les sous-titres'),
             'inline' => __('Vidéo : afficher dans la page'), 'video_width' => __('Vidéo : Largeur du popup'), 'video_height' => __('Vidéo : Hauteur du popup'),
             'visibility_os' => __('Visible sur les systèmes'),
             'interactive' => __('Interactivité'), 'video_service' => __('Webvideo : service'),
@@ -196,9 +198,10 @@ class LinksData
             if ($fluidbook->isOnePage() && !$meta['onepage']) {
                 self::_moveToOnePageLinks($r['links'], $r['rulers'], $fluidbook);
             }
+            $rulers = self::_UID($r['rulers']);
 
+            self::$UIDMissing = false;
             $links = self::_UID($r['links']);
-            $rulers = self::_UID($r['rulers']);
 
             if ($forceDecrypt || can('fluidbook-publication:links:edit-animations')) {
                 $links = Link::decryptLinks($links);
@@ -260,9 +263,11 @@ class LinksData
     protected static function _UID($items)
     {
         $res = [];
+
         foreach ($items as $item) {
             if (!isset($item['uid']) || empty($item['uid']) || isset($res[$item['uid']])) {
                 $item['uid'] = self::generateUID();
+                self::$UIDMissing = true;
             }
             $res[$item['uid']] = $item;
         }
@@ -662,7 +667,7 @@ class LinksData
         /** @var FluidbookPublication $book */
         $book = FluidbookPublication::withoutGlobalScopes()->find($book_id);
 
-        $booleans = array('video_loop', 'video_auto_start', 'video_controls', 'video_sound_on', 'video_cc','video_autohide');
+        $booleans = array('video_loop', 'video_auto_start', 'video_controls', 'video_sound_on', 'video_cc', 'video_autohide');
         $numbers = ['left', 'top', 'width', 'height'];
 
         $links = [];
diff --git a/app/Jobs/AuditLinkRegister.php b/app/Jobs/AuditLinkRegister.php
new file mode 100644 (file)
index 0000000..264f258
--- /dev/null
@@ -0,0 +1,90 @@
+<?php
+
+namespace App\Jobs;
+
+use App\Fluidbook\Link\LinksData;
+use App\Models\FluidbookAuditLink;
+use App\Models\FluidbookPublication;
+use App\Models\FluidbookCollection;
+use Fluidbook\Tools\Links\Link as LinkAlias;
+use Illuminate\Support\Arr;
+use Illuminate\Support\Facades\Log;
+
+class AuditLinkRegister extends Base
+{
+    /**
+     * Create a new job instance.
+     */
+    public function __construct()
+    {
+    }
+
+    public function handle()
+    {
+        $publications = Arr::flatten(FluidbookCollection::where('enable_audit', 1)->pluck('publications')->toArray(), 1);
+
+        $publications = array_map(function ($n) {
+            return $n['fluidbook'];
+        }, $publications);
+
+        // Nécessaire pour vérifier si la liste des fluidbooks fourni par les collections
+        // existent vraiment ou s'ils ont été supprimé sans être supprimé dans la collection
+        $publications = FluidbookPublication::whereIn('id', $publications)->pluck('id');
+
+        // Get all links in the audit base
+        $existing = [];
+        foreach (FluidbookAuditLink::all() as $item) {
+            $key = $item->fluidbook_id . '_' . $item->link_id;
+            $existing[$key] = ['fluidbook_id' => $item->fluidbook_id, 'link_id' => $item->link_id, 'page' => $item->page, 'url' => $item->url];
+        }
+
+        foreach ($publications as $publication) {
+            $publication = (int)$publication;
+            $externalLinks = [];
+            // Get all links in current fluidbook
+            // Access to links in $links variable
+            LinksData::getLinksAndRulers($publication, $links, $rulers);
+            if (LinksData::$UIDMissing) {
+                LinksData::saveLinksInFile($publication, false, 'Save after fixing missing UID', $links, $rulers);
+            }
+
+            // We want only url link begin with http or https and webvideo link
+            // We check every link, because almost any can get an http url as destination.
+            $links = array_filter($links, function ($n) {
+                return (preg_match('/^https?:\/\//', trim($n['to']))) || $n['type'] == LinkAlias::WEBVIDEO;
+            });
+
+            foreach ($links as $link) {
+                $link['to'] = trim($link['to']);
+                if (Arr::exists($link, 'video_service')) {
+                    if ($link['type'] == LinkAlias::WEBVIDEO && $link['video_service'] === "youtube") {
+                        $link['to'] = "https://youtu.be/" . $link['to'];
+                    }
+                }
+
+                if (isset($existing[$publication . '_' . $link['uid']])) {
+                    $l = $existing[$publication . '_' . $link['uid']];
+                    if ($l['url'] == $link['to'] && $l['page'] == $link['page']) {
+                        continue;
+                    }
+                    FluidbookAuditLink::where('fluidbook_id', $publication)->where('link_id', $link['uid'])->delete();
+                }
+
+                $externalLinks[] = [
+                    'link_id' => $link['uid'],
+                    'fluidbook_id' => $publication,
+                    'page' => $link['page'],
+                    'url' => $link['to'],
+                ];
+            }
+
+            if (count($externalLinks) > 0) {
+                FluidbookAuditLink::insert($externalLinks);
+            }
+            Log::info('Parsed fluidbook ' . $publication . ' : found ' . count($externalLinks) . ' links');
+        }
+
+
+        Log::info('Job exécuté avec succès');
+    }
+}
diff --git a/app/Jobs/registerLinksForAudit.php b/app/Jobs/registerLinksForAudit.php
deleted file mode 100644 (file)
index 08e1479..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-<?php
-
-namespace App\Jobs;
-
-use App\Fluidbook\Link\LinksData;
-use App\Models\FluidbookAuditLink;
-use App\Models\FluidbookPublication;
-use App\Models\FluidbookCollection;
-use Cubist\Net\Util;
-use Cubist\Util\CommandLine;
-use Cubist\Util\Files\Files;
-use Illuminate\Support\Arr;
-use Illuminate\Support\Facades\Cache;
-use Illuminate\Support\Facades\Log;
-use mysql_xdevapi\Exception;
-
-class registerLinksForAudit extends Base
-{
-    /**
-     * Create a new job instance.
-     */
-    public function __construct() {
-    }
-
-    public function handle()
-    {
-        $externalLinks = [];
-
-        $publications = Arr::flatten(FluidbookCollection::where('enable_audit',1)->pluck('publications')->toArray(), 1);
-
-        $publications = array_map(function($n) {
-            return $n['fluidbook'];
-        }, $publications);
-
-        // Nécessaire pour vérifier si la liste des fluidbooks fourni par les collections
-        // existent vraiment ou s'ils ont été supprimé sans être supprimé dans la collection
-        $publications = FluidbookPublication::whereIn('id',$publications)->pluck('id');
-
-        foreach ($publications as $publication) {
-            // Get all links in current fluidbook
-            // Access to links in $links variable
-            LinksData::getLinksAndRulers($publication, $links, $rulers);
-
-            // We want only url link begin with http or https and webvideo link
-            // type // 10: web video // 2: url
-            $links = array_filter($links, function($n){
-                return ($n['type'] == 2 && preg_match('/https?:\/\//', $n['to']) ) || $n['type'] == 10;
-            });
-
-            foreach ($links as $link) {
-                if (Arr::exists($link, 'video_service')) {
-                    if ($link['video_service'] === "youtube") {
-                        $link['to'] = "https://youtu.be/" . $link['to'];
-                    }
-                }
-
-                $externalLinks[] = [
-                    'link_id' => $link['uid'],
-                    'fluidbook_id' => intval($publication),
-                    'page' => intval($link['page']),
-                    'url' => $link['to'],
-                    'created_at' => date('Y-m-d H:i:s'),
-                    'updated_at'=> date('Y-m-d H:i:s')
-                ];
-            }
-        }
-
-        FluidbookAuditLink::upsert($externalLinks, ['link_id','fluidbook_id'], ['url','updated_at','page']);
-
-        Log::info('Job exécuté avec succès');
-    }
-}
index d71d1234dc27f7ed46c25cff3866f90b3fb28a43..2b2747e71646eba1d16694699db08c1680adf5f4 100644 (file)
@@ -23,7 +23,7 @@ class FluidbookAuditLink extends CubistMagicAbstractModel
     {
         parent::setFields();
         $this->addField('fluidbook_id', Integer::class, 'Fluidbook ID');
-        $this->addField('page', Integer::class, 'Fluidbook ID');
+        $this->addField('page', Text::class, 'Fluidbook ID');
         $this->addField('link_id', Text::class, 'Link ID');
         $this->addField('http_code', Integer::class, 'HTTP Code');
         $this->addField('code_date', Datetime::class);
index 4317c0c7c81af75c48780ac893114f0f0fce7e30..d02a5326216ddef1a0fddd2b8ca8648caf7a88cc 100644 (file)
@@ -13,6 +13,7 @@ use App\Http\Controllers\Admin\Operations\FluidbookCollection\DownloadOperation;
 use App\Http\Controllers\Admin\Operations\FluidbookCollection\PreviewOperation;
 use App\Http\Controllers\Admin\Operations\FluidbookCollection\SettingsExportOperation;
 use App\Jobs\AuditLink;
+use App\Jobs\AuditLinkRegister;
 use App\Jobs\FluidbookCollectionRefreshIndex;
 use App\Jobs\GenerateDeliveryThumbnailsPreview;
 use App\Jobs\registerLinksForAudit;
@@ -309,18 +310,12 @@ class FluidbookCollection extends ToolboxStatusModel
     {
         $res = parent::onSaved();
         dispatch(new FluidbookCollectionRefreshIndex($this->id));
+        if($this->enable_audit){
+            AuditLinkRegister::dispatch();
+        }
         return $res;
     }
 
-    public static function runAuditLink($sync = false)
-    {
-        dispatch_sync(new AuditLink());
-    }
-
-    public static function registerLinks() {
-        dispatch_sync(new registerLinksForAudit());
-    }
-
     public static function updateHemsleyCollection($data) {
         $c = self::where('title','=','Audit Hemsley');
         $collection = $c->get();