composer require ldc/web-status-checker-laravel remove Old static status checker Fix ImportMedia WIP commands OK many fixes Fix and try to optimize folder component Fix front icons + actions based on icons Favico front fix alert Fix Media upload on depot fix folder component buttons Full front fix with perf due tu vuejs Download medias Navigate within medias superfix Move media + loader isLocked boolean and remove media fix Folder scroll fix arcadia link color red Fix panier show external Tons of fixes back as front REwrited all
294 lines
11 KiB
PHP
294 lines
11 KiB
PHP
<?php
|
|
|
|
namespace App\Lib;
|
|
|
|
use App\Enums\EdiMouvementType;
|
|
use App\Models\ArcadiaLink;
|
|
use App\Models\Format;
|
|
use App\Models\Media;
|
|
use App\Scopes\SystemScope;
|
|
use DOMDocument;
|
|
use Illuminate\Support\Collection;
|
|
use Illuminate\Support\Facades\Storage;
|
|
use Illuminate\Support\Str;
|
|
|
|
class ArcadiaLinkUtilities
|
|
{
|
|
/**
|
|
* Create Media
|
|
*
|
|
* @param \App\Models\Media $media
|
|
* @return boolean
|
|
*/
|
|
public static function create(Media $media): bool
|
|
{
|
|
return self::sendMediaToArcadia($media, EdiMouvementType::create);
|
|
}
|
|
|
|
/**
|
|
* Update Media
|
|
*
|
|
* @param \App\Models\Media $media
|
|
* @return boolean
|
|
*/
|
|
public static function update(Media $media): bool
|
|
{
|
|
return self::sendMediaToArcadia($media, EdiMouvementType::update);
|
|
}
|
|
|
|
/**
|
|
* Delete Media
|
|
*
|
|
* @param \App\Models\Media $media
|
|
* @return boolean
|
|
*/
|
|
public static function delete(Media $media): bool
|
|
{
|
|
return self::sendMediaToArcadia($media, EdiMouvementType::delete);
|
|
}
|
|
|
|
/**
|
|
* Reactivate Media
|
|
*
|
|
* @param \App\Models\Media $media
|
|
* @return boolean
|
|
*/
|
|
public static function reactivate(Media $media): bool
|
|
{
|
|
return self::sendMediaToArcadia($media, EdiMouvementType::reactivate);
|
|
}
|
|
|
|
/**
|
|
* Send Media mouvement to Arcadia
|
|
*
|
|
* @param \App\Models\Media $media
|
|
* @param \App\Enums\EdiMouvementType $ediMouvementType
|
|
* @return boolean
|
|
*/
|
|
private static function sendMediaToArcadia(Media $media, EdiMouvementType $ediMouvementType): bool
|
|
{
|
|
if (
|
|
$ediMouvementType !== EdiMouvementType::create and
|
|
$media->arcadia_id === null and
|
|
!self::hasRequiredValues($media)
|
|
) {
|
|
return false;
|
|
}
|
|
|
|
$media->fresh();
|
|
$media->isLocked = true;
|
|
|
|
try {
|
|
if (
|
|
!($media->saveQuietly() and
|
|
self::compress(self::generateXml($media, $ediMouvementType), $media)
|
|
)
|
|
) {
|
|
return false;
|
|
}
|
|
|
|
/** @throws \RuntimeException */
|
|
$media->addToElasticSearch();
|
|
|
|
return true;
|
|
} catch (\RuntimeException | \Throwable $e) {
|
|
report($e);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Check has required values
|
|
*
|
|
* @param \App\Models\Media $media
|
|
* @return boolean
|
|
*/
|
|
private static function hasRequiredValues(Media $media): bool
|
|
{
|
|
$required = ['sujet_id', 'type_media_id', 'type_vue_id', 'variante_id', 'langue_id', 'version'];
|
|
foreach ($required as $v) {
|
|
if ($media->{$v} === null) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Compress Xml File into zip
|
|
*
|
|
* @param string $xml
|
|
* @param \App\Models\Media $media
|
|
* @return boolean
|
|
*/
|
|
private static function compress(string $xml, Media $media): bool
|
|
{
|
|
/** @var \Illuminate\Filesystem\FilesystemAdapter */
|
|
$storage = Storage::disk('arcadia_link_s');
|
|
$uuid = Str::uuid();
|
|
$filename = "{$media->id}-{$uuid}.zip";
|
|
$zip = new \ZipArchive();
|
|
$success = $zip->open(
|
|
$storage->path($filename),
|
|
\ZipArchive::CREATE | \ZipArchive::OVERWRITE
|
|
);
|
|
$success = $zip->addFromString($xml, 'media.xml') && $success;
|
|
$success = $zip->addFile($media->full_path, $media->basename) && $success;
|
|
$success = $zip->close() && $success;
|
|
unset($zip);
|
|
|
|
// On insert dans la table de supervision.
|
|
$arcadiaLink = new ArcadiaLink();
|
|
$arcadiaLink->media_id = $media->id;
|
|
if ($media->arcadia_id !== null) {
|
|
$arcadiaLink->arcadia_id = $media->arcadia_id;
|
|
}
|
|
$arcadiaLink->filename = $filename;
|
|
return $success and $arcadiaLink->save();
|
|
}
|
|
|
|
/**
|
|
* Generate Xml
|
|
*
|
|
* @param \App\Models\Media $media
|
|
* @param \App\Enums\EdiMouvementType $mouvement
|
|
* @return string
|
|
* @throws \RuntimeException If Generating XML Fails.
|
|
*/
|
|
private static function generateXml(Media $media, EdiMouvementType $mouvement): string
|
|
{
|
|
$refKey = self::getRefKey($media);
|
|
$formats = self::getFormats();
|
|
|
|
$dom = new DOMDocument('1.0', 'UTF-8');
|
|
$dom->formatOutput = true;
|
|
|
|
try {
|
|
$root = $dom->createElement('MEDIA_VISUEL');
|
|
$dom->appendChild($root);
|
|
|
|
$root->appendChild($dom->createElement('codeArcadia'))
|
|
->appendChild($dom->createCDATASection("$media->arcadia_id"));
|
|
$root->appendChild($dom->createElement('code_DAM'))
|
|
->appendChild($dom->createCDATASection("$media->id"));
|
|
$root->appendChild($dom->createElement('TypeMouvement'))
|
|
->appendChild($dom->createCDATASection("$mouvement->value"));
|
|
|
|
$cleRef = $root->appendChild($dom->createElement('cle_Referentiel'));
|
|
|
|
foreach ($refKey as $model) {
|
|
if ($media->sujet_id === 1) {
|
|
$cleRef->appendChild($dom->createElement('id'))
|
|
->appendChild($dom->createCDATASection("$model->noArt"));
|
|
} elseif ($media->sujet_id === 2) {
|
|
$cleRef->appendChild($dom->createElement('id'))
|
|
->appendChild($dom->createCDATASection("$model->codMarq"));
|
|
} elseif ($media->sujet_id === 4) {
|
|
$cleRef->appendChild($dom->createElement('id'))
|
|
->appendChild($dom->createCDATASection("$model->id"));
|
|
}
|
|
}
|
|
|
|
$root->appendChild($dom->createElement('libExtension'))
|
|
->appendChild($dom->createCDATASection($media->extension->value));
|
|
$root->appendChild($dom->createElement('nbPxLargeur'))
|
|
->appendChild($dom->createCDATASection("$media->largeur"));
|
|
$root->appendChild($dom->createElement('largeurMm'))
|
|
->appendChild($dom->createCDATASection("$media->largeur_mm"));
|
|
$root->appendChild($dom->createElement('nbPxHauteur'))
|
|
->appendChild($dom->createCDATASection("$media->hauteur"));
|
|
$root->appendChild($dom->createElement('hauteurMm'))
|
|
->appendChild($dom->createCDATASection("$media->hauteur_mm"));
|
|
$root->appendChild($dom->createElement('pppLargeur'))
|
|
->appendChild($dom->createCDATASection("$media->resolution"));
|
|
$root->appendChild($dom->createElement('version'))
|
|
->appendChild($dom->createCDATASection("$media->version"));
|
|
$root->appendChild($dom->createElement('codeTypeMedia'))
|
|
->appendChild($dom->createCDATASection("$media->type_media_id"));
|
|
$root->appendChild($dom->createElement('codeTypeVue'))
|
|
->appendChild($dom->createCDATASection("$media->type_vue_id"));
|
|
$root->appendChild($dom->createElement('commentaire'))
|
|
->appendChild($dom->createCDATASection("$media->commentaire"));
|
|
$root->appendChild($dom->createElement('codeSujet'))
|
|
->appendChild($dom->createCDATASection("$media->sujet_id"));
|
|
$root->appendChild($dom->createElement('langue'))
|
|
->appendChild($dom->createCDATASection("$media->langue_id"));
|
|
$root->appendChild($dom->createElement('copyright'))
|
|
->appendChild($dom->createCDATASection("$media->copyright_id"));
|
|
$root->appendChild($dom->createElement('codeVariante'))
|
|
->appendChild($dom->createCDATASection("$media->variante_id"));
|
|
$root->appendChild($dom->createElement('dateCreation'))
|
|
->appendChild($dom->createCDATASection("$media->created_at"));
|
|
$root->appendChild($dom->createElement('dateModification'))
|
|
->appendChild($dom->createCDATASection("$media->updated_at"));
|
|
$root->appendChild($dom->createElement('datePublication'))
|
|
->appendChild($dom->createCDATASection("$media->published_at"));
|
|
$root->appendChild($dom->createElement('libelle'))
|
|
->appendChild($dom->createCDATASection("$media->libelle"));
|
|
$root->appendChild($dom->createElement('NomFichier'))
|
|
->appendChild($dom->createCDATASection("$media->uid.{$media->extension->value}"));
|
|
|
|
$mediaFormat = $root->appendChild($dom->createElement('formats'));
|
|
|
|
foreach ($formats as $formatModel) {
|
|
$format = $mediaFormat
|
|
->appendChild($dom->createElement('format'));
|
|
$format->appendChild($dom->createElement('id'))
|
|
->appendChild($dom->createCDATASection($formatModel['id']));
|
|
$format->appendChild($dom->createElement('libelle'))
|
|
->appendChild($dom->createCDATASection($formatModel['libelle']));
|
|
$format->appendChild($dom->createElement('extension'))
|
|
->appendChild($dom->createCDATASection($media->extension->value));
|
|
$format->appendChild($dom->createElement('largeur'))
|
|
->appendChild($dom->createCDATASection($formatModel['largeur']));
|
|
$format->appendChild($dom->createElement('hauteur'))
|
|
->appendChild($dom->createCDATASection($formatModel['hauteur']));
|
|
$format->appendChild($dom->createElement('lien'))
|
|
->appendChild($dom->createCDATASection(\sprintf(
|
|
"%s/{$media->folder}{$media->uid}_%s.{$media->extension->value}",
|
|
config('app.url'),
|
|
$formatModel['libelle']
|
|
)));
|
|
}
|
|
} catch (\DOMException | \Exception $e) {
|
|
report($e);
|
|
throw new \RuntimeException('Failed to generate XML', 0, $e);
|
|
} //end try
|
|
|
|
if (!($xml = $dom->saveXML())) {
|
|
throw new \RuntimeException('Failed to generate XML');
|
|
}
|
|
return $xml;
|
|
}
|
|
|
|
/**
|
|
* Get Ref Key
|
|
*
|
|
* @param \App\Models\Media $media
|
|
* @return \Illuminate\Support\Collection<\App\Models\Article|\App\Models\Marque|\App\Models\Societe>
|
|
*/
|
|
public static function getRefKey(Media $media): Collection
|
|
{
|
|
switch ($media->sujet_id) {
|
|
case 1:
|
|
return $media->articles;
|
|
case 2:
|
|
return $media->marques;
|
|
case 4:
|
|
return $media->societes;
|
|
default:
|
|
return collect();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Get Formats
|
|
*
|
|
* @return \Illuminate\Support\Collection<\App\Models\Format>
|
|
*/
|
|
private static function getFormats(): Collection
|
|
{
|
|
return Format::withoutGlobalScope(SystemScope::class)
|
|
->where('system', true)->get();
|
|
}
|
|
}
|