Merge branch 'multiple-fixes' into 'develop'
Issues 6,7,8,9,10,12,13 See merge request ldc-web/projets/dam!4
This commit is contained in:
commit
e0870d362e
28 changed files with 2788 additions and 12780 deletions
4
.gitignore
vendored
4
.gitignore
vendored
|
|
@ -25,7 +25,7 @@ public/uploads/*
|
|||
|
||||
/storage/*.key
|
||||
/vendor
|
||||
.env
|
||||
.env*
|
||||
.phpunit.result.cache
|
||||
Homestead.json
|
||||
Homestead.yaml
|
||||
|
|
@ -34,4 +34,4 @@ yarn-error.log
|
|||
/.idea
|
||||
/.vscode
|
||||
*.sqlite*
|
||||
auth.json
|
||||
auth.json
|
||||
|
|
|
|||
4
.gitmodules
vendored
4
.gitmodules
vendored
|
|
@ -1,3 +1,3 @@
|
|||
[submodule "clients/Api"]
|
||||
path = clients/Api
|
||||
url = git@gitlab.com:service-web-lab/dam-client.git
|
||||
path = clients/Api
|
||||
url = ../dam-client.git
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Models\ArcadiaLink;
|
||||
use Illuminate\Support\Carbon;
|
||||
use Illuminate\Contracts\Database\Eloquent\Builder;
|
||||
|
||||
class ArcadiaLinkController extends Controller
|
||||
{
|
||||
|
|
@ -17,9 +17,14 @@ class ArcadiaLinkController extends Controller
|
|||
/** @var \App\Models\User */
|
||||
$user = auth()->user();
|
||||
$user->authorizeRoles(config('roles.const.ADMIN'));
|
||||
$dt = Carbon::now('Europe/Paris')->subMinutes(15)->toDateTimeString();
|
||||
$ano = ArcadiaLink::where('created_at', '<', $dt)->orderBy('id', 'DESC')->get();
|
||||
return view('arcadialinks.index', ['ano' => $ano]);
|
||||
|
||||
// * ArcadiaLink->Media is nullable
|
||||
$arcadiaLinkList = ArcadiaLink::query()
|
||||
->with('media', fn (Builder $q) => $q->withTrashed())
|
||||
->where('created_at', '<', now()->subMinutes(15))
|
||||
->orderBy('id', 'DESC')->get();
|
||||
|
||||
return view('arcadialinks.index', compact('arcadiaLinkList'));
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -15,9 +15,11 @@ use App\Models\Marque;
|
|||
use App\Models\Media;
|
||||
use App\Models\Variante;
|
||||
use App\Models\Format;
|
||||
use Illuminate\Contracts\Database\Eloquent\Builder;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\RedirectResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Arr;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
|
|
@ -38,51 +40,64 @@ class DossierController extends Controller
|
|||
$select = ['id', 'libelle', 'system'];
|
||||
|
||||
/** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Dossier> Dossiers publiques */
|
||||
$publicFolders = Dossier::whereHas('sujet', function ($q) use ($request) {
|
||||
$q->where('codeSujet', $request->sujet_id);
|
||||
})->whereIsPrivate(false)->whereNull('parent_id')->select($select)->get();
|
||||
$publicFolders = Dossier::query()
|
||||
->whereHas('sujet', fn (Builder $q) => $q->where('codeSujet', $request->input('sujet_id')))
|
||||
->where('is_private', false)
|
||||
->whereDoesntHave('dossierParent')
|
||||
->select($select)->get();
|
||||
|
||||
|
||||
// On récupère les dossiers privés.
|
||||
// * On récupère les dossiers privés.
|
||||
/** @var \Illuminate\Database\Eloquent\Builder */
|
||||
$privateQuery = Dossier::whereHas('sujet', function ($q) use ($request) {
|
||||
$q->where('codeSujet', $request->sujet_id);
|
||||
})->select($select)->whereIsPrivate(true);
|
||||
$privateQuery = Dossier::query()
|
||||
->whereHas('sujet', fn (Builder $q) => $q->where('codeSujet', $request->input('sujet_id')))
|
||||
->where('is_private', true)
|
||||
->select($select);
|
||||
|
||||
// If not admin, get using brands.
|
||||
// ? Is admin ?
|
||||
if (!$user->hasRole(config('roles.const.ADMIN'))) {
|
||||
// * If not admin, get using brands.
|
||||
/** @var \Illuminate\Database\Eloquent\Collection<integer> Codes marques */
|
||||
$marques = $user->marques()->pluck('codMarq');
|
||||
$privateQuery->whereHas('marques', function ($q) use ($marques) {
|
||||
$q->whereIn('codMarq', $marques);
|
||||
});
|
||||
$privateQuery->whereHas('marques', fn (Builder $q) => $q->whereIn('codMarq', $marques));
|
||||
}
|
||||
|
||||
/** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Dossier> Dossiers privés */
|
||||
$privateFolders = $privateQuery->get();
|
||||
|
||||
$foldersCollection = $publicFolders->merge($privateFolders);
|
||||
$foldersCollection = $foldersCollection->sortBy('libelle', SORT_NATURAL | SORT_FLAG_CASE)
|
||||
$foldersCollection = $foldersCollection
|
||||
->sortBy('libelle', SORT_NATURAL | SORT_FLAG_CASE)
|
||||
->sortBy('favoris')->values();
|
||||
|
||||
// Ajout du dépôt de fichier pour les admin.
|
||||
// ? Is admin ?
|
||||
if ($user->hasRole(config('roles.const.ADMIN'))) {
|
||||
// * Ajout du dépôt de fichier pour les admin.
|
||||
/** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Dossier> Dossiers depots */
|
||||
$depotQuery = Dossier::whereNull('parent_id')
|
||||
$depotQuery = Dossier::query()
|
||||
->whereDoesntHave('dossierParent')
|
||||
->where('system', true)
|
||||
->orderBy('libelle', 'ASC')
|
||||
->get();
|
||||
$foldersCollection = $foldersCollection->merge($depotQuery);
|
||||
}
|
||||
|
||||
$folders['data'] = new NestedDossiersListResource($foldersCollection);
|
||||
$folders['racineCount'] = Media::whereSujetId($request->sujet_id)
|
||||
->whereNull('dossier_id')
|
||||
->where(function ($query) use ($user) {
|
||||
$query->where('statut', MediaStatut::public_etendu)
|
||||
Arr::set($folders, 'data', new NestedDossiersListResource($foldersCollection));
|
||||
|
||||
// * Racine Count
|
||||
$racineCountQuery = Media::query()
|
||||
->whereHas('sujet', fn (Builder $q) => $q->where('codeSujet', $request->input('sujet_id')))
|
||||
->whereDoesntHave('dossier');
|
||||
// ? Is not admin ?
|
||||
if (!$user->hasRole(config('roles.const.ADMIN'))) {
|
||||
$racineCountQuery->where(
|
||||
fn (Builder $q) =>
|
||||
$q->where('statut', MediaStatut::public_etendu)
|
||||
->orWhere('statut', MediaStatut::public)
|
||||
->orWhere('created_by', $user->id);
|
||||
})->count();
|
||||
->orWhere('created_by', $user->id)
|
||||
);
|
||||
}
|
||||
Arr::set($folders, 'racineCount', $racineCountQuery->count());
|
||||
|
||||
return response()->json($folders);
|
||||
}
|
||||
|
|
@ -99,13 +114,16 @@ class DossierController extends Controller
|
|||
$user = auth()->user();
|
||||
|
||||
$response = [];
|
||||
$response['variantes'] = Variante::where('sujet_id', $request->sujetId)->get();
|
||||
$response['variantes'] = Variante::query()
|
||||
->whereHas('sujet', fn (Builder $q) => $q->where('codeSujet', $request->input('sujetId')))
|
||||
->get();
|
||||
/** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Format> */
|
||||
$FormatsSujet = Format::whereHas('sujets', function ($query) use ($request) {
|
||||
$query->where('sujet_id', $request->sujetId);
|
||||
})->get();
|
||||
$FormatsSujet = Format::query()
|
||||
->whereHas('sujets', fn (Builder $q) => $q->where('sujet_id', $request->input('sujetId')))
|
||||
->get();
|
||||
/** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Format> */
|
||||
$FormatsSystem = Format::withoutGlobalScope('App\Scopes\SystemScope')
|
||||
$FormatsSystem = Format::query()
|
||||
->withoutGlobalScope('App\Scopes\SystemScope')
|
||||
->where('system', true)->get();
|
||||
$response['formats'] = $FormatsSujet->merge($FormatsSystem);
|
||||
|
||||
|
|
@ -131,14 +149,15 @@ class DossierController extends Controller
|
|||
$user->authorizeRoles(config('roles.const.ADMIN'));
|
||||
|
||||
/** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Dossier> */
|
||||
$dossiers = Dossier::whereNull('parent_id')
|
||||
->where('system', false)
|
||||
$dossiers = Dossier::query()
|
||||
->whereDoesntHave('dossierParent')
|
||||
->where('system', false)
|
||||
->orderBy('libelle', 'asc')
|
||||
->get();
|
||||
/** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Sujet> */
|
||||
$sujets = Sujet::where('sujet_dam', true)->get();
|
||||
$sujets = Sujet::query()->where('sujet_dam', true)->get();
|
||||
|
||||
return view('dossiers.index')->with([
|
||||
return view('dossiers.index', [
|
||||
'dossiers' => $dossiers,
|
||||
'sujets' => $sujets,
|
||||
]);
|
||||
|
|
@ -154,9 +173,13 @@ class DossierController extends Controller
|
|||
{
|
||||
if ($request->sub) {
|
||||
/** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Dossier> */
|
||||
$dossiers = Dossier::whereNull('parent_id')->where('system', false)
|
||||
$dossiers = Dossier::query()
|
||||
->whereDoesntHave('dossierParent')
|
||||
->where('system', false)
|
||||
->orderBy('libelle', 'asc')->get();
|
||||
return view('dossiers.create-sub')->with(['dossiers' => $dossiers]);
|
||||
return view('dossiers.create-sub', [
|
||||
'dossiers' => $dossiers
|
||||
]);
|
||||
}
|
||||
|
||||
/** @var \App\Models\User */
|
||||
|
|
@ -166,10 +189,11 @@ class DossierController extends Controller
|
|||
$marques = Marque::all();
|
||||
|
||||
/** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Sujet> */
|
||||
$sujets = Sujet::where('sujet_dam', true)->get();
|
||||
$sujets = Sujet::query()->where('sujet_dam', true)->get();
|
||||
|
||||
return view('dossiers.create')->with([
|
||||
'marques' => $marques, 'sujets' => $sujets
|
||||
'marques' => $marques,
|
||||
'sujets' => $sujets
|
||||
]);
|
||||
}
|
||||
|
||||
|
|
@ -192,19 +216,19 @@ class DossierController extends Controller
|
|||
|
||||
if ($request->sub) {
|
||||
/** @var \App\Models\Dossier */
|
||||
$parent_dossier = Dossier::findOrFail($request->parent_id);
|
||||
$parent_dossier = Dossier::query()->findOrFail($request->input('parent_id'));
|
||||
$dossier->sujet()->associate($parent_dossier->sujet);
|
||||
} else {
|
||||
$dossier->sujet()->associate($request->sujet);
|
||||
$dossier->sujet()->associate($request->input('sujet'));
|
||||
}
|
||||
|
||||
if ($dossier->saveOrFail()) {
|
||||
// ---- Les marques
|
||||
if ($request->marques) {
|
||||
$dossier->marques()->sync($request->marques);
|
||||
if ($request->input('marques')) {
|
||||
$dossier->marques()->sync($request->input('marques'));
|
||||
}
|
||||
return redirect()->route('dossier.edit', ['dossier' => $dossier])
|
||||
->with('success', 'Le dossier a été enregistré');
|
||||
->with('success', 'Le dossier a été enregistré');
|
||||
}
|
||||
});
|
||||
return back();
|
||||
|
|
@ -228,9 +252,9 @@ class DossierController extends Controller
|
|||
/** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Sujet> */
|
||||
$dossierSujets = $dossier->sujets;
|
||||
/** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Sujet> */
|
||||
$sujets = Sujet::where('sujet_dam', true)->get();
|
||||
$sujets = Sujet::query()->where('sujet_dam', true)->get();
|
||||
|
||||
return view('dossiers.edit')->with([
|
||||
return view('dossiers.edit', [
|
||||
'dossier' => $dossier,
|
||||
'dossierMarques' => $dossierMarques,
|
||||
'marques' => $marques,
|
||||
|
|
@ -261,7 +285,7 @@ class DossierController extends Controller
|
|||
$dossier->marques()->sync($request->marques);
|
||||
}
|
||||
return redirect()->route('dossier.edit', ['dossier' => $dossier])
|
||||
->with('success', 'Le dossier a été mis à jour');
|
||||
->with('success', trans('Le dossier a été mis à jour'));
|
||||
}
|
||||
});
|
||||
return back();
|
||||
|
|
@ -280,7 +304,7 @@ class DossierController extends Controller
|
|||
$user->authorizeRoles(config('roles.const.ADMIN'));
|
||||
if ($dossier->deleteOrFail()) {
|
||||
return \response()->redirectToRoute('dossier.index')
|
||||
->with('warning', trans('Le dossier à été supprimé'));
|
||||
->with('warning', trans('Le dossier à été supprimé'));
|
||||
}
|
||||
return back();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -34,11 +34,12 @@ use App\Models\Sujet;
|
|||
use App\Models\Tag;
|
||||
use App\Models\TypeMedia;
|
||||
use App\Traits\Http\HandlesMedia;
|
||||
use Illuminate\Contracts\Database\Eloquent\Builder;
|
||||
use Illuminate\Database\Eloquent\ModelNotFoundException;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\RedirectResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\Support\Arr;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\File;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
|
|
@ -65,6 +66,8 @@ class MediaController extends Controller
|
|||
|
||||
/** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Sujet> */
|
||||
$sujets = $user->sujets;
|
||||
// ! Has to flush Media cache before querying basket with media list
|
||||
Media::flushQueryCache();
|
||||
/** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Panier> */
|
||||
$paniers = $user->paniersOwner;
|
||||
/** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Societe> */
|
||||
|
|
@ -156,12 +159,16 @@ class MediaController extends Controller
|
|||
$user = auth()->user();
|
||||
|
||||
/** @var \App\Models\Dossier|null */
|
||||
$dossier = Dossier::where('id', $request->folder)->first();
|
||||
$dossier = Dossier::query()
|
||||
->with('dossierParent')
|
||||
->where('id', $request->input('folder'))
|
||||
->first();
|
||||
|
||||
$response = [];
|
||||
$filters = (object)collect($request->filters)->all();
|
||||
$filters = (object)collect($request->input('filters'))->all();
|
||||
|
||||
$isDepot = ($dossier->parent_id ?? null) === 1 || ($dossier->id ?? null) === 1;
|
||||
/** @var boolean Est un dossier Dépot ? */
|
||||
$isDepot = !empty($dossier) && (\optional($dossier->dossierParent)->id === 1 || $dossier->id === 1);
|
||||
|
||||
/**
|
||||
* Elastic Search must conditions
|
||||
|
|
@ -205,7 +212,6 @@ class MediaController extends Controller
|
|||
$esMust,
|
||||
$esMustNot,
|
||||
$esShould,
|
||||
$esFilters,
|
||||
$request,
|
||||
$dossier,
|
||||
$sujet,
|
||||
|
|
@ -220,26 +226,30 @@ class MediaController extends Controller
|
|||
'bool.should' => $esShould,
|
||||
'bool.filter' => $esFilters,
|
||||
]);
|
||||
$sort = [[$orderField => ['order' => $order]]];
|
||||
|
||||
$sort = [[$orderField => ['order' => $order]]];
|
||||
|
||||
$response['data'] = Media::searchByQuery(
|
||||
Arr::set($response, 'data', Media::searchByQuery(
|
||||
$query,
|
||||
null,
|
||||
null,
|
||||
intval($request->post('limit', 50)),
|
||||
intval($request->post('offset', 0)),
|
||||
$sort
|
||||
));
|
||||
|
||||
Arr::set($response, 'draggable', $user->hasRole([
|
||||
config('roles.const.ADMIN'),
|
||||
config('roles.const.REDACTEUR')
|
||||
]));
|
||||
Arr::set($response, 'isDepot', $isDepot);
|
||||
Arr::set(
|
||||
$response,
|
||||
'isCAQuery',
|
||||
$searchText &&
|
||||
strpos($searchText, '=') !== false &&
|
||||
\strval(collect(explode('=', $searchText))->get(0)) === 'ca'
|
||||
);
|
||||
|
||||
$response['draggable'] = $user->hasRole([config('roles.const.ADMIN'), config('roles.const.REDACTEUR')]);
|
||||
$response['isDepot'] = $isDepot;
|
||||
|
||||
$response['isCAQuery'] = $searchText &&
|
||||
strpos($searchText, '=') !== false &&
|
||||
\strval(collect(explode('=', $searchText))->get(0)) === 'ca';
|
||||
|
||||
$response['role'] = $user->role;
|
||||
Arr::set($response, 'role', $user->role);
|
||||
|
||||
return \response()->json($response);
|
||||
}
|
||||
|
|
@ -428,93 +438,98 @@ 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->isDuplicate = true;
|
||||
|
||||
$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
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -747,15 +762,16 @@ class MediaController extends Controller
|
|||
*/
|
||||
public function getMediaOtherInfos(Media $media): JsonResponse
|
||||
{
|
||||
if (!($user = Auth::user())) {
|
||||
if (!auth()->check()) {
|
||||
abort(401, 'Cette action n\'est pas autorisée.');
|
||||
}
|
||||
|
||||
$history = Historique::whereHas('media', function ($q) use ($media) {
|
||||
$q->whereId($media->id);
|
||||
})->with('user')
|
||||
$history = Historique::query()
|
||||
->whereHas('media', fn(Builder $q) => $q->where('id', $media->id))
|
||||
->with('user')
|
||||
->orderBy('created_date', 'DESC')
|
||||
->get();
|
||||
|
||||
return \response()->json([
|
||||
'history' => $history,
|
||||
'vignettes' => $this->getVignettesByMedia($media)
|
||||
|
|
@ -794,7 +810,7 @@ class MediaController extends Controller
|
|||
/** @var boolean */
|
||||
$arcadia_id = collect($filters)->reduce(function (string|null $carry, array $item) {
|
||||
$item = collect($item);
|
||||
return $carry ?? ($carry or $item->get('type') === 'arcadia_id' ? true : false);
|
||||
return ($carry ?? false) or ($item->get('type') === 'arcadia_id' ? true : false);
|
||||
});
|
||||
|
||||
$esConditions = [];
|
||||
|
|
@ -828,21 +844,21 @@ class MediaController extends Controller
|
|||
/**
|
||||
* Elastic Search select appropriate Folder
|
||||
*
|
||||
* @param array $esMust
|
||||
* @param array $esMustNot
|
||||
* @param array $esShould
|
||||
* @param array $esFilters
|
||||
* @param \App\Http\Requests\Bo\LoadMediaRequest $request
|
||||
* @param \App\Models\Dossier|null $dossier
|
||||
* @param \App\Models\Sujet $sujet
|
||||
* @param boolean $isDepot
|
||||
* @param array $esMust ES conditions INCLURE TOUT (AND).
|
||||
* @param array $esMustNot ES conditions EXCLURE.
|
||||
* @param array $esShould ES conditions INCLURE AU MOINS (OR), avec un score.
|
||||
* @param \App\Http\Requests\Bo\LoadMediaRequest $request La request Lrvl.
|
||||
* @param \App\Models\Dossier|null $dossier Le dossier concerné, si les Medias
|
||||
* doivent appartenir a celui-ci.
|
||||
* @param \App\Models\Sujet $sujet Le sujet concerné, si les Medias
|
||||
* doivent appartenir a celui-ci.
|
||||
* @param boolean $isDepot Si les medias doivent se trouver dans le dossier dépot.
|
||||
* @return void
|
||||
*/
|
||||
private function esFolderSearch(
|
||||
array &$esMust,
|
||||
array &$esMustNot,
|
||||
array &$esShould,
|
||||
array &$esFilters,
|
||||
LoadMediaRequest $request,
|
||||
Dossier|null $dossier,
|
||||
Sujet $sujet,
|
||||
|
|
@ -851,6 +867,7 @@ class MediaController extends Controller
|
|||
/** @var \App\Models\User */
|
||||
$user = auth()->user();
|
||||
|
||||
// ? Doivent être dans le dossier dépot ?
|
||||
if ($isDepot) {
|
||||
// * Dossier dépôt
|
||||
$esMust = array_merge($esMust, [[
|
||||
|
|
@ -859,21 +876,26 @@ class MediaController extends Controller
|
|||
return;
|
||||
}
|
||||
|
||||
// ? N'est pas dans le dossier dépot ou racine ?
|
||||
if (!$dossier) {
|
||||
if ($request->folder === -1) {
|
||||
// ? Recherche globale ?
|
||||
if ($request->input('folder') === -1) {
|
||||
// * Recherche globale .
|
||||
$esMust = array_merge($esMust, [
|
||||
// * AND
|
||||
\array_undot(['bool.must.match.sujet_id' => $sujet->codeSujet])
|
||||
]);
|
||||
} else {
|
||||
// * Dossier racine .
|
||||
$esMust = array_merge($esMust, [
|
||||
// * AND
|
||||
\array_undot(['bool.should.match.sujet_id' => $sujet->codeSujet])
|
||||
]);
|
||||
$esMustNot = array_merge($esMustNot, [
|
||||
\array_undot(['exists.field' => 'dossier_id'])
|
||||
]);
|
||||
} //end if
|
||||
// * OR
|
||||
$esShould = array_merge($esShould, [
|
||||
\array_undot(['match.statut' => MediaStatut::public_etendu]),
|
||||
\array_undot(['match.statut' => MediaStatut::public]),
|
||||
|
|
@ -884,6 +906,7 @@ class MediaController extends Controller
|
|||
|
||||
// * Dossier classic .
|
||||
$esMust = array_merge($esMust, [[
|
||||
// * AND
|
||||
\array_undot([
|
||||
'bool.must' => [
|
||||
\array_undot(['match.sujet_id' => $sujet->codeSujet]),
|
||||
|
|
@ -892,9 +915,13 @@ class MediaController extends Controller
|
|||
])
|
||||
]]);
|
||||
|
||||
// ? User n'est pas ADMIN ?
|
||||
if (!$user->hasRole(config('roles.const.ADMIN'))) {
|
||||
$esFilters = array_merge($esFilters, [
|
||||
// * Ajout de restrictions
|
||||
// * Tout ce qui nous appartient et tout ce qui n'est pas brouillon
|
||||
$esMust = array_merge($esMust, [
|
||||
\array_undot([
|
||||
// * OR
|
||||
'bool.should' => [
|
||||
\array_undot([
|
||||
'bool.must_not' => [[
|
||||
|
|
|
|||
|
|
@ -11,6 +11,8 @@ use Illuminate\Support\Str;
|
|||
use App\Models\Panier;
|
||||
use App\Models\Format;
|
||||
use App\Models\Media;
|
||||
use Illuminate\Contracts\View\View;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
|
||||
class PanierController extends Controller
|
||||
{
|
||||
|
|
@ -19,15 +21,16 @@ class PanierController extends Controller
|
|||
/**
|
||||
* Page principale des paniers
|
||||
*
|
||||
* @return \Illuminate\View\View|\Illuminate\Contracts\View\Factory
|
||||
* @return \Illuminate\Contracts\View\View
|
||||
*/
|
||||
public function index()
|
||||
public function index(): View
|
||||
{
|
||||
/** @var \App\Models\User $user */
|
||||
$user = \auth()->user();
|
||||
|
||||
/** @var \Illuminate\Database\Eloquent\Collection $paniers */
|
||||
// ! Has to flush Media cache before querying basket with media list
|
||||
Media::flushQueryCache();
|
||||
$paniers = $user->paniersOwner;
|
||||
|
||||
return view('panier.index')->with([
|
||||
'paniers' => $paniers,
|
||||
]);
|
||||
|
|
@ -39,12 +42,12 @@ class PanierController extends Controller
|
|||
*
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
*/
|
||||
public function getBaskets()
|
||||
public function getBaskets(): JsonResponse
|
||||
{
|
||||
/** @var \App\Models\User $user */
|
||||
$user = \auth()->user();
|
||||
|
||||
/** @var \Illuminate\Database\Eloquent\Collection $paniers */
|
||||
// ! Has to flush Media cache before querying basket with media list
|
||||
Media::flushQueryCache();
|
||||
$paniers = $user->paniersOwner;
|
||||
|
||||
return response()->json($paniers);
|
||||
|
|
@ -56,16 +59,18 @@ class PanierController extends Controller
|
|||
* @param \App\Http\Requests\Bo\Ajax\AddMediasBasketRequest $request
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
*/
|
||||
public function addMediasBasket(AddMediasBasketRequest $request)
|
||||
public function addMediasBasket(AddMediasBasketRequest $request): JsonResponse
|
||||
{
|
||||
/** @var \App\Models\Panier $panier */
|
||||
$panier = Panier::whereId($request->panier_id)
|
||||
->with('mediaList')->firstOrFail();
|
||||
$panier = Panier::query()
|
||||
->where('id', $request->input('panier_id'))
|
||||
->with('mediaList')
|
||||
->firstOrFail();
|
||||
|
||||
// * Sync every media to basket
|
||||
$panier->mediaList()->sync(array_merge(
|
||||
$panier->mediaList()->pluck('id')->all(),
|
||||
$request->mediaList
|
||||
$request->input('mediaList')
|
||||
));
|
||||
|
||||
Media::flushQueryCache();
|
||||
|
|
@ -79,15 +84,18 @@ class PanierController extends Controller
|
|||
* @param \App\Http\Requests\Bo\Ajax\RemoveMediasBasketRequest $request
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
*/
|
||||
public function removeMediasBasket(RemoveMediasBasketRequest $request)
|
||||
public function removeMediasBasket(RemoveMediasBasketRequest $request): JsonResponse
|
||||
{
|
||||
|
||||
/** @var \App\Models\Panier $panier */
|
||||
$panier = Panier::whereId($request->panier_id)
|
||||
->with('mediaList')->firstOrFail();
|
||||
$panier = Panier::query()
|
||||
->where('id', $request->input('panier_id'))
|
||||
->with('mediaList')
|
||||
->firstOrFail();
|
||||
|
||||
/** @var \App\Models\Media $media */
|
||||
$media = Media::whereId($request->media_id)->firstOrFail();
|
||||
$media = Media::query()
|
||||
->where('id', $request->input('media_id'))
|
||||
->firstOrFail();
|
||||
|
||||
$panier->mediaList()->detach($media);
|
||||
|
||||
|
|
@ -100,13 +108,13 @@ class PanierController extends Controller
|
|||
* @param \App\Http\Requests\Bo\Ajax\CreateBasketRequest $request
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
*/
|
||||
public function createBasket(CreateBasketRequest $request)
|
||||
public function createBasket(CreateBasketRequest $request): JsonResponse
|
||||
{
|
||||
/** @var \App\Models\User $user */
|
||||
$user = auth()->user();
|
||||
|
||||
$panier = new Panier();
|
||||
$panier->libelle = $request->title;
|
||||
$panier->libelle = $request->input('title');
|
||||
$panier->uid = Str::uuid();
|
||||
$panier->owner()->associate($user);
|
||||
$panier->saveOrFail();
|
||||
|
|
@ -120,10 +128,12 @@ class PanierController extends Controller
|
|||
* @param \App\Http\Requests\Bo\Ajax\DestroyBasketRequest $request
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
*/
|
||||
public function destroyBasket(DestroyBasketRequest $request)
|
||||
public function destroyBasket(DestroyBasketRequest $request): JsonResponse
|
||||
{
|
||||
/** @var \App\Models\Panier $basket */
|
||||
$basket = Panier::whereId($request->basket_id)->firstOrFail();
|
||||
$basket = Panier::query()
|
||||
->where('id', $request->input('basket_id'))
|
||||
->firstOrFail();
|
||||
|
||||
$basket->deleteOrFail();
|
||||
|
||||
|
|
@ -136,9 +146,9 @@ class PanierController extends Controller
|
|||
* Page publique d'un panier
|
||||
*
|
||||
* @param \App\Models\Panier $panier
|
||||
* @return \Illuminate\View\View|\Illuminate\Contracts\View\Factory
|
||||
* @return \Illuminate\Contracts\View\View
|
||||
*/
|
||||
public function showBasket(Panier $panier)
|
||||
public function showBasket(Panier $panier): View
|
||||
{
|
||||
/** @var \App\Models\User|null $user */
|
||||
$user = auth()->user();
|
||||
|
|
@ -152,9 +162,12 @@ class PanierController extends Controller
|
|||
}
|
||||
|
||||
/** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Format> $formats */
|
||||
$formats = Format::withoutGlobalScope('App\Scopes\SystemScope')
|
||||
->where('system', true)->get();
|
||||
return view('panier.show')->with([
|
||||
$formats = Format::query()
|
||||
->withoutGlobalScope('App\Scopes\SystemScope')
|
||||
->where('system', true)
|
||||
->get();
|
||||
|
||||
return view('panier.show', [
|
||||
'panier' => $panier,
|
||||
'formats' => $formats,
|
||||
]);
|
||||
|
|
@ -166,10 +179,12 @@ class PanierController extends Controller
|
|||
* @param \App\Http\Requests\Bo\Ajax\SaveBasketPropsRequest $request
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
*/
|
||||
public function saveBasketProperty(SaveBasketPropsRequest $request)
|
||||
public function saveBasketProperty(SaveBasketPropsRequest $request): JsonResponse
|
||||
{
|
||||
/** @var \App\Models\Panier $panier */
|
||||
$panier = Panier::whereId($request->basket_id)->firstOrFail();
|
||||
$panier = Panier::query()
|
||||
->where('id', $request->input('basket_id'))
|
||||
->firstOrFail();
|
||||
|
||||
$panier->fill($request->validated());
|
||||
$panier->saveOrFail();
|
||||
|
|
|
|||
|
|
@ -144,12 +144,11 @@ class UploadController extends Controller
|
|||
$this->validateUploadedFile($uplodedFile);
|
||||
|
||||
/** @var \App\Models\Media */
|
||||
$media = Media::query()->whereId($request->media_id)
|
||||
->whereHas('sujet', function (Builder $q) use ($sujet) {
|
||||
$q->where('codeSujet', $sujet->codeSujet);
|
||||
})->whereHas('dossier', function ($q) use ($dossier) {
|
||||
$q->whereId($dossier->id);
|
||||
})->firstOrNew();
|
||||
$media = Media::query()
|
||||
->where('id', $request->input('media_id'))
|
||||
->whereHas('sujet', fn(Builder $q) => $q->where('codeSujet', $sujet->codeSujet))
|
||||
->whereHas('dossier', fn(Builder $q) => $q->where('id', $dossier->id))
|
||||
->firstOrNew();
|
||||
|
||||
// Save the file and return any response you need.
|
||||
return $this->createOrUpdateMedia($user, $uplodedFile, $media, $dossier, $sujet);
|
||||
|
|
|
|||
|
|
@ -5,6 +5,13 @@ namespace App\Models;
|
|||
use Illuminate\Database\Eloquent\Model;
|
||||
use Carbon\Carbon;
|
||||
|
||||
/**
|
||||
* @property integer $arcadia_id The ID on Arcadia side, Defaults to 0 (not linked).
|
||||
* @property string $filename
|
||||
*
|
||||
* @property-read \App\Models\Media $media Media BelongsTo relationship.
|
||||
* @package App\Models
|
||||
*/
|
||||
class ArcadiaLink extends Model
|
||||
{
|
||||
// * GETTERS
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@ namespace App\Models;
|
|||
|
||||
use App\Enums\MediaStatut;
|
||||
use App\Models\User;
|
||||
use Illuminate\Contracts\Database\Eloquent\Builder;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
|
||||
|
|
@ -73,19 +74,24 @@ class Dossier extends Model
|
|||
/** @var \App\Model\User $user */
|
||||
$user = Auth::user();
|
||||
|
||||
// * dossier classic
|
||||
if ($this->parent_id != 1 && $this->id != 1) {
|
||||
if ($user->hasRole(config('roles.const.ADMIN'))) {
|
||||
return $this->mediaList()->count();
|
||||
} else {
|
||||
return $this->mediaList()
|
||||
->where('statut', '<>', MediaStatut::brouillon)
|
||||
->orWhere('created_by', $user->id)->count();
|
||||
}
|
||||
} else {
|
||||
// * dossier dépôt
|
||||
// ? Est un dossier dépot ou racine ?
|
||||
if ($this->parent_id === 1 or $this->id === 1) {
|
||||
// * Dossier dépôt
|
||||
return $this->mediaList()->count();
|
||||
}
|
||||
|
||||
// * Dossier classic
|
||||
// ? User is admin ?
|
||||
if ($user->hasRole(config('roles.const.ADMIN'))) {
|
||||
// * Tout de tout le monde
|
||||
return $this->mediaList()->count();
|
||||
}
|
||||
|
||||
// * Tous les non brouillons ou crées par le user
|
||||
return $this->mediaList()
|
||||
->where(fn (Builder $q) => $q->where('statut', '!=', MediaStatut::brouillon)
|
||||
->orWhere('created_by', $user->id))
|
||||
->count();
|
||||
}
|
||||
|
||||
// * RELATIONSHIPS
|
||||
|
|
@ -120,7 +126,7 @@ class Dossier extends Model
|
|||
*/
|
||||
public function mediaList()
|
||||
{
|
||||
return $this->hasMany(Media::class, 'dossier_id', 'id');
|
||||
return $this->hasMany(Media::class);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -48,4 +48,24 @@ class Historique extends Model
|
|||
{
|
||||
return $this->belongsTo(Media::class);
|
||||
}
|
||||
|
||||
// * METHODS
|
||||
|
||||
/**
|
||||
* Get the instance as an array.
|
||||
*
|
||||
* @return array<TKey,TValue>
|
||||
*/
|
||||
public function toArray(): array
|
||||
{
|
||||
return \array_merge(
|
||||
parent::toArray(),
|
||||
[
|
||||
'type' => [
|
||||
'value' => $this->type,
|
||||
'label' => $this->type->label()
|
||||
]
|
||||
]
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -274,6 +274,16 @@ class Media extends Model
|
|||
|
||||
// * Laravel Behaviors
|
||||
|
||||
/**
|
||||
* Get the route key for the model.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getRouteKeyName()
|
||||
{
|
||||
return 'uid';
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the base cache tags that will be present
|
||||
* on all queries.
|
||||
|
|
@ -472,7 +482,7 @@ class Media extends Model
|
|||
*/
|
||||
public function paniers()
|
||||
{
|
||||
return $this->belongsToMany(Panier::class);
|
||||
return $this->belongsToMany(Panier::class, 'panier_media');
|
||||
}
|
||||
|
||||
// * METHODS
|
||||
|
|
@ -797,7 +807,7 @@ class Media extends Model
|
|||
$storage = Storage::disk('media');
|
||||
|
||||
// * format spécifique
|
||||
if ($format->system) {
|
||||
if (!$format->system) {
|
||||
if (in_array($this->extension, ['gif', 'jpeg', 'jpg', 'png', 'pdf', 'ai', 'psd'])) {
|
||||
return $storage->path("/{$this->folder}/{$this->uid}_{$format->libelle}.{$format->extension->value}");
|
||||
}
|
||||
|
|
@ -812,7 +822,7 @@ class Media extends Model
|
|||
} elseif (in_array($this->extension, ['pdf', 'ai', 'psd'])) {
|
||||
return $storage->path("/{$this->folder}/{$this->uid}_{$format->libelle}.png");
|
||||
}
|
||||
return $storage->path("/{$this->folder}/{$this->uid}.{$this->extension}");
|
||||
return $storage->path("/{$this->folder}/{$this->uid}.{$this->extension->value}");
|
||||
}
|
||||
throw new \RuntimeException("Unhandled Format $format->id $format->libelle");
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,6 +6,36 @@ use Illuminate\Database\Eloquent\Factories\HasFactory;
|
|||
use Illuminate\Foundation\Auth\User as Authenticatable;
|
||||
use Illuminate\Notifications\Notifiable;
|
||||
|
||||
/**
|
||||
* @property string $firstname Prénom.
|
||||
* @property string $lastname Nom.
|
||||
* @property string $email Email.
|
||||
* @property string $objectguid
|
||||
* @property string $matricule Unique LDAP.
|
||||
* @property-read \Illuminate\Support\Carbon $email_verified_at Mail verified at date.
|
||||
* @property string $password Mot de passe.
|
||||
* @property string $remember_token
|
||||
* @property integer $role Rôle in config/role; 1 => Admin.
|
||||
* @property-read \Illuminate\Support\Carbon $created_at Created date.
|
||||
* @property-read \Illuminate\Support\Carbon $updated_at Updated date.
|
||||
*
|
||||
* @property-read \Illuminate\Database\Eloquent\Collection<\App\Models\Marque> $marques
|
||||
* Marques BelongsToMany relationship.
|
||||
* @property-read \Illuminate\Database\Eloquent\Collection<\App\Models\Dossier> $dossiers
|
||||
* Dossiers BelongsToMany relationship.
|
||||
* @property-read \Illuminate\Database\Eloquent\Collection<\App\Models\Sujet> $sujets
|
||||
* Sujets BelongsToMany relationship.
|
||||
* @property-read \Illuminate\Database\Eloquent\Collection<\App\Models\Media> $mediaList
|
||||
* Medias HasMany relationship.
|
||||
* @property-read \Illuminate\Database\Eloquent\Collection<\App\Models\Historique> $historiques
|
||||
* Historiques HasMany relationship.
|
||||
* @property-read \Illuminate\Database\Eloquent\Collection<\App\Models\Recherche> $recherches
|
||||
* Recherches HasMany relationship.
|
||||
* @property-read \Illuminate\Database\Eloquent\Collection<\App\Models\Panier> $paniersOwner
|
||||
* Paniers HasMany relationship that belongs to the user.
|
||||
* @property-read \Illuminate\Database\Eloquent\Collection<\App\Models\Panier> $paniersFavoris
|
||||
* Paniers HasMany relationship.
|
||||
*/
|
||||
class User extends Authenticatable
|
||||
{
|
||||
use HasFactory;
|
||||
|
|
|
|||
|
|
@ -2,7 +2,6 @@
|
|||
|
||||
namespace App\Providers;
|
||||
|
||||
use Illuminate\Pagination\Paginator;
|
||||
use Illuminate\Support\Carbon;
|
||||
use Illuminate\Support\Facades\App;
|
||||
use Illuminate\Support\Facades\URL;
|
||||
|
|
@ -26,10 +25,12 @@ class AppServiceProvider extends ServiceProvider
|
|||
return $url->current();
|
||||
});
|
||||
}
|
||||
|
||||
// * LOCAL HTTPS FIX
|
||||
if (!in_array(config('app.env'), ['local', 'testing'])) {
|
||||
URL::forceScheme('https');
|
||||
}
|
||||
|
||||
// * HA PROXY FIX
|
||||
App::singleton('clientIp', function () {
|
||||
if (config('app.env') == 'local') {
|
||||
|
|
@ -38,6 +39,7 @@ class AppServiceProvider extends ServiceProvider
|
|||
return request()->server('HTTP_X_FORWARDED_FOR') ?? request()->getClientIp();
|
||||
}
|
||||
});
|
||||
|
||||
// * LOCAL FORCE eg: for Carbon
|
||||
foreach ([\LC_TIME, \LC_MESSAGES, \LC_COLLATE, \LC_CTYPE, \LC_MONETARY] as $category) {
|
||||
setlocale(
|
||||
|
|
@ -47,9 +49,5 @@ class AppServiceProvider extends ServiceProvider
|
|||
);
|
||||
}
|
||||
Carbon::setLocale(config('app.locale'));
|
||||
if (!app()->runningInConsole()) {
|
||||
// * FORCE BOOTSTRAP PAGINATOR (or custom if in front)
|
||||
Paginator::useBootstrap();
|
||||
}//end if
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -41,12 +41,9 @@ class RouteServiceProvider extends ServiceProvider
|
|||
->group(base_path('routes/api.php'));
|
||||
});
|
||||
|
||||
Route::bind('media', function ($value) {
|
||||
return Media::whereUid($value)->firstOrFail();
|
||||
});
|
||||
Route::bind('basket_uuid', function ($value) {
|
||||
return Panier::where('uid', $value)
|
||||
->with('owner')->firstOrFail();
|
||||
->with('owner')->firstOrFail();
|
||||
});
|
||||
|
||||
// * API
|
||||
|
|
|
|||
34
app/Providers/ViewServiceProvider.php
Normal file
34
app/Providers/ViewServiceProvider.php
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
<?php
|
||||
|
||||
namespace App\Providers;
|
||||
|
||||
use Illuminate\Pagination\Paginator;
|
||||
use Illuminate\Support\Facades\Cache;
|
||||
use Illuminate\Support\Facades\File;
|
||||
use Illuminate\Support\Facades\View;
|
||||
use Illuminate\Support\ServiceProvider;
|
||||
|
||||
class ViewServiceProvider extends ServiceProvider
|
||||
{
|
||||
/**
|
||||
* Bootstrap any application services.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function boot(): void
|
||||
{
|
||||
$appInfos = Cache::remember('composer', 360, function () {
|
||||
return json_decode(File::get(\app_path('../composer.json')));
|
||||
});
|
||||
// Share composer.json infos.
|
||||
if (isset($appInfos->name) and isset($appInfos->version)) {
|
||||
View::share('cpsr_name', $appInfos->name);
|
||||
View::share('cpsr_version', $appInfos->version);
|
||||
}
|
||||
|
||||
if (!app()->runningInConsole()) {
|
||||
// * FORCE BOOTSTRAP PAGINATOR (or custom if in front)
|
||||
Paginator::useBootstrap();
|
||||
}
|
||||
}
|
||||
}
|
||||
819
composer.lock
generated
819
composer.lock
generated
File diff suppressed because it is too large
Load diff
|
|
@ -169,7 +169,7 @@ return [
|
|||
* Package Service Providers...
|
||||
*/
|
||||
|
||||
Elasticquent\ElasticquentServiceProvider::class,
|
||||
Elasticquent\ElasticquentServiceProvider::class,
|
||||
|
||||
/*
|
||||
* Application Service Providers...
|
||||
|
|
@ -178,7 +178,8 @@ return [
|
|||
App\Providers\AppServiceProvider::class,
|
||||
App\Providers\AuthServiceProvider::class,
|
||||
App\Providers\EventServiceProvider::class,
|
||||
App\Providers\RouteServiceProvider::class
|
||||
App\Providers\RouteServiceProvider::class,
|
||||
App\Providers\ViewServiceProvider::class
|
||||
|
||||
],
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
<?php
|
||||
|
||||
// TODO: Pass this as an enum.
|
||||
return [
|
||||
'const' => [
|
||||
'ADMIN' => '1',
|
||||
|
|
|
|||
|
|
@ -0,0 +1,48 @@
|
|||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
$linkedMediaIdList = DB::table('arcadia_links')->pluck('media_id');
|
||||
$existingMediaIdList = DB::table('media')->whereIn('id', $linkedMediaIdList)->pluck('id');
|
||||
$linkIdListToRemove = $linkedMediaIdList->filter(fn (int $media_id) =>
|
||||
!$existingMediaIdList->contains($media_id));
|
||||
|
||||
// * Remove Orphan links
|
||||
DB::transaction(fn () => DB::table('arcadia_links')->whereIn('media_id', $linkIdListToRemove)->delete());
|
||||
|
||||
// * Add foreign Key
|
||||
Schema::table('arcadia_links', function (Blueprint $table) {
|
||||
$table->unsignedBigInteger('media_id')->nullable(false)->default(null)->change();
|
||||
});
|
||||
Schema::table('arcadia_links', function (Blueprint $table) {
|
||||
$table->foreign('media_id')->references('id')->on('media');
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
Schema::table('arcadia_links', function (Blueprint $table) {
|
||||
$table->dropForeign(['media_id']);
|
||||
});
|
||||
Schema::table('arcadia_links', function (Blueprint $table) {
|
||||
$table->bigInteger('media_id')->default(0)->change();
|
||||
});
|
||||
}
|
||||
};
|
||||
14032
package-lock.json
generated
14032
package-lock.json
generated
File diff suppressed because it is too large
Load diff
|
|
@ -1,4 +1,5 @@
|
|||
{
|
||||
"name": "srcs",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "npm run development",
|
||||
|
|
|
|||
|
|
@ -489,9 +489,6 @@ export default {
|
|||
.querySelector('meta[name="csrf-token"]')
|
||||
.getAttribute("content"),
|
||||
},
|
||||
query: {
|
||||
media_id: this.storeMedia.id
|
||||
}
|
||||
});
|
||||
|
||||
this.resumable.on("fileAdded", this.uploadFileAdded);
|
||||
|
|
|
|||
|
|
@ -184,7 +184,7 @@ export default {
|
|||
},
|
||||
mounted() {
|
||||
const data = JSON.parse(this.$parent.$options.json);
|
||||
if (data.selectedFolder) {
|
||||
if (data.selectedFolder && data.selectedFolder != -1) {
|
||||
this.selectedFolder = data.selectedFolder;
|
||||
this.selectFolder(data.selectedFolder);
|
||||
this.$store.commit({
|
||||
|
|
|
|||
|
|
@ -292,7 +292,7 @@ export default {
|
|||
},
|
||||
SaveMedia() {
|
||||
axios
|
||||
.put(`/ajax/media/${this.storeMedia.id}`, {
|
||||
.put(`/ajax/media/${this.storeMedia.uid}`, {
|
||||
media: this.storeMedia,
|
||||
})
|
||||
.then((response) => {
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@
|
|||
item.user.matricule
|
||||
}})
|
||||
</td>
|
||||
<td>{{ item.type }}</td>
|
||||
<td>{{ item.type.label }}</td>
|
||||
<td>{{ item.description }}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
|
|
|
|||
|
|
@ -1,36 +1,48 @@
|
|||
@extends('layouts.app')
|
||||
|
||||
@include('layouts.header')
|
||||
|
||||
@section('content')
|
||||
<main class="user_index template_2col">
|
||||
@include('modules.param-sideMenu')
|
||||
<div class="main_content">
|
||||
<div class="heading">
|
||||
<h1>Anomalies du lien Arcadia</h1>
|
||||
<h1>{{ __('Anomalies du lien Arcadia') }}</h1>
|
||||
</div>
|
||||
<table class="datatable">
|
||||
<thead>
|
||||
<table class="datatable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>ID</th>
|
||||
<th>Media ID (DAM ID)</th>
|
||||
<th>Arcadia ID</th>
|
||||
<th>Filename</th>
|
||||
<th>Date création ZIP</th>
|
||||
<th>{{ __('ID') }}</th>
|
||||
<th>{{ __('Media ID (DAM ID)') }}</th>
|
||||
<th>{{ __('Arcadia ID') }}</th>
|
||||
<th>{{ __('Filename') }}</th>
|
||||
<th>{{ __('Date création ZIP') }}</th>
|
||||
<th></th>
|
||||
<th></th>
|
||||
</tr>
|
||||
</thead>
|
||||
@foreach ($ano as $line)
|
||||
<tr class="data_row">
|
||||
<td>{{$line->id}}</td>
|
||||
<td>{{$line->media_id}}</td>
|
||||
<td>{{$line->arcadia_id}}</td>
|
||||
<td>{{$line->filename}}</td>
|
||||
<td>{{$line->date_f}}</td>
|
||||
<td><a href="/media/{{$line->media_uuid}}" target="_blank">Ouvrir la fiche média</a></td>
|
||||
<td><a href="{{route('arcadialinks.destroy', ['id' => $line->id])}}" onclick="return confirm('Êtes-vous sûr de vouloir supprimer cette anomalie ?');"><i class="fas fa-times" style="color: red"></i></a></td>
|
||||
</tr>
|
||||
@endforeach
|
||||
</table>
|
||||
</thead>
|
||||
@foreach ($arcadiaLinkList as $arcadiaLink)
|
||||
<tr class="data_row">
|
||||
<td>{{ $arcadiaLink->id }}</td>
|
||||
<td>{{ $arcadiaLink->media->id }}</td>
|
||||
<td>{{ $arcadiaLink->arcadia_id }}</td>
|
||||
<td>{{ $arcadiaLink->filename }}</td>
|
||||
<td>{{ $arcadiaLink->date_f }}</td>
|
||||
<td>
|
||||
<a href="{{ route('media.show', $arcadiaLink->media) }}"
|
||||
title="{{ __('Ouvrir la fiche média dans un nouvel onglet') }}" target="_blank">
|
||||
{{ __('Ouvrir la fiche média') }}
|
||||
</a>
|
||||
</td>
|
||||
<td>
|
||||
<a href="{{ route('arcadialinks.destroy', $arcadiaLink) }}" title="{{ __('Supprimer le lien arcadia') }}"
|
||||
onclick="return confirm('{{ __('Êtes-vous sûr de vouloir supprimer cette anomalie ?') }}');">
|
||||
<i class="fas fa-times" style="color: red"></i>
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
@endforeach
|
||||
</table>
|
||||
</div>
|
||||
</main>
|
||||
@endsection
|
||||
|
|
|
|||
|
|
@ -26,7 +26,6 @@
|
|||
'textsearch' => $textSearch,
|
||||
'typesmedia' => $typesmedia,
|
||||
'etiquettes' => $etiquettes,
|
||||
'selectedFolder' => $currentFolder,
|
||||
];
|
||||
@endphp
|
||||
<div id="mm-filters" data-json='@json($dataVue)'></div>
|
||||
|
|
|
|||
|
|
@ -73,11 +73,11 @@ Route::post('/ajax/add-depot-folder', [DossierController::class, 'addDepotFolder
|
|||
|
||||
// * Ajax pour la gestion de l'upload de média .
|
||||
Route::post('/ajax/upload-media/depot', [UploadController::class, 'uploadMediaFileIntoDepot'])
|
||||
->name('media.uploadDepot');
|
||||
->name('media.uploadDepot');
|
||||
Route::post('/ajax/upload-media/{sujet}/{dossier}', [UploadController::class, 'uploadMediaFile'])
|
||||
->name('media.upload');
|
||||
->name('media.upload');
|
||||
|
||||
// * Les pages Front panier public.
|
||||
Route::get('/basket/{basket_uuid}', [PanierController::class, 'showBasket']);
|
||||
Route::post('/ajax/download-media-public/{format?}', [MediaController::class, 'downloadMediaPublic'])
|
||||
->name('downloadMediaPublic');
|
||||
->name('downloadMediaPublic');
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue