envoi de la fiche vers Arcadia après upload de nouveau visuel Gestion de retour en erreur avant la liaison avec Arcadia Check des dimensions et du type avant liaison vers Arcadia
1231 lines
43 KiB
PHP
1231 lines
43 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Http\Traits\ArcadiaLink;
|
|
use Elasticquent\ElasticquentTrait;
|
|
use Illuminate\Support\Facades\Auth;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\Storage;
|
|
use App\Models\Sujet;
|
|
use App\Models\Format;
|
|
use App\Models\Media;
|
|
use App\Models\Typemedia;
|
|
use App\Models\Langue;
|
|
use App\Models\Copyright;
|
|
use App\Models\Etiquette;
|
|
use App\Models\Societe;
|
|
use App\Models\Marque;
|
|
use App\Models\Dossier;
|
|
use App\Models\Tag;
|
|
use App\Models\Article;
|
|
use App\Models\Recherche;
|
|
use App\Models\Historique;
|
|
use App\Models\Panier;
|
|
use App\Http\Traits\MediaTools;
|
|
|
|
class MediaController extends Controller
|
|
{
|
|
|
|
use MediaTools;
|
|
|
|
/**
|
|
* Display a listing of the resource.
|
|
*
|
|
* @return \Illuminate\Http\Response
|
|
*/
|
|
public function index(Request $request)
|
|
{
|
|
$filters = "";
|
|
$sujets = Auth::user()->sujets;
|
|
$paniers = Auth::user()->paniersOwner;
|
|
$typemedias = Typemedia::all();
|
|
$langues = Langue::all();
|
|
$copyrights = Copyright::all();
|
|
$etiquettes = Etiquette::all();
|
|
$societes = Societe::orderBy('libelle')->get();
|
|
$marques = Marque::all();
|
|
|
|
$dossier_id = $request->get('d') !== null ? $request->get('d') : -1;
|
|
$sujet_id = $request->get('s') !== null ? $request->get('s') : 1;
|
|
$textSearch = $request->get('t');
|
|
$recherche_id = $request->get('r');
|
|
|
|
// ---- Recherche type texte
|
|
if ($textSearch != "" && $sujet_id != "") {
|
|
// on créé un object filtre
|
|
$filters = (object)[
|
|
"search" => array(
|
|
'type' => "search",
|
|
'legend' => "Recherche : ",
|
|
'value' => $textSearch,
|
|
'libelle' => array($textSearch),
|
|
)
|
|
];
|
|
$filters = json_encode($filters);
|
|
|
|
// ---- Recherche favorite
|
|
} elseif ($recherche_id != "") {
|
|
$recherche = Recherche::where('id', $recherche_id)->first();
|
|
if ($recherche) {
|
|
$filters = $recherche->filters;
|
|
$sujet_id = $recherche->sujet_id;
|
|
$dossier_id = $recherche->dossier_id;
|
|
}
|
|
}
|
|
|
|
return view('media_manager')->with([
|
|
'sujets' => $sujets,
|
|
'typemedias' => $typemedias,
|
|
'langues' => $langues,
|
|
'copyrights' => $copyrights,
|
|
'etiquettes' => $etiquettes,
|
|
'societes' => $societes,
|
|
'marques' => $marques,
|
|
'currentFolder' => $dossier_id,
|
|
'currentSujet' => $sujet_id,
|
|
'currentFilters' => $filters,
|
|
'paniers' => $paniers,
|
|
'textSearch' => $textSearch
|
|
]);
|
|
}
|
|
|
|
public function show(Request $request) {
|
|
$uid = $request->uid;
|
|
$media = Media::where('uid', $uid)->first();
|
|
if (!$media)
|
|
abort(404);
|
|
return redirect()->route('media_manager')->with('autoOpen', $media);
|
|
}
|
|
|
|
/**
|
|
* Chargement des médias
|
|
*
|
|
*/
|
|
public function loadMedia(Request $request)
|
|
{
|
|
$response = array();
|
|
$userId = Auth::user()->id;
|
|
$dossier_id = $request->folder;
|
|
$sujet_id = $request->sujet;
|
|
$filters = $request->filters;
|
|
$offset = $request->offset;
|
|
$limit = $request->limit;
|
|
$saveSearch = $request->saveSearch;
|
|
$isDepot = 0;
|
|
|
|
$order = array_search('order', array_column($filters, 'type'));
|
|
|
|
$orderField = $filters[$order]['value'];
|
|
$order = $filters[$order]['order'];
|
|
|
|
$esMust = [];
|
|
$esMustNot = [];
|
|
$esShould = [];
|
|
$esFilters = [];
|
|
|
|
if ($dossier_id == "0") { // dossier racine
|
|
$esMust = array_merge($esMust, [
|
|
[
|
|
'bool' => [
|
|
'should' => [
|
|
'match' => [
|
|
'sujet_id' => $sujet_id
|
|
]
|
|
]
|
|
]
|
|
]
|
|
]);
|
|
$esMustNot = array_merge($esMustNot, [
|
|
'exists' => [
|
|
'field' => 'dossier_id'
|
|
]
|
|
]);
|
|
$esShould = array_merge($esShould, [
|
|
[
|
|
'match' => [
|
|
'statut' => config('services.statut.public_etendu')
|
|
]
|
|
],
|
|
[
|
|
'match' => [
|
|
'statut' => config('services.statut.public')
|
|
]
|
|
],
|
|
[
|
|
'match' => [
|
|
'created_by' => $userId
|
|
]
|
|
]
|
|
]);
|
|
|
|
} elseif ($dossier_id == "-1") { // recherche global
|
|
|
|
$esMust = array_merge($esMust, [
|
|
[
|
|
'bool' => [
|
|
'should' => [
|
|
[
|
|
'match' => [
|
|
'sujet_id' => $sujet_id
|
|
]
|
|
],
|
|
[
|
|
'match' => [
|
|
'statut' => config('services.statut.public_etendu')
|
|
]
|
|
]
|
|
]
|
|
]
|
|
]
|
|
]);
|
|
|
|
$esShould = array_merge($esShould, [
|
|
[
|
|
'match' => [
|
|
'created_by' => $userId
|
|
]
|
|
]
|
|
]);
|
|
|
|
} else {
|
|
$dossier = Dossier::where('id', $dossier_id)->first();
|
|
if ($dossier->parent_id != 1 && $dossier->id != 1) { // dossier classic
|
|
|
|
$esMust = array_merge($esMust, [
|
|
[
|
|
'bool' => [
|
|
'must' => [
|
|
[
|
|
'match' => [
|
|
'sujet_id' => $sujet_id
|
|
]
|
|
],
|
|
[
|
|
'match' => [
|
|
'dossier_id' => $dossier_id
|
|
]
|
|
]
|
|
]
|
|
]
|
|
]
|
|
]);
|
|
|
|
$esFilters = array_merge($esFilters, array(
|
|
[
|
|
'bool' => [
|
|
'should' => [
|
|
[
|
|
'bool' => [
|
|
'must_not' => [
|
|
[
|
|
'term' => [
|
|
'statut' => [
|
|
'value' => config('services.statut.brouillon'),
|
|
'boost' => 1.0
|
|
]
|
|
]
|
|
]
|
|
],
|
|
'adjust_pure_negative' => true,
|
|
'boost' => 1.0
|
|
]
|
|
],
|
|
[
|
|
'term' => [
|
|
'created_by' => [
|
|
'value' => $userId,
|
|
'boost' => 1.0
|
|
]
|
|
]
|
|
]
|
|
],
|
|
'adjust_pure_negative' => true,
|
|
'boost' => 1.0
|
|
]
|
|
]
|
|
));
|
|
|
|
} else { // dossier dépôt
|
|
$isDepot = 1;
|
|
$esMust = array_merge($esMust, [
|
|
[
|
|
'match' => [
|
|
'dossier_id' => $dossier_id
|
|
]
|
|
]
|
|
]);
|
|
}
|
|
}
|
|
|
|
// Filtre recherche texte
|
|
$tmp = array_search('search', array_column($filters, 'type'));
|
|
if ($tmp !== false) {
|
|
$tmpFilters = [];
|
|
$search = strtolower(trim($filters[$tmp]['value']));
|
|
|
|
if (strpos($search, '=') !== false){
|
|
$tmpSearch = explode('=', $search);
|
|
$key = $tmpSearch[0];
|
|
$needle = $tmpSearch[1];
|
|
|
|
switch ($key){
|
|
case 'ca':
|
|
$isCAQuery = true;
|
|
$tmpFilters = [
|
|
[
|
|
'bool' => [
|
|
'must' => [
|
|
'match' => [
|
|
'articles.noArt' => $needle
|
|
]
|
|
]
|
|
]
|
|
]
|
|
];
|
|
break;
|
|
case 'fv':
|
|
$tmpFilters = [
|
|
[
|
|
'bool' => [
|
|
'must' => [
|
|
'match' => [
|
|
'articles.codFamVte' => $needle
|
|
]
|
|
]
|
|
]
|
|
]
|
|
];
|
|
break;
|
|
case 'gca':
|
|
$tmpFilters = [
|
|
[
|
|
'bool' => [
|
|
'must' => [
|
|
'match' => [
|
|
'articles.codGencodAdm' => $needle
|
|
]
|
|
]
|
|
]
|
|
]
|
|
];
|
|
break;
|
|
case 'gcs':
|
|
$tmpFilters = [
|
|
[
|
|
'bool' => [
|
|
'must' => [
|
|
'match' => [
|
|
'articles.codGencodSymb' => $needle
|
|
]
|
|
]
|
|
]
|
|
]
|
|
];
|
|
break;
|
|
case 'gcp':
|
|
$tmpFilters = [
|
|
[
|
|
'bool' => [
|
|
'must' => [
|
|
'match' => [
|
|
'articles.codGencodPds' => $needle
|
|
]
|
|
]
|
|
]
|
|
]
|
|
];
|
|
break;
|
|
case 'cd': // media id
|
|
$tmpFilters = [
|
|
[
|
|
'bool' => [
|
|
'must' => [
|
|
'match' => [
|
|
'id' => $needle
|
|
]
|
|
]
|
|
]
|
|
]
|
|
];
|
|
break;
|
|
case 'cv': // media arcadia_id
|
|
$tmpFilters = [
|
|
[
|
|
'bool' => [
|
|
'must' => [
|
|
'match' => [
|
|
'arcadia_id' => $needle
|
|
]
|
|
]
|
|
]
|
|
]
|
|
];
|
|
break;
|
|
}
|
|
}else if (strpos($search, '+') !== false){
|
|
$tmpSearch = explode('+', $search);
|
|
|
|
$mustLib = [];
|
|
foreach ($tmpSearch as $search) {
|
|
array_push($mustLib, [
|
|
'wildcard' => [
|
|
'libelle.keyword' => [
|
|
'wildcard' => "*$search*",
|
|
'boost' => 1.0
|
|
]
|
|
]
|
|
]);
|
|
}
|
|
|
|
$mustArt = [];
|
|
foreach ($tmpSearch as $search) {
|
|
array_push($mustArt, [
|
|
'wildcard' => [
|
|
'articles.libCcial.keyword' => [
|
|
'wildcard' => "*$search*",
|
|
'boost' => 1.0
|
|
]
|
|
]
|
|
]);
|
|
}
|
|
|
|
$tmpFilters = [
|
|
[
|
|
'bool' => [
|
|
'should' => [
|
|
[
|
|
'bool' => [
|
|
'must' => $mustLib
|
|
]
|
|
],
|
|
[
|
|
'bool' => [
|
|
'must' => $mustArt
|
|
]
|
|
]
|
|
]
|
|
]
|
|
]
|
|
];
|
|
|
|
}else{
|
|
$tmpFilters = [
|
|
[
|
|
'multi_match' => [
|
|
'query' => $search,
|
|
"type" => "most_fields",
|
|
'fields' => [
|
|
'libelle^3',
|
|
'commentaire^2',
|
|
'arcadia_id',
|
|
'articles.libCcial',
|
|
'articles.libMarq',
|
|
'articles.libFamVte',
|
|
'tags.libelle'
|
|
],
|
|
'operator' => 'or',
|
|
'fuzziness' => 'AUTO'
|
|
]
|
|
]
|
|
];
|
|
}
|
|
|
|
$esMust = array_merge($esMust, $tmpFilters);
|
|
|
|
// ---- Sauvegarde de la recherche utilisateur
|
|
if ($saveSearch == 1) {
|
|
$recherche = Recherche::where('libelle', $search)->first();
|
|
if ($recherche) {
|
|
$recherche->user_id = $userId;
|
|
$recherche->sujet_id = $sujet_id;
|
|
$recherche->dossier_id = $dossier_id;
|
|
$recherche->filters = json_encode($filters);
|
|
$recherche->save();
|
|
} else {
|
|
$recherche = new Recherche();
|
|
$recherche->user_id = $userId;
|
|
$recherche->sujet_id = $sujet_id;
|
|
$recherche->dossier_id = $dossier_id;
|
|
$recherche->filters = json_encode($filters);
|
|
$recherche->libelle = $search;
|
|
$recherche->save();
|
|
|
|
// Purge des anciennes recherches
|
|
$count = Recherche::where('user_id', $userId)->count();
|
|
Recherche::where('user_id', $userId)->orderBy("created_at", "desc")->skip(10)->take($count)->get()->each(function ($row) {
|
|
$row->delete();
|
|
});
|
|
}
|
|
}
|
|
}
|
|
|
|
// Filtre type de média
|
|
$tmp = array_search('typemedia_id', array_column($filters, 'type'));
|
|
if ($tmp !== false) {
|
|
$oTmp = [];
|
|
foreach ($filters[$tmp]['value'] as $type) {
|
|
$oTmp = array_merge($oTmp, [
|
|
[
|
|
'match' => [
|
|
'typemedia_id' => $type['codeTypemedia']
|
|
]
|
|
]
|
|
]);
|
|
}
|
|
$esTypeMedia = [
|
|
[
|
|
'bool' => [
|
|
'should' => $oTmp
|
|
]
|
|
]
|
|
];
|
|
$esMust = array_merge($esMust, $esTypeMedia);
|
|
}
|
|
|
|
// Filtre type de vue
|
|
$tmp = array_search('typevue_id', array_column($filters, 'type'));
|
|
if ($tmp !== false) {
|
|
$oTmp = [];
|
|
foreach ($filters[$tmp]['value'] as $type) {
|
|
$oTmp = array_merge($oTmp, [
|
|
[
|
|
'match' => [
|
|
'typevue_id' => $type['codeTypevue']
|
|
]
|
|
]
|
|
]);
|
|
}
|
|
$esTypeVue = [
|
|
[
|
|
'bool' => [
|
|
'should' => $oTmp
|
|
]
|
|
]
|
|
];
|
|
$esMust = array_merge($esMust, $esTypeVue);
|
|
}
|
|
|
|
// Filtre liason avec Arcadia
|
|
$tmp = array_search('arcadia_id', array_column($filters, 'type'));
|
|
if ($tmp !== false) {
|
|
$esArcadia = [
|
|
[
|
|
'exists' => [
|
|
'field' => 'arcadia_id'
|
|
]
|
|
]
|
|
];
|
|
$esMust = array_merge($esMust, $esArcadia);
|
|
}
|
|
|
|
// Filtre etiquette
|
|
$tmp = array_search('etiquette_id', array_column($filters, 'type'));
|
|
if ($tmp !== false) {
|
|
$oTmp = [];
|
|
foreach ($filters[$tmp]['value'] as $item) {
|
|
$oTmp = array_merge($oTmp, [
|
|
[
|
|
'match' => [
|
|
'etiquette_id' => $item['etiquette_id']
|
|
]
|
|
]
|
|
]);
|
|
}
|
|
$esEtiquette = [
|
|
[
|
|
'bool' => [
|
|
'should' => $oTmp
|
|
]
|
|
]
|
|
];
|
|
$esMust = array_merge($esMust, $esEtiquette);
|
|
}
|
|
|
|
$query = array(
|
|
'bool' => array(
|
|
'must' => $esMust,
|
|
'must_not' => $esMustNot,
|
|
'should' => $esShould,
|
|
'filter' => $esFilters
|
|
),
|
|
);
|
|
|
|
$sort = [
|
|
[
|
|
$orderField => [
|
|
'order' => $order
|
|
]
|
|
]
|
|
];
|
|
|
|
$response['data'] = $query = Media::searchByQuery($query, null, null, $limit, $offset, $sort);
|
|
|
|
if (Auth::user()->hasRole([config('roles.const.ADMIN'), config('roles.const.REDACTEUR')])) {
|
|
$response['draggable'] = true;
|
|
} else {
|
|
$response['draggable'] = false;
|
|
}
|
|
$response['isDepot'] = $isDepot;
|
|
|
|
if (isset($isCAQuery)){
|
|
$response['isCAQuery'] = $isCAQuery;
|
|
}
|
|
|
|
$response['role'] = Auth::user()->role;
|
|
|
|
return json_encode($response);
|
|
}
|
|
|
|
/**
|
|
* Déplacement des médias
|
|
*
|
|
*/
|
|
public function moveMedia(Request $request)
|
|
{
|
|
Auth::user()->authorizeRoles([config('roles.const.ADMIN'), config('roles.const.REDACTEUR')]);
|
|
$response = false;
|
|
$dossier_id = $request->input('dossier_id');
|
|
$medias = $request->input('medias');
|
|
|
|
$user_id = Auth::user()->id;
|
|
$libelle = "";
|
|
|
|
if ($dossier_id > 0) {
|
|
$dossier = Dossier::where('id', $dossier_id)->first();
|
|
if ($dossier) {
|
|
$libelle = $dossier->libelle;
|
|
}
|
|
}
|
|
|
|
foreach ($medias as $media) {
|
|
$media = Media::where('id', $media['id'])->first();
|
|
if ($media) {
|
|
$historique = new historique();
|
|
$historique->user_id = $user_id;
|
|
$historique->media_id = $media->id;
|
|
$historique->type = "Déplacement";
|
|
|
|
if ($dossier_id > 0) {
|
|
$media->dossier_id = $dossier_id;
|
|
$historique->description = "Déplacement dans le dossier " . $libelle;
|
|
} else {
|
|
$media->dossier_id = null;
|
|
$historique->description = "Média déplacé à la racine";
|
|
}
|
|
$media->save();
|
|
|
|
// Elasticsearch
|
|
$id = $media->id;
|
|
$media = Media::find($id);
|
|
$media->removeFromIndex();
|
|
$media->addToIndex();
|
|
|
|
// Lien Arcadia
|
|
ArcadiaLink::update($media);
|
|
|
|
$historique->save();
|
|
}
|
|
}
|
|
|
|
return json_encode($response);
|
|
}
|
|
|
|
/**
|
|
* supprimer des médias
|
|
*
|
|
*/
|
|
public function removeMedia(Request $request)
|
|
{
|
|
$deletedMediasList = array();
|
|
Auth::user()->authorizeRoles([config('roles.const.ADMIN'), config('roles.const.REDACTEUR')]);
|
|
$user_id = Auth::user()->id;
|
|
$deleteMedias = $request->input('medias');
|
|
|
|
if (Auth::user()->hasRole(config('roles.const.ADMIN'))){
|
|
$medias = Media::whereIn('id', $deleteMedias)->get();
|
|
}else{
|
|
$medias = Media::whereIn('id', $deleteMedias)->whereNull('arcadia_id')->get();
|
|
}
|
|
|
|
foreach ($medias as $media) {
|
|
$deletedMediasList[] = $media->id;
|
|
|
|
// Historique des actions
|
|
$historique = new historique();
|
|
$historique->user_id = $user_id;
|
|
$historique->media_id = $media->id;
|
|
$historique->type = "Suppression";
|
|
$historique->description = "Le média a été supprimé";
|
|
$historique->save();
|
|
|
|
// Elasticsearch
|
|
$media->removeFromIndex();
|
|
|
|
$media->delete();
|
|
|
|
// Lien Arcadia
|
|
ArcadiaLink::delete($media);
|
|
}
|
|
|
|
return json_encode($deletedMediasList);
|
|
}
|
|
|
|
/**
|
|
* Récupération d'un média
|
|
*/
|
|
|
|
public function recoverMedia(Request $request)
|
|
{
|
|
$arcadia_id = $request->arcadia_id;
|
|
$media = Media::onlyTrashed()->where('arcadia_id', '=', $arcadia_id)->first();
|
|
$media->restore();
|
|
$media->isLocked = 1;
|
|
$media->save();
|
|
|
|
// Elasticsearch
|
|
$id = $media->id;
|
|
$media = Media::find($id);
|
|
$media->addToIndex();
|
|
|
|
// Lien Arcadia
|
|
ArcadiaLink::reactivate($media);
|
|
|
|
return json_encode(true);
|
|
}
|
|
|
|
/**
|
|
* Obtenir toutes les informations d'un média
|
|
*
|
|
*/
|
|
public function getOneMedia(Request $request)
|
|
{
|
|
$host = $request->getSchemeAndHttpHost();
|
|
$response = array();
|
|
$media_id = $request->input('media_id');
|
|
$media = Media::where('id', $media_id)->with('sujet', 'societes', 'marques', 'articles', 'tags:libelle')->first();
|
|
if ($media) {
|
|
// stock le média
|
|
$response['data'] = $media;
|
|
// stock les tags
|
|
foreach ($media->tags as $tag) {
|
|
$response['tags'][] = $tag->libelle;
|
|
}
|
|
// stock les vignettes existantes
|
|
$files = Storage::files($media->folder . "/");
|
|
$filepath = preg_quote($media->folder . $media->uid, '/');
|
|
$matchingFiles = preg_grep('/^' . $filepath . '/', $files);
|
|
foreach ($matchingFiles as $matchingFile) {
|
|
$path_parts = pathinfo($matchingFile);
|
|
$fileInfo = array();
|
|
$fileInfo['url'] = $host . "/" . $matchingFile;
|
|
$fileInfo['libelle'] = $path_parts['filename'];
|
|
$fileInfo['extension'] = $path_parts['extension'];
|
|
$fileInfo['resolution'] = "";
|
|
|
|
if (in_array($path_parts['extension'], array("gif", "jpeg", "jpg", "png", "pdf", "ai", "psd"))) {
|
|
$im = new \imagick($matchingFile);
|
|
$im->setIteratorIndex(0);
|
|
$imageprops = $im->getImageGeometry();
|
|
$fileInfo['resolution'] = $imageprops['width'] . "x" . $imageprops['height'] . "px";
|
|
}
|
|
|
|
|
|
if (strpos($fileInfo['libelle'], '_')) {
|
|
$fileInfo['libelle'] = "Format " . substr($fileInfo['libelle'], strpos($fileInfo['libelle'], '_') + 1);
|
|
} else {
|
|
$fileInfo['libelle'] = "Format original";
|
|
}
|
|
$response['vignettes'][] = $fileInfo;
|
|
}
|
|
}
|
|
|
|
return json_encode($response);
|
|
}
|
|
|
|
/**
|
|
* Sauvegarde toutes les informations d'un média
|
|
*
|
|
*/
|
|
public function saveMedia(Request $request)
|
|
{
|
|
Auth::user()->authorizeRoles([config('roles.const.ADMIN'), config('roles.const.REDACTEUR'), config('roles.const.CONTRIBUTEUR')]);
|
|
$user_id = Auth::user()->id;
|
|
$mediaUpdate = (object)$request->input('media');
|
|
|
|
$media = Media::where('id', $mediaUpdate->id)->first();
|
|
if ($media) {
|
|
|
|
if ($media->isLocked === 1){
|
|
return json_encode(array('status' => false, 'error' => "Le média est en attente d'un retour d'Arcadia."));
|
|
}
|
|
|
|
$media->libelle = mb_substr($mediaUpdate->libelle, 0, 50, "UTF-8");
|
|
$media->typevue_id = $mediaUpdate->typevue_id;
|
|
$media->variante_id = $mediaUpdate->variante_id;
|
|
$media->langue_id = $mediaUpdate->langue_id;
|
|
$media->commentaire = $mediaUpdate->commentaire;
|
|
$media->version = $mediaUpdate->version;
|
|
$media->published_at = $mediaUpdate->published_at;
|
|
$media->statut = $mediaUpdate->statut;
|
|
$media->copyright_id = $mediaUpdate->copyright_id;
|
|
|
|
|
|
// ---- Historique des actions (etiquette seulement)
|
|
if ($media->etiquette_id != $mediaUpdate->etiquette_id) {
|
|
$curEtiquette = Etiquette::where('etiquette_id', $media->etiquette_id)->first();
|
|
$newEtiquette = Etiquette::where('etiquette_id', $mediaUpdate->etiquette_id)->first();
|
|
$historique = new historique();
|
|
$historique->user_id = $user_id;
|
|
$historique->media_id = $media->id;
|
|
$historique->type = "Etiquette";
|
|
$historique->description = $curEtiquette->libelle . " -> " . $newEtiquette->libelle;
|
|
$historique->save();
|
|
$media->etiquette_id = $mediaUpdate->etiquette_id;
|
|
}
|
|
|
|
// Si lié à Arcadia on bloque le media en attente du retour
|
|
if ($media->arcadia_id !== null)
|
|
$media->isLocked = 1;
|
|
|
|
$media->save();
|
|
|
|
// MAJ des tags
|
|
$media->tags()->detach();
|
|
if (isset($mediaUpdate->tags)) {
|
|
foreach ($mediaUpdate->tags as $tag) {
|
|
$oTag = Tag::where('libelle', $tag['libelle'])->first();
|
|
if (!$oTag) {
|
|
$oTag = new Tag();
|
|
$oTag->libelle = $tag['libelle'];
|
|
$oTag->save();
|
|
}
|
|
$media->tags()->attach($oTag->id);
|
|
}
|
|
}
|
|
|
|
|
|
// ---- Les sociétés
|
|
$media->societes()->detach();
|
|
$sSocietes = $mediaUpdate->societes;
|
|
if (!empty($sSocietes)) {
|
|
foreach ($sSocietes as $societeId) {
|
|
$media->societes()->attach($societeId['id']);
|
|
}
|
|
}
|
|
|
|
// ---- Les marques
|
|
$media->marques()->detach();
|
|
$sMarques = $mediaUpdate->marques;
|
|
if (!empty($sMarques)) {
|
|
foreach ($sMarques as $marqueId) {
|
|
$media->marques()->attach($marqueId['codMarq']);
|
|
}
|
|
}
|
|
|
|
// ---- Les articles
|
|
$media->articles()->detach();
|
|
$sArticles = $mediaUpdate->articles;
|
|
if (!empty($sArticles)) {
|
|
foreach ($sArticles as $articleId) {
|
|
$media->articles()->attach($articleId['id']);
|
|
}
|
|
}
|
|
|
|
// ---- Index dans Elasticsearch
|
|
$id = $media->id;
|
|
$media = Media::find($id);
|
|
$media->removeFromIndex();
|
|
$media->addToIndex();
|
|
|
|
// Lien Arcadia
|
|
ArcadiaLink::update($media);
|
|
|
|
// ---- Historique des actions
|
|
$historique = new historique();
|
|
$historique->user_id = $user_id;
|
|
$historique->media_id = $media->id;
|
|
$historique->type = "Modification";
|
|
$historique->description = "Les informations du média ont été modifiées";
|
|
$historique->save();
|
|
|
|
}
|
|
|
|
$response = array('status' => true, 'sujet_id' => $media->sujet_id, 'datas' => $media);
|
|
return json_encode($response);
|
|
}
|
|
|
|
/**
|
|
* Duplique un média sans l'image
|
|
*/
|
|
|
|
public function duplicateMedia(Request $request)
|
|
{
|
|
Auth::user()->authorizeRoles([config('roles.const.ADMIN'), config('roles.const.REDACTEUR'), config('roles.const.CONTRIBUTEUR')]);
|
|
$media_id = $request->input('media_id');
|
|
|
|
$media = Media::where('id', $media_id)->first();
|
|
if ($media){
|
|
if ($media->isLocked === 1){
|
|
return json_encode(array('status' => false, 'error' => "Le média est en attente d'un retour d'Arcadia."));
|
|
}
|
|
|
|
$n = $media->replicate();
|
|
$n->push();
|
|
|
|
foreach ($media->articles as $article) {
|
|
$n->articles()->attach($article);
|
|
}
|
|
|
|
foreach ($media->marques as $marque) {
|
|
$n->marques()->attach($marque);
|
|
}
|
|
|
|
foreach ($media->societes as $societe) {
|
|
$n->societes()->attach($societe);
|
|
}
|
|
|
|
foreach ($media->tags as $tag) {
|
|
$n->tags()->attach($tag);
|
|
}
|
|
|
|
$destinationPath = $this->get_mediaFolder() . "/";
|
|
$uid = sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x', mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0x0fff) | 0x4000, mt_rand(0, 0x3fff) | 0x8000, mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff));
|
|
$filename = $uid . ".jpg";
|
|
Storage::copy("images/default.jpg", $destinationPath . $filename);
|
|
|
|
$n->arcadia_id = NULL;
|
|
$n->libelle = (strlen($n->libelle) + 5) >= 50 ? substr($n->libelle, 0, -((strlen($n->libelle) - 50) + 5)) . '_copy' : $n->libelle . '_copy';
|
|
$n->folder = $destinationPath;
|
|
$n->uid = $uid;
|
|
$n->extension = 'jpg';
|
|
$n->taille = $this->formatBytes($this->get_file_size($destinationPath . $filename));
|
|
|
|
$im = new \imagick($destinationPath . $filename);
|
|
//pour dev sous windows (pour cause de bug sur imagick avec les chemins relatifs)
|
|
//$im = new \imagick(realpath($destinationPath.$filename));
|
|
$resolutions = $im->getImageResolution();
|
|
$n->resolution = round($resolutions['x'] * 2.54, 2);
|
|
$imageprops = $im->getImageGeometry();
|
|
$n->largeur = $imageprops['width'];
|
|
$n->hauteur = $imageprops['height'];
|
|
$n->largeur_mm = ceil(($n->largeur * 2.54 / $n->resolution) * 10);
|
|
$n->hauteur_mm = ceil(($n->hauteur * 2.54 / $n->resolution) * 10);
|
|
|
|
$n->duree = '';
|
|
$n->version = 1;
|
|
$n->isDefault = 1;
|
|
$n->statut = 0;
|
|
$n->created_at = NOW();
|
|
$n->updated_at = NOW();
|
|
$n->created_by = Auth::user()->id;
|
|
$n->save();
|
|
|
|
// ---- Creation des vignettes de base
|
|
$this->create_sys_thumb($n);
|
|
// ---- Creation des vignettes en lien avec le sujet du média
|
|
$this->create_thumb($n);
|
|
|
|
$media = Media::find($n->id);
|
|
$media->addToIndex();
|
|
|
|
return json_encode(array('status' => true, 'sujet_id' => $media->sujet_id, 'datas' => $media));
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Sauvegarde toutes les informations d'un média
|
|
*
|
|
*/
|
|
public function applySticker(Request $request)
|
|
{
|
|
Auth::user()->authorizeRoles([config('roles.const.ADMIN'), config('roles.const.REDACTEUR'), config('roles.const.CONTRIBUTEUR')]);
|
|
$medias = $request->input('medias');
|
|
$etiquette_id = $request->input('etiquette_id');
|
|
$user_id = Auth::user()->id;
|
|
|
|
$etiquette = Etiquette::where('etiquette_id', $etiquette_id)->first();
|
|
$response = $etiquette;
|
|
if ($etiquette) {
|
|
foreach ($medias as $item) {
|
|
$media_id = $item['id'];
|
|
$media = Media::where('id', $media_id)->first();
|
|
if ($media) {
|
|
// ---- Historique des actions
|
|
$curEtiquette = Etiquette::where('etiquette_id', $media->etiquette_id)->first();
|
|
$historique = new historique();
|
|
$historique->user_id = $user_id;
|
|
$historique->media_id = $media->id;
|
|
$historique->type = "Etiquette";
|
|
$historique->description = $curEtiquette->libelle . " -> " . $etiquette->libelle;
|
|
$historique->save();
|
|
|
|
// ---- Sauvegarde de la nouvelle étiquette
|
|
$media->etiquette_id = $etiquette_id;
|
|
$media->save();
|
|
|
|
// ---- Index dans Elasticsearch
|
|
$id = $media->id;
|
|
$media = Media::find($id);
|
|
$media->removeFromIndex();
|
|
$media->addToIndex();
|
|
|
|
// Lien Arcadia
|
|
ArcadiaLink::update($media);
|
|
}
|
|
}
|
|
}
|
|
return json_encode($response);
|
|
}
|
|
|
|
/**
|
|
* Vérification des clés pour liaison arcadia avant création, mise à jour
|
|
*
|
|
*/
|
|
public function checkRefKey(Request $request)
|
|
{
|
|
Auth::user()->authorizeRoles([config('roles.const.ADMIN')]);
|
|
$media_id = $request->input('media_id');
|
|
$media = Media::find($media_id);
|
|
//il faut check les dimensions de l'image
|
|
//pour les cas sujet, type vue, type media qui nous interesse
|
|
$code_sujet = $media->sujet_id;
|
|
$type_vue = $media->typevue_id;
|
|
$type_media = $media->typemedia_id;
|
|
$extension = $media->extension;
|
|
$largeur = $media->largeur;
|
|
$hauteur = $media->hauteur;
|
|
|
|
//si on est sur un sujet arcadia (donc pas le sujet Groupe)
|
|
if ($media->sujet->sujet_arcadia) {
|
|
//le check est requis
|
|
$doCheck = true;
|
|
//cas d'exclusion BAT
|
|
if ($type_vue == 19) {
|
|
$doCheck = false;
|
|
}
|
|
if ($type_media == 6) {
|
|
$doCheck = false;
|
|
}
|
|
}
|
|
if ($doCheck) {
|
|
if ($extension == 'png') {
|
|
if ($largeur == 1800) {
|
|
if ($hauteur == 1800) {
|
|
//ok
|
|
} else {
|
|
//fail hauteur
|
|
return json_encode(array('status' => false, 'error' => "Les dimensions requises sont 1800px par 1800px, veuillez charger un autre média"));
|
|
}
|
|
} else {
|
|
//fail largeur
|
|
return json_encode(array('status' => false, 'error' => "Les dimensions requises sont 1800px par 1800px, veuillez charger un autre média"));
|
|
}
|
|
} else {
|
|
//fail type de fichier
|
|
return json_encode(array('status' => false, 'error' => "Le type de fichier doit être PNG, veuillez charger un autre média"));
|
|
}
|
|
}
|
|
|
|
if ($media) {
|
|
$refs = ArcadiaLink::getRefKey($media);
|
|
if (count($refs) > 0){
|
|
return 'true';
|
|
}else{
|
|
return 'false';
|
|
}
|
|
}
|
|
return 'false';
|
|
}
|
|
|
|
/**
|
|
* Applique un Id Arcadia à un média
|
|
*
|
|
*/
|
|
public function setIdArcdadia(Request $request)
|
|
{
|
|
Auth::user()->authorizeRoles([config('roles.const.ADMIN')]);
|
|
$response = false;
|
|
$media_id = $request->input('media_id');
|
|
|
|
$historique = new historique();
|
|
$historique->user_id = Auth::user()->id;
|
|
$historique->media_id = $media_id;
|
|
$historique->type = "Modification";
|
|
$historique->description = "Ajout de la liaison Arcadia";
|
|
|
|
$media = Media::where('id', $media_id)->first();
|
|
if ($media) {
|
|
$media->isLocked = 1;
|
|
$media->save();
|
|
|
|
// Lien Arcadia
|
|
ArcadiaLink::create($media);
|
|
|
|
// ---- Index dans Elasticsearch
|
|
$id = $media->id;
|
|
$media = Media::find($id);
|
|
$media->removeFromIndex();
|
|
$media->addToIndex();
|
|
|
|
$response = true;
|
|
$historique->save();
|
|
}
|
|
|
|
return json_encode($response);
|
|
}
|
|
|
|
/**
|
|
* Renvoie un article par ID Arcadia
|
|
*
|
|
*/
|
|
public function getArticle(Request $request)
|
|
{
|
|
if (!$user = Auth::user()) abort(401, 'Cette action n\'est pas autorisée.');
|
|
$response = array();
|
|
$arcadia_id = $request->input('arcadia_id');
|
|
|
|
$article = Article::where('noArt', $arcadia_id)->first();
|
|
if ($article) {
|
|
$response['article'] = $article;
|
|
} else {
|
|
$response = false;
|
|
}
|
|
return json_encode($response);
|
|
}
|
|
|
|
/**
|
|
* Téléchargement des médias
|
|
*
|
|
*/
|
|
public function downloadMedia(Request $request)
|
|
{
|
|
if (!$user = Auth::user()) abort(404, 'Erreur lors du téléchargement');
|
|
$deleteFileAfterSend = false;
|
|
// obtention du format
|
|
$formatId = $request->input('format');
|
|
|
|
if ($formatId != "original") {
|
|
$format = Format::withoutGlobalScope('App\Scopes\SystemScope')->where('id', $formatId)->first();
|
|
if (!$format) abort(404, 'Erreur lors du téléchargement');
|
|
} else {
|
|
$format = "original";
|
|
}
|
|
|
|
$mediasId = $request->input('medias');
|
|
$medias = explode(",", $mediasId);
|
|
if (sizeof($medias) == 1) {
|
|
$media = Media::where('id', $mediasId)->first();
|
|
if ($media) {
|
|
if ($format === 'original') {
|
|
$fp = public_path() . '/' . $media->folder . $media->uid . '.' . $media->extension;
|
|
}else{
|
|
$fp = $this->get_mediaPath($media, $format);
|
|
}
|
|
|
|
if (!file_exists($fp))
|
|
abort(404, 'Fichier inconnu.');
|
|
|
|
if ($format === 'original') {
|
|
return response()->download($fp, str_replace(' ', '_', $media->libelle)."_original_". $media->largeur ."x". $media->hauteur ."px.".pathinfo($fp, PATHINFO_EXTENSION))->deleteFileAfterSend($deleteFileAfterSend);
|
|
}else{
|
|
return response()->download($fp, str_replace(' ', '_', $media->libelle)."_". $format->libelle ."_". $format->largeur ."x". $format->hauteur ."px.".pathinfo($fp, PATHINFO_EXTENSION))->deleteFileAfterSend($deleteFileAfterSend);
|
|
}
|
|
}
|
|
} else {
|
|
// create zip archive
|
|
$zip_file = public_path() . '/uploads/DAM_' . uniqid() . '_' . date("Ymd") . '.zip';
|
|
$zip = new \ZipArchive();
|
|
$zip->open($zip_file, \ZipArchive::CREATE | \ZipArchive::OVERWRITE);
|
|
|
|
// add file to archive
|
|
foreach ($medias as $mediaId) {
|
|
$media = Media::where('id', $mediaId)->first();
|
|
if ($media) {
|
|
|
|
if ($format === 'original') {
|
|
$fp = public_path() . '/' . $media->folder . $media->uid . '.' . $media->extension;
|
|
}else{
|
|
$fp = $this->get_mediaPath($media, $format);
|
|
}
|
|
if (!file_exists($fp)) {
|
|
$zip->close();
|
|
unlink($zip_file);
|
|
abort(404, 'Fichier(s) inconnu(s).');
|
|
}
|
|
|
|
if ($format === 'original') {
|
|
$zip->addFile($fp, str_replace(' ', '_', $media->libelle)."_original_". $media->largeur ."x". $media->hauteur ."px.".pathinfo($fp, PATHINFO_EXTENSION));
|
|
}else{
|
|
$zip->addFile($fp, str_replace(' ', '_', $media->libelle)."_". $format->libelle ."_". $format->largeur ."x". $format->hauteur ."px.".pathinfo($fp, PATHINFO_EXTENSION));
|
|
}
|
|
}
|
|
}
|
|
$deleteFileAfterSend = true;
|
|
$zip->close();
|
|
$fp = $zip_file;
|
|
return response()->download($fp)->deleteFileAfterSend($deleteFileAfterSend);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
* Renvoie les infos complémentaires d'un média
|
|
*
|
|
*/
|
|
public function getMediaOtherInfos(Request $request)
|
|
{
|
|
$media_id = $request->input('media_id');
|
|
if (!$user = Auth::user()) abort(401, 'Cette action n\'est pas autorisée.');
|
|
$media = Media::find($media_id);
|
|
if(!$media)
|
|
abort('404', "Ce média n'existe pas.");
|
|
$response = array();
|
|
$history = Historique::where('media_id', $media_id)->with('user')->orderBy("created_date", "DESC")->get();
|
|
$response['history'] = $history;
|
|
$response['vignettes'] = $this->getVignettesByMedia($media);
|
|
return json_encode($response);
|
|
}
|
|
|
|
private function getVignettesByMedia($media)
|
|
{
|
|
$vignettes = [];
|
|
|
|
$vignettes['original'] = [
|
|
'url' => config('app.url') . "/" . $media->folder . $media->uid . "." . $media->extension,
|
|
'extension' => $media->extension,
|
|
'largeur' => $media->largeur,
|
|
'hauteur' => $media->hauteur
|
|
];
|
|
|
|
if(in_array($media->extension, array("pdf", "ai", "psd")) ){
|
|
$sys_extension = "png";
|
|
}else{
|
|
$sys_extension = $media->extension;
|
|
}
|
|
|
|
$vignettes['preview'] = [
|
|
'url' => config('app.url') . "/" . $media->folder . $media->uid . "_preview" . "." . $sys_extension,
|
|
'extension' => $sys_extension,
|
|
'largeur' => '1800',
|
|
'hauteur' => '1800'
|
|
];
|
|
$vignettes['thumb'] = [
|
|
'url' => config('app.url') . "/" . $media->folder . $media->uid . "_thumb" . "." . $sys_extension,
|
|
'extension' => $sys_extension,
|
|
'largeur' => '200',
|
|
'hauteur' => '200'
|
|
];
|
|
|
|
$formats = $media->sujet->formats;
|
|
foreach ($formats as $format)
|
|
$vignettes[$format->libelle] = [
|
|
'url' => config('app.url') . "/" . $media->folder . $media->uid . "_" . $format->libelle . "." . $format->extension,
|
|
'extension' => $format->extension,
|
|
'largeur' => $format->largeur,
|
|
'hauteur' => $format->hauteur
|
|
];
|
|
return $vignettes;
|
|
}
|
|
}
|