-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathserver.py
111 lines (80 loc) · 3.45 KB
/
server.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
import hashlib
import os
from pathlib import Path
from typing import Annotated
from api.app import appendChart, appendNextChart, browseCharts, getCharts, loadSession, setPreferred
from api.models import ChartModel, FieldModel
from fastapi import Depends, FastAPI, HTTPException, Request, UploadFile, status
from fastapi.staticfiles import StaticFiles
from pydantic import BaseModel, Field
server = FastAPI()
async def get_session_key(request: Request) -> str:
user_agent = request.headers.get("user-agent", "")
ip = (
request.headers.get("x-real-ip", "")
or request.headers.get("x-forwarded-for", "").split(",")[0].strip()
or request.client.host
if request.client
else ""
)
accept_lang = request.headers.get("accept-language", "")
platform = request.headers.get("sec-ch-ua-platform", "")
mobile = request.headers.get("sec-ch-ua-mobile", "")
device_string = f"{user_agent}{ip}{accept_lang}{platform}{mobile}"
return hashlib.sha256(device_string.encode()).hexdigest()
if os.path.exists("dist") and os.getenv("ENV") != "development":
server.mount("/Swipytics", StaticFiles(directory="dist", html=True), name="static")
@server.post("/api/writeFile")
async def write_file(file: UploadFile, session_key: Annotated[str, Depends(get_session_key)]):
Path("data").mkdir(parents=True, exist_ok=True)
with open(f"data/{file.filename}", "wb") as buffer:
buffer.write(await file.read())
return {"filename": file.filename}
class LoadSessionRequest(BaseModel):
filename: str
charts: list["ChartModel"] = Field(default_factory=list)
fields: list["FieldModel"] = Field(default_factory=list)
timestamp: int = Field(default=0)
@server.post("/api/loadSession")
async def load_session(
session: LoadSessionRequest, session_key: Annotated[str, Depends(get_session_key)]
):
if os.path.isfile(f"data/{session.filename}"):
return loadSession(session=session.model_dump(), session_key=session_key)
else:
return HTTPException(status_code=404, detail="File not found")
class BrowseChartRequest(BaseModel):
field_names: list[str]
@server.post("/api/browseCharts")
async def browse_charts(
req: BrowseChartRequest, session_key: Annotated[str, Depends(get_session_key)]
):
return browseCharts(req.field_names, session_key=session_key)
class AppendChartRequest(BaseModel):
chart: ChartModel
@server.post("/api/appendChart")
async def append_chart(
req: AppendChartRequest, session_key: Annotated[str, Depends(get_session_key)]
):
return appendChart(req.chart, session_key=session_key)
@server.get("/api/appendNextChart")
async def append_next_chart(session_key: Annotated[str, Depends(get_session_key)]):
chart = appendNextChart(session_key=session_key)
return HTTPException(status_code=404, detail="No more charts") if not chart else chart
@server.post("/api/getCharts")
async def get_charts(
req: BrowseChartRequest, session_key: Annotated[str, Depends(get_session_key)]
):
return getCharts(req.field_names, session_key=session_key)
class SetPreferredRequest(BaseModel):
key: str = Field(default="", alias="key")
preferred: bool = Field(default=False)
@server.patch("/api/setPreferred")
async def set_preferred(
req: SetPreferredRequest, session_key: Annotated[str, Depends(get_session_key)]
):
chart = setPreferred(req.key, req.preferred, session_key=session_key)
return HTTPException(status_code=404, detail="Chart not found") if not chart else chart
@server.get("/api", status_code=status.HTTP_200_OK)
async def root():
return {}