- Add CalendarSlotService methods for slot order calculation - Update PlannedItemController to create slots from datetime - Update CalendarSlotController with proper eager loading - Create timeline UI components (TripTimeline, DaySection, HourRow, ScheduleItemModal) - Add comprehensive PHPUnit tests (PlannedItemTest, CalendarSlotServiceTest) - Add comprehensive Selenium E2E tests (timeline-scheduling.test.js) - Update PlannablesList to support onItemsChange callback
93 lines
2.6 KiB
PHP
93 lines
2.6 KiB
PHP
<?php
|
|
|
|
namespace App\Infrastructure\Http\Controllers\API\Trip;
|
|
|
|
use App\Domain\Trip\Policies\TripPolicy;
|
|
use App\Infrastructure\Http\Controllers\Controller;
|
|
use App\Models\Trip;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Http\JsonResponse;
|
|
|
|
class TripController extends Controller
|
|
{
|
|
public function __construct(
|
|
private TripPolicy $policy
|
|
) {}
|
|
/**
|
|
* Display a listing of the resource.
|
|
*/
|
|
public function index(Request $request): JsonResponse
|
|
{
|
|
$trips = Trip::where('created_by_user_id', $request->user()->id)
|
|
->orderBy('created_at', 'desc')
|
|
->get();
|
|
|
|
return response()->json(['data' => $trips]);
|
|
}
|
|
|
|
/**
|
|
* Store a newly created resource in storage.
|
|
*/
|
|
public function store(Request $request): JsonResponse
|
|
{
|
|
$validated = $request->validate([
|
|
'name' => 'required|string|max:255',
|
|
'description' => 'nullable|string',
|
|
'start_date' => 'nullable|date',
|
|
'end_date' => 'nullable|date|after_or_equal:start_date',
|
|
]);
|
|
|
|
$validated['created_by_user_id'] = $request->user()->id;
|
|
|
|
$trip = Trip::create($validated);
|
|
|
|
return response()->json(['data' => $trip], 201);
|
|
}
|
|
|
|
/**
|
|
* Display the specified resource.
|
|
*/
|
|
public function show(Request $request, Trip $trip): JsonResponse
|
|
{
|
|
if (!$this->policy->view($request->user(), $trip)) {
|
|
return response()->json(['message' => 'Forbidden'], 403);
|
|
}
|
|
|
|
return response()->json(['data' => $trip]);
|
|
}
|
|
|
|
/**
|
|
* Update the specified resource in storage.
|
|
*/
|
|
public function update(Request $request, Trip $trip): JsonResponse
|
|
{
|
|
if (!$this->policy->update($request->user(), $trip)) {
|
|
return response()->json(['message' => 'Forbidden'], 403);
|
|
}
|
|
|
|
$validated = $request->validate([
|
|
'name' => 'required|string|max:255',
|
|
'description' => 'nullable|string',
|
|
'start_date' => 'nullable|date',
|
|
'end_date' => 'nullable|date|after_or_equal:start_date',
|
|
]);
|
|
|
|
$trip->update($validated);
|
|
|
|
return response()->json(['data' => $trip]);
|
|
}
|
|
|
|
/**
|
|
* Remove the specified resource from storage.
|
|
*/
|
|
public function destroy(Request $request, Trip $trip): JsonResponse
|
|
{
|
|
if (!$this->policy->delete($request->user(), $trip)) {
|
|
return response()->json(['message' => 'Forbidden'], 403);
|
|
}
|
|
|
|
$trip->delete();
|
|
|
|
return response()->json(['message' => 'Trip deleted successfully']);
|
|
}
|
|
}
|