From: Vincent Vanwaelscappel Date: Tue, 18 Nov 2025 19:36:22 +0000 (+0100) Subject: wip #7850 @1 X-Git-Url: http://git.cubedesigners.com/?a=commitdiff_plain;h=db6bc5ac5ba202a9bbc6dadf2fd2906769eab032;p=fluidbook-toolbox.git wip #7850 @1 --- diff --git a/app/Fluidbook/Link/LinksData.php b/app/Fluidbook/Link/LinksData.php index 5e4091271..7d88d3a94 100644 --- a/app/Fluidbook/Link/LinksData.php +++ b/app/Fluidbook/Link/LinksData.php @@ -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 index 000000000..264f25863 --- /dev/null +++ b/app/Jobs/AuditLinkRegister.php @@ -0,0 +1,90 @@ +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 index 08e14798e..000000000 --- a/app/Jobs/registerLinksForAudit.php +++ /dev/null @@ -1,72 +0,0 @@ -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'); - } -} diff --git a/app/Models/FluidbookAuditLink.php b/app/Models/FluidbookAuditLink.php index d71d1234d..2b2747e71 100644 --- a/app/Models/FluidbookAuditLink.php +++ b/app/Models/FluidbookAuditLink.php @@ -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); diff --git a/app/Models/FluidbookCollection.php b/app/Models/FluidbookCollection.php index 4317c0c7c..d02a53262 100644 --- a/app/Models/FluidbookCollection.php +++ b/app/Models/FluidbookCollection.php @@ -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();