Support vague flight segments with airport/date-only details
All checks were successful
Build and Push Image / docker-build-and-push (push) Successful in 2m44s

This commit is contained in:
2026-02-26 09:18:23 -05:00
parent 118aee639e
commit 9a0636cc4a
6 changed files with 148 additions and 45 deletions

View File

@@ -106,7 +106,7 @@ export interface FlightSegment {
airline_iata: string | null;
airline_icao: string | null;
airline_name: string | null;
flight_number: string;
flight_number: string | null;
position: number;
created_at: string;
}
@@ -124,6 +124,7 @@ export interface FlightRoute {
arrival_airport_code: string | null;
arrival_terminal: string | null;
arrival_gate: string | null;
arrival_date: string | null;
arrival_datetime: string | null;
arrival_timezone: string | null;
created_at: string;
@@ -144,7 +145,7 @@ export interface CreateFlightInput {
airlineIata?: string;
airlineIcao?: string;
airlineName?: string;
flightNumber: string;
flightNumber?: string;
route?: {
departureAirportId?: number;
departureAirportCode?: string;
@@ -156,6 +157,7 @@ export interface CreateFlightInput {
arrivalAirportCode?: string;
arrivalTerminal?: string;
arrivalGate?: string;
arrivalDate?: string;
arrivalDatetime?: string;
arrivalTimezone?: string;
};
@@ -230,7 +232,15 @@ export function createFlight(input: CreateFlightInput): FlightBooking {
// Generate a title from the first segment
const firstSegment = input.segments[0];
const title = firstSegment
? `${firstSegment.airlineName || firstSegment.airlineIata || 'Flight'} ${firstSegment.flightNumber}`
? (() => {
const airline = firstSegment.airlineName || firstSegment.airlineIata || 'Flight';
const flightNumber = firstSegment.flightNumber?.trim();
const dep = firstSegment.route?.departureAirportCode?.trim();
const arr = firstSegment.route?.arrivalAirportCode?.trim();
if (flightNumber) return `${airline} ${flightNumber}`;
if (dep || arr) return `Flight: ${dep || 'TBD'} -> ${arr || 'TBD'}`;
return 'Flight';
})()
: 'Flight';
db.run(
@@ -282,7 +292,7 @@ export function createFlight(input: CreateFlightInput): FlightBooking {
airlineIata ?? null,
airlineIcao ?? null,
airlineName ?? null,
segment.flightNumber,
segment.flightNumber?.trim() || '',
segmentPosition++
]
);
@@ -296,8 +306,8 @@ export function createFlight(input: CreateFlightInput): FlightBooking {
departure_airport_id, departure_airport_code, departure_terminal, departure_gate,
departure_datetime, departure_timezone,
arrival_airport_id, arrival_airport_code, arrival_terminal, arrival_gate,
arrival_datetime, arrival_timezone
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
arrival_date, arrival_datetime, arrival_timezone
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
[
routeId,
segmentId,
@@ -313,6 +323,7 @@ export function createFlight(input: CreateFlightInput): FlightBooking {
segment.route.arrivalAirportCode ?? null,
segment.route.arrivalTerminal ?? null,
segment.route.arrivalGate ?? null,
segment.route.arrivalDate ?? null,
segment.route.arrivalDatetime ?? null,
segment.route.arrivalTimezone ?? airportTimezone(segment.route.arrivalAirportId) ?? null
]
@@ -481,7 +492,7 @@ export interface UpdateFlightInput {
airlineIata?: string;
airlineIcao?: string;
airlineName?: string;
flightNumber: string;
flightNumber?: string;
route?: {
departureAirportId?: number;
departureAirportCode?: string;
@@ -493,6 +504,7 @@ export interface UpdateFlightInput {
arrivalAirportCode?: string;
arrivalTerminal?: string;
arrivalGate?: string;
arrivalDate?: string;
arrivalDatetime?: string;
arrivalTimezone?: string;
};
@@ -513,7 +525,15 @@ export function updateFlight(input: UpdateFlightInput): void {
// Derive new title from first segment
const firstSegment = input.segments[0];
const title = firstSegment
? `${firstSegment.airlineName || firstSegment.airlineIata || 'Flight'} ${firstSegment.flightNumber}`
? (() => {
const airline = firstSegment.airlineName || firstSegment.airlineIata || 'Flight';
const flightNumber = firstSegment.flightNumber?.trim();
const dep = firstSegment.route?.departureAirportCode?.trim();
const arr = firstSegment.route?.arrivalAirportCode?.trim();
if (flightNumber) return `${airline} ${flightNumber}`;
if (dep || arr) return `Flight: ${dep || 'TBD'} -> ${arr || 'TBD'}`;
return 'Flight';
})()
: 'Flight';
// Update the plan row (status + title)
@@ -558,7 +578,7 @@ export function updateFlight(input: UpdateFlightInput): void {
segment.airlineIata ?? null,
segment.airlineIcao ?? null,
segment.airlineName ?? null,
segment.flightNumber,
segment.flightNumber?.trim() || '',
segmentPosition++
]
);
@@ -571,8 +591,8 @@ export function updateFlight(input: UpdateFlightInput): void {
departure_airport_id, departure_airport_code, departure_terminal, departure_gate,
departure_datetime, departure_timezone,
arrival_airport_id, arrival_airport_code, arrival_terminal, arrival_gate,
arrival_datetime, arrival_timezone
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
arrival_date, arrival_datetime, arrival_timezone
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
[
routeId,
segmentId,
@@ -588,6 +608,7 @@ export function updateFlight(input: UpdateFlightInput): void {
segment.route.arrivalAirportCode ?? null,
segment.route.arrivalTerminal ?? null,
segment.route.arrivalGate ?? null,
segment.route.arrivalDate ?? null,
segment.route.arrivalDatetime ?? null,
segment.route.arrivalTimezone ?? airportTimezone(segment.route.arrivalAirportId) ?? null
]