Skip to content

Commit 4272fea

Browse files
committed
all model tests
1 parent dcadf36 commit 4272fea

35 files changed

+415
-228
lines changed

backend/app/api/auth.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,12 @@
55
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
66
from jose import jwt, JWTError
77
from sqlalchemy.orm import Session
8+
from redis.asyncio import Redis
89

910
from app.config import get_config
1011
from app.models.user import User
1112
from app.database import get_db
12-
from app.redis import redis
13+
from app.redis import get_redis
1314
from werkzeug.security import generate_password_hash, check_password_hash
1415
from app.schemas.auth import Token, UserSignup
1516

@@ -18,7 +19,7 @@
1819
config = get_config()
1920
SECRET_KEY = config.SECRET_KEY
2021
ALGORITHM = "HS256"
21-
ACCESS_TOKEN_EXPIRE_MINUTES = 60
22+
ACCESS_TOKEN_EXPIRE_MINUTES = 7 * 24 * 60 # 7 days
2223

2324
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="api/login")
2425

@@ -52,7 +53,7 @@ async def get_current_user(token: str = Depends(oauth2_scheme), db: Session = De
5253
return user
5354

5455
@public_api.post("/login", response_model=Token)
55-
async def login(request: Request, form_data: OAuth2PasswordRequestForm = Depends(), db: Session = Depends(get_db)):
56+
async def login(request: Request, form_data: OAuth2PasswordRequestForm = Depends(), db: Session = Depends(get_db), redis: Redis = Depends(get_redis)):
5657
email = form_data.username
5758
password = form_data.password
5859
ip = request.client.host

backend/app/api/frames.py

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
from sqlalchemy.orm import Session
1616

1717
from app.database import get_db
18-
from app.redis import redis
18+
from redis.asyncio import Redis
1919
from app.models.frame import Frame, new_frame, delete_frame, update_frame
2020
from app.models.log import new_log as log
2121
from app.models.metrics import Metrics
@@ -28,6 +28,7 @@
2828
)
2929
from app.api.auth import ALGORITHM, SECRET_KEY, get_current_user
3030
from app.utils.network import is_safe_host
31+
from app.redis import get_redis
3132
from . import private_api, public_api
3233

3334

@@ -40,15 +41,15 @@ async def api_frames_list(db: Session = Depends(get_db)):
4041

4142
@private_api.get("/frames/{id}", response_model=FrameResponse)
4243
async def api_frame_get(id: int, db: Session = Depends(get_db)):
43-
frame = db.query(Frame).get(id)
44+
frame = db.get(Frame, id)
4445
if frame is None:
4546
raise HTTPException(status_code=HTTPStatus.NOT_FOUND, detail="Frame not found")
4647
return {"frame": frame.to_dict()}
4748

4849

4950
@private_api.get("/frames/{id}/logs", response_model=FrameLogsResponse)
5051
async def api_frame_get_logs(id: int, db: Session = Depends(get_db)):
51-
frame = db.query(Frame).get(id)
52+
frame = db.get(Frame, id)
5253
if frame is None:
5354
raise HTTPException(status_code=HTTPStatus.NOT_FOUND, detail="Frame not found")
5455
logs = [ll.to_dict() for ll in frame.logs][-1000:]
@@ -71,15 +72,15 @@ async def get_image_link(id: int, user=Depends(get_current_user)):
7172
}
7273

7374
@public_api.get("/frames/{id}/image")
74-
async def api_frame_get_image(id: int, token: str, request: Request, db: Session = Depends(get_db)):
75+
async def api_frame_get_image(id: int, token: str, request: Request, db: Session = Depends(get_db), redis: Redis = Depends(get_redis)):
7576
try:
7677
payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
7778
if payload.get("sub") != str(id):
7879
raise HTTPException(status_code=401, detail="Unauthorized")
7980
except JWTError:
8081
raise HTTPException(status_code=401, detail="Unauthorized")
8182

