diff --git a/app/Console/Commands/GetAircraftInfoForArrivedFlights.php b/app/Console/Commands/GetAircraftInfoForArrivedFlights.php index 8e30b66..0adcb69 100644 --- a/app/Console/Commands/GetAircraftInfoForArrivedFlights.php +++ b/app/Console/Commands/GetAircraftInfoForArrivedFlights.php @@ -78,6 +78,28 @@ class GetAircraftInfoForArrivedFlights extends Command $this->applyAndNotify($flight, $data, $airlineCode, $flightNumber); } + protected function splitFlightNumber(UserFlight $flight): array + { + $raw = strtoupper($flight->flight_number); + $airline = $flight->airline; + + // Preferred: anchor on the airline's known codes rather than guessing. + foreach (array_filter([$airline?->iata_code, $airline?->icao_code]) as $code) { + $code = strtoupper($code); + if (str_starts_with($raw, $code) && preg_match('/^\d+$/', substr($raw, strlen($code)))) { + return [$code, substr($raw, strlen($code))]; + } + } + + // Fallback: regex guess. + // Covers: letter+digit (J2), digit+letter (9K, 4U), and 2-3 letter codes (AA, DAL). + if (preg_match('/^([A-Z]\d|\d[A-Z]|[A-Z]{2,3})(\d+)$/', $raw, $matches)) { + return [$matches[1], $matches[2]]; + } + + return [null, null]; + } + protected function notifyLookupFailed(UserFlight $flight, string $airlineCode, string $flightNumber): void { Notification::create([ diff --git a/app/Http/Controllers/Api/UserApiController.php b/app/Http/Controllers/Api/UserApiController.php index 8b13171..a1f8f99 100644 --- a/app/Http/Controllers/Api/UserApiController.php +++ b/app/Http/Controllers/Api/UserApiController.php @@ -13,7 +13,7 @@ class UserApiController extends ApiController { public function nextFlight(?User $user): JsonResponse { - $user = $user ?? auth()->user(); + $user = $user?->exists ? $user : auth()->user(); if (!$user->id) { return response()->json(['message' => 'User not found'], 404); @@ -48,8 +48,8 @@ class UserApiController extends ApiController 'arrivalTime' => $arrival->format('H:i'), 'arrivalDateUtc' => $flight->arrival_date, 'flightNumber' => $flight->flight_number, - 'airlineName' => $flight->airline->name, - 'aircraftType' => $flight->aircraft->manufacturer_code . ' ' . $flight->aircraft->model_full_name, + 'airlineName' => $flight->airline?->name, + 'aircraftType' => $flight->aircraft?->manufacturer_code . ' ' . $flight->aircraft?->model_full_name, 'logoUrl' => $flight->airline?->logo_url ?? '', ]); } diff --git a/app/Http/Controllers/FlightController.php b/app/Http/Controllers/FlightController.php index 10c2455..2115b7c 100644 --- a/app/Http/Controllers/FlightController.php +++ b/app/Http/Controllers/FlightController.php @@ -64,11 +64,14 @@ class FlightController extends Controller public function lookup(Request $request) { $number = strtoupper(trim($request->query('number', ''))); - - preg_match('/^([A-Z]{2,3})(\d+)/', $number, $matches); + preg_match( + '/^([A-Z]{3}|[A-Z]{2}|[A-Z]\d|\d[A-Z])(\d+)$/', + $number, + $matches + ); $code = $matches[1] ?? null; $flightNumber = $matches[2] ?? null; - $isIata = strlen($code) === 2; + $isIata = $code !== null && strlen($code) === 2; $codeColumn = $isIata ? 'iata_code' : 'icao_code'; $apiAirlineCodes = []; diff --git a/routes/api.php b/routes/api.php index ad2510b..d745ea9 100644 --- a/routes/api.php +++ b/routes/api.php @@ -20,8 +20,6 @@ Route::domain(config('app.api_domain'))->group(function () { Route::get('/flights/most-recent', [HomePageController::class ,'mostRecentFlights'])->name('home-page.most-recent-flights'); Route::get('/feed/following', [FeedController::class ,'following'])->name('feed.following'); Route::get('/feed/following-flights', [FeedController::class ,'followingFlights'])->name('feed.following-flights'); - - });