user(); // ! Has to flush Media cache before querying basket with media list Media::flushQueryCache(); $paniers = $user->paniersOwner; return view('panier.index')->with([ 'paniers' => $paniers, ]); } // * AJAX /** * Get user baskets * * @return \Illuminate\Http\JsonResponse */ public function getBaskets(): JsonResponse { /** @var \App\Models\User $user */ $user = \auth()->user(); // ! Has to flush Media cache before querying basket with media list Media::flushQueryCache(); $paniers = $user->paniersOwner; return response()->json($paniers); } /** * Ajout de média à un panier * * @param \App\Http\Requests\Bo\Ajax\AddMediasBasketRequest $request * @return \Illuminate\Http\JsonResponse */ public function addMediasBasket(AddMediasBasketRequest $request): JsonResponse { /** @var \App\Models\Panier $panier */ $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->input('mediaList') )); return response()->json(); } /** * Suppression de média à un panier * * @param \App\Http\Requests\Bo\Ajax\RemoveMediasBasketRequest $request * @return \Illuminate\Http\JsonResponse */ public function removeMediasBasket(RemoveMediasBasketRequest $request): JsonResponse { /** @var \App\Models\Panier $panier */ $panier = Panier::query() ->where('id', $request->input('panier_id')) ->with('mediaList') ->firstOrFail(); /** @var \App\Models\Media $media */ $media = Media::query() ->where('id', $request->input('media_id')) ->firstOrFail(); $panier->mediaList()->detach($media); return response()->json(true); } /** * Ajoute un panier * * @param \App\Http\Requests\Bo\Ajax\CreateBasketRequest $request * @return \Illuminate\Http\JsonResponse */ public function createBasket(CreateBasketRequest $request): JsonResponse { /** @var \App\Models\User $user */ $user = auth()->user(); $panier = new Panier(); $panier->libelle = $request->input('title'); $panier->uid = Str::uuid(); $panier->owner()->associate($user); $panier->saveOrFail(); return response()->json($panier); } /** * Supprimer un panier * * @param \App\Http\Requests\Bo\Ajax\DestroyBasketRequest $request * @return \Illuminate\Http\JsonResponse */ public function destroyBasket(DestroyBasketRequest $request): JsonResponse { /** @var \App\Models\Panier $basket */ $basket = Panier::query() ->where('id', $request->input('basket_id')) ->firstOrFail(); $basket->deleteOrFail(); return response()->json(); } // * FO /** * Page publique d'un panier * * @param \App\Models\Panier $panier * @return \Illuminate\Contracts\View\View */ public function showBasket(Panier $panier): View { /** @var \App\Models\User|null $user */ $user = auth()->user(); // * Ne pas afficher le panier si il n'est pas pas publié et // * que l'utilisateur n'est pas le propiétaire if (!$panier->statut) { if (!$user or \optional($panier->owner)->id !== $user->id) { abort(404); } } /** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Format> $formats */ $formats = Format::query() ->withoutGlobalScope('App\Scopes\SystemScope') ->where('system', true) ->get(); return view('panier.show', [ 'panier' => $panier, 'formats' => $formats, ]); } /** * Enregistre les propriétés d'un panier * * @param \App\Http\Requests\Bo\Ajax\SaveBasketPropsRequest $request * @return \Illuminate\Http\JsonResponse */ public function saveBasketProperty(SaveBasketPropsRequest $request): JsonResponse { /** @var \App\Models\Panier $panier */ $panier = Panier::query() ->where('id', $request->input('basket_id')) ->firstOrFail(); $panier->fill($request->validated()); $panier->saveOrFail(); return response()->json($panier); } }