diff --git a/app/Http/Controllers/AdminController.php b/app/Http/Controllers/AdminController.php
index 0d20463..000dcfb 100644
--- a/app/Http/Controllers/AdminController.php
+++ b/app/Http/Controllers/AdminController.php
@@ -19,6 +19,7 @@ class AdminController extends Controller
function staticAdminData(){
return [
'missingLiveryCount' => $this->adminService->getMissingLiveries()->count(),
+ 'missingAirlineCount' => $this->adminService->getMissingAirlines()->count(),
];
}
@@ -44,6 +45,16 @@ class AdminController extends Controller
]);
}
+ function reconcileMissingAirlines(){
+ $missingAirlines = $this->adminService->getMissingAirlines()->values();
+
+ return Inertia::render('Admin/MissingAirlines', [
+ 'title' => $missingAirlines->count() . ' Missing Airlines',
+ 'missingAirlines' => $missingAirlines,
+ ...$this->staticAdminData(),
+ ]);
+ }
+
public function ignoreMissingLivery(Request $request)
{
$validated = $request->validate([
diff --git a/app/Services/AdminService.php b/app/Services/AdminService.php
index 86f5f1f..2b70761 100644
--- a/app/Services/AdminService.php
+++ b/app/Services/AdminService.php
@@ -5,6 +5,7 @@ namespace App\Services;
use App\DTOs\MissingLivery;
use App\Models\IgnoredMissingLivery;
use App\Models\UserFlight;
+use Illuminate\Support\Enumerable;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Collection;
@@ -45,4 +46,36 @@ class AdminService
->sortBy('airline_name')
->values();
}
+
+ function getMissingAirlines(): Enumerable|Collection
+ {
+ $flights = UserFlight::whereNotNull('flight_number')
+ ->whereNull('airline_id')
+ ->with('user:id,name') // adjust to your actual user relation/columns
+ ->get(['id', 'flight_number', 'user_id']);
+
+ return $flights
+ ->map(function ($flight) {
+ // Extract the 2-character IATA-style prefix (letters and/or digits)
+ preg_match('/^([A-Za-z0-9]{2})\d+/', trim($flight->flight_number), $matches);
+
+ return [
+ 'code' => $matches[1] ?? null,
+ 'flight_number' => $flight->flight_number,
+ 'link' => "/u/{$flight->user->name}/flight/{$flight->id}",
+ ];
+ })
+ ->filter(fn ($f) => $f['code'] !== null) // drop any that didn't match the pattern
+ ->groupBy('code')
+ ->map(function ($group, $code) {
+ return [
+ 'code' => $code,
+ 'flights' => $group->map(fn ($f) => [
+ 'flight_number' => $f['flight_number'],
+ 'link' => $f['link'],
+ ])->values()->all(),
+ ];
+ })
+ ->values();
+ }
}
diff --git a/resources/js/Components/Admin/MissingAirlineCard.vue b/resources/js/Components/Admin/MissingAirlineCard.vue
new file mode 100644
index 0000000..bff6252
--- /dev/null
+++ b/resources/js/Components/Admin/MissingAirlineCard.vue
@@ -0,0 +1,91 @@
+
+
+
+
+
+