Fix Media duplicate

- put in transaction
- set arcadia_id to null
This commit is contained in:
Jérémy Munsch 2023-12-15 12:03:35 +01:00 • committed by Noah Lancien
parent 14aeec5e2a
commit 0194d8e0c1

View file

@ -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();