Compare commits

...
Sign in to create a new pull request.

21 commits

Author SHA1 Message Date
Jérémy Munsch
fe2460d87e
Reset Media route resolv using uid (besoin métier) vu avec Vincent 2023-12-15 12:38:17 +01:00
Jérémy Munsch
ab28dc9257
Fixes #12 Fixed MediaController::esFilters arcadia_id fetch from filters issue 2023-12-15 12:20:34 +01:00
Jérémy Munsch
744a10a74a
Fix Media duplicate
- put in transaction
- set arcadia_id to null
2023-12-15 12:03:35 +01:00
Jérémy Munsch
0bb6189090
Fixes #10
- Remove explicition resolve for media in RouteServicePRovider
- Set usage of media id on media routes everywhere
2023-12-15 11:54:50 +01:00
Jérémy Munsch
94470da862
Fixes #9
- add FK on arcadia_links to media.id and remove orphans
- Refactored ArcadiaLinkController
- Added comments on ArcadiaLink model
- refactored arcadialinks.index
2023-12-15 11:45:54 +01:00
Jérémy Munsch
3f32460d60
Add View service provider (prepare to bump slowly) 2023-12-15 11:45:50 +01:00
Jérémy Munsch
57fdd70d92
Fixes #8+
Enums arent using BaseEnum trait and cannot since tool low php level, need to manually implement behaviors
2023-12-14 17:13:46 +01:00
Jérémy Munsch
442de63409
MediaController refactor getMediaOtherInfos 2023-12-14 17:12:19 +01:00
Jérémy Munsch
e531def9f3
Fixes #7,#13 REfactor BasektController + Flush cache before querying basket media list 2023-12-14 16:51:05 +01:00
Jérémy Munsch
7d53509e8e
Fixes #6 2023-12-14 15:47:50 +01:00
Jérémy Munsch
080b400e84
UploadController fix Media query 2023-12-14 15:19:07 +01:00
Jérémy Munsch
665d003a5b
Add TODO in config/roles 2023-12-14 14:23:09 +01:00
Jérémy Munsch
2fcfddf46f
Add Model User comments 2023-12-14 14:22:57 +01:00
Jérémy Munsch
e0ca3acf23
MediaController::loadMedia refactor 2023-12-14 13:21:05 +01:00
Jérémy Munsch
27d0f7ff70
Dossier model refactor getMediacountAttribute 2023-12-14 13:05:35 +01:00
Jérémy Munsch
3ef0b3c144
DossierController refactor with typehint 2023-12-14 13:04:24 +01:00
Jérémy Munsch
22f5e907d0
.gitignore update 2023-12-14 12:02:40 +01:00
Jérémy Munsch
faa9f2ce33
npm update 2023-12-14 11:49:40 +01:00
Jérémy Munsch
cf8057d351
composer update 2023-12-14 11:48:21 +01:00
Jérémy Munsch
67d7e54c1c
add name to package json 2023-12-14 11:47:08 +01:00
Jérémy Munsch
c51bf890b6
update client api + add .gitmodules 2023-12-14 11:45:25 +01:00
26 changed files with 2811 additions and 12797 deletions

2
.gitignore vendored
View file

