-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.py
More file actions
133 lines (88 loc) · 3.87 KB
/
main.py
File metadata and controls
133 lines (88 loc) · 3.87 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
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
import json
import pathlib
from typing import List, Union
from fastapi import FastAPI, Response, Depends
from sqlmodel import Session, select
from models import Track
from database import TrackModel, engine, create_tables
# instantiate the FastAPI app
app = FastAPI()
# create container for our data - to be loaded at app startup.
data = []
# ---------------------------------------------------------------------------------------------------
@app.on_event("startup")
async def startup_event():
DATAFILE = pathlib.Path() / 'data' / 'tracks.json'
# Check if the tables already exist
with engine.connect() as connection:
existing_tables = connection.dialect.get_table_names(connection)
if 'trackmodel' not in existing_tables:
# Create tables if they do not exist
create_tables()
session = Session(engine)
# check if the database is already populated
stmt = select(TrackModel)
result = session.exec(stmt).first()
# Load data if there's no results
if result is None:
with open(DATAFILE, 'r') as f:
tracks = json.load(f)
for track in tracks:
session.add(TrackModel(**track))
session.commit()
session.close()
# ---------------------------------------------------------------------------------------------------
def get_session():
with Session(engine) as session:
yield session
# ---------------------------------------------------------------------------------------------------
@app.get('/tracks', response_model=List[Track])
def tracks(session: Session = Depends(get_session)):
# select * from
stmt = select(TrackModel)
result = session.exec(stmt).all()
return result
# ---------------------------------------------------------------------------------------------------
@app.get('/tracks/{track_id}', response_model=Union[Track, str])
def track(track_id: int, response: Response, session: Session = Depends(get_session)):
# find the track with the given ID, or None if it does not exist
track = session.get(TrackModel, track_id)
if track is None:
# if a track with given ID doesn't exist, set 404 code and return string
response.status_code = 404
return "Track not found"
return track
# ---------------------------------------------------------------------------------------------------
@app.post("/tracks", response_model=Track, status_code=201)
def create_track(track: TrackModel, session: Session = Depends(get_session)):
session.add(track)
session.commit()
session.refresh(track)
return track
# ---------------------------------------------------------------------------------------------------
@app.put("/tracks/{track_id}", response_model=Union[Track, str])
def update_track(track_id: int, updated_track: Track, response: Response, session: Session = Depends(get_session)):
track = session.get(TrackModel, track_id)
if track is None:
# if a track with given ID doesn't exist, set 404 code and return string
response.status_code = 404
return "Track not found"
# update the track data
track_dict = updated_track.dict(exclude_unset=True)
for key, val in track_dict.items():
setattr(track, key, val)
session.add(track)
session.commit()
session.refresh(track)
return track
# ---------------------------------------------------------------------------------------------------
@app.delete("/tracks/{track_id}", response_model=str, status_code=200)
def delete_track(track_id: int, response: Response, session: Session = Depends(get_session)):
track = session.get(TrackModel, track_id)
if track is None:
# if a track with given ID doesn't exist, set 404 code and return string
response.status_code = 404
return "Track not found"
session.delete(track)
session.commit()
return "Track has been deleted"