82-
frame = db.query(Frame).get(id)
83+
frame = db.get(Frame, id)
8384
if frame is None:
8485
raise HTTPException(status_code=HTTPStatus.NOT_FOUND, detail="Frame not found")
8586

@@ -110,8 +111,8 @@ async def api_frame_get_image(id: int, token: str, request: Request, db: Session
110111

111112

112113
@private_api.get("/frames/{id}/state", response_model=FrameStateResponse)
113-
async def api_frame_get_state(id: int, db: Session = Depends(get_db)):
114-
frame = db.query(Frame).get(id)
114+
async def api_frame_get_state(id: int, db: Session = Depends(get_db), redis: Redis = Depends(get_redis)):
115+
frame = db.get(Frame, id)
115116
if frame is None:
116117
raise HTTPException(status_code=HTTPStatus.NOT_FOUND, detail="Frame not found")
117118

@@ -147,7 +148,7 @@ async def api_frame_get_state(id: int, db: Session = Depends(get_db)):
147148

148149
@private_api.post("/frames/{id}/event/{event}")
149150
async def api_frame_event(id: int, event: str, request: Request, db: Session = Depends(get_db)):
150-
frame = db.query(Frame).get(id)
151+
frame = db.get(Frame, id)
151152
if frame is None:
152153
raise HTTPException(status_code=HTTPStatus.NOT_FOUND, detail="Frame not found")
153154

@@ -179,7 +180,7 @@ async def api_frame_event(id: int, event: str, request: Request, db: Session = D
179180

180181
@private_api.get("/frames/{id}/scene_source/{scene}")
181182
async def api_frame_scene_source(id: int, scene: str, db: Session = Depends(get_db)):
182-
frame = db.query(Frame).get(id)
183+
frame = db.get(Frame, id)
183184
if frame is None:
184185
raise HTTPException(status_code=HTTPStatus.NOT_FOUND, detail="Frame not found")
185186

@@ -191,7 +192,7 @@ async def api_frame_scene_source(id: int, scene: str, db: Session = Depends(get_
191192

192193
@private_api.get("/frames/{id}/assets", response_model=FrameAssetsResponse)
193194
async def api_frame_get_assets(id: int, db: Session = Depends(get_db)):
194-
frame = db.query(Frame).get(id)
195+
frame = db.get(Frame, id)
195196
if frame is None:
196197
raise HTTPException(status_code=HTTPStatus.NOT_FOUND, detail="Frame not found")
197198

@@ -217,8 +218,8 @@ async def api_frame_get_assets(id: int, db: Session = Depends(get_db)):
217218

218219

219220
@private_api.get("/frames/{id}/asset")
220-
async def api_frame_get_asset(id: int, request: Request, db: Session = Depends(get_db)):
221-
frame = db.query(Frame).get(id)
221+
async def api_frame_get_asset(id: int, request: Request, db: Session = Depends(get_db), redis: Redis = Depends(get_redis)):
222+
frame = db.get(Frame, id)
222223
if frame is None:
223224
raise HTTPException(status_code=HTTPStatus.NOT_FOUND, detail="Frame not found")
224225

@@ -325,7 +326,7 @@ async def api_frame_update_endpoint(
325326
data: FrameUpdateRequest,
326327
db: Session = Depends(get_db)
327328
):
328-
frame = db.query(Frame).get(id)
329+
frame = db.get(Frame, id)
329330
if not frame:
330331
raise HTTPException(status_code=HTTPStatus.NOT_FOUND, detail="Frame not found")
331332

@@ -349,18 +350,18 @@ async def api_frame_update_endpoint(
349350

350351

351352
@private_api.post("/frames/new", response_model=FrameResponse)
352-
async def api_frame_new(data: FrameCreateRequest, db: Session = Depends(get_db)):
353+
async def api_frame_new(data: FrameCreateRequest, db: Session = Depends(get_db), redis: Redis = Depends(get_redis)):
353354
try:
354-
frame = await new_frame(db, data.name, data.frame_host, data.server_host, data.device, data.interval)
355+
frame = await new_frame(db, redis, data.name, data.frame_host, data.server_host, data.device, data.interval)
355356
return {"frame": frame.to_dict()}
356357
except Exception as e:
357358
raise HTTPException(status_code=HTTPStatus.INTERNAL_SERVER_ERROR, detail=str(e))
358359

359360

360361
@private_api.delete("/frames/{frame_id}")
361-
async def api_frame_delete(frame_id: int, db: Session = Depends(get_db)):
362+
async def api_frame_delete(frame_id: int, db: Session = Depends(get_db), redis: Redis = Depends(get_redis)):
362363
try:
363-
success = await delete_frame(db, frame_id)
364+
success = await delete_frame(db, redis, frame_id)
364365
if success:
365366
return {"message": "Frame deleted successfully"}
366367
else:
@@ -371,7 +372,7 @@ async def api_frame_delete(frame_id: int, db: Session = Depends(get_db)):
371372

372373
@private_api.get("/frames/{id}/metrics", response_model=FrameMetricsResponse)
373374
async def api_frame_metrics(id: int, db: Session = Depends(get_db)):
374-
frame = db.query(Frame).get(id)
375+
frame = db.get(Frame, id)
375376
if frame is None:
376377
raise HTTPException(status_code=HTTPStatus.NOT_FOUND, detail="Frame not found")
377378
try:

backend/app/api/log.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,19 @@
11
from fastapi import HTTPException, Depends, Header
22
from sqlalchemy.orm import Session
3+
from redis.asyncio import Redis
34

45
from app.database import get_db
56
from app.models.frame import Frame
67
from app.models.log import process_log
78
from app.schemas.log import LogRequest, LogResponse
9+
from app.redis import get_redis
810
from . import public_api
911

1012
@public_api.post("/log", response_model=LogResponse)
1113
async def post_api_log(
1214
data: LogRequest,
1315
db: Session = Depends(get_db),
16+
redis: Redis = Depends(get_redis),
1417
authorization: str = Header(None)
1518
):
1619
if not authorization:
@@ -27,10 +30,10 @@ async def post_api_log(
2730
raise HTTPException(status_code=401, detail="Unauthorized")
2831

2932
if data.log:
30-
await process_log(db, frame, data.log)
33+
await process_log(db, redis, frame, data.log)
3134

3235
if data.logs:
3336
for log in data.logs:
34-
await process_log(db, frame, log)
37+
await process_log(db, redis, frame, log)
3538

3639
return LogResponse(message="OK")

backend/app/api/repositories.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ async def get_repositories(db: Session = Depends(get_db)):
8181
@private_api.get("/repositories/{repository_id}", response_model=RepositoryResponse)
8282
async def get_repository(repository_id: int, db: Session = Depends(get_db)):
8383
try:
84-
repository = db.query(Repository).get(repository_id)
84+
repository = db.get(Repository, repository_id)
8585
if not repository:
8686
raise HTTPException(status_code=404, detail="Repository not found")
8787
repo_dict = repository.to_dict()
@@ -93,7 +93,7 @@ async def get_repository(repository_id: int, db: Session = Depends(get_db)):
9393
@private_api.patch("/repositories/{repository_id}", response_model=RepositoryResponse)
9494
async def update_repository(repository_id: int, data: RepositoryUpdateRequest, db: Session = Depends(get_db)):
9595
try:
96-
repository = db.query(Repository).get(repository_id)
96+
repository = db.get(Repository, repository_id)
9797
if not repository:
9898
raise HTTPException(status_code=404, detail="Repository not found")
9999

@@ -112,7 +112,7 @@ async def update_repository(repository_id: int, data: RepositoryUpdateRequest, d
112112
@private_api.delete("/repositories/{repository_id}")
113113
async def delete_repository(repository_id: int, db: Session = Depends(get_db)):
114114
try:
115-
repository = db.query(Repository).get(repository_id)
115+
repository = db.get(Repository, repository_id)
116116
if not repository:
117117
raise HTTPException(status_code=404, detail="Repository not found")
118118
db.delete(repository)

backend/app/api/templates.py

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,15 @@
1313
from sqlalchemy.orm import Session
1414

1515
from app.database import get_db
16-
from app.redis import redis
16+
from redis.asyncio import Redis
1717
from app.models.template import Template
1818
from app.models.frame import Frame
1919
from app.schemas.templates import (
2020
TemplateResponse, TemplatesListResponse, CreateTemplateRequest, UpdateTemplateRequest
2121
)
2222
from app.api.auth import SECRET_KEY, ALGORITHM
2323
from app.api import private_api, public_api
24+
from app.redis import get_redis
2425

2526

2627
def respond_with_template(template: Template):
@@ -54,6 +55,7 @@ def respond_with_template(template: Template):
5455
@private_api.post("/templates")
5556
async def create_template(
5657
db: Session = Depends(get_db),
58+
redis: Redis = Depends(get_redis),
5759
file: UploadFile = File(None),
5860
url: str = Form(None),
5961
from_frame_id: int = Form(None),
@@ -143,7 +145,7 @@ async def create_template(
143145
# If from_frame_id is provided, attempt to fetch image from frame cache
144146
if data.get('from_frame_id'):
145147
frame_id = data['from_frame_id']
146-
frame = db.query(Frame).get(frame_id)
148+
frame = db.get(Frame, frame_id)
147149
if frame:
148150
cache_key = f'frame:{frame.frame_host}:{frame.frame_port}:image'
149151
last_image = await redis.get(cache_key)
@@ -203,21 +205,21 @@ async def get_template_image(template_id: str, token: str, request: Request, db:
203205
except JWTError:
204206
raise HTTPException(status_code=401, detail="Unauthorized")
205207

206-
template = db.query(Template).get(template_id)
208+
template = db.get(Template, template_id)
207209
if not template or not template.image:
208210
raise HTTPException(status_code=404, detail="Template not found")
209211
return StreamingResponse(io.BytesIO(template.image), media_type='image/jpeg')
210212

211213

212214
@private_api.get("/templates/{template_id}/export")
213215
async def export_template(template_id: int, db: Session = Depends(get_db)):
214-
template = db.query(Template).get(template_id)
216+
template = db.get(Template, template_id)
215217
return respond_with_template(template)
216218

217219

218220
@private_api.get("/templates/{template_id}", response_model=TemplateResponse)
219221
async def get_template(template_id: int, db: Session = Depends(get_db)):
220-
template = db.query(Template).get(template_id)
222+
template = db.get(Template, template_id)
221223
if not template:
222224
raise HTTPException(status_code=404, detail="Template not found")
223225
d = template.to_dict()
@@ -227,7 +229,7 @@ async def get_template(template_id: int, db: Session = Depends(get_db)):
227229

228230
@private_api.patch("/templates/{template_id}", response_model=TemplateResponse)
229231
async def update_template(template_id: int, data: UpdateTemplateRequest, db: Session = Depends(get_db)):
230-
template = db.query(Template).get(template_id)
232+
template = db.get(Template, template_id)
231233
if not template:
232234
raise HTTPException(status_code=404, detail="Template not found")
233235

@@ -245,7 +247,7 @@ async def update_template(template_id: int, data: UpdateTemplateRequest, db: Ses
245247

246248
@private_api.delete("/templates/{template_id}")
247249
async def delete_template(template_id: int, db: Session = Depends(get_db)):
248-
template = db.query(Template).get(template_id)
250+
template = db.get(Template, template_id)
249251
if not template:
250252
raise HTTPException(status_code=404, detail="Template not found")
251253
db.delete(template)

0 commit comments

Comments
 (0)