From bd8ef98d30e171b08206f109b1bca5ad7f2baa3f Mon Sep 17 00:00:00 2001 From: josh Date: Wed, 22 Apr 2026 15:17:01 +1000 Subject: [PATCH] Added User API --- app/Http/Controllers/Api/LogoController.php | 78 +++++++++++++++++++ app/Http/Controllers/Api/UserController.php | 50 ++++++++++++ app/Http/Controllers/ApiController.php | 10 +++ app/Http/Controllers/LogoController.php | 61 --------------- .../Components/FlightsGoneBy/AirlineLogo.vue | 2 +- .../FlightsGoneBy/DepartureBoard.vue | 13 ++-- .../Components/FlightsGoneBy/FlightFilter.vue | 6 +- routes/web.php | 8 +- 8 files changed, 154 insertions(+), 74 deletions(-) create mode 100644 app/Http/Controllers/Api/LogoController.php create mode 100644 app/Http/Controllers/Api/UserController.php create mode 100644 app/Http/Controllers/ApiController.php diff --git a/app/Http/Controllers/Api/LogoController.php b/app/Http/Controllers/Api/LogoController.php new file mode 100644 index 0000000..134e662 --- /dev/null +++ b/app/Http/Controllers/Api/LogoController.php @@ -0,0 +1,78 @@ +logo ?? 'blank.png'; + $cacheLimit = 60 * 60 * 24; + + if ($airline?->internal_name == 'condor') { + $logoKey = array_rand(self::CONDOR_LOGOS); + $logoFile = 'DE_' . self::CONDOR_LOGOS[$logoKey] . '.png'; + $cacheLimit = 1; + } + + $path = 'images/logos/tail/' . $logoFile; + if (!Storage::disk('local')->exists($path)) { + $path = 'images/logos/tail/blank.png'; + } + + $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), + ]); + } + + public function getLogoById($id){ + $airline = Airline::where('id', $id) + ->first(); + + return $this->getAirlineLogo($airline); + } + + public function getLogoByInternalName(string $internalName){ + $airline = Airline::where('internal_name', $internalName) + ->first(); + + return $this->getAirlineLogo($airline); + } + + + public function getLogoByCode(string $code){ + + $column = strlen($code) == 2 + ? 'IATA_code' + : 'ICAO_code'; + + $airline = Airline::where($column, strtoupper($code)) + ->whereNotNull('logo') + ->where('active', true) + ->latest('id') + ->first(); + + if (!$airline) { + $airline = Airline::where($column, strtoupper($code)) + ->whereNotNull('logo') + ->latest('id') + ->first(); + } + + return $this->getAirlineLogo($airline); + } +} diff --git a/app/Http/Controllers/Api/UserController.php b/app/Http/Controllers/Api/UserController.php new file mode 100644 index 0000000..5dded58 --- /dev/null +++ b/app/Http/Controllers/Api/UserController.php @@ -0,0 +1,50 @@ +first(); + if(!$user) return [ + 'message' => 'User not found', + ]; + + $flight = UserFlight::with(['departureAirport', 'arrivalAirport', 'airline', 'aircraft']) + ->where('user_id', $user->id) + ->where('departure_date', '>', now()->utc()) + ->orderBy('departure_date', 'asc') + ->first(); + + $departure = Carbon::parse($flight->departure_date)->setTimezone($flight->departureAirport->timezone); + $arrival = Carbon::parse($flight->arrival_date)->setTimezone($flight->arrivalAirport->timezone); + + return [ + 'departureAirportCode' => $flight->departureAirport->iata_code, + 'departureCity' => $flight->departureAirport->municipality, + 'departureDateReadable' => $departure->format('F j'), + 'departureTime' => $departure->format('H:i'), + 'arrivalAirportCode' => $flight->arrivalAirport->iata_code, + 'arrivalCity' => $flight->arrivalAirport->municipality, + 'arrivalDateReadable' => $arrival->format('F j'), + 'arrivalTime' => $arrival->format('H:i'), + 'flightNumber' => $flight->flight_number, + 'airlineName' => $flight->airline->name, + 'aircraftType' => $flight->aircraft->manufacturer_code . ' ' . $flight->aircraft->model_full_name, + 'logoUrl' => config('app.logo_api_url') . "/airlines/logos/tail/name/{$flight->airline->internal_name}" + ]; + } + + function flights(string $username){ + + } +} diff --git a/app/Http/Controllers/ApiController.php b/app/Http/Controllers/ApiController.php new file mode 100644 index 0000000..35c1196 --- /dev/null +++ b/app/Http/Controllers/ApiController.php @@ -0,0 +1,10 @@ +logo ?? 'blank.png'; - $cacheLimit = 60 * 60 * 24; - - if ($airline?->internal_name == 'condor') { - $logoKey = array_rand(self::CONDOR_LOGOS); - $logoFile = 'DE_' . self::CONDOR_LOGOS[$logoKey] . '.png'; - $cacheLimit = 1; - } - - $path = 'images/logos/tail/' . $logoFile; - if (!Storage::disk('local')->exists($path)) { - $path = 'images/logos/tail/blank.png'; - } - - $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), - ]); - } - - public function getLogoById($id){ - $airline = Airline::where('id', $id) - ->first(); - - //Blank Airline Logo - if(!$airline) return $this->getLogoByCode('2H'); - - return $this->getAirlineLogo($airline); - } - - public function getLogoByCode(string $code){ - - $column = strlen($code) == 2 - ? 'IATA_code' - : 'ICAO_code'; - - $airline = Airline::where($column, strtoupper($code)) - ->whereNotNull('logo') - ->where('active', true) - ->latest('id') - ->first(); - - if (!$airline) { - $airline = Airline::where($column, strtoupper($code)) - ->whereNotNull('logo') - ->latest('id') - ->first(); - } - - return $this->getAirlineLogo($airline); - } - public static function deduplicateLogo(string $logo, array $correctInternalNames) { diff --git a/resources/js/Components/FlightsGoneBy/AirlineLogo.vue b/resources/js/Components/FlightsGoneBy/AirlineLogo.vue index 7fedc53..5c62f22 100644 --- a/resources/js/Components/FlightsGoneBy/AirlineLogo.vue +++ b/resources/js/Components/FlightsGoneBy/AirlineLogo.vue @@ -11,7 +11,7 @@ const props = defineProps<{ }>(); const page = usePage().props; -const logoUrl = computed(() => `url('${page.logo_api_url}/airlines/logos/tail/id/${props.airline?.id}')`); +const logoUrl = computed(() => `url('${page.logo_api_url}/airlines/logos/tail/name/${props.airline?.internal_name}')`); const logoStyle = computed(() => ({ width: size.value, height: size.value, diff --git a/resources/js/Components/FlightsGoneBy/DepartureBoard.vue b/resources/js/Components/FlightsGoneBy/DepartureBoard.vue index 4a6905c..e938908 100644 --- a/resources/js/Components/FlightsGoneBy/DepartureBoard.vue +++ b/resources/js/Components/FlightsGoneBy/DepartureBoard.vue @@ -233,12 +233,13 @@ watch( - - - - - {{(item as Flight).seat_number}} - {{(item as Flight).seat_type?.name}} + + + Crew + + + {{ (item as Flight).seat_number }} + {{ (item as Flight).seat_type?.name }} diff --git a/resources/js/Components/FlightsGoneBy/FlightFilter.vue b/resources/js/Components/FlightsGoneBy/FlightFilter.vue index dd4b446..1ea7274 100644 --- a/resources/js/Components/FlightsGoneBy/FlightFilter.vue +++ b/resources/js/Components/FlightsGoneBy/FlightFilter.vue @@ -82,8 +82,8 @@ function emitFilters() { // ── Helpers ─────────────────────────────────────────────────────────────────── const page = usePage() -const airlineLogoUrl = (id: number) => - `${page.props.logo_api_url}/airlines/logos/tail/id/${id}` +const airlineLogoUrl = (internal_name: string) => + `${page.props.logo_api_url}/airlines/logos/tail/name/${internal_name}` const countryFlagClass = (code: string) => `fi fi-${code.toLowerCase()}` @@ -123,7 +123,7 @@ const countryFlagClass = (code: string) =>