Skip to content

Commit 7efb2f0

Browse files
author
ExpDev07
committed
move routes to new files
1 parent be5865d commit 7efb2f0

File tree

6 files changed

+110
-99
lines changed

6 files changed

+110
-99
lines changed

app/enums/sources.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
from enum import Enum
2+
3+
class Sources(str, Enum):
4+
"""
5+
A source available for retrieving data.
6+
"""
7+
jhu = 'jhu'
8+
csbs = 'csbs'

app/main.py

Lines changed: 6 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -6,34 +6,22 @@
66
import logging
77
import os
88
import reprlib
9-
from typing import Dict, List
109

1110
import fastapi
1211
import pydantic
1312
import uvicorn
1413

14+
from typing import Dict, List
15+
1516
from fastapi.middleware.wsgi import WSGIMiddleware
1617
from fastapi.middleware.cors import CORSMiddleware
1718

1819
from .core import create_app
19-
from .data import data_source, data_sources
20+
from .data import data_source
2021

2122
from .models.location import LocationResponse as Location, LocationsResponse as Locations
2223
from .models.latest import LatestResponse as Latest
2324

24-
# ################
25-
# Dependencies
26-
# ################
27-
28-
29-
class Sources(str, enum.Enum):
30-
"""
31-
A source available for retrieving data.
32-
"""
33-
jhu = 'jhu'
34-
csbs = 'csbs'
35-
36-
3725
# ############
3826
# FastAPI App
3927
# ############
@@ -98,94 +86,13 @@ async def handle_validation_error(
9886

9987

10088
# ################
101-
# Routes
89+
# Routing
10290
# ################
10391

104-
V2 = fastapi.APIRouter()
105-
106-
@V2.get('/latest', response_model=Latest)
107-
def get_latest(request: fastapi.Request, source: Sources = 'jhu'):
108-
"""
109-
Getting latest amount of total confirmed cases, deaths, and recoveries.
110-
"""
111-
locations = request.state.source.get_all()
112-
return {
113-
'latest': {
114-
'confirmed': sum(map(lambda location: location.confirmed, locations)),
115-
'deaths' : sum(map(lambda location: location.deaths, locations)),
116-
'recovered': sum(map(lambda location: location.recovered, locations)),
117-
}
118-
}
119-
120-
121-
@V2.get(
122-
'/locations', response_model=Locations, response_model_exclude_unset=True
123-
)
124-
def get_locations(
125-
request: fastapi.Request,
126-
source: Sources = 'jhu',
127-
country_code: str = None,
128-
province: str = None,
129-
county: str = None,
130-
timelines: bool = False,
131-
):
132-
"""
133-
Getting the locations.
134-
"""
135-
# All query paramameters.
136-
params = dict(request.query_params)
137-
138-
# Remove reserved params.
139-
params.pop('source', None)
140-
params.pop('timelines', None)
141-
142-
# Retrieve all the locations.
143-
locations = request.state.source.get_all()
144-
145-
# Attempt to filter out locations with properties matching the provided query params.
146-
for key, value in params.items():
147-
# Clean keys for security purposes.
148-
key = key.lower()
149-
value = value.lower().strip('__')
150-
151-
# Do filtering.
152-
try:
153-
locations = [location for location in locations if str(getattr(location, key)).lower() == str(value)]
154-
except AttributeError:
155-
pass
156-
157-
# Return final serialized data.
158-
return {
159-
'latest': {
160-
'confirmed': sum(map(lambda location: location.confirmed, locations)),
161-
'deaths' : sum(map(lambda location: location.deaths, locations)),
162-
'recovered': sum(map(lambda location: location.recovered, locations)),
163-
},
164-
'locations': [location.serialize(timelines) for location in locations],
165-
}
166-
167-
168-
@V2.get('/locations/{id}', response_model=Location)
169-
def get_location_by_id(request: fastapi.Request, id: int, source: Sources = 'jhu', timelines: bool = True):
170-
"""
171-
Getting specific location by id.
172-
"""
173-
return {
174-
'location': request.state.source.get(id).serialize(timelines)
175-
}
176-
177-
178-
@V2.get('/sources')
179-
async def sources():
180-
"""
181-
Retrieves a list of data-sources that are availble to use.
182-
"""
183-
return {
184-
'sources': list(data_sources.keys())
185-
}
92+
from .router import router
18693

18794
# Include routers.
188-
APP.include_router(V2, prefix='/v2', tags=['v2'])
95+
APP.include_router(router, prefix='/v2', tags=['v2'])
18996

19097
# mount the existing Flask app
19198
# v1 @ /

app/router/__init__.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
from fastapi import APIRouter
2+
3+
# Create the router.
4+
router = APIRouter()
5+
6+
# The routes.
7+
from . import latest, sources, locations

app/router/latest.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
from fastapi import Request
2+
from . import router
3+
from ..enums.sources import Sources
4+
from ..models.latest import LatestResponse as Latest
5+
6+
@router.get('/latest', response_model=Latest)
7+
def get_latest(request: Request, source: Sources = 'jhu'):
8+
"""
9+
Getting latest amount of total confirmed cases, deaths, and recoveries.
10+
"""
11+
locations = request.state.source.get_all()
12+
return {
13+
'latest': {
14+
'confirmed': sum(map(lambda location: location.confirmed, locations)),
15+
'deaths' : sum(map(lambda location: location.deaths, locations)),
16+
'recovered': sum(map(lambda location: location.recovered, locations)),
17+
}
18+
}

app/router/locations.py

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
from fastapi import Request
2+
from . import router
3+
from ..enums.sources import Sources
4+
from ..models.location import LocationResponse as Location, LocationsResponse as Locations
5+
6+
@router.get(
7+
'/locations', response_model=Locations, response_model_exclude_unset=True
8+
)
9+
def get_locations(
10+
request: Request,
11+
source: Sources = 'jhu',
12+
country_code: str = None,
13+
province: str = None,
14+
county: str = None,
15+
timelines: bool = False,
16+
):
17+
"""
18+
Getting the locations.
19+
"""
20+
# All query paramameters.
21+
params = dict(request.query_params)
22+
23+
# Remove reserved params.
24+
params.pop('source', None)
25+
params.pop('timelines', None)
26+
27+
# Retrieve all the locations.
28+
locations = request.state.source.get_all()
29+
30+
# Attempt to filter out locations with properties matching the provided query params.
31+
for key, value in params.items():
32+
# Clean keys for security purposes.
33+
key = key.lower()
34+
value = value.lower().strip('__')
35+
36+
# Do filtering.
37+
try:
38+
locations = [location for location in locations if str(getattr(location, key)).lower() == str(value)]
39+
except AttributeError:
40+
pass
41+
42+
# Return final serialized data.
43+
return {
44+
'latest': {
45+
'confirmed': sum(map(lambda location: location.confirmed, locations)),
46+
'deaths' : sum(map(lambda location: location.deaths, locations)),
47+
'recovered': sum(map(lambda location: location.recovered, locations)),
48+
},
49+
'locations': [location.serialize(timelines) for location in locations],
50+
}
51+
52+
53+
@router.get('/locations/{id}', response_model=Location)
54+
def get_location_by_id(request: Request, id: int, source: Sources = 'jhu', timelines: bool = True):
55+
"""
56+
Getting specific location by id.
57+
"""
58+
return {
59+
'location': request.state.source.get(id).serialize(timelines)
60+
}

app/router/sources.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
from . import router
2+
from ..data import data_sources
3+
4+
@router.get('/sources')
5+
async def sources():
6+
"""
7+
Retrieves a list of data-sources that are availble to use.
8+
"""
9+
return {
10+
'sources': list(data_sources.keys())
11+
}

0 commit comments

Comments
 (0)