Skip to content

Commit 825de31

Browse files
committed
create middleware to attach the "data_source"
https://www.starlette.io/requests/#other-state
1 parent bdae7f0 commit 825de31

File tree

1 file changed

+22
-3
lines changed

1 file changed

+22
-3
lines changed

app/main.py

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,15 @@
22
app.main.py
33
"""
44
import os
5+
import logging
56
import datetime as dt
67
from typing import Dict, List
78

89
import fastapi
910
import pydantic
1011
import uvicorn
1112

13+
from .data import data_source
1214

1315
# #################################
1416
# Models
@@ -80,16 +82,33 @@ class Location(pydantic.BaseModel):
8082
#######################
8183

8284

85+
# TODO this could probably just be a FastAPI dependency
86+
@APP.middleware("http")
87+
async def add_datasource(request: fastapi.Request, call_next):
88+
"""Attach the data source to the request.state."""
89+
source = request.query_params.get("source", default="jhu")
90+
request.state.source = data_source(source)
91+
LOGGER.info(f"source: {request.state.source.__class__.__name__}")
92+
response = await call_next(request)
93+
return response
94+
95+
8396
# ################
8497
# Routes
8598
# ################
8699

87100

88101
@APP.get("/latest", response_model=Latest)
89-
def get_latest():
102+
def get_latest(request: fastapi.Request):
90103
"""Getting latest amount of total confirmed cases, deaths, and recoveries."""
91-
sample_data = {"latest": {"confirmed": 197146, "deaths": 7905, "recovered": 80840}}
92-
return sample_data
104+
locations = request.state.source.get_all()
105+
return {
106+
"latest": {
107+
"confirmed": sum(map(lambda location: location.confirmed, locations)),
108+
"deaths": sum(map(lambda location: location.deaths, locations)),
109+
"recovered": sum(map(lambda location: location.recovered, locations)),
110+
}
111+
}
93112

94113

95114
@APP.get("/locations", response_model=AllLocations)

0 commit comments

Comments
 (0)