From 19f81a00249e9beaa1612b020873b3142cc3ed75 Mon Sep 17 00:00:00 2001 From: "Edward Tirado Jr." Date: Sun, 5 Apr 2026 00:37:44 -0500 Subject: [PATCH] updated controllers to use resources --- app/Http/Controllers/InvitationController.php | 2 +- app/Http/Controllers/MovieListController.php | 30 ++++++------- app/Http/Resources/MovieListResource.php | 42 +++++++++++++++++++ app/Models/MovieList.php | 20 ++++++++- app/Policies/MovieListPolicy.php | 1 + routes/api.php | 2 +- 6 files changed, 79 insertions(+), 18 deletions(-) create mode 100644 app/Http/Resources/MovieListResource.php diff --git a/app/Http/Controllers/InvitationController.php b/app/Http/Controllers/InvitationController.php index 936a821..d75e6d5 100644 --- a/app/Http/Controllers/InvitationController.php +++ b/app/Http/Controllers/InvitationController.php @@ -106,7 +106,7 @@ class InvitationController extends Controller Mail::to($invitation->email)->queue(new ListCollaboratorInvite(Auth::user(), $invitation)); } - return response()->json(['message' => 'Invitation created successfully'], 201); + return response()->json(['message' => 'Invitations sent!'], 201); } /** diff --git a/app/Http/Controllers/MovieListController.php b/app/Http/Controllers/MovieListController.php index 95da065..c1ec7c2 100644 --- a/app/Http/Controllers/MovieListController.php +++ b/app/Http/Controllers/MovieListController.php @@ -4,10 +4,11 @@ namespace App\Http\Controllers; use App\Http\Requests\CreateMovieListRequest; use App\Http\Requests\UpdateMovieListRequest; +use App\Http\Resources\MovieListResource; use App\Interfaces\MovieDbInterface; use App\Models\Movie; use App\Models\MovieList; -use Illuminate\Database\Eloquent\ModelNotFoundException; +use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Str; @@ -17,7 +18,7 @@ class MovieListController extends Controller /** * Display a listing of the resource. */ - public function index() + public function index(): JsonResponse { $user = Auth::user(); @@ -48,37 +49,36 @@ class MovieListController extends Controller /** * Display the specified resource. */ - public function show(MovieList $movieList) + public function show(MovieList $movieList): MovieListResource { $this->authorize('view', $movieList); - try { - return $movieList->load('movies'); - } catch (ModelNotFoundException $e) { - return response()->json(['message' => 'Movie list not found'], 404); - } + + return MovieListResource::make($movieList->load('movies', 'collaborators')); } /** * Update the specified resource in storage. */ - public function update(UpdateMovieListRequest $request, MovieList $movieList) + public function update(UpdateMovieListRequest $request, MovieList $movieList): MovieListResource { $validated = $request->validated(); $movieList->update($validated); - return response()->json($movieList, 200); + return MovieListResource::make($movieList); } /** * Remove the specified resource from storage. */ - public function destroy(MovieList $movieList) + public function destroy(MovieList $movieList): JsonResponse { $this->authorize('delete', $movieList); $movieList->delete(); + + return response()->json(['message', 'Movie list deleted successfully'], 204); } - public function addMovie(MovieDbInterface $movieDb, Request $request, MovieList $movieList) + public function addMovie(MovieDbInterface $movieDb, Request $request, MovieList $movieList): MovieListResource { $this->authorize('update', $movieList); $movieResult = $movieDb->find($request->input('movie')['imdbId'], ['type' => 'imdb']); @@ -87,16 +87,16 @@ class MovieListController extends Controller $movieList->movies()->attach($movie); $movieList->load('movies'); - return response()->json($movieList); + return MovieListResource::make($movieList); } - public function removeMovie(MovieDbInterface $movieDb, Request $request, MovieList $movieList, Movie $movie) + public function removeMovie(Request $request, MovieList $movieList, Movie $movie): MovieListResource { $this->authorize('update', $movieList); $movieList->movies()->detach($movie); $movieList->load('movies'); - return response()->json($movieList); + return MovieListResource::make($movieList); } } diff --git a/app/Http/Resources/MovieListResource.php b/app/Http/Resources/MovieListResource.php new file mode 100644 index 0000000..0b672ab --- /dev/null +++ b/app/Http/Resources/MovieListResource.php @@ -0,0 +1,42 @@ + + */ + public function toArray(Request $request): array + { + $user_id = Auth::id(); + + return [ + 'id' => $this->id, + 'name' => $this->name, + 'is_public' => $this->is_public, + 'owner' => $this->listOwner->username, + 'role' => $this->getRole($this->owner, $user_id), + 'collaborators' => $this->whenLoaded('collaborators', fn () => $this->collaborators->map(fn ($user) => [ + 'username' => $user->username, + 'role' => $user->pivot->role, + ])), + 'movies' => $this->whenLoaded('movies'), + ]; + } + + private function getRole(int $owner_id, int $user_id): ?string + { + if ($owner_id === $user_id) { + return 'owner'; + } + + return $this->getUserRole($user_id); + } +} diff --git a/app/Models/MovieList.php b/app/Models/MovieList.php index b27acbe..bd422fa 100644 --- a/app/Models/MovieList.php +++ b/app/Models/MovieList.php @@ -3,6 +3,7 @@ namespace App\Models; use Illuminate\Database\Eloquent\Model; +use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsToMany; class MovieList extends Model @@ -14,13 +15,30 @@ class MovieList extends Model 'slug', ]; + protected $with = ['listOwner']; + + public function listOwner(): BelongsTo + { + return $this->belongsTo(User::class, 'owner'); + } + public function movies(): BelongsToMany { return $this->belongsToMany(Movie::class); } + public function getUserRole($userId) + { + return $this->collaborators() + ->where('user_id', $userId) + ->first() + ?->pivot + ->role; + } + public function collaborators(): BelongsToMany { - return $this->belongsToMany(User::class, 'movie_list_user'); + return $this->belongsToMany(User::class, 'movie_list_user') + ->withPivot('role'); } } diff --git a/app/Policies/MovieListPolicy.php b/app/Policies/MovieListPolicy.php index 2d31082..91cc5cb 100644 --- a/app/Policies/MovieListPolicy.php +++ b/app/Policies/MovieListPolicy.php @@ -31,6 +31,7 @@ class MovieListPolicy public function update(User $user, MovieList $movieList): bool { + if ($movieList->owner === $user->getKey()) { return true; } diff --git a/routes/api.php b/routes/api.php index 68176d7..0549072 100644 --- a/routes/api.php +++ b/routes/api.php @@ -26,7 +26,7 @@ Route::middleware('auth:sanctum')->group(function () { // Movie Lists Route::get('/movielists', [MovieListController::class, 'index'])->name('movielists.index'); - Route::put('/movielists/', [MovieListController::class, 'index'])->name('movielists.index'); + Route::put('/movielists/{movieList}', [MovieListController::class, 'update'])->name('movielists.update'); Route::get('/movielists/{movieList}', [MovieListController::class, 'show'])->name('movielists.show'); Route::post('/movielists', [MovieListController::class, 'store'])->name('movielists.store'); Route::post('/movielists/{movieList}/movies', [MovieListController::class, 'addMovie'])->name('movielists.addMovie');