diff --git a/app/Http/Controllers/Api/AircraftApiController.php b/app/Http/Controllers/Api/AircraftApiController.php new file mode 100644 index 0000000..8c487a2 --- /dev/null +++ b/app/Http/Controllers/Api/AircraftApiController.php @@ -0,0 +1,15 @@ +imageIfExists($path); + } + +} diff --git a/app/Http/Controllers/Api/AirlineApiController.php b/app/Http/Controllers/Api/AirlineApiController.php index c48c0f2..338a522 100644 --- a/app/Http/Controllers/Api/AirlineApiController.php +++ b/app/Http/Controllers/Api/AirlineApiController.php @@ -49,21 +49,8 @@ class AirlineApiController extends ApiController public function getLivery(string $airlineInternalName, string $aircraftDesignator){ $path = "images/liveries/{$airlineInternalName}_{$aircraftDesignator}.png"; - $cacheLimit = 60 * 60 * 72; - if(!Storage::disk('local')->exists($path)){ - return response()->json(['error' => 'Livery not found'], 404); - } - - $fullPath = Storage::disk('local')->path($path); - $lastModified = filemtime($fullPath); - - return response()->file($fullPath, [ - 'Content-Type' => 'image/png', - 'Cache-Control' => 'public, max-age='.$cacheLimit, // 24 hours - 'Last-Modified' => gmdate('D, d M Y H:i:s', $lastModified) . ' GMT', - 'ETag' => md5($path . $lastModified), - ]); + return $this->imageIfExists($path); } function parseAirlineData(Airline $airline){ diff --git a/app/Http/Controllers/Controller.php b/app/Http/Controllers/Controller.php index 8677cd5..ce49da9 100644 --- a/app/Http/Controllers/Controller.php +++ b/app/Http/Controllers/Controller.php @@ -2,7 +2,23 @@ namespace App\Http\Controllers; +use Illuminate\Support\Facades\Storage; + abstract class Controller { - // + public function imageIfExists(string $path, $cacheLimit = 60 * 60 * 72){ + if(!Storage::disk('local')->exists($path)){ + return response()->json(['error' => 'Image not found'], 404); + } + + $fullPath = Storage::disk('local')->path($path); + $lastModified = filemtime($fullPath); + + return response()->file($fullPath, [ + 'Content-Type' => 'image/png', + 'Cache-Control' => 'public, max-age='.$cacheLimit, // 24 hours + 'Last-Modified' => gmdate('D, d M Y H:i:s', $lastModified) . ' GMT', + 'ETag' => md5($path . $lastModified), + ]); + } } diff --git a/app/Http/Controllers/FlightController.php b/app/Http/Controllers/FlightController.php index 67d28b9..285859f 100644 --- a/app/Http/Controllers/FlightController.php +++ b/app/Http/Controllers/FlightController.php @@ -275,7 +275,7 @@ class FlightController extends Controller return redirect()->route('profile.departure-board', [Auth::user()->name, $flight->id]); } - public function delete(UserFlight $flight) + public function delete(UserFlight $flight, ?string $referrer = 'departure-board') { $this->authorize('delete', $flight); @@ -296,7 +296,7 @@ class FlightController extends Controller ]); $flight->delete(); - return redirect()->route('profile.departure-board', [Auth::user()->name]); + return redirect()->route('profile.'.$referrer, [Auth::user()->name]); } public function staticData() : array { diff --git a/app/Http/Controllers/FlightProfileController.php b/app/Http/Controllers/FlightProfileController.php index 8579adf..6fb80cf 100644 --- a/app/Http/Controllers/FlightProfileController.php +++ b/app/Http/Controllers/FlightProfileController.php @@ -52,10 +52,10 @@ class FlightProfileController extends Controller abort(404); } - return Inertia::render('UserFlight', [ - 'flightCount' => $user->flights()->count(), + 'flightCount' => $user->departedFlights()->count(), 'flight' => $userFlight->snapshot($userFlight->id), + 'canEdit' => auth()->check() && auth()->id() === $user->id, 'user' => $user, 'isFollowing' => auth()->check() && auth()->user()->isFollowing($user), ]); diff --git a/app/Models/UserFlight.php b/app/Models/UserFlight.php index 31ee29c..72dfe68 100644 --- a/app/Models/UserFlight.php +++ b/app/Models/UserFlight.php @@ -227,17 +227,32 @@ class UserFlight extends Model return Attribute::make( get: function () { - if(!$this->airline || !$this->aircraft){ + $apiUrl = config('app.logo_api_url'); + + if (!$this->aircraft) { return null; } - $path = "images/liveries/{$this->airline->internal_name}_{$this->aircraft->designator}.png"; - if(!Storage::disk('local')->exists($path)){ + if ($this->airline){ + $path = "images/liveries/{$this->airline->internal_name}_{$this->aircraft->designator}.png"; + if (Storage::disk('local')->exists($path)) { + $finalPath = $apiUrl."/airline/{$this->airline->internal_name}/livery/{$this->aircraft->designator}"; + } + } + + if(empty($finalPath)){ + $path = "images/livery_templates/{$this->aircraft->designator}.png"; + if (Storage::disk('local')->exists($path)) { + $finalPath = $apiUrl."/aircraft/{$this->aircraft->designator}/livery"; + } + } + + if(empty($finalPath)){ return null; } - return config('app.logo_api_url')."/airline/{$this->airline->internal_name}/livery/{$this->aircraft->designator}"; + return $finalPath; } ); } diff --git a/resources/js/Components/FlightsGoneBy/BoardingPass.vue b/resources/js/Components/FlightsGoneBy/BoardingPass.vue index c98c925..25eac4b 100644 --- a/resources/js/Components/FlightsGoneBy/BoardingPass.vue +++ b/resources/js/Components/FlightsGoneBy/BoardingPass.vue @@ -1,13 +1,16 @@ + + + + diff --git a/resources/js/Pages/UserFlight.vue b/resources/js/Pages/UserFlight.vue index 6ba2dff..17e9ac8 100644 --- a/resources/js/Pages/UserFlight.vue +++ b/resources/js/Pages/UserFlight.vue @@ -19,6 +19,7 @@ const props = defineProps<{ flight: Flight flightCount: number isFollowing: boolean + canEdit: boolean }>() @@ -37,7 +38,7 @@ const props = defineProps<{
- + diff --git a/resources/js/Pages/UserProfile.vue b/resources/js/Pages/UserProfile.vue index 44f317d..1fb83f7 100644 --- a/resources/js/Pages/UserProfile.vue +++ b/resources/js/Pages/UserProfile.vue @@ -124,7 +124,7 @@ function switchView(view: ProfileView) { - + group( function() { Route::get('/', function () { - return Inertia::render(auth()->check() ? 'Dashboard' : 'Auth/Login'); + if (auth()->check()) { + return redirect()->route('profile.view', auth()->user()->name); + } + return redirect()->route('login'); }); @@ -48,7 +52,7 @@ Route::domain(config('app.domain'))->group( Route::get('/flights/add', [FlightController::class, 'add'])->name('flights.add'); Route::get('/flights/{flight}/edit', [FlightController::class, 'edit'])->name('flights.edit'); Route::put('/flights/{flight}', [FlightController::class, 'update'])->name('flights.update'); - Route::delete('/flights/{flight}', [FlightController::class, 'delete'])->name('flights.delete'); + Route::delete('/flights/{flight}/{referrer?}', [FlightController::class, 'delete'])->name('flights.delete'); @@ -117,6 +121,10 @@ Route::domain(config('app.api_domain'))->group(function () { Route::get('{airlineInternalName}/livery/{aircraftDesignator}', 'getLivery')->name('airline.livery'); }); + Route::prefix('aircraft')->controller(AircraftApiController::class)->group(function () { + Route::get('{aircraftDesignator}/livery', 'getLivery')->name('aircraft.livery'); + }); + Route::prefix('user')->controller(UserApiController::class)->group(function () { Route::get('{username}/next-flight', 'nextFlight');