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('media.xml', $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(); } }