findOrFail($id); Gate::authorize('update', $post); $user = $request->user(); // Count existing pinned posts $pinnedCount = Post::where('user_id', $user->id) ->where('is_pinned', true) ->count(); if ($post->is_pinned) { return response()->json(['message' => 'Post is already pinned.'], 409); } if ($pinnedCount >= self::MAX_PINNED) { return response()->json([ 'message' => 'You can pin a maximum of ' . self::MAX_PINNED . ' posts.', ], 422); } $nextOrder = Post::where('user_id', $user->id) ->where('is_pinned', true) ->max('pinned_order') ?? 0; $post->update([ 'is_pinned' => true, 'pinned_order' => $nextOrder + 1, ]); return response()->json(['message' => 'Post pinned.', 'post_id' => $post->id]); } public function unpin(int $id): JsonResponse { $post = Post::findOrFail($id); Gate::authorize('update', $post); if (! $post->is_pinned) { return response()->json(['message' => 'Post is not pinned.'], 409); } $post->update(['is_pinned' => false, 'pinned_order' => null]); return response()->json(['message' => 'Post unpinned.', 'post_id' => $post->id]); } }