您最多能選擇 25 個主題 主題必須以字母或數字為開頭,可包含連接號「-」且最長為 35 個字元。

83 行
2.8 KiB

此檔案含有易混淆的 Unicode 字元!

此檔案含有易混淆的 Unicode 字元,這些字元的處理方式可能和下面呈現的不同。若您是有意且合理的使用,您可以放心地忽略此警告。使用 Escape 按鈕標記這些字元。

from fastapi import FastAPI, Depends
from starlette.requests import Request
from .server_data import ServerData
from .database.db import database
# from .utils.dependencies import right_checkers, get_current_user
from .utils.dependencies import get_current_user
from .utils.responses import (
ResponseStructure,
get_base_url,
validate_response,
)
from .utils.users import check_user_rights
from .schemas.responses import GetRootResponse
from .schemas.users import User
from .routers.users import router as users_router
from .routers.commands import router as commands_router
# TODO
# 1. Добавить список отклоняемых токенов и их обработку.
# 2. Добавить предварительный вариант генерации access_tokens.
# 3. Продумать, наконец, концепцию cid и wid, в ключе их применения при
# настройке команд и запуске воркеров.
# 4. Решить сколько команд может запускать пользователь единовременно.
# 5. Добавить способ указания принадлежности воркеров и команд пользователям.
# 6. Разобраться с местом раcположения базы данных.
data = ServerData()
app = FastAPI()
@app.on_event("startup")
async def startup():
await database.connect()
@app.on_event("shutdown")
async def shutdown():
await database.disconnect()
@app.get("/", response_model=GetRootResponse, tags=["Home"])
async def get_primary_commands(request: Request,
user: User = Depends(get_current_user)):
check_user_rights(user, "read")
resp = ResponseStructure(get_base_url(request))
resp.add_data(name="Calculate Server", version="0.1")
resp.add_link("commands", "/commands?gui={is_gui}", templated=True)
resp.add_link("find_command", "/commands/{console_command}?gui={is_gui}",
templated=True)
resp.add_link("workers", "/workers")
return validate_response(resp.get_dict(), GetRootResponse,
media_type="application/hal+json")
# @app.get("/workers/{wid}", tags=["Workers management"],
# dependencies=[Depends(right_checkers["write"])])
# async def get_worker(wid: int):
# '''Тестовый обработчик.'''
# worker = data.get_worker_object(wid=wid)
# worker.run()
# print(f"worker: {type(worker)} object {worker}")
# await worker.send({"text": "INFO"})
# worker_data = await worker.get()
# if worker_data['type'] == 'log':
# data.log_message[data['level']](data['msg'])
# return worker_data
# Authentification and users management.
app.include_router(users_router)
# Commands running and management.
app.include_router(commands_router)