-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathbackend_fastapi.py
112 lines (84 loc) · 3.08 KB
/
backend_fastapi.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
import os
from fastapi import FastAPI, Query, HTTPException, Response
from starlette.staticfiles import StaticFiles, FileResponse
from fastapi.middleware.gzip import GZipMiddleware
from pydantic import BaseModel, confloat, conint, constr
import redis
import uvicorn
import backend_vrs_db
import logging
logging.basicConfig(level=logging.INFO)
redis_connection = redis.Redis(os.getenv("REDIS_HOST"), decode_responses=True)
app = FastAPI(
title="FlightMapEuropeSimple",
openapi_url="/api/openapi.json",
redoc_url="/api/redoc",
docs_url="/api/docs",
)
app.add_middleware(GZipMiddleware, minimum_size=500)
class Location(BaseModel):
lat: confloat(ge=-90, le=90)
lng: confloat(ge=-180, le=180)
class FlightSearch(BaseModel):
origin: Location
destination: Location
originRadius: conint(gt=0, le=600e3)
destinationRadius: conint(gt=0, le=600e3)
numberOfStops: conint(ge=0, le=2)
filterAirlineAlliance: constr(regex="^(Star Alliance|Oneworld|SkyTeam|)$")
@app.get("/", include_in_schema=False)
async def root():
return FileResponse("static/index.html")
@app.get("/api/geojson/airports")
def get_geojson_airports():
return backend_vrs_db.get_geojson_airports()
@app.get("/api/geojson/callsign/")
def get_geojson_callsign(
callsign: str = Query(
...,
min_length=4,
max_length=8,
regex=(
"^([A-Z]{3})[0-9](([0-9]{0,3})|([0-9]{0,2})([A-Z])|([0-9]?)"
"([A-Z]{2}))$"
),
)
):
return backend_vrs_db.get_geojson_callsign(callsign)
@app.get("/api/geojson/airline/")
def get_geojson_airline(
icao: str = Query(..., min_length=3, max_length=3, regex="^[A-Z]{3}$")
):
return backend_vrs_db.get_geojson_airline(icao)
@app.get("/api/geojson/airport/")
def get_geojson_airport(
icao: str = Query(..., min_length=4, max_length=4, regex="^[0-9A-Z]{4}$")
):
return backend_vrs_db.get_geojson_airport(icao)
@app.post("/api/geojson/flightsearch")
def post_geojson_flightsearch(data: FlightSearch):
return backend_vrs_db.get_geojson_flightsearch(data)
@app.get("/api/covid_data.json")
def get_covid_data():
json_data = redis_connection.get("covid_data")
if json_data is not None:
return Response(content=json_data, media_type="application/json")
else:
raise HTTPException(status_code=404, detail="Item not found")
@app.get("/api/flights_statistics.json")
def get_flights_statistics():
json_data = redis_connection.get("flights_statistics")
if json_data is not None:
return Response(content=json_data, media_type="application/json")
else:
raise HTTPException(status_code=404, detail="Item not found")
@app.get("/api/fir_uir_statistics.json")
def get_fir_uir_statistics():
json_data = redis_connection.get("fir_uir_statistics")
if json_data is not None:
return Response(content=json_data, media_type="application/json")
else:
raise HTTPException(status_code=404, detail="Item not found")
app.mount("/", StaticFiles(directory="static"), name="static")
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=8000)