diff --git a/app/Http/Controllers/MediaController.php b/app/Http/Controllers/MediaController.php index a2434c4..b55556e 100644 --- a/app/Http/Controllers/MediaController.php +++ b/app/Http/Controllers/MediaController.php @@ -438,93 +438,96 @@ class MediaController extends Controller */ public function duplicateMedia(Media $media): JsonResponse { - /** @var \App\Models\User */ - $user = auth()->user(); + return DB::transaction(function () use ($media) { + /** @var \App\Models\User */ + $user = auth()->user(); - $user->authorizeRoles([ - config('roles.const.ADMIN'), - config('roles.const.REDACTEUR'), - config('roles.const.CONTRIBUTEUR') - ]); - - if ($media->isLocked) { - return \response()->json([ - 'status' => false, - 'error' => trans('Le média est en attente d\'un retour d\'Arcadia.') + $user->authorizeRoles([ + config('roles.const.ADMIN'), + config('roles.const.REDACTEUR'), + config('roles.const.CONTRIBUTEUR') ]); - } - $clonedMedia = $media->replicate(); + if ($media->isLocked) { + return \response()->json([ + 'status' => false, + 'error' => trans('Le média est en attente d\'un retour d\'Arcadia.') + ]); + } - /** @var \Illuminate\Filesystem\FilesystemAdapter */ - $storage = Storage::disk('media'); + $clonedMedia = $media->replicate(); - $clonedMedia->uid = Str::uuid(); - $clonedMedia->extension = MediaExtension::jpg; + // * Remove Arcadia ID (cloned is not linked to arcadia) + $clonedMedia->arcadia_id = null; - if (!Storage::exists('assets/images/default.jpg')) { - throw new \RuntimeException('Missing default picture'); - } + /** @var \Illuminate\Filesystem\FilesystemAdapter */ + $storage = Storage::disk('media'); - $fileContent = Storage::get('assets/images/default.jpg'); + $clonedMedia->uid = Str::uuid(); + $clonedMedia->extension = MediaExtension::jpg; - if (!$storage->put($clonedMedia->relative_path, $fileContent)) { - throw new \RuntimeException('Failed to copy default picture'); - } + if (!Storage::exists('assets/images/default.jpg')) { + throw new \RuntimeException('Missing default picture'); + } - $clonedMedia->libelle = Str::limit("{$clonedMedia->libelle}_copy", 45); - $clonedMedia->taille = \strlen($fileContent); + $fileContent = Storage::get('assets/images/default.jpg'); - $dimensions = ToolboxHelper::getImageDimensions(Storage::path('assets/images/default.jpg')); + if (!$storage->put($clonedMedia->relative_path, $fileContent)) { + throw new \RuntimeException('Failed to copy default picture'); + } - if ($dimensions) { - $clonedMedia->resolution = $dimensions['resolutionX']; - $clonedMedia->largeur = $dimensions['width']; - $clonedMedia->hauteur = $dimensions['height']; - $clonedMedia->largeur_mm = !empty($media->resolution) ? ceil($media->largeur * 10) : 0; - $clonedMedia->hauteur_mm = !empty($media->resolution) ? ceil($media->hauteur * 10) : 0; - } + $clonedMedia->libelle = Str::limit("{$clonedMedia->libelle}_copy", 45); + $clonedMedia->taille = \strlen($fileContent); - $clonedMedia->isDefault = true; - $clonedMedia->owner()->associate($user); + $dimensions = ToolboxHelper::getImageDimensions(Storage::path('assets/images/default.jpg')); - $clonedMedia->typeMedia()->associate(TypeMedia::getMediaType($clonedMedia->extension)); + if ($dimensions) { + $clonedMedia->resolution = $dimensions['resolutionX']; + $clonedMedia->largeur = $dimensions['width']; + $clonedMedia->hauteur = $dimensions['height']; + $clonedMedia->largeur_mm = !empty($media->resolution) ? ceil($media->largeur * 10) : 0; + $clonedMedia->hauteur_mm = !empty($media->resolution) ? ceil($media->hauteur * 10) : 0; + } - // ---- Creation des vignettes de base - $clonedMedia->createThumbnail(); - // ---- Creation des vignettes en lien avec le sujet du média - $clonedMedia->createSubjectThumbnails(); + $clonedMedia->isDefault = true; + $clonedMedia->owner()->associate($user); - $clonedMedia->isDuplicate = true; + $clonedMedia->typeMedia()->associate(TypeMedia::getMediaType($clonedMedia->extension)); - $clonedMedia->saveOrFail(); + // ---- Creation des vignettes de base + $clonedMedia->createThumbnail(); + // ---- Creation des vignettes en lien avec le sujet du média + $clonedMedia->createSubjectThumbnails(); - // Manage relations after the model has been saved. - $media->articles->map(function (Article $article) use ($clonedMedia) { - $clonedMedia->articles()->attach($article); + $clonedMedia->save(); + + // * Add relations after having a media id + $media->articles->map(function (Article $article) use ($clonedMedia) { + $clonedMedia->articles()->attach($article); + }); + $media->marques->map(function (Marque $marque) use ($clonedMedia) { + $clonedMedia->marques()->attach($marque); + }); + $media->societes->map(function (Societe $societe) use ($clonedMedia) { + $clonedMedia->societes()->attach($societe); + }); + $media->tags->map(function (Tag $tag) use ($clonedMedia) { + $clonedMedia->tags()->attach($tag); + }); + + + /** @throws \RuntimeException */ + $clonedMedia->addToElasticSearch(); + + // * Get props inserted by DB. + $clonedMedia->refresh(); + + return \response()->json([ + 'status' => true, + 'sujet_id' => $clonedMedia->sujet_id, + 'datas' => $clonedMedia + ]); }); - $media->marques->map(function (Marque $marque) use ($clonedMedia) { - $clonedMedia->marques()->attach($marque); - }); - $media->societes->map(function (Societe $societe) use ($clonedMedia) { - $clonedMedia->societes()->attach($societe); - }); - $media->tags->map(function (Tag $tag) use ($clonedMedia) { - $clonedMedia->tags()->attach($tag); - }); - - - /** @throws \RuntimeException */ - $clonedMedia->addToElasticSearch(); - - // * Get props inserted by DB. - $clonedMedia->refresh(); - - return \response()->json([ - 'status' => true, - 'sujet_id' => $clonedMedia->sujet_id, - 'datas' => $clonedMedia - ]); } /** @@ -762,7 +765,7 @@ class MediaController extends Controller } $history = Historique::query() - ->whereHas('media', fn (Builder $q) => $q->where('id', $media->id)) + ->whereHas('media', fn(Builder $q) => $q->where('id', $media->id)) ->with('user') ->orderBy('created_date', 'DESC') ->get();