This commit is contained in:
Jérémy Munsch 2023-12-14 15:47:30 +01:00 • committed by Noah Lancien
parent d62b1d513f
commit bc4a8f64ae
3 changed files with 44 additions and 25 deletions

View file

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

View file

@ -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' => [[

View file

@ -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);
}
/**