forked from AbdulDavids/example-fast-api-f1
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.py
218 lines (192 loc) · 5.62 KB
/
main.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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
from typing import List
from fastapi import FastAPI
from fastapi.responses import JSONResponse
from pydantic import BaseModel, ConfigDict, Field
app = FastAPI(
servers=[
{
"url": "http://localhost:8000",
"description": "Local server",
}
],
openapi_tags=[
{
"name": "F1",
"description": "Endpoints related to F1 races and winners.",
"externalDocs": {
"description": "F1 official website",
"url": "http://localhost:8000/docs",
},
},
],
)
# Fake data of F1 race winners
f1_race_winners = {
2021: [
{"race": "bahrain", "winner": "Lewis Hamilton"},
{"race": "emilia_romagna", "winner": "Max Verstappen"},
{"race": "portuguese", "winner": "Lewis Hamilton"},
],
2022: [
{"race": "bahrain", "winner": "Charles Leclerc"},
{"race": "saudi_arabia", "winner": "Max Verstappen"},
{"race": "australian", "winner": "Charles Leclerc"},
],
2023: [
{"race": "bahrain", "winner": "Max Verstappen"},
{"race": "saudi_arabia", "winner": "Max Verstappen"},
{"race": "australian", "winner": "Max Verstappen"},
],
2024: [
{"race": "bahrain", "winner": "Max Verstappen"},
{"race": "australian", "winner": "Carlos Sainz"},
{"race": "saudi_arabia", "winner": "Max Verstappen"},
{"race": "monaco", "winner": "Charles Leclerc"},
{"race": "cape_town", "winner": "Abdul Davids"},
],
}
# Models
class RaceWinner(BaseModel):
"""The winner of a race."""
race: str = Field(description="The name of the F1 race.", examples=["bahrain"])
winner: str = Field(
description="The name of the F1 race.", examples=["Lewis Hamilton"]
)
model_config = ConfigDict(
title="Race winner",
json_schema_extra={
"examples": [
{
"race": "bahrain",
"winner": "Lewis Hamilton",
},
],
},
)
class YearWinnersResponse(BaseModel):
"""Year winners response."""
year: int = Field(description="The year of the F1 race.", examples=[2021])
winners: List[RaceWinner] = Field(
description="The winners",
examples=[
{
"race": "bahrain",
"winner": "Lewis Hamilton",
},
],
)
model_config = ConfigDict(
title="Year winners",
json_schema_extra={
"examples": [
{
"year": 2021,
"winners": [
{
"race": "bahrain",
"winner": "Lewis Hamilton",
},
{
"race": "emilia_romagna",
"winner": "Max Verstappen",
},
],
},
],
},
)
class RaceWinnerResponse(BaseModel):
"""Race winner response."""
year: int
race: str
winner: str
model_config = ConfigDict(
title="Race winner response",
json_schema_extra={
"examples": [
{
"year": 2021,
"race": "bahrain",
"winner": "Lewis Hamilton",
},
{
"year": 2024,
"race": "cape_town",
"winner": "Abdul Davids",
},
],
},
)
class ResponseMessage(BaseModel):
"""A response message"""
message: str = Field(description="The response message")
OPENAPI_RESPONSE_OBJECT_NOT_FOUND = {
"model": ResponseMessage,
"description": "Object not found",
}
@app.get(
"/",
response_model=ResponseMessage,
operation_id="root",
)
def read_root():
"""
Welcome message.
"""
return {"message": "Welcome to the F1 Race Winners API! Docs at /docs."}
@app.get(
"/winners/{year}",
response_model=YearWinnersResponse,
tags=["F1"],
operation_id="getYearWinners",
responses={
404: OPENAPI_RESPONSE_OBJECT_NOT_FOUND,
},
summary="Get the winners of all Formula 1 races in a given year.",
)
def get_year_winners(year: int):
"""
Get the winners of all Formula 1 races in a given year.
"""
if year in f1_race_winners:
return {"year": year, "winners": f1_race_winners[year]}
return JSONResponse(
status_code=404,
content={
"message": "Data not available for the requested year.",
},
)
@app.get(
"/winners/{year}/{race}",
response_model=RaceWinnerResponse,
tags=["F1"],
operation_id="getRaceWinner",
responses={
404: OPENAPI_RESPONSE_OBJECT_NOT_FOUND,
},
summary="Get the winner of a specific Formula 1",
)
def get_race_winner(year: int, race: str):
"""
Get the winner of a specific Formula 1 race in a given year.
"""
if year in f1_race_winners:
for race_info in f1_race_winners[year]:
if race_info["race"].strip().lower() == race.strip().lower():
return {
"year": year,
"race": race,
"winner": race_info["winner"],
}
return JSONResponse(
status_code=404,
content={
"message": "Data not available for the requested race.",
},
)
return JSONResponse(
status_code=404,
content={
"message": "Data not available for the requested year.",
},
)