@ -25,7 +25,7 @@ public/uploads/*
/storage/*.key /storage/*.key
/vendor /vendor
.env .env*
.phpunit.result.cache .phpunit.result.cache
Homestead.json Homestead.json
Homestead.yaml Homestead.yaml

4
.gitmodules vendored
View file

@ -1,3 +1,3 @@
[submodule "clients/Api"] [submodule "clients/Api"]
path = clients/Api path = clients/Api
url = git@gitlab.com:service-web-lab/dam-client.git url = ../dam-client.git

View file

@ -3,7 +3,7 @@
namespace App\Http\Controllers; namespace App\Http\Controllers;
use App\Models\ArcadiaLink; use App\Models\ArcadiaLink;
use Illuminate\Support\Carbon; use Illuminate\Contracts\Database\Eloquent\Builder;
class ArcadiaLinkController extends Controller class ArcadiaLinkController extends Controller
{ {
@ -17,9 +17,14 @@ class ArcadiaLinkController extends Controller
/** @var \App\Models\User */ /** @var \App\Models\User */
$user = auth()->user(); $user = auth()->user();
$user->authorizeRoles(config('roles.const.ADMIN')); $user->authorizeRoles(config('roles.const.ADMIN'));
$dt = Carbon::now('Europe/Paris')->subMinutes(15)->toDateTimeString();
$ano = ArcadiaLink::where('created_at', '<', $dt)->orderBy('id', 'DESC')->get(); // * ArcadiaLink->Media is nullable
return view('arcadialinks.index', ['ano' => $ano]); $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'));
} }
/** /**

View file

@ -15,9 +15,11 @@ use App\Models\Marque;
use App\Models\Media; use App\Models\Media;
use App\Models\Variante; use App\Models\Variante;
use App\Models\Format; use App\Models\Format;
use Illuminate\Contracts\Database\Eloquent\Builder;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use Illuminate\Http\RedirectResponse; use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
@ -38,51 +40,64 @@ class DossierController extends Controller
$select = ['id', 'libelle', 'system']; $select = ['id', 'libelle', 'system'];
/** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Dossier> Dossiers publiques */ /** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Dossier> Dossiers publiques */
$publicFolders = Dossier::whereHas('sujet', function ($q) use ($request) { $publicFolders = Dossier::query()
$q->where('codeSujet', $request->sujet_id); ->whereHas('sujet', fn (Builder $q) => $q->where('codeSujet', $request->input('sujet_id')))
})->whereIsPrivate(false)->whereNull('parent_id')->select($select)->get(); ->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 */ /** @var \Illuminate\Database\Eloquent\Builder */
$privateQuery = Dossier::whereHas('sujet', function ($q) use ($request) { $privateQuery = Dossier::query()
$q->where('codeSujet', $request->sujet_id); ->whereHas('sujet', fn (Builder $q) => $q->where('codeSujet', $request->input('sujet_id')))
})->select($select)->whereIsPrivate(true); ->where('is_private', true)
->select($select);
// If not admin, get using brands. // ? Is admin ?
if (!$user->hasRole(config('roles.const.ADMIN'))) { if (!$user->hasRole(config('roles.const.ADMIN'))) {
// * If not admin, get using brands.
/** @var \Illuminate\Database\Eloquent\Collection<integer> Codes marques */ /** @var \Illuminate\Database\Eloquent\Collection<integer> Codes marques */
$marques = $user->marques()->pluck('codMarq'); $marques = $user->marques()->pluck('codMarq');
$privateQuery->whereHas('marques', function ($q) use ($marques) { $privateQuery->whereHas('marques', fn (Builder $q) => $q->whereIn('codMarq', $marques));
$q->whereIn('codMarq', $marques);
});
} }
/** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Dossier> Dossiers privés */ /** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Dossier> Dossiers privés */
$privateFolders = $privateQuery->get(); $privateFolders = $privateQuery->get();
$foldersCollection = $publicFolders->merge($privateFolders); $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(); ->sortBy('favoris')->values();
// Ajout du dépôt de fichier pour les admin. // ? Is admin ?
if ($user->hasRole(config('roles.const.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 */ /** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Dossier> Dossiers depots */
$depotQuery = Dossier::whereNull('parent_id') $depotQuery = Dossier::query()
->whereDoesntHave('dossierParent')
->where('system', true) ->where('system', true)
->orderBy('libelle', 'ASC') ->orderBy('libelle', 'ASC')
->get(); ->get();
$foldersCollection = $foldersCollection->merge($depotQuery); $foldersCollection = $foldersCollection->merge($depotQuery);
} }
$folders['data'] = new NestedDossiersListResource($foldersCollection); Arr::set($folders, 'data', new NestedDossiersListResource($foldersCollection));
$folders['racineCount'] = Media::whereSujetId($request->sujet_id)
->whereNull('dossier_id') // * Racine Count
->where(function ($query) use ($user) { $racineCountQuery = Media::query()
$query->where('statut', MediaStatut::public_etendu) ->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('statut', MediaStatut::public)
->orWhere('created_by', $user->id); ->orWhere('created_by', $user->id)
})->count(); );
}
Arr::set($folders, 'racineCount', $racineCountQuery->count());
return response()->json($folders); return response()->json($folders);
} }
@ -99,13 +114,16 @@ class DossierController extends Controller
$user = auth()->user(); $user = auth()->user();
$response = []; $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> */ /** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Format> */
$FormatsSujet = Format::whereHas('sujets', function ($query) use ($request) { $FormatsSujet = Format::query()
$query->where('sujet_id', $request->sujetId); ->whereHas('sujets', fn (Builder $q) => $q->where('sujet_id', $request->input('sujetId')))
})->get(); ->get();
/** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Format> */ /** @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(); ->where('system', true)->get();
$response['formats'] = $FormatsSujet->merge($FormatsSystem); $response['formats'] = $FormatsSujet->merge($FormatsSystem);
@ -131,14 +149,15 @@ class DossierController extends Controller
$user->authorizeRoles(config('roles.const.ADMIN')); $user->authorizeRoles(config('roles.const.ADMIN'));
/** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Dossier> */ /** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Dossier> */
$dossiers = Dossier::whereNull('parent_id') $dossiers = Dossier::query()
->where('system', false) ->whereDoesntHave('dossierParent')
->where('system', false)
->orderBy('libelle', 'asc') ->orderBy('libelle', 'asc')
->get(); ->get();
/** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Sujet> */ /** @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, 'dossiers' => $dossiers,
'sujets' => $sujets, 'sujets' => $sujets,
]); ]);
@ -154,9 +173,13 @@ class DossierController extends Controller
{ {
if ($request->sub) { if ($request->sub) {
/** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Dossier> */ /** @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(); ->orderBy('libelle', 'asc')->get();
return view('dossiers.create-sub')->with(['dossiers' => $dossiers]); return view('dossiers.create-sub', [
'dossiers' => $dossiers
]);
} }
/** @var \App\Models\User */ /** @var \App\Models\User */
@ -166,10 +189,11 @@ class DossierController extends Controller
$marques = Marque::all(); $marques = Marque::all();
/** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Sujet> */ /** @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([ return view('dossiers.create')->with([
'marques' => $marques, 'sujets' => $sujets 'marques' => $marques,
'sujets' => $sujets
]); ]);
} }
@ -192,19 +216,19 @@ class DossierController extends Controller
if ($request->sub) { if ($request->sub) {
/** @var \App\Models\Dossier */ /** @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); $dossier->sujet()->associate($parent_dossier->sujet);
} else { } else {
$dossier->sujet()->associate($request->sujet); $dossier->sujet()->associate($request->input('sujet'));
} }
if ($dossier->saveOrFail()) { if ($dossier->saveOrFail()) {
// ---- Les marques // ---- Les marques
if ($request->marques) { if ($request->input('marques')) {
$dossier->marques()->sync($request->marques); $dossier->marques()->sync($request->input('marques'));
} }
return redirect()->route('dossier.edit', ['dossier' => $dossier]) return redirect()->route('dossier.edit', ['dossier' => $dossier])
->with('success', 'Le dossier a été enregistré'); ->with('success', 'Le dossier a été enregistré');
} }
}); });
return back(); return back();
@ -228,9 +252,9 @@ class DossierController extends Controller
/** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Sujet> */ /** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Sujet> */
$dossierSujets = $dossier->sujets; $dossierSujets = $dossier->sujets;
/** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Sujet> */ /** @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, 'dossier' => $dossier,
'dossierMarques' => $dossierMarques, 'dossierMarques' => $dossierMarques,
'marques' => $marques, 'marques' => $marques,
@ -261,7 +285,7 @@ class DossierController extends Controller
$dossier->marques()->sync($request->marques); $dossier->marques()->sync($request->marques);
} }
return redirect()->route('dossier.edit', ['dossier' => $dossier]) 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(); return back();
@ -280,7 +304,7 @@ class DossierController extends Controller
$user->authorizeRoles(config('roles.const.ADMIN')); $user->authorizeRoles(config('roles.const.ADMIN'));
if ($dossier->deleteOrFail()) { if ($dossier->deleteOrFail()) {
return \response()->redirectToRoute('dossier.index') return \response()->redirectToRoute('dossier.index')
->with('warning', trans('Le dossier à été supprimé')); ->with('warning', trans('Le dossier à été supprimé'));
} }
return back(); return back();
} }

View file

@ -34,11 +34,12 @@ use App\Models\Sujet;
use App\Models\Tag; use App\Models\Tag;
use App\Models\TypeMedia; use App\Models\TypeMedia;
use App\Traits\Http\HandlesMedia; use App\Traits\Http\HandlesMedia;
use Illuminate\Contracts\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\ModelNotFoundException; use Illuminate\Database\Eloquent\ModelNotFoundException;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use Illuminate\Http\RedirectResponse; use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Arr;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\File; use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Storage; use Illuminate\Support\Facades\Storage;
@ -65,6 +66,8 @@ class MediaController extends Controller
/** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Sujet> */ /** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Sujet> */
$sujets = $user->sujets; $sujets = $user->sujets;
// ! Has to flush Media cache before querying basket with media list
Media::flushQueryCache();
/** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Panier> */ /** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Panier> */
$paniers = $user->paniersOwner; $paniers = $user->paniersOwner;
/** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Societe> */ /** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Societe> */
@ -102,7 +105,7 @@ class MediaController extends Controller
$textSearch, $textSearch,
$filters, $filters,
intval(Dossier::where('id', $dossier_id)->exists() ? intval(Dossier::where('id', $dossier_id)->exists() ?
$dossier_id : (in_array($dossier_id, [-1, 0]) ? $dossier_id : -1)) $dossier_id : (in_array($dossier_id, [-1, 0]) ? $dossier_id : -1))
); );
} }
@ -156,12 +159,16 @@ class MediaController extends Controller
$user = auth()->user(); $user = auth()->user();
/** @var \App\Models\Dossier|null */ /** @var \App\Models\Dossier|null */
$dossier = Dossier::where('id', $request->folder)->first(); $dossier = Dossier::query()
->with('dossierParent')
->where('id', $request->input('folder'))
->first();
$response = []; $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 * Elastic Search must conditions
@ -205,7 +212,6 @@ class MediaController extends Controller
$esMust, $esMust,
$esMustNot, $esMustNot,
$esShould, $esShould,
$esFilters,
$request, $request,
$dossier, $dossier,
$sujet, $sujet,
@ -220,26 +226,30 @@ class MediaController extends Controller
'bool.should' => $esShould, 'bool.should' => $esShould,
'bool.filter' => $esFilters, 'bool.filter' => $esFilters,
]); ]);
$sort = [[$orderField => ['order' => $order]]];
$sort = [[$orderField => ['order' => $order]]]; Arr::set($response, 'data', Media::searchByQuery(
$response['data'] = Media::searchByQuery(
$query, $query,
null, null,
null, null,
intval($request->post('limit', 50)), intval($request->post('limit', 50)),
intval($request->post('offset', 0)), intval($request->post('offset', 0)),
$sort $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'
); );
Arr::set($response, 'role', $user->role);
$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;
return \response()->json($response); return \response()->json($response);
} }
@ -262,7 +272,7 @@ class MediaController extends Controller
/** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Media> */ /** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Media> */
$mediaList = Media::whereIn('id', collect($request->mediaList)->pluck('id')) $mediaList = Media::whereIn('id', collect($request->mediaList)->pluck('id'))
->where('isLocked', false)->get(); ->where('isLocked', false)->get();
$destinationDossierId = \intval($request->dossier_id); $destinationDossierId = \intval($request->dossier_id);
@ -346,7 +356,7 @@ class MediaController extends Controller
}); });
} catch (ModelNotFoundException | \RuntimeException $e) { } catch (ModelNotFoundException | \RuntimeException $e) {
return response()->json($e->getMessage(), 500); return response()->json($e->getMessage(), 500);
}//end try } //end try
} }
/** /**
@ -416,7 +426,7 @@ class MediaController extends Controller
'status' => false, 'status' => false,
'error' => trans('Une erreur est survenue veuillez réessayer') 'error' => trans('Une erreur est survenue veuillez réessayer')
]); ]);
}//end try } //end try
} }
/** /**
@ -428,90 +438,96 @@ class MediaController extends Controller
*/ */
public function duplicateMedia(Media $media): JsonResponse public function duplicateMedia(Media $media): JsonResponse
{ {
/** @var \App\Models\User */ return DB::transaction(function () use ($media) {
$user = auth()->user(); /** @var \App\Models\User */
$user = auth()->user();
$user->authorizeRoles([ $user->authorizeRoles([
config('roles.const.ADMIN'), config('roles.const.ADMIN'),
config('roles.const.REDACTEUR'), config('roles.const.REDACTEUR'),
config('roles.const.CONTRIBUTEUR') 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.')
]); ]);
}
$clonedMedia = $media->replicate(); if ($media->isLocked) {
return \response()->json([
'status' => false,
'error' => trans('Le média est en attente d\'un retour d\'Arcadia.')
]);
}
$media->articles->map(function (Article $article) use ($clonedMedia) { $clonedMedia = $media->replicate();
$clonedMedia->articles()->attach($article);
// * Remove Arcadia ID (cloned is not linked to arcadia)
$clonedMedia->arcadia_id = null;
/** @var \Illuminate\Filesystem\FilesystemAdapter */
$storage = Storage::disk('media');
$clonedMedia->uid = Str::uuid();
$clonedMedia->extension = MediaExtension::jpg;
if (!Storage::exists('assets/images/default.jpg')) {
throw new \RuntimeException('Missing default picture');
}
$fileContent = Storage::get('assets/images/default.jpg');
if (!$storage->put($clonedMedia->relative_path, $fileContent)) {
throw new \RuntimeException('Failed to copy default picture');
}
$clonedMedia->libelle = Str::limit("{$clonedMedia->libelle}_copy", 45);
$clonedMedia->taille = \strlen($fileContent);
$dimensions = ToolboxHelper::getImageDimensions(Storage::path('assets/images/default.jpg'));
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->isDefault = true;
$clonedMedia->owner()->associate($user);
$clonedMedia->typeMedia()->associate(TypeMedia::getMediaType($clonedMedia->extension));
// ---- Creation des vignettes de base
$clonedMedia->createThumbnail();
// ---- Creation des vignettes en lien avec le sujet du média
$clonedMedia->createSubjectThumbnails();
$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);
});
/** @var \Illuminate\Filesystem\FilesystemAdapter */
$storage = Storage::disk('media');
$clonedMedia->uid = Str::uuid();
$clonedMedia->extension = MediaExtension::jpg;
if (!Storage::exists('assets/images/default.jpg')) {
throw new \RuntimeException('Missing default picture');
}
$fileContent = Storage::get('assets/images/default.jpg');
if (!$storage->put($clonedMedia->relative_path, $fileContent)) {
throw new \RuntimeException('Failed to copy default picture');
}
$clonedMedia->libelle = Str::limit("{$clonedMedia->libelle}_copy", 45);
$clonedMedia->taille = \strlen($fileContent);
$dimensions = ToolboxHelper::getImageDimensions(Storage::path('assets/images/default.jpg'));
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->isDefault = true;
$clonedMedia->owner()->associate($user);
$clonedMedia->typeMedia()->associate(TypeMedia::getMediaType($clonedMedia->extension));
// ---- Creation des vignettes de base
$clonedMedia->createThumbnail();
// ---- Creation des vignettes en lien avec le sujet du média
$clonedMedia->createSubjectThumbnails();
$clonedMedia->saveOrFail();
/** @throws \RuntimeException */
$clonedMedia->addToElasticSearch();
// * Get props inserted by DB.
$clonedMedia->refresh();
return \response()->json([
'status' => true,
'sujet_id' => $clonedMedia->sujet_id,
'datas' => $clonedMedia
]);
} }
/** /**
@ -744,15 +760,16 @@ class MediaController extends Controller
*/ */
public function getMediaOtherInfos(Media $media): JsonResponse public function getMediaOtherInfos(Media $media): JsonResponse
{ {
if (!($user = Auth::user())) { if (!auth()->check()) {
abort(401, 'Cette action n\'est pas autorisée.'); abort(401, 'Cette action n\'est pas autorisée.');
} }
$history = Historique::whereHas('media', function ($q) use ($media) { $history = Historique::query()
$q->whereId($media->id); ->whereHas('media', fn (Builder $q) => $q->where('id', $media->id))
})->with('user') ->with('user')
->orderBy('created_date', 'DESC') ->orderBy('created_date', 'DESC')
->get(); ->get();
return \response()->json([ return \response()->json([
'history' => $history, 'history' => $history,
'vignettes' => $this->getVignettesByMedia($media) 'vignettes' => $this->getVignettesByMedia($media)
@ -791,7 +808,7 @@ class MediaController extends Controller
/** @var boolean */ /** @var boolean */
$arcadia_id = collect($filters)->reduce(function (string|null $carry, array $item) { $arcadia_id = collect($filters)->reduce(function (string|null $carry, array $item) {
$item = collect($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 = []; $esConditions = [];
@ -825,21 +842,21 @@ class MediaController extends Controller
/** /**
* Elastic Search select appropriate Folder * Elastic Search select appropriate Folder
* *
* @param array $esMust * @param array $esMust ES conditions INCLURE TOUT (AND).
* @param array $esMustNot * @param array $esMustNot ES conditions EXCLURE.
* @param array $esShould * @param array $esShould ES conditions INCLURE AU MOINS (OR), avec un score.
* @param array $esFilters * @param \App\Http\Requests\Bo\LoadMediaRequest $request La request Lrvl.
* @param \App\Http\Requests\Bo\LoadMediaRequest $request * @param \App\Models\Dossier|null $dossier Le dossier concerné, si les Medias
* @param \App\Models\Dossier|null $dossier * doivent appartenir a celui-ci.
* @param \App\Models\Sujet $sujet * @param \App\Models\Sujet $sujet Le sujet concerné, si les Medias
* @param boolean $isDepot * doivent appartenir a celui-ci.
* @param boolean $isDepot Si les medias doivent se trouver dans le dossier dépot.
* @return void * @return void
*/ */
private function esFolderSearch( private function esFolderSearch(
array &$esMust, array &$esMust,
array &$esMustNot, array &$esMustNot,
array &$esShould, array &$esShould,
array &$esFilters,
LoadMediaRequest $request, LoadMediaRequest $request,
Dossier|null $dossier, Dossier|null $dossier,
Sujet $sujet, Sujet $sujet,
@ -848,6 +865,7 @@ class MediaController extends Controller
/** @var \App\Models\User */ /** @var \App\Models\User */
$user = auth()->user(); $user = auth()->user();
// ? Doivent être dans le dossier dépot ?
if ($isDepot) { if ($isDepot) {
// * Dossier dépôt // * Dossier dépôt
$esMust = array_merge($esMust, [[ $esMust = array_merge($esMust, [[
@ -856,21 +874,26 @@ class MediaController extends Controller
return; return;
} }
// ? N'est pas dans le dossier dépot ou racine ?
if (!$dossier) { if (!$dossier) {
if ($request->folder === -1) { // ? Recherche globale ?
if ($request->input('folder') === -1) {
// * Recherche globale . // * Recherche globale .
$esMust = array_merge($esMust, [ $esMust = array_merge($esMust, [
// * AND
\array_undot(['bool.must.match.sujet_id' => $sujet->codeSujet]) \array_undot(['bool.must.match.sujet_id' => $sujet->codeSujet])
]); ]);
} else { } else {
// * Dossier racine . // * Dossier racine .
$esMust = array_merge($esMust, [ $esMust = array_merge($esMust, [
// * AND
\array_undot(['bool.should.match.sujet_id' => $sujet->codeSujet]) \array_undot(['bool.should.match.sujet_id' => $sujet->codeSujet])
]); ]);
$esMustNot = array_merge($esMustNot, [ $esMustNot = array_merge($esMustNot, [
\array_undot(['exists.field' => 'dossier_id']) \array_undot(['exists.field' => 'dossier_id'])
]); ]);
} //end if } //end if
// * OR
$esShould = array_merge($esShould, [ $esShould = array_merge($esShould, [
\array_undot(['match.statut' => MediaStatut::public_etendu]), \array_undot(['match.statut' => MediaStatut::public_etendu]),
\array_undot(['match.statut' => MediaStatut::public]), \array_undot(['match.statut' => MediaStatut::public]),
@ -881,6 +904,7 @@ class MediaController extends Controller
// * Dossier classic . // * Dossier classic .
$esMust = array_merge($esMust, [[ $esMust = array_merge($esMust, [[
// * AND
\array_undot([ \array_undot([
'bool.must' => [ 'bool.must' => [
\array_undot(['match.sujet_id' => $sujet->codeSujet]), \array_undot(['match.sujet_id' => $sujet->codeSujet]),
@ -889,9 +913,13 @@ class MediaController extends Controller
]) ])
]]); ]]);
// ? User n'est pas ADMIN ?
if (!$user->hasRole(config('roles.const.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([ \array_undot([
// * OR
'bool.should' => [ 'bool.should' => [
\array_undot([ \array_undot([
'bool.must_not' => [[ 'bool.must_not' => [[
@ -1062,9 +1090,9 @@ class MediaController extends Controller
]; ];
$sys_extension = in_array($media->extension, [ $sys_extension = in_array($media->extension, [
MediaExtension::pdf, MediaExtension::pdf,
MediaExtension::ai, MediaExtension::ai,
MediaExtension::psd MediaExtension::psd
]) ? MediaExtension::png : $media->extension->value; ]) ? MediaExtension::png : $media->extension->value;
$vignettes['preview'] = [ $vignettes['preview'] = [

View file

@ -11,6 +11,8 @@ use Illuminate\Support\Str;
use App\Models\Panier; use App\Models\Panier;
use App\Models\Format; use App\Models\Format;
use App\Models\Media; use App\Models\Media;
use Illuminate\Contracts\View\View;
use Illuminate\Http\JsonResponse;
class PanierController extends Controller class PanierController extends Controller
{ {
@ -19,15 +21,16 @@ class PanierController extends Controller
/** /**
* Page principale des paniers * 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 */ /** @var \App\Models\User $user */
$user = \auth()->user(); $user = \auth()->user();
// ! Has to flush Media cache before querying basket with media list
/** @var \Illuminate\Database\Eloquent\Collection $paniers */ Media::flushQueryCache();
$paniers = $user->paniersOwner; $paniers = $user->paniersOwner;
return view('panier.index')->with([ return view('panier.index')->with([
'paniers' => $paniers, 'paniers' => $paniers,
]); ]);
@ -39,12 +42,12 @@ class PanierController extends Controller
* *
* @return \Illuminate\Http\JsonResponse * @return \Illuminate\Http\JsonResponse
*/ */
public function getBaskets() public function getBaskets(): JsonResponse
{ {
/** @var \App\Models\User $user */ /** @var \App\Models\User $user */
$user = \auth()->user(); $user = \auth()->user();
// ! Has to flush Media cache before querying basket with media list
/** @var \Illuminate\Database\Eloquent\Collection $paniers */ Media::flushQueryCache();
$paniers = $user->paniersOwner; $paniers = $user->paniersOwner;
return response()->json($paniers); return response()->json($paniers);
@ -56,16 +59,18 @@ class PanierController extends Controller
* @param \App\Http\Requests\Bo\Ajax\AddMediasBasketRequest $request * @param \App\Http\Requests\Bo\Ajax\AddMediasBasketRequest $request
* @return \Illuminate\Http\JsonResponse * @return \Illuminate\Http\JsonResponse
*/ */
public function addMediasBasket(AddMediasBasketRequest $request) public function addMediasBasket(AddMediasBasketRequest $request): JsonResponse
{ {
/** @var \App\Models\Panier $panier */ /** @var \App\Models\Panier $panier */
$panier = Panier::whereId($request->panier_id) $panier = Panier::query()
->with('mediaList')->firstOrFail(); ->where('id', $request->input('panier_id'))
->with('mediaList')
->firstOrFail();
// * Sync every media to basket // * Sync every media to basket
$panier->mediaList()->sync(array_merge( $panier->mediaList()->sync(array_merge(
$panier->mediaList()->pluck('id')->all(), $panier->mediaList()->pluck('id')->all(),
$request->mediaList $request->input('mediaList')
)); ));
return response()->json(); return response()->json();
@ -77,15 +82,18 @@ class PanierController extends Controller
* @param \App\Http\Requests\Bo\Ajax\RemoveMediasBasketRequest $request * @param \App\Http\Requests\Bo\Ajax\RemoveMediasBasketRequest $request
* @return \Illuminate\Http\JsonResponse * @return \Illuminate\Http\JsonResponse
*/ */
public function removeMediasBasket(RemoveMediasBasketRequest $request) public function removeMediasBasket(RemoveMediasBasketRequest $request): JsonResponse
{ {
/** @var \App\Models\Panier $panier */ /** @var \App\Models\Panier $panier */
$panier = Panier::whereId($request->panier_id) $panier = Panier::query()
->with('mediaList')->firstOrFail(); ->where('id', $request->input('panier_id'))
->with('mediaList')
->firstOrFail();
/** @var \App\Models\Media $media */ /** @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); $panier->mediaList()->detach($media);
@ -98,13 +106,13 @@ class PanierController extends Controller
* @param \App\Http\Requests\Bo\Ajax\CreateBasketRequest $request * @param \App\Http\Requests\Bo\Ajax\CreateBasketRequest $request
* @return \Illuminate\Http\JsonResponse * @return \Illuminate\Http\JsonResponse
*/ */
public function createBasket(CreateBasketRequest $request) public function createBasket(CreateBasketRequest $request): JsonResponse
{ {
/** @var \App\Models\User $user */ /** @var \App\Models\User $user */
$user = auth()->user(); $user = auth()->user();
$panier = new Panier(); $panier = new Panier();
$panier->libelle = $request->title; $panier->libelle = $request->input('title');
$panier->uid = Str::uuid(); $panier->uid = Str::uuid();
$panier->owner()->associate($user); $panier->owner()->associate($user);
$panier->saveOrFail(); $panier->saveOrFail();
@ -118,10 +126,12 @@ class PanierController extends Controller
* @param \App\Http\Requests\Bo\Ajax\DestroyBasketRequest $request * @param \App\Http\Requests\Bo\Ajax\DestroyBasketRequest $request
* @return \Illuminate\Http\JsonResponse * @return \Illuminate\Http\JsonResponse
*/ */
public function destroyBasket(DestroyBasketRequest $request) public function destroyBasket(DestroyBasketRequest $request): JsonResponse
{ {
/** @var \App\Models\Panier $basket */ /** @var \App\Models\Panier $basket */
$basket = Panier::whereId($request->basket_id)->firstOrFail(); $basket = Panier::query()
->where('id', $request->input('basket_id'))
->firstOrFail();
$basket->deleteOrFail(); $basket->deleteOrFail();
@ -134,9 +144,9 @@ class PanierController extends Controller
* Page publique d'un panier * Page publique d'un panier
* *
* @param \App\Models\Panier $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 */ /** @var \App\Models\User|null $user */
$user = auth()->user(); $user = auth()->user();
@ -150,9 +160,12 @@ class PanierController extends Controller
} }
/** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Format> $formats */ /** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Format> $formats */
$formats = Format::withoutGlobalScope('App\Scopes\SystemScope') $formats = Format::query()
->where('system', true)->get(); ->withoutGlobalScope('App\Scopes\SystemScope')
return view('panier.show')->with([ ->where('system', true)
->get();
return view('panier.show', [
'panier' => $panier, 'panier' => $panier,
'formats' => $formats, 'formats' => $formats,
]); ]);
@ -164,10 +177,12 @@ class PanierController extends Controller
* @param \App\Http\Requests\Bo\Ajax\SaveBasketPropsRequest $request * @param \App\Http\Requests\Bo\Ajax\SaveBasketPropsRequest $request
* @return \Illuminate\Http\JsonResponse * @return \Illuminate\Http\JsonResponse
*/ */
public function saveBasketProperty(SaveBasketPropsRequest $request) public function saveBasketProperty(SaveBasketPropsRequest $request): JsonResponse
{ {
/** @var \App\Models\Panier $panier */ /** @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->fill($request->validated());
$panier->saveOrFail(); $panier->saveOrFail();

View file

@ -15,6 +15,7 @@ use App\Models\Sujet;
use App\Models\TypeMedia; use App\Models\TypeMedia;
use App\Models\User; use App\Models\User;
use App\Traits\Http\HandlesMedia; use App\Traits\Http\HandlesMedia;
use Illuminate\Contracts\Database\Eloquent\Builder;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Http\UploadedFile; use Illuminate\Http\UploadedFile;
@ -97,7 +98,7 @@ class UploadController extends Controller
// 400 instead of 422 is for resumablejs to handle properly. // 400 instead of 422 is for resumablejs to handle properly.
return \response()->json($e->errors(), 400); return \response()->json($e->errors(), 400);
} }
}//end if } //end if
// We are in chunk mode, lets send the current progress. // We are in chunk mode, lets send the current progress.
/** @var AbstractHandler $handler */ /** @var AbstractHandler $handler */
@ -143,12 +144,11 @@ class UploadController extends Controller
$this->validateUploadedFile($uplodedFile); $this->validateUploadedFile($uplodedFile);
/** @var \App\Models\Media */ /** @var \App\Models\Media */
$media = Media::whereId($request->media_id) $media = Media::query()
->whereHas('sujet', function ($q) use ($sujet) { ->where('id', $request->input('media_id'))
$q->whereId($sujet->id); ->whereHas('sujet', fn (Builder $q) => $q->where('codeSujet', $sujet->codeSujet))
})->whereHas('dossier', function ($q) use ($dossier) { ->whereHas('dossier', fn (Builder $q) => $q->where('id', $dossier->id))
$q->whereId($dossier->id); ->firstOrNew();
})->firstOrNew();
// Save the file and return any response you need. // Save the file and return any response you need.
return $this->createOrUpdateMedia($user, $uplodedFile, $media, $dossier, $sujet); return $this->createOrUpdateMedia($user, $uplodedFile, $media, $dossier, $sujet);
@ -156,7 +156,7 @@ class UploadController extends Controller
// 400 instead of 422 is for resumablejs to handle properly. // 400 instead of 422 is for resumablejs to handle properly.
return \response()->json($e->errors(), 400); return \response()->json($e->errors(), 400);
} }
}//end if } //end if
// We are in chunk mode, lets send the current progress. // We are in chunk mode, lets send the current progress.
/** @var AbstractHandler $handler */ /** @var AbstractHandler $handler */

View file

@ -5,6 +5,13 @@ namespace App\Models;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Carbon\Carbon; 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 class ArcadiaLink extends Model
{ {
// * GETTERS // * GETTERS

View file

@ -4,6 +4,7 @@ namespace App\Models;
use App\Enums\MediaStatut; use App\Enums\MediaStatut;
use App\Models\User; use App\Models\User;
use Illuminate\Contracts\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Auth;
@ -73,19 +74,24 @@ class Dossier extends Model
/** @var \App\Model\User $user */ /** @var \App\Model\User $user */
$user = Auth::user(); $user = Auth::user();
// * dossier classic // ? Est un dossier dépot ou racine ?
if ($this->parent_id != 1 && $this->id != 1) { if ($this->parent_id === 1 or $this->id === 1) {
if ($user->hasRole(config('roles.const.ADMIN'))) { // * Dossier dépôt
return $this->mediaList()->count();
} else {
return $this->mediaList()
->where('statut', '<>', MediaStatut::brouillon)
->orWhere('created_by', $user->id)->count();
}
} else {
// * dossier dépôt
return $this->mediaList()->count(); 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 // * RELATIONSHIPS
@ -120,7 +126,7 @@ class Dossier extends Model
*/ */
public function mediaList() public function mediaList()
{ {
return $this->hasMany(Media::class, 'dossier_id', 'id'); return $this->hasMany(Media::class);
} }
/** /**

View file

@ -48,4 +48,24 @@ class Historique extends Model
{ {
return $this->belongsTo(Media::class); 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()
]
]
);
}
} }

View file

@ -259,6 +259,16 @@ class Media extends Model
// * Laravel Behaviors // * 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 * Set the base cache tags that will be present
* on all queries. * on all queries.
@ -457,7 +467,7 @@ class Media extends Model
*/ */
public function paniers() public function paniers()
{ {
return $this->belongsToMany(Panier::class); return $this->belongsToMany(Panier::class, 'panier_media');
} }
// * METHODS // * METHODS
@ -723,7 +733,7 @@ class Media extends Model
// * create preview // * create preview
/** @var \App\Models\Format $format */ /** @var \App\Models\Format $format */
$format = Format::withoutGlobalScope('App\Scopes\SystemScope') $format = Format::withoutGlobalScope('App\Scopes\SystemScope')
->where('libelle', '=', 'preview')->firstOrFail(); ->where('libelle', '=', 'preview')->firstOrFail();
if ($this->extension == MediaExtension::gif) { if ($this->extension == MediaExtension::gif) {
if ($this->largeur >= $format->largeur || $this->hauteur >= $format->hauteur || $this->largeur == "") { if ($this->largeur >= $format->largeur || $this->hauteur >= $format->hauteur || $this->largeur == "") {
@ -753,7 +763,7 @@ class Media extends Model
// * create thumb // * create thumb
/** @var \App\Models\Format $format */ /** @var \App\Models\Format $format */
$format = Format::withoutGlobalScope('App\Scopes\SystemScope') $format = Format::withoutGlobalScope('App\Scopes\SystemScope')
->where('libelle', '=', 'thumb')->firstOrFail(); ->where('libelle', '=', 'thumb')->firstOrFail();
if ($this->extension != MediaExtension::png) { if ($this->extension != MediaExtension::png) {
$im->setImageBackgroundColor('#ffffff'); $im->setImageBackgroundColor('#ffffff');
$im->setImageAlphaChannel(\Imagick::ALPHACHANNEL_REMOVE); $im->setImageAlphaChannel(\Imagick::ALPHACHANNEL_REMOVE);

View file

@ -6,6 +6,36 @@ use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable; 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 class User extends Authenticatable
{ {
use HasFactory; use HasFactory;

View file

@ -2,7 +2,6 @@
namespace App\Providers; namespace App\Providers;
use Illuminate\Pagination\Paginator;
use Illuminate\Support\Carbon; use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\App; use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\URL; use Illuminate\Support\Facades\URL;
@ -26,10 +25,12 @@ class AppServiceProvider extends ServiceProvider
return $url->current(); return $url->current();
}); });
} }
// * LOCAL HTTPS FIX // * LOCAL HTTPS FIX
if (!in_array(config('app.env'), ['local', 'testing'])) { if (!in_array(config('app.env'), ['local', 'testing'])) {
URL::forceScheme('https'); URL::forceScheme('https');
} }
// * HA PROXY FIX // * HA PROXY FIX
App::singleton('clientIp', function () { App::singleton('clientIp', function () {
if (config('app.env') == 'local') { if (config('app.env') == 'local') {
@ -38,6 +39,7 @@ class AppServiceProvider extends ServiceProvider
return request()->server('HTTP_X_FORWARDED_FOR') ?? request()->getClientIp(); return request()->server('HTTP_X_FORWARDED_FOR') ?? request()->getClientIp();
} }
}); });
// * LOCAL FORCE eg: for Carbon // * LOCAL FORCE eg: for Carbon
foreach ([\LC_TIME, \LC_MESSAGES, \LC_COLLATE, \LC_CTYPE, \LC_MONETARY] as $category) { foreach ([\LC_TIME, \LC_MESSAGES, \LC_COLLATE, \LC_CTYPE, \LC_MONETARY] as $category) {
setlocale( setlocale(
@ -47,9 +49,5 @@ class AppServiceProvider extends ServiceProvider
); );
} }
Carbon::setLocale(config('app.locale')); Carbon::setLocale(config('app.locale'));
if (!app()->runningInConsole()) {
// * FORCE BOOTSTRAP PAGINATOR (or custom if in front)
Paginator::useBootstrap();
}//end if
} }
} }

View file

@ -41,12 +41,9 @@ class RouteServiceProvider extends ServiceProvider
->group(base_path('routes/api.php')); ->group(base_path('routes/api.php'));
}); });
Route::bind('media', function ($value) {
return Media::whereUid($value)->firstOrFail();
});
Route::bind('basket_uuid', function ($value) { Route::bind('basket_uuid', function ($value) {
return Panier::where('uid', $value) return Panier::where('uid', $value)
->with('owner')->firstOrFail(); ->with('owner')->firstOrFail();
}); });
// * API // * API

View 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

File diff suppressed because it is too large Load diff

View file

@ -169,7 +169,7 @@ return [
* Package Service Providers... * Package Service Providers...
*/ */
Elasticquent\ElasticquentServiceProvider::class, Elasticquent\ElasticquentServiceProvider::class,
/* /*
* Application Service Providers... * Application Service Providers...
@ -178,7 +178,8 @@ return [
App\Providers\AppServiceProvider::class, App\Providers\AppServiceProvider::class,
App\Providers\AuthServiceProvider::class, App\Providers\AuthServiceProvider::class,
App\Providers\EventServiceProvider::class, App\Providers\EventServiceProvider::class,
App\Providers\RouteServiceProvider::class App\Providers\RouteServiceProvider::class,
App\Providers\ViewServiceProvider::class
], ],

View file

@ -1,5 +1,6 @@
<?php <?php
// TODO: Pass this as an enum.
return [ return [
'const' => [ 'const' => [
'ADMIN' => '1', 'ADMIN' => '1',

View file

@ -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

File diff suppressed because it is too large Load diff

View file

@ -1,4 +1,5 @@
{ {
"name": "srcs",
"private": true, "private": true,
"scripts": { "scripts": {
"dev": "npm run development", "dev": "npm run development",

View file

@ -224,7 +224,7 @@ export default {
} else { } else {
this.$loading.show({ delay: 0 }); this.$loading.show({ delay: 0 });
axios axios
.post(`/ajax/media/${this.storeGrabbed[0].id}/duplicate`) .post(`/ajax/media/${this.storeGrabbed[0].uid}/duplicate`)
.then((response) => { .then((response) => {
this.$loading.hide(); this.$loading.hide();
if (response.data.status === true) { if (response.data.status === true) {

View file

@ -292,7 +292,7 @@ export default {
}, },
SaveMedia() { SaveMedia() {
axios axios
.put(`/ajax/media/${this.storeMedia.id}`, { .put(`/ajax/media/${this.storeMedia.uid}`, {
media: this.storeMedia, media: this.storeMedia,
}) })
.then((response) => { .then((response) => {

View file

@ -20,7 +20,7 @@
item.user.matricule item.user.matricule
}}) }})
</td> </td>
<td>{{ item.type }}</td> <td>{{ item.type.label }}</td>
<td>{{ item.description }}</td> <td>{{ item.description }}</td>
</tr> </tr>
</tbody> </tbody>

View file

@ -1,36 +1,48 @@
@extends('layouts.app') @extends('layouts.app')
@include('layouts.header') @include('layouts.header')
@section('content') @section('content')
<main class="user_index template_2col"> <main class="user_index template_2col">
@include('modules.param-sideMenu') @include('modules.param-sideMenu')
<div class="main_content"> <div class="main_content">
<div class="heading"> <div class="heading">
<h1>Anomalies du lien Arcadia</h1> <h1>{{ __('Anomalies du lien Arcadia') }}</h1>
</div> </div>
<table class="datatable"> <table class="datatable">
<thead> <thead>
<tr> <tr>
<th>ID</th> <th>{{ __('ID') }}</th>
<th>Media ID (DAM ID)</th> <th>{{ __('Media ID (DAM ID)') }}</th>
<th>Arcadia ID</th> <th>{{ __('Arcadia ID') }}</th>
<th>Filename</th> <th>{{ __('Filename') }}</th>
<th>Date création ZIP</th> <th>{{ __('Date création ZIP') }}</th>
<th></th> <th></th>
<th></th> <th></th>
</tr> </tr>
</thead> </thead>
@foreach ($ano as $line) @foreach ($arcadiaLinkList as $arcadiaLink)
<tr class="data_row"> <tr class="data_row">
<td>{{$line->id}}</td> <td>{{ $arcadiaLink->id }}</td>
<td>{{$line->media_id}}</td> <td>{{ $arcadiaLink->media->id }}</td>
<td>{{$line->arcadia_id}}</td> <td>{{ $arcadiaLink->arcadia_id }}</td>
<td>{{$line->filename}}</td> <td>{{ $arcadiaLink->filename }}</td>
<td>{{$line->date_f}}</td> <td>{{ $arcadiaLink->date_f }}</td>
<td><a href="/media/{{$line->media_uuid}}" target="_blank">Ouvrir la fiche média</a></td> <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> <a href="{{ route('media.show', $arcadiaLink->media) }}"
</tr> title="{{ __('Ouvrir la fiche média dans un nouvel onglet') }}" target="_blank">
@endforeach {{ __('Ouvrir la fiche média') }}
</table> </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> </div>
</main> </main>
@endsection @endsection

View file

@ -73,11 +73,11 @@ Route::post('/ajax/add-depot-folder', [DossierController::class, 'addDepotFolder
// * Ajax pour la gestion de l'upload de média . // * Ajax pour la gestion de l'upload de média .
Route::post('/ajax/upload-media/depot', [UploadController::class, 'uploadMediaFileIntoDepot']) 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']) Route::post('/ajax/upload-media/{sujet}/{dossier}', [UploadController::class, 'uploadMediaFile'])
->name('media.upload'); ->name('media.upload');
// * Les pages Front panier public. // * Les pages Front panier public.
Route::get('/basket/{basket_uuid}', [PanierController::class, 'showBasket']); Route::get('/basket/{basket_uuid}', [PanierController::class, 'showBasket']);
Route::post('/ajax/download-media-public/{format?}', [MediaController::class, 'downloadMediaPublic']) Route::post('/ajax/download-media-public/{format?}', [MediaController::class, 'downloadMediaPublic'])
->name('downloadMediaPublic'); ->name('downloadMediaPublic');