Live ac search

This commit is contained in:
James Pattinson
2025-10-21 21:06:38 +00:00
parent 4f952a5a1b
commit c1accd82c5
4 changed files with 232 additions and 70 deletions

View File

@@ -1,8 +1,9 @@
from fastapi import APIRouter
from app.api.endpoints import auth, pprs, public
from app.api.endpoints import auth, pprs, public, aircraft
api_router = APIRouter()
api_router.include_router(auth.router, prefix="/auth", tags=["authentication"])
api_router.include_router(pprs.router, prefix="/pprs", tags=["pprs"])
api_router.include_router(public.router, prefix="/public", tags=["public"])
api_router.include_router(public.router, prefix="/public", tags=["public"])
api_router.include_router(aircraft.router, prefix="/aircraft", tags=["aircraft"])

View File

@@ -0,0 +1,60 @@
from typing import List, Optional
from fastapi import APIRouter, Depends, HTTPException, Query
from sqlalchemy.orm import Session
from app.api.deps import get_db, get_current_active_user
from app.models.ppr import Aircraft
from app.schemas.ppr import Aircraft as AircraftSchema
from app.models.ppr import User
router = APIRouter()
@router.get("/lookup/{registration}", response_model=List[AircraftSchema])
async def lookup_aircraft_by_registration(
registration: str,
db: Session = Depends(get_db),
current_user: User = Depends(get_current_active_user)
):
"""
Lookup aircraft by registration (clean match).
Removes non-alphanumeric characters from input for matching.
"""
# Clean the input registration (remove non-alphanumeric characters)
clean_input = ''.join(c for c in registration if c.isalnum()).upper()
if len(clean_input) < 4:
return []
# Query aircraft table using clean_reg column
aircraft_list = db.query(Aircraft).filter(
Aircraft.clean_reg.like(f"{clean_input}%")
).limit(10).all()
return aircraft_list
@router.get("/search", response_model=List[AircraftSchema])
async def search_aircraft(
q: Optional[str] = Query(None, description="Search query for registration, type, or manufacturer"),
limit: int = Query(10, ge=1, le=100, description="Maximum number of results"),
db: Session = Depends(get_db),
current_user: User = Depends(get_current_active_user)
):
"""
Search aircraft by registration, type code, or manufacturer name.
"""
if not q or len(q) < 2:
return []
# Clean search term
clean_query = ''.join(c for c in q if c.isalnum()).upper()
# Search across multiple fields
aircraft_list = db.query(Aircraft).filter(
(Aircraft.clean_reg.like(f"%{clean_query}%")) |
(Aircraft.type_code.like(f"%{q.upper()}%")) |
(Aircraft.manufacturer_name.like(f"%{q}%")) |
(Aircraft.model.like(f"%{q}%"))
).limit(limit).all()
return aircraft_list