You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

90 lines
3.7 KiB

from fastapi import FastAPI
from fastapi.requests import Request
from fastapi.responses import Response, JSONResponse, StreamingResponse
from fastapi.exceptions import HTTPException
from extra.NodeDTO import NodeDTO
import traceback
class WebExtension:
app: FastAPI
def __init__(self, core):
self.core = core
self.app = core.app
self.dbService = core.dbService
@self.app.get(f"{self.core.context}/ping")
async def pong(request:Request):
return {"pong": True}
@self.app.get(f"{self.core.context}/status")
async def status(request:Request):
return {
"status": self.core.meshState,
"last_packet_catch": self.core.last_packet_catch
}
@self.app.get(f"{self.core.context}/auth/code")
async def sendCodeToNode(request:Request, num: int):
#в сообщение одноразовый код и юзер агент кто слал, так-же чтобы не спапили по фингерпринту один код в минуту
if num:
node = await self.dbService.oneNode(num)
if node:
code = self.core.authManager.request_auth(num)
await self.core.devices[0].sendMsgToDM(f"Auth code: {code}", num)
return {"status": f"Code sended to {node['long_name']}"}
raise HTTPException(status_code=400)
@self.app.get(f"{self.core.context}/auth/code/check")
async def acceptCodeFromNode(request:Request, code: int):
#если такой код есть то авторизуем пользователя, иначе шлем н***й
if code:
try:
num = self.core.authManager.accept_code(code)
respond = self.core.authManager.setAuth(JSONResponse({"status":True}), num)
return respond
except:
return {"status": False}
return {"status": False}
@self.app.get(f"{self.core.context}/auth/logout")
async def clearSession(request:Request):
return self.core.authManager.setAuth(JSONResponse({"status":True}), 0, True)
@self.app.get(f"{self.core.context}/auth/me")
@self.core.authManager.authRequest()
async def userNode(request:Request):
userNum = request.cookies.get(self.core.authManager.NUM, None)
userNode = await self.dbService.oneNode(userNum)
if userNum is not None:
return NodeDTO(userNode)
else:
return {}
@self.app.get(self.core.context+"/tile/{z}/{x}/{y}.png")
@self.core.authManager.authRequest()
async def grabTile(request:Request, z:int, x:int, y:int):
try:
img = await self.core.tileManager.grabTile(z, x, y)
headers = {
"Cache-Control": f"public, max-age={86400*7}"
}
return Response(content=img, headers=headers, media_type="image/png")
except:
traceback.print_exc()
raise HTTPException(status_code=404, detail="not found tile")
@self.app.get(f"{self.core.context}/devices")
async def devicesList():
response = []
count = 1
for hash in self.core.devicesUuidHashToUuid.keys():
obj = {
"hash": hash,
"default": hash == self.core.defaultDeviceUUIDHash,
"name": f"Устройство {count}"
}
response.append(obj)
count += 1
return response