forked from ExpDev07/coronavirus-tracker-api
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathv2.py
More file actions
100 lines (81 loc) · 3.03 KB
/
v2.py
File metadata and controls
100 lines (81 loc) · 3.03 KB
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
"""app.routers.v2"""
import enum
from fastapi import APIRouter, HTTPException, Request
from ..data import DATA_SOURCES
from ..models import LatestResponse, LocationResponse, LocationsResponse
V2 = APIRouter()
class Sources(str, enum.Enum):
"""
A source available for retrieving data.
"""
jhu = "jhu"
csbs = "csbs"
nyt = "nyt"
@V2.get("/latest", response_model=LatestResponse)
async def get_latest(request: Request, source: Sources = "jhu"): # pylint: disable=unused-argument
"""
Getting latest amount of total confirmed cases, deaths, and recoveries.
"""
locations = await request.state.source.get_all()
return {
"latest": {
"confirmed": sum(map(lambda location: location.confirmed, locations)),
"deaths": sum(map(lambda location: location.deaths, locations)),
"recovered": sum(map(lambda location: location.recovered, locations)),
}
}
# pylint: disable=unused-argument,too-many-arguments,redefined-builtin
@V2.get("/locations", response_model=LocationsResponse, response_model_exclude_unset=True)
async def get_locations(
request: Request,
source: Sources = "jhu",
country_code: str = None,
province: str = None,
county: str = None,
timelines: bool = False,
):
"""
Getting the locations.
"""
# All query paramameters.
params = dict(request.query_params)
# Remove reserved params.
params.pop("source", None)
params.pop("timelines", None)
# Retrieve all the locations.
locations = await request.state.source.get_all()
# Attempt to filter out locations with properties matching the provided query params.
for key, value in params.items():
# Clean keys for security purposes.
key = key.lower()
value = value.lower().strip("__")
# Do filtering.
try:
locations = [location for location in locations if str(getattr(location, key)).lower() == str(value)]
except AttributeError:
pass
if not locations:
raise HTTPException(404, detail=f"Source `{source}` does not have the desired location data.")
# Return final serialized data.
return {
"latest": {
"confirmed": sum(map(lambda location: location.confirmed, locations)),
"deaths": sum(map(lambda location: location.deaths, locations)),
"recovered": sum(map(lambda location: location.recovered, locations)),
},
"locations": [location.serialize(timelines) for location in locations],
}
# pylint: disable=invalid-name
@V2.get("/locations/{id}", response_model=LocationResponse)
async def get_location_by_id(request: Request, id: int, source: Sources = "jhu", timelines: bool = True):
"""
Getting specific location by id.
"""
location = await request.state.source.get(id)
return {"location": location.serialize(timelines)}
@V2.get("/sources")
async def sources():
"""
Retrieves a list of data-sources that are availble to use.
"""
return {"sources": list(DATA_SOURCES.keys())}