- Add `/stats/live` endpoint returning station count and latest price timestamp with 5-minute cache - Transform StationCard into expandable component with click/keyboard interaction showing full details - Display brand label, badges (24h/Supermarket/Motorway), fuel types, amenities, opening hours, and price delta vs average - Add brand filter dropdown to StationList with dynamic brand extraction from results - Calculate and display price comparison against filtered stations average - Redesign map markers to simpler price display; move directions link to popup alongside station details - Add "locate-me" button to SearchBar for geolocation trigger - Show "Live" indicator with station count and last-update time on homepage hero - Remove standalone directions link from marker HTML; consolidate in popup with click propagation handling - Persist `avgPence` calculation across StationList and pass to cards for delta display - Add `@iconify-json/lucide` dev dependency and register collection on app mount - Stop click propagation on card action buttons (directions, remove)
48 lines
2.1 KiB
PHP
48 lines
2.1 KiB
PHP
<?php
|
|
|
|
use App\Enums\FuelType;
|
|
use App\Http\Controllers\Api\AuthController;
|
|
use App\Http\Controllers\Api\PredictionController;
|
|
use App\Http\Controllers\Api\StationController;
|
|
use App\Http\Controllers\Api\StatsController;
|
|
use App\Http\Controllers\Api\UserController;
|
|
use App\Http\Middleware\VerifyApiKey;
|
|
use Illuminate\Support\Facades\Cache;
|
|
use Illuminate\Support\Facades\Route;
|
|
|
|
// Public endpoints (no API key required)
|
|
Route::post('/auth/register', [AuthController::class, 'register']);
|
|
Route::post('/auth/login', [AuthController::class, 'login']);
|
|
|
|
Route::get('/fuel-types', function () {
|
|
return Cache::remember('api:fuel-types', now()->addDay(), fn () => collect(FuelType::cases())
|
|
->map(fn (FuelType $case) => ['value' => $case->value, 'label' => $case->label()])
|
|
->values());
|
|
});
|
|
|
|
Route::get('/stats/live', [StatsController::class, 'live']);
|
|
|
|
// Protected endpoints (API key required)
|
|
Route::middleware(['throttle:60,1', VerifyApiKey::class])->group(function (): void {
|
|
Route::get('/stations', [StationController::class, 'index']);
|
|
Route::get('/stats/searches', [StatsController::class, 'searches']);
|
|
Route::get('/prediction', [PredictionController::class, 'index']);
|
|
});
|
|
|
|
// Sanctum-authenticated endpoints
|
|
Route::middleware('auth:sanctum')->group(function (): void {
|
|
Route::get('/auth/me', [AuthController::class, 'me']);
|
|
Route::post('/auth/logout', [AuthController::class, 'logout']);
|
|
|
|
// User dashboard endpoints
|
|
Route::get('/user/preferences', [UserController::class, 'preferences']);
|
|
Route::put('/user/preferences', [UserController::class, 'updatePreferences']);
|
|
Route::get('/user/saved-stations', [UserController::class, 'savedStations']);
|
|
Route::post('/user/saved-stations', [UserController::class, 'saveStation']);
|
|
Route::delete('/user/saved-stations/{stationId}', [UserController::class, 'removeStation']);
|
|
|
|
Route::put('/user/profile', [UserController::class, 'updateProfile']);
|
|
Route::put('/user/password', [UserController::class, 'updatePassword']);
|
|
Route::delete('/user', [UserController::class, 'deleteAccount']);
|
|
});
|