ldc-dam/app/Http/Controllers/DossierController.php
Jérémy Munsch bc4a8f64ae Fixes #6
2025-05-06 11:01:28 +02:00

329 lines
12 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Enums\MediaStatut;
use App\Http\Requests\Bo\Ajax\FetchFoldersRequest;
use App\Http\Requests\Bo\Ajax\LoadFoldersRequest;
use App\Http\Requests\Bo\Folders\StoreDepotFolderRequest;
use App\Http\Requests\Bo\Folders\StoreFolderRequest;
use App\Http\Requests\Bo\Folders\UpdateFolderRequest;
use App\Http\Resources\NestedDossiersListResource;
use App\Models\Dossier;
use App\Models\Sujet;
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;
class DossierController extends Controller
{
/**
* Ajax Load folders
*
* @param \App\Http\Requests\Bo\Ajax\LoadFoldersRequest $request
* @return \Illuminate\Http\JsonResponse
*/
public function loadFolders(LoadFoldersRequest $request): JsonResponse
{
/** @var \App\Models\User */
$user = Auth::user();
$folders = [];
$select = ['id', 'libelle', 'system'];
/** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Dossier> Dossiers publiques */
$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.
/** @var \Illuminate\Database\Eloquent\Builder */
$privateQuery = Dossier::query()
->whereHas('sujet', fn (Builder $q) => $q->where('codeSujet', $request->input('sujet_id')))
->where('is_private', true)
->select($select);
// ? 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', 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)
->sortBy('favoris')->values();
// ? 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::query()
->whereDoesntHave('dossierParent')
->where('system', true)
->orderBy('libelle', 'ASC')
->get();
$foldersCollection = $foldersCollection->merge($depotQuery);
}
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)
);
}
Arr::set($folders, 'racineCount', $racineCountQuery->count());
return response()->json($folders);
}
/**
* Chargement des dossiers
*
* @param \App\Http\Requests\Bo\Ajax\FetchFoldersRequest $request
* @return \Illuminate\Http\JsonResponse
*/
public function loadFolder(FetchFoldersRequest $request): JsonResponse
{
/** @var \App\Models\User */
$user = auth()->user();
$response = [];
$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::query()
->whereHas('sujets', fn (Builder $q) => $q->where('sujet_id', $request->input('sujetId')))
->get();
/** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Format> */
$FormatsSystem = Format::query()
->withoutGlobalScope('App\Scopes\SystemScope')
->where('system', true)->get();
$response['formats'] = $FormatsSujet->merge($FormatsSystem);
$response['draggable'] = $user->hasRole([config('roles.const.ADMIN'), config('roles.const.REDACTEUR')]);
// Envoi du role .
$response['role'] = $user->role;
return \response()->json($response);
}
// * CRUD
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
/** @var \App\Models\User */
$user = auth()->user();
$user->authorizeRoles(config('roles.const.ADMIN'));
/** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Dossier> */
$dossiers = Dossier::query()
->whereDoesntHave('dossierParent')
->where('system', false)
->orderBy('libelle', 'asc')
->get();
/** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Sujet> */
$sujets = Sujet::query()->where('sujet_dam', true)->get();
return view('dossiers.index', [
'dossiers' => $dossiers,
'sujets' => $sujets,
]);
}
/**
* Show the form for creating a new resource.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Contracts\View\View|\Illuminate\Contracts\View\Factory
*/
public function create(Request $request)
{
if ($request->sub) {
/** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Dossier> */
$dossiers = Dossier::query()
->whereDoesntHave('dossierParent')
->where('system', false)
->orderBy('libelle', 'asc')->get();
return view('dossiers.create-sub', [
'dossiers' => $dossiers
]);
}
/** @var \App\Models\User */
$user = auth()->user();
$user->authorizeRoles(config('roles.const.ADMIN'));
$marques = Marque::all();
/** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Sujet> */
$sujets = Sujet::query()->where('sujet_dam', true)->get();
return view('dossiers.create')->with([
'marques' => $marques,
'sujets' => $sujets
]);
}
/**
* Store a newly created resource in storage.
*
* @param \App\Http\Requests\Bo\Folders\StoreFolderRequest $request
* @return \Illuminate\Http\Response
*/
public function store(StoreFolderRequest $request)
{
DB::transaction(function () use ($request) {
/** @var \App\Models\User */
$user = auth()->user();
$user->authorizeRoles(config('roles.const.ADMIN'));
// ---- Le dossier
$dossier = new Dossier();
$dossier->fill($request->validated());
if ($request->sub) {
/** @var \App\Models\Dossier */
$parent_dossier = Dossier::query()->findOrFail($request->input('parent_id'));
$dossier->sujet()->associate($parent_dossier->sujet);
} else {
$dossier->sujet()->associate($request->input('sujet'));
}
if ($dossier->saveOrFail()) {
// ---- Les 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é');
}
});
return back();
}
/**
* Show the form for editing the specified resource.
*
* @param \App\Models\Dossier $dossier
* @return \Illuminate\Contracts\View\View|\Illuminate\Contracts\View\Factory
*/
public function edit(Dossier $dossier)
{
/** @var \App\Models\User */
$user = auth()->user();
$user->authorizeRoles(config('roles.const.ADMIN'));
$marques = Marque::all();
/** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Marque> */
$dossierMarques = $dossier->marques;
/** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Sujet> */
$dossierSujets = $dossier->sujets;
/** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Sujet> */
$sujets = Sujet::query()->where('sujet_dam', true)->get();
return view('dossiers.edit', [
'dossier' => $dossier,
'dossierMarques' => $dossierMarques,
'marques' => $marques,
'sujets' => $sujets
]);
}
/**
* Update the specified resource in storage.
*
* @param \App\Http\Requests\Bo\Folders\UpdateFolderRequest $request
* @param \App\Models\Dossier $dossier
* @return \Illuminate\Http\RedirectResponse
*/
public function update(UpdateFolderRequest $request, Dossier $dossier): RedirectResponse
{
DB::transaction(function () use ($request, $dossier) {
/** @var \App\Models\User */
$user = auth()->user();
$user->authorizeRoles(config('roles.const.ADMIN'));
// ---- Le dossier
$dossier->fill($request->validated());
if ($dossier->saveOrFail()) {
// ---- Les marques
if ($request->marques) {
$dossier->marques()->sync($request->marques);
}
return redirect()->route('dossier.edit', ['dossier' => $dossier])
->with('success', trans('Le dossier a été mis à jour'));
}
});
return back();
}
/**
* Remove the specified resource from storage.
*
* @param \App\Models\Dossier $dossier
* @return \Illuminate\Http\RedirectResponse
*/
public function destroy(Dossier $dossier): RedirectResponse
{
/** @var \App\Models\User */
$user = auth()->user();
$user->authorizeRoles(config('roles.const.ADMIN'));
if ($dossier->deleteOrFail()) {
return \response()->redirectToRoute('dossier.index')
->with('warning', trans('Le dossier à été supprimé'));
}
return back();
}
/**
* Ajouter un dossier de dépôt
*
* @param \App\Http\Requests\Bo\Folders\StoreDepotFolderRequest $request
* @return \Illuminate\Http\JsonResponse
*/
public function addDepotFolder(StoreDepotFolderRequest $request): JsonResponse
{
// ---- Le dossier
$dossier = new Dossier($request->validated());
$dossier->parent_id = 1;
$dossier->system = true;
$dossier->saveOrFail();
return \response()->json([
'folder_id' => $dossier->id
]);
}
}