created_by_user_id !== auth()->id()) { return response()->json(['message' => 'Forbidden'], 403); } $plannableItems = $trip->plannableItems() ->with(['calendarSlots']) ->get(); return response()->json(['data' => $plannableItems]); } public function store(Request $request, Trip $trip): JsonResponse { // Check if user owns the trip if ($trip->created_by_user_id !== auth()->id()) { return response()->json(['message' => 'Forbidden'], 403); } $validated = $request->validate([ 'name' => 'required|string|max:255', 'type' => 'required|in:hotel,restaurant,attraction,transport,activity', 'address' => 'nullable|string|max:255', 'notes' => 'nullable|string', 'metadata' => 'nullable|array', ]); $plannableItem = $trip->plannableItems()->create($validated); return response()->json(['data' => $plannableItem], 201); } public function show(PlannableItem $plannableItem): JsonResponse { $plannableItem->load(['calendarSlots', 'trip']); return response()->json($plannableItem); } public function update(Request $request, PlannableItem $plannableItem): JsonResponse { // Check if user owns the trip if ($plannableItem->trip->created_by_user_id !== auth()->id()) { return response()->json(['message' => 'Forbidden'], 403); } $validated = $request->validate([ 'name' => 'sometimes|required|string|max:255', 'type' => 'sometimes|required|in:hotel,restaurant,attraction,transport,activity', 'address' => 'nullable|string|max:255', 'notes' => 'nullable|string', 'metadata' => 'nullable|array', ]); $plannableItem->update($validated); return response()->json(['data' => $plannableItem]); } public function destroy(PlannableItem $plannableItem): JsonResponse { $plannableItem->delete(); return response()->json(null, 204); } }