ldc-dam/app/Http/Controllers/MediaController.php

483 lines
14 KiB
PHP
Raw Normal View History

2019-05-22 17:10:16 +02:00
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\Auth;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
2019-05-22 17:10:16 +02:00
use App\Sujet;
use App\Format;
2019-05-23 15:09:28 +02:00
use App\Media;
2019-06-17 09:22:10 +02:00
use App\Typemedia;
use App\Langue;
use App\Copyright;
use App\Etiquette;
use App\Site;
use App\Marque;
use App\Dossier;
use App\Tag;
use App\Article;
use App\Http\Traits\MediaTools;
2019-05-22 17:10:16 +02:00
class MediaController extends Controller
{
use MediaTools;
2019-05-22 17:10:16 +02:00
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
2019-06-17 09:22:10 +02:00
$sujets = Auth::user()->sujets;
$typemedias = Typemedia::all();
$langues = Langue::all();
$copyrights = Copyright::all();
$etiquettes = Etiquette::all();
$sites = Site::orderBy('libelle')->get();
$marques = Marque::all();
2019-06-17 09:22:10 +02:00
return view('media_manager')->with([
'sujets'=> $sujets,
'typemedias'=> $typemedias,
'langues'=> $langues,
'copyrights'=> $copyrights,
'etiquettes'=> $etiquettes,
'sites'=> $sites,
'marques'=> $marques
2019-06-17 09:22:10 +02:00
]);
2019-05-22 17:10:16 +02:00
}
2019-05-23 15:09:28 +02:00
/**
* Chargement des médias
*
*/
public function loadMedia(Request $request)
{
$response = array();
$userId = Auth::user()->id;
2019-05-23 15:09:28 +02:00
$dossier_id = $request->input('dossier_id');
$sujet_id = $request->input('sujet_id');
$filters = json_decode($request->input('filters'));
2019-05-23 15:09:28 +02:00
$offset = $request->input('offset');
$limit = $request->input('limit');
$orderField = $request->input('orderField');
$order = $request->input('order');
$isDepot = 0;
2019-05-23 15:09:28 +02:00
if($dossier_id == "0"){ // dossier racine
$query= Media::where('sujet_id', $sujet_id)
->whereNull('dossier_id');
}elseif($dossier_id == "-1"){
$query = Media::where('sujet_id', $sujet_id)
->where(function ($query) use ( $userId ) {
$query->where('statut', '<>', 0)
->orWhere('created_by', $userId);
});
2019-05-23 15:09:28 +02:00
}else{
$dossier= Dossier::where('id', $dossier_id)->first();
if($dossier->parent_id != 1 && $dossier->id != 1){ // dossier classic
$query = Media::where('sujet_id', $sujet_id)
->where('dossier_id', $dossier_id)
->where(function ($query) use ( $userId ) {
$query->where('statut', '<>', 0)
->orWhere('created_by', $userId);
});
}else{ // dossier dépôt
$isDepot = 1;
$query= Media::where('dossier_id', $dossier_id);
}
}
// Filtre recherche texte
if(property_exists($filters, 'search')){
$search = strtolower(trim($filters->search->value));
$query->where(function ($query) use ( $search ) {
$query->whereRaw("LCASE(libelle) LIKE '%".$search."%'")
->orWhere('arcadia_id', $search)
->orWhereHas("articles", function($query) use ($search){
$query->where("noArt", $search)
->orWhereRaw("LCASE(libCcial) LIKE '%".$search."%'")
->orWhereRaw("LCASE(libMarq) LIKE '%".$search."%'")
->orWhereRaw("LCASE(libFamVte) LIKE '%".$search."%'")
->orWhere('codGencodAdm', $search)
->orWhere('codGencodSymb', $search)
->orWhere('codGencodPds', $search);
})
->orWhereHas("tags", function($query) use ($search){
$query->WhereRaw("LCASE(libelle) LIKE '%".$search."%'");
});
});
2019-06-17 09:22:10 +02:00
}
// Filtre type de média
if(property_exists($filters, 'typemedia_id')){
$query->whereIn('typemedia_id', $filters->typemedia_id->value);
}
// Filtre type de vue
if(property_exists($filters, 'typevue_id')){
$query->whereIn('typevue_id', $filters->typevue_id->value);
}
// Filtre liason avec Arcadia
if(property_exists($filters, 'arcadia_id')){
$query->whereNotNull('arcadia_id' );
}
// Filtre etiquette
if(property_exists($filters, 'etiquette_id')){
$query->whereIn('etiquette_id', $filters->etiquette_id->value);
}
$query->with('Etiquette')
->offset($offset)
->limit($limit)
->orderBy($orderField, $order);
$response['data'] = $query->get();
2019-06-17 09:22:10 +02:00
if(Auth::user()->hasRole([config('roles.const.ADMIN'), config('roles.const.REDACTEUR')] )){
$response['draggable'] = true;
}else{
$response['draggable'] = false;
2019-05-23 15:09:28 +02:00
}
$response['role'] = Auth::user()->role;
$response['isDepot'] = $isDepot;
2019-05-23 15:09:28 +02:00
return json_encode($response);
}
/**
* Déplacement des médias
*
*/
public function moveMedia(Request $request)
{
2019-06-17 09:22:10 +02:00
Auth::user()->authorizeRoles([config('roles.const.ADMIN'), config('roles.const.REDACTEUR')]);
2019-05-23 15:09:28 +02:00
$response = array();
$dossier_id = $request->input('dossier_id');
$data = $request->input('data');
$sujet_id = $request->input('sujet_id');
2019-05-23 15:09:28 +02:00
$data = explode(",", $data);
foreach ($data as $key => $media_id) {
$media = Media::where('id', $media_id)->first();
if($media){
$media->sujet_id = $sujet_id;
2019-05-23 15:09:28 +02:00
if($dossier_id > 0){
$media->dossier_id = $dossier_id;
}else{
$media->dossier_id = null;
}
$media->save();
}
}
return json_encode(true);
}
2019-05-22 17:10:16 +02:00
2019-06-17 09:22:10 +02:00
/**
* supprimer des médias
*
*/
public function removeMedia(Request $request)
{
$deletedMediasList = array();
2019-06-17 09:22:10 +02:00
Auth::user()->authorizeRoles([config('roles.const.ADMIN'), config('roles.const.REDACTEUR')]);
$deleteMedias = $request->input('medias');
2019-06-17 09:22:10 +02:00
$medias = Media::whereIn('id', $deleteMedias)->whereNull('arcadia_id')->get();
foreach ($medias as $media) {
$deletedMediasList[] = $media->id;
$media->delete();
}
return json_encode($deletedMediasList);
2019-06-17 09:22:10 +02:00
}
/**
* Obtenir toutes les informations d'un média
*
*/
public function getOneMedia(Request $request)
{
$host = $request->getSchemeAndHttpHost();
2019-06-17 09:22:10 +02:00
$response = array();
$media_id = $request->input('media_id');
$media = Media::where('id', $media_id)->with('sujet')->with('sites')->with('marques')->with('articles')->with('tags:libelle')->first();
2019-06-17 09:22:10 +02:00
if($media){
// stock le média
2019-06-17 09:22:10 +02:00
$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;
}
2019-06-17 09:22:10 +02:00
}
2019-06-17 09:22:10 +02:00
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')]);
$response = array();
$mediaUpdate = (object) $request->input('media');
$media = Media::where('id', $mediaUpdate->id)->first();
if($media){
$media->libelle = $mediaUpdate->libelle;
$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;
if( ($mediaUpdate->statut == config('services.statut.public') || $mediaUpdate->statut == config('services.statut.public_etendue')) && $media->statut == config('services.statut.brouillon')){
$media->published_at = date("Y-m-d H:i:s");
}
$media->statut = $mediaUpdate->statut;
$media->copyright_id = $mediaUpdate->copyright_id;
$media->etiquette_id = $mediaUpdate->etiquette_id;
$media->save();
// MAJ des tags
$media->tags()->detach();
if(isset($mediaUpdate->tags)){
foreach($mediaUpdate->tags as $tag){
$oTag = Tag::where('libelle', $tag)->first();
if(!$oTag){
$oTag = new Tag();
$oTag->libelle = $tag;
$oTag->save();
}
$media->tags()->attach($oTag->id);
}
}
// ---- Les sites
$media->sites()->detach();
$sSites = $mediaUpdate->sites;
if($sSites != ""){
$sites = explode(",", $sSites);
foreach($sites as $siteId){
$media->sites()->attach($siteId);
}
}
// ---- Les marques
$media->marques()->detach();
$sMarques = $mediaUpdate->marques;
if($sMarques != ""){
$marques = explode(",", $sMarques);
foreach($marques as $marqueId){
$media->marques()->attach($marqueId);
}
}
// ---- Les articles
$media->articles()->detach();
$sArticles = $mediaUpdate->articles;
if($sArticles){
$articles = explode(",", $sArticles);
foreach($articles as $articleId){
$media->articles()->attach($articleId);
}
}
}
$response = true;
return json_encode($response);
}
/**
* 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')]);
$response = array();
$medias = $request->input('medias');
$etiquette_id = $request->input('etiquette_id');
$etiquette = Etiquette::where('etiquette_id', $etiquette_id)->first();
$response = $etiquette;
if($etiquette){
foreach ($medias as $media_id) {
$media = Media::where('id', $media_id)->first();
if($media){
$media->etiquette_id = $etiquette_id;
$media->save();
}
}
}
return json_encode($response);
}
/**
* Sauvegarde une retouche photo
*
*/
public function editPhoto(Request $request)
{
Auth::user()->authorizeRoles([config('roles.const.ADMIN'), config('roles.const.REDACTEUR'), config('roles.const.CONTRIBUTEUR')]);
$response = array();
$media_id = $request->input('media_id');
$image = $request->input('image');
preg_match("/data:image\/(.*?);/",$image,$image_extension); // extract the image extension
$image = preg_replace('/data:image\/(.*?);base64,/','',$image); // remove the type part
$image = str_replace(' ', '+', $image);
$media = Media::where('id', $media_id)->first();
if($media){
$mediaPath = $media->folder.$media->uid.".".$media->extension;
Storage::put($mediaPath, base64_decode($image));
$im = new \imagick($mediaPath);
$imageprops = $im->getImageGeometry();
$media->largeur = $imageprops['width'];
$media->hauteur = $imageprops['height'];
$resolutions = $im->getImageResolution();
$im->destroy();
$media->resolution = $resolutions['x'];
if($media->resolution != 0){
$media->largeur_mm = ceil(($media->largeur * 2.54 / $media->resolution)*10);
$media->hauteur_mm = ceil(($media->hauteur * 2.54 / $media->resolution)*10);
}else{
$media->largeur_mm = "";
$media->hauteur_mm = "";
}
$media->taille = $this->formatBytes($this->get_file_size($mediaPath));
$media->save();
// Regénération des miniatures de base
$this->create_sys_thumb($media);
// ---- Creation des vignettes en lien avec le sujet du média
$this->create_thumb($media);
$response = $media;
}
return json_encode($response);
}
/**
* 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');
$arcadia_id = $request->input('arcadia_id');
if($arcadia_id == "" || $arcadia_id == 0){
$arcadia_id = NULL;
}else{
$media = Media::where('arcadia_id', $arcadia_id)->first();
if($media) return json_encode($response);
}
$media = Media::where('id', $media_id)->first();
if($media){
$media->arcadia_id = $arcadia_id;
$media->save();
$response = true;
}
return json_encode($response);
}
/**
* Renvoie un article par ID Arcadia
*
*/
public function getArticle(Request $request)
{
$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);
}
/**
* Renvoie un article par ID Arcadia
*
*/
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 != 0){
$format = Format::withoutGlobalScope('App\Scopes\SystemScope')->where('id', $formatId)->first();
if(!$format) abort(404, 'Erreur lors du téléchargement');
}else{
$format = "";
}
$mediasId = $request->input('medias');
$medias = explode(",", $mediasId);
if(sizeof($medias) == 1){
$media = Media::where('id', $mediasId)->first();
if($media){
$fp = $this->get_mediaPath($media, $format);
}
}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){
$fp = $this->get_mediaPath($media, $format);
$zip->addFile($fp, basename($fp));
}
}
$deleteFileAfterSend = true;
$zip->close();
$fp = $zip_file;
}
return response()->download($fp)->deleteFileAfterSend($deleteFileAfterSend);
}
2019-05-22 17:10:16 +02:00
}