diff --git a/app/Http/Controllers/DossierController.php b/app/Http/Controllers/DossierController.php index 26d1e26..9cba5f8 100644 --- a/app/Http/Controllers/DossierController.php +++ b/app/Http/Controllers/DossierController.php @@ -19,6 +19,7 @@ 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; @@ -81,16 +82,22 @@ class DossierController extends Controller $foldersCollection = $foldersCollection->merge($depotQuery); } - $folders['data'] = new NestedDossiersListResource($foldersCollection); - $folders['racineCount'] = Media::query() - ->whereHas('sujet', fn (Builder $q) => $q->where('id', $request->input('sujet_id'))) - ->whereDoesntHave('dossier') - ->where( + 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(); + ); + } + Arr::set($folders, 'racineCount', $racineCountQuery->count()); return response()->json($folders); } @@ -108,7 +115,7 @@ class DossierController extends Controller $response = []; $response['variantes'] = Variante::query() - ->whereHas('sujet', fn (Builder $q) => $q->where('id', $request->input('sujetId'))) + ->whereHas('sujet', fn (Builder $q) => $q->where('codeSujet', $request->input('sujetId'))) ->get(); /** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Format> */ $FormatsSujet = Format::query() diff --git a/app/Http/Controllers/MediaController.php b/app/Http/Controllers/MediaController.php index 0b477ff..f652b88 100644 --- a/app/Http/Controllers/MediaController.php +++ b/app/Http/Controllers/MediaController.php @@ -166,7 +166,7 @@ class MediaController extends Controller $filters = (object)collect($request->input('filters'))->all(); /** @var boolean Est un dossier Dépot ? */ - $isDepot = !empty($dossier) and (\optional($dossier->dossierParent)->id === 1 || $dossier->id === 1); + $isDepot = !empty($dossier) && (\optional($dossier->dossierParent)->id === 1 || $dossier->id === 1); /** * Elastic Search must conditions @@ -210,7 +210,6 @@ class MediaController extends Controller $esMust, $esMustNot, $esShould, - $esFilters, $request, $dossier, $sujet, @@ -837,21 +836,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, @@ -860,6 +859,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, [[ @@ -868,21 +868,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]), @@ -893,6 +898,7 @@ class MediaController extends Controller // * Dossier classic . $esMust = array_merge($esMust, [[ + // * AND \array_undot([ 'bool.must' => [ \array_undot(['match.sujet_id' => $sujet->codeSujet]), @@ -901,9 +907,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' => [[ diff --git a/app/Models/Dossier.php b/app/Models/Dossier.php index 31f435b..ab35819 100644 --- a/app/Models/Dossier.php +++ b/app/Models/Dossier.php @@ -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,8 +74,8 @@ class Dossier extends Model /** @var \App\Model\User $user */ $user = Auth::user(); - // ? Est un dossier dépot ? - if ($this->parent_id === 1 && $this->id === 1) { + // ? Est un dossier dépot ou racine ? + if ($this->parent_id === 1 or $this->id === 1) { // * Dossier dépôt return $this->mediaList()->count(); } @@ -88,8 +89,9 @@ class Dossier extends Model // * Tous les non brouillons ou crées par le user return $this->mediaList() - ->where('statut', '<>', MediaStatut::brouillon) - ->orWhere('created_by', $user->id); + ->where(fn (Builder $q) => $q->where('statut', '!=', MediaStatut::brouillon) + ->orWhere('created_by', $user->id)) + ->count(); } // * RELATIONSHIPS @@ -124,7 +126,7 @@ class Dossier extends Model */ public function mediaList() { - return $this->hasMany(Media::class, 'dossier_id', 'id'); + return $this->hasMany(Media::class); } /**