-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapi.py
99 lines (88 loc) · 2.56 KB
/
api.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
from datetime import datetime
from typing import List
from zoneinfo import ZoneInfo
from fastapi import FastAPI, Request
from fastapi.responses import HTMLResponse
from fastapi.templating import Jinja2Templates
from jinja2 import Environment, FileSystemLoader
from pydantic import BaseModel, parse_obj_as
from pydantic.json import pydantic_encoder
import json
class Mesh(BaseModel):
name: str
short_name: str
description: str | None = None
url: str | None = None
meshinfo_url: str | None = None
contact: str | None = None
country: str | None = None
region: str | None = None
metro: str | None = None
latitude: float | None = None
longitude: float | None = None
altitude: float | None = None
timezone: str | None = None
last_announcement: datetime | None = None
meshes = [
Mesh(
name="Sac Valley Mesh",
short_name="SVM",
url="https://www.sacvalleymesh.com",
contact="https://www.sacvalleymesh.com",
meshinfo_url="https://svm.meshinfo.network",
country="US",
region="CA",
metro="Sacramento",
latitude=38.5,
longitude=-121.4,
altitude=0,
timezone="America/Los_Angeles",
last_announcement=datetime.now(ZoneInfo("America/Los_Angeles")),
),
Mesh(
name="Bay Area Mesh",
short_name="BAYM",
url="https://bayme.sh",
contact="https://bayme.sh",
meshinfo_url="https://bayme.sh",
country="US",
region="CA",
metro="San Francisco Bay Area",
latitude=37.8,
longitude=-122.4,
altitude=0,
timezone="America/Los_Angeles",
last_announcement=datetime.now(ZoneInfo("America/Los_Angeles")),
),
]
templates = Jinja2Templates(directory="./templates")
app = FastAPI()
@app.get("/", response_class=HTMLResponse)
async def root(request: Request):
global meshes
return templates.TemplateResponse(
request=request, name="index.html.j2", context={"meshes": meshes}
)
@app.get("/meshes")
async def read_meshes():
save_meshes()
return meshes
@app.post("/meshes")
async def create_mesh(mesh: Mesh):
meshes.append(mesh)
save_meshes()
return mesh
def load_meshes():
try:
with open("data/meshes.json", "r") as f:
meshes_dict = json.load(f)
meshes = parse_obj_as(List[Mesh], meshes_dict)
return meshes
except:
return []
def save_meshes():
with open("data/meshes.json", "w") as f:
json.dump(meshes, f, default=pydantic_encoder)
save_meshes()
meshes = load_meshes()
print(meshes)