diff --git a/app/Http/Controllers/PanierController.php b/app/Http/Controllers/PanierController.php index a1f5c8c..5ff969f 100644 --- a/app/Http/Controllers/PanierController.php +++ b/app/Http/Controllers/PanierController.php @@ -2,156 +2,176 @@ namespace App\Http\Controllers; -use Illuminate\Http\Request; -use Illuminate\Support\Facades\Auth; +use App\Http\Requests\Bo\AjaxAddMediasBasketRequest; +use App\Http\Requests\Bo\AjaxCreateBasketRequest; +use App\Http\Requests\Bo\AjaxDestroyBasketRequest; +use App\Http\Requests\Bo\AjaxRemoveMediasBasketRequest; +use App\Http\Requests\Bo\AjaxSaveBasketPropsRequest; +use Illuminate\Support\Str; use App\Models\Panier; -use App\Models\Media; use App\Models\Format; +use App\Models\Media; class PanierController extends Controller { - /** + // * BO + + /** * Page principale des paniers * - * @return \Illuminate\Http\Response + * @return \Illuminate\View\View|\Illuminate\Contracts\View\Factory */ - public function index(Request $request) + public function index() { - $paniers = Auth::user()->paniersOwner; - return view('panier.index')->with([ - 'paniers'=> $paniers, - ]); + /** @var \App\User $user */ + $user = \auth()->user(); + /** @var \Illuminate\Database\Eloquent\Collection $paniers */ + $paniers = $user->paniersOwner; + return view('panier.index')->with([ + 'paniers' => $paniers, + ]); } - public function getBaskets(Request $request) + // * AJAX + /** + * Get user baskets + * + * @return \Illuminate\Http\JsonResponse + */ + public function getBaskets() { - return Auth::user()->paniersOwner; + /** @var \App\User $user */ + $user = \auth()->user(); + + /** @var \Illuminate\Database\Eloquent\Collection $paniers */ + $paniers = $user->paniersOwner; + + return response()->json($paniers); } - /** + /** + * Ajout de média à un panier + * + * @param AjaxAddMediasBasketRequest $request + * @return \Illuminate\Http\JsonResponse + */ + public function addMediasBasket(AjaxAddMediasBasketRequest $request) + { + /** @var \App\Models\Panier $panier */ + $panier = Panier::whereId($request->panier_id) + ->with('medias')->firstOrFail(); + + // * Sync every media to basket + $panier->medias()->sync(array_merge( + $panier->medias()->pluck('id')->all(), + $request->medias + )); + + return response()->json(); + } + + /** + * Suppression de média à un panier + * + * @param AjaxRemoveMediasBasketRequest $request + * @return \Illuminate\Http\JsonResponse + */ + public function removeMediasBasket(AjaxRemoveMediasBasketRequest $request) + { + + /** @var \App\Models\Panier $panier */ + $panier = Panier::whereId($request->panier_id) + ->with('medias')->firstOrFail(); + + /** @var \App\Models\Media $media */ + $media = Media::whereId($request->media_id)->firstOrFail(); + + $panier->medias()->detach($media); + + return response()->json(true); + } + + /** + * Ajoute un panier + * + * @param AjaxCreateBasketRequest $request + * @return \Illuminate\Http\JsonResponse + */ + public function createBasket(AjaxCreateBasketRequest $request) + { + /** @var \App\Models\User $user */ + $user = auth()->user(); + + $panier = new Panier(); + $panier->libelle = $request->title; + $panier->uid = Str::uuid(); + $panier->owner()->associate($user); + $panier->saveOrFail(); + + return response()->json($panier); + } + + /** + * Supprimer un panier + * + * @param AjaxDestroyBasketRequest $request + * @return \Illuminate\Http\JsonResponse + */ + public function destroyBasket(AjaxDestroyBasketRequest $request) + { + /** @var \App\Models\Panier $basket */ + $basket = Panier::whereId($request->basket_id)->firstOrFail(); + + // TODO: Replace this with deleteOrFail after laravel bump. + $basket->delete(); + + return response()->json(); + } + + // * FO + + /** * Page publique d'un panier * - * @return \Illuminate\Http\Response + * @param Panier $panier + * @return \Illuminate\View\View|\Illuminate\Contracts\View\Factory */ - public function showBasket(Request $request) + public function showBasket(Panier $panier) { - $panier_uid = $request->basket_uid; - $formats = Format::withoutGlobalScope('App\Scopes\SystemScope')->where('system', 1)->get(); - $panier = Panier::where('uid', $panier_uid)->first(); - if($panier && $panier->statut == 1){ - return view('panier.show')->with([ - 'panier'=> $panier, - 'formats' => $formats, - ]); - }else{ - abort(404, 'Page introuvable'); - } - } + /** @var \App\User|null $user */ + $user = auth()->user(); - /** - * Ajout de média à un panier - */ - public function addMediasBasket(Request $request) - { - $response = false; - - $mediasToAdd = $request->input('medias'); - $panierId = $request->input('panier_id'); - - $panier = Panier::where('id', $panierId)->with('medias')->first(); - if($panier){ - foreach ($mediasToAdd as $media) { - $panier->medias()->attach($media['id']); + // * 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); } - $response = true; - } + } - return json_encode($response); + /** @var \Illuminate\Database\Eloquent\Collection $formats */ + $formats = Format::withoutGlobalScope('App\Scopes\SystemScope') + ->where('system', 1)->get(); + return view('panier.show')->with([ + 'panier' => $panier, + 'formats' => $formats, + ]); } - /** - * Suppression de média à un panier - */ - public function removeMediasBasket(Request $request) - { - $response = false; + /** + * Enregistre les propriétés d'un panier + * + * @param AjaxSaveBasketPropsRequest $request + * @return \Illuminate\Http\JsonResponse + */ + public function saveBasketProperty(AjaxSaveBasketPropsRequest $request) + { + /** @var \App\Models\Panier $panier */ + $panier = Panier::whereId($request->basket_id)->firstOrFail(); - $mediaToRemove = $request->input('media_id'); - $panierId = $request->input('panier_id'); - - $panier = Panier::where('id', $panierId)->with('medias')->first(); - if($panier && $mediaToRemove != ""){ - $panier->medias()->detach($mediaToRemove); - $response = true; - } - - return json_encode($response); - } - - - /** - * Ajoute un panier - */ - public function addBasket(Request $request) - { - $response = false; - $uid = sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x', mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0x0fff) | 0x4000, mt_rand(0, 0x3fff) | 0x8000, mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff)); - $title = $request->input('title'); - - if($title == ""){ - $title = "Panier du ".date("d/m/Y"); - } - - $panier = new Panier(); - $panier->owner = Auth::user()->id; - $panier->libelle = $title; - $panier->uid = $uid; - if($panier->save()){ - $response = $panier; - } - - return json_encode($response); - } - - /** - * Supprimer un panier - * - */ - public function removeBasket(Request $request) - { - $response = false; - $basket_id = $request->input('basket_id'); - - - $panier = Panier::where('id', $basket_id); - if($panier){ - $panier->delete(); - $response = true; - } - return json_encode($response); - } - - /** - * enregistre les propriétés d'un panier - * - */ - public function saveBasketProperty(Request $request) - { - $response = false; - $basket_id = $request->input('basket_id'); - $libelle = $request->input('libelle'); - $description = $request->input('description'); - $statut = $request->input('statut'); - - $panier = Panier::where('id', $basket_id)->first(); - if($panier){ - $panier->libelle = $libelle; - $panier->description = $description; - $panier->statut = $statut; - $panier->save(); - $response = $panier; - } - return json_encode($response); - } + $panier->fill($request->validated()); + $panier->saveOrFail(); + return response()->json($panier); + } } diff --git a/app/Http/Requests/Bo/AjaxAddMediasBasketRequest.php b/app/Http/Requests/Bo/AjaxAddMediasBasketRequest.php new file mode 100644 index 0000000..b5c313e --- /dev/null +++ b/app/Http/Requests/Bo/AjaxAddMediasBasketRequest.php @@ -0,0 +1,32 @@ +check(); + } + + /** + * Get the validation rules that apply to the request. + * + * @return array + */ + public function rules() + { + return [ + 'panier_id' => 'required|exists:paniers,id,deleted_at,NULL', + 'medias' => 'required|array', + 'medias.*' => 'required|exists:medias,id,deleted_at,NULL' + ]; + } +} diff --git a/app/Http/Requests/Bo/AjaxCreateBasketRequest.php b/app/Http/Requests/Bo/AjaxCreateBasketRequest.php new file mode 100644 index 0000000..ba4405a --- /dev/null +++ b/app/Http/Requests/Bo/AjaxCreateBasketRequest.php @@ -0,0 +1,35 @@ +merge([ + 'title' => $this->title ?? + sprintf('Panier du %s', Carbon::now()->format('d/m/Y')) + ]); + return auth()->check(); + } + + /** + * Get the validation rules that apply to the request. + * + * @return array + */ + public function rules() + { + return [ + 'title' => 'required|min:1|max:255' + ]; + } +} diff --git a/app/Http/Requests/Bo/AjaxDestroyBasketRequest.php b/app/Http/Requests/Bo/AjaxDestroyBasketRequest.php new file mode 100644 index 0000000..35aa69c --- /dev/null +++ b/app/Http/Requests/Bo/AjaxDestroyBasketRequest.php @@ -0,0 +1,30 @@ +check(); + } + + /** + * Get the validation rules that apply to the request. + * + * @return array + */ + public function rules() + { + return [ + 'basket_id' => 'required|exists:paniers,id,deleted_at,NULL' + ]; + } +} diff --git a/app/Http/Requests/Bo/AjaxRemoveMediasBasketRequest.php b/app/Http/Requests/Bo/AjaxRemoveMediasBasketRequest.php new file mode 100644 index 0000000..d0a5b27 --- /dev/null +++ b/app/Http/Requests/Bo/AjaxRemoveMediasBasketRequest.php @@ -0,0 +1,31 @@ +check(); + } + + /** + * Get the validation rules that apply to the request. + * + * @return array + */ + public function rules() + { + return [ + 'panier_id' => 'required|exists:paniers,id,deleted_at,NULL', + 'media_id' => 'required|exists:medias,id,deleted_at,NULL' + ]; + } +} diff --git a/app/Http/Requests/Bo/AjaxSaveBasketPropsRequest.php b/app/Http/Requests/Bo/AjaxSaveBasketPropsRequest.php new file mode 100644 index 0000000..fddad47 --- /dev/null +++ b/app/Http/Requests/Bo/AjaxSaveBasketPropsRequest.php @@ -0,0 +1,36 @@ +merge([ + 'statut' => $this->statut ? true : false + ]); + return \auth()->check(); + } + + /** + * Get the validation rules that apply to the request. + * + * @return array + */ + public function rules() + { + return [ + 'basket_id' => 'required|exists:paniers,id,deleted_at,NULL', + 'libelle' => 'required|string|min:2|max:255', + 'description' => 'nullable|string', + 'statut' => 'required|boolean' + ]; + } +} diff --git a/app/Models/Panier.php b/app/Models/Panier.php index d08a25e..19e58fa 100644 --- a/app/Models/Panier.php +++ b/app/Models/Panier.php @@ -2,6 +2,7 @@ namespace App\Models; +use App\User; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; @@ -9,61 +10,102 @@ class Panier extends Model { use SoftDeletes; - protected $appends = array('mediacount', 'mediacover'); + /** + * The accessors to append to the model's array form. + * + * @var array + */ + protected $appends = [ + 'mediacount', 'mediacover' + ]; - /** - * Get the user that owns the panier. - */ - public function owner() - { - return $this->belongsTo('App\User', 'owner'); - } + /** + * The attributes that are mass assignable. + * + * @var array + */ + protected $fillable = [ + 'description', 'libelle', 'statut' + ]; - /** - * The users that belong to the panier. - */ - public function usersFavoris() - { - return $this->belongsToMany('App\User', 'paniers_users', 'panier_id', 'user_id'); - } + /** + * The attributes that should be cast to native types. + * + * @var array + */ + protected $casts = [ + 'statut' => 'boolean' + ]; - /** - * The medias that belong to the panier. - */ - public function medias() - { - return $this->belongsToMany('App\Models\Media', 'paniers_medias', 'panier_id', 'media_id'); - } + // * RELATIONSHIPS - /** - * Get media linked - */ - public function getMediacountAttribute() - { - return $this->medias()->count(); - } + /** + * BelongsTo user relation + * Get the user that owns the panier. + * + * @return \Illuminate\Database\Eloquent\Relations\BelongsTo + */ + public function owner() + { + return $this->belongsTo(User::class, 'user_id'); + } - /** - * Get media linked - */ - public function getMediacoverAttribute() - { - $cover = ""; - $media = $this->medias()->where('typemedia_id', 1)->first(); - if($media){ - switch ($media->typemedia_id) { - case 1: - if($media->extension == "pdf" || $media->extension == "ai" || $media->extension == "psd"){ - $cover = $media->folder.$media->uid."_thumb.png"; - }else{ - $cover = $media->folder.$media->uid."_thumb.".$media->extension; - } - break; - case 2: - $cover = $media->folder.$media->uid."_thumb.".$media->extension; - break; - } - } - return $cover; - } + /** + * BelongsToMany users relation + * The users that belong to the panier. + * + * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany + */ + public function usersFavoris() + { + return $this->belongsToMany(User::class, 'paniers_users', 'panier_id', 'user_id'); + } + + /** + * BelongsToMany medias relation + * The medias that belong to the panier. + * + * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany + */ + public function medias() + { + return $this->belongsToMany(Media::class, 'paniers_medias', 'panier_id', 'media_id'); + } + + // * GETTERS + + /** + * Get mediacount attribute + * + * @return boolean + */ + public function getMediacountAttribute(): int + { + return $this->medias()->count(); + } + + /** + * Get mediacover attribute + * + * @return string + */ + public function getMediacoverAttribute(): string + { + $cover = ''; + if ($media = $this->medias()->where('typemedia_id', 1)->first()) { + switch ($media->typemedia_id) { + case 1: + if ($media->extension == "pdf" || $media->extension == "ai" || $media->extension == "psd") { + $cover = $media->folder . $media->uid . "_thumb.png"; + } else { + $cover = $media->folder . $media->uid . "_thumb." . $media->extension; + } + break; + case 2: + $cover = $media->folder . $media->uid . "_thumb." . $media->extension; + break; + } + } + return $cover; + } } diff --git a/app/Providers/RouteServiceProvider.php b/app/Providers/RouteServiceProvider.php index 60c25ac..dbfe56f 100644 --- a/app/Providers/RouteServiceProvider.php +++ b/app/Providers/RouteServiceProvider.php @@ -3,6 +3,7 @@ namespace App\Providers; use App\Models\Media; +use App\Models\Panier; use Illuminate\Support\Facades\Route; use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider; @@ -27,6 +28,10 @@ class RouteServiceProvider extends ServiceProvider Route::bind('media', function ($value) { return Media::whereUid($value)->firstOrFail(); }); + Route::bind('basket_uuid', function ($value) { + return Panier::where('uid', $value) + ->with('owner')->firstOrFail(); + }); parent::boot(); } diff --git a/app/User.php b/app/User.php index fbbc6c9..dc78b59 100644 --- a/app/User.php +++ b/app/User.php @@ -153,7 +153,7 @@ class User extends Authenticatable */ public function paniersOwner() { - return $this->hasMany(Panier::class, 'owner')->with('medias'); + return $this->hasMany(Panier::class, 'user_id')->with('medias'); } /** diff --git a/resources/js/components/media-manager/BasketComponent.vue b/resources/js/components/media-manager/BasketComponent.vue index 8c60a1f..910eb9e 100644 --- a/resources/js/components/media-manager/BasketComponent.vue +++ b/resources/js/components/media-manager/BasketComponent.vue @@ -2,19 +2,20 @@