import { stringify as qs } from 'querystring'; /** * @see https://airtable.com/tblECHqrQ5ysrgqmY/viw1zmFvJX5jS9qqJ?blocks=bipAXyZW4slGpfoek * @see https://api.airtable.com/v0/applMUDzHzoRQ6sAd */ const airtableToken = 'keyzYOzqIxWDUVdhC'; interface AirtableRecord { id: string; createdTime: string; fields: any; } enum Tables { 'Users' = 'Users', 'Flights' = 'Flights', 'Aircraft' = 'Aircraft', 'Organizations' = 'Organizations', 'Aircraft FAA' = 'Aircraft FAA', 'Airports North America' = 'Airports North America', 'Logs' = 'Logs', } function getData({ table, view, }: { table: keyof typeof Tables; view?: string; }): Promise<{ records: AirtableRecord[] }> { const query: Record = { maxRecords: 100, }; if (view) query.view = view; return window .fetch( `https://api.airtable.com/v0/applMUDzHzoRQ6sAd/${encodeURI(table)}?${qs( query, )}`, { headers: { Accept: 'application/json', Authorization: `Bearer ${airtableToken}`, }, }, ) .then(res => res.json()); } export function getUsers(): Promise<{ records: User[] }> { return getData({ table: Tables.Users, }); } export function getFlights(): Promise<{ records: Flight[] }> { return getData({ table: Tables.Flights, }); } export function getAircrafts(): Promise<{ records: Aircraft[]; }> { return getData({ table: Tables.Aircraft, }); } export function getOrganizations(): Promise<{ records: Organization[]; }> { return getData({ table: Tables.Organizations, }); } export function getAircraftFAA(): Promise<{ records: AircraftFAA[]; }> { return getData({ table: Tables['Aircraft FAA'], }); } export function getAirportsNorthAmerica(): Promise<{ records: AirportNorthAmerica[]; }> { return getData({ table: Tables['Airports North America'], }); } export function getLogs(): Promise<{ records: Log[]; }> { return getData({ table: Tables.Logs, }); } export interface User extends AirtableRecord { fields: { 'Last Name': string; Role: string[]; Flights: string[]; 'First Name': string; Certification: string[]; Organization: string[]; 'Date of Birth': Date; Username: string; Email: string; 'Total flight hours': number; 'Total Flights': number; Aircraft: string[]; }; } export interface Flight extends AirtableRecord { fields: { Pilot: string[]; 'Scheduled Departure': Date; Status: string[]; Aircraft: string[]; 'Scheduled Arrival': Date; Origin: string[]; Destination: string[]; 'Mission Type': string[]; 'Flight-number': number; 'Co-Pilot': string[]; Logs: string[]; Name: string; Route: string; 'Origin-ident': string[]; 'Destination-ident': string[]; 'Route-short': string; 'Flight-date-short': string; 'Departure-short': string; 'Arrival-Short': string; }; } export interface Aircraft extends AirtableRecord { fields: { 'N-Number': number; Flights: string[]; Owner: string[]; 'Maintenance Status': string[]; 'Fuel (gal)': number; 'Fuel Capacity': number; 'Custom equipment': string[]; 'Make and Model': string[]; Code: string[]; Name: string; 'Fuel (ltr)': number; 'Fuel Full': string; Model: string[]; }; } export interface Organization extends AirtableRecord { fields: { Name: string; User: string[]; Aircraft: string[]; }; } export interface AircraftFAA extends AirtableRecord { fields: { 'Date Completed': string; Manufacturer: string; Model: string; 'Physical Class (Engine)': string; '# Engines': string; AAC: string; ADG: string; TDG: string; 'Approach Speed\n(Vref)': string; 'Wingtip Configuration': string; 'Wingspan, ft': string; 'Length, ft': string; 'Tail Height, ft\n(@ OEW)': string; 'Wheelbase, ft': string; 'Cockpit to Main Gear (CMG)': string; 'MGW\n(Outer to Outer)': string; MTOW: string; 'Max Ramp\nMax Taxi': string; 'Main Gear Config': string; 'ICAO Code': string; 'Wake Category': string; 'ATCT Weight Class': string; 'Years Manufactured': string; Note: string; 'Parking Area (WS x Length), sf': string; Name: string; }; } export interface AirportNorthAmerica extends AirtableRecord { fields: { ident: string; type: string; name: string; iso_country: string; municipality: string; 'Airport name': string; }; } export interface Log extends AirtableRecord { fields: { Flight: string[]; 'Climbs and Descents': number; 'Log type': string[]; Name: string; }; }