70 lines
1.9 KiB
Python
70 lines
1.9 KiB
Python
import jwt
|
|
from fastapi import FastAPI, Request
|
|
from fastapi.middleware.cors import CORSMiddleware
|
|
from fastapi.openapi.docs import get_swagger_ui_html
|
|
from fastapi.responses import JSONResponse
|
|
|
|
from app import mongo, schedules
|
|
from app.api import v1
|
|
from app.config import config
|
|
from app.utils.logger_util import logger
|
|
|
|
app = FastAPI(
|
|
docs_url=None,
|
|
redirect_slashes=False
|
|
)
|
|
|
|
|
|
@app.on_event("startup")
|
|
async def startup_event():
|
|
await mongo.migrate()
|
|
await schedules.start()
|
|
logger.info("App started")
|
|
|
|
|
|
@app.on_event("shutdown")
|
|
async def shutdown_event():
|
|
logger.info("App shutted down")
|
|
|
|
|
|
if config["MODE"] == 'development':
|
|
logger.debug("Development mode")
|
|
app.add_middleware(
|
|
CORSMiddleware,
|
|
allow_origins=["*"],
|
|
allow_credentials=True,
|
|
allow_methods=["*"],
|
|
allow_headers=["*"],
|
|
)
|
|
|
|
|
|
@app.middleware("http")
|
|
async def http_processing(request: Request, call_next) -> any:
|
|
if request.method == "GET" or "/api/v1/auth/login" in str(request.url):
|
|
return await call_next(request)
|
|
|
|
authorization = request.headers.get("authorization")
|
|
if not authorization or not authorization.startswith("Bearer "):
|
|
return JSONResponse(content={"detail": "Отсутствует токен"}, status_code=401)
|
|
|
|
bearer = authorization.replace("Bearer ", "")
|
|
payload = jwt.decode(bearer, config["JWT_SECRET_KEY"], algorithms=[config["JWT_ALGORITHM"]])
|
|
|
|
user = await mongo.users_collection.find_one({"id": int(payload["sub"])})
|
|
if not user:
|
|
return JSONResponse(content={"detail": "Пользователь не найден"}, status_code=401)
|
|
|
|
request.state.user = user
|
|
return await call_next(request)
|
|
|
|
|
|
@app.get("/apidoc", include_in_schema=False)
|
|
async def custom_swagger_ui_html():
|
|
return get_swagger_ui_html(
|
|
openapi_url=app.openapi_url,
|
|
title=f"{app.title} - Swagger UI"
|
|
)
|
|
|
|
|
|
app.include_router(v1.router, prefix='/api/v1')
|