diff --git a/src/app.py b/src/app.py index dff3806..932e94a 100644 --- a/src/app.py +++ b/src/app.py @@ -1,41 +1,113 @@ +import uvicorn import requests -from flask import Flask, render_template, abort, request, jsonify + +from fastapi import ( + FastAPI, + Request, + HTTPException, +) +from fastapi.responses import FileResponse +from starlette.staticfiles import StaticFiles +from fastapi.templating import Jinja2Templates -app = Flask(__name__) VATSIM_API_URL = "https://api.vatsim.net/v2/" - -@app.route("/") -def index_page(): - return render_template("index.html") +app = FastAPI( + title="VATSIM Fox", + docs_url=None, + redoc_url=None, + openapi_url=None, + redirect_slashes=True +) +templates = Jinja2Templates(directory="templates") +app.mount("/static", StaticFiles(directory="static"), name="static") -@app.errorhandler(404) -def errorhandler_page(_): - return render_template("4O4.html"), 404 +@app.get("/") +async def get_index_page(request: Request): + """ + Index page + + :param request: FastAPI request + :return: HTML template + """ + + return templates.TemplateResponse( + name="index.html", + context={ + "request": request, + } + ) -@app.route("/api/request") -def request_handler(): - if request_string := request.args.get("request_string"): +@app.get("/favicon.ico", include_in_schema=False) +async def get_favicon(): + """ + Get favicon + + :return: Icon file + """ + + return FileResponse("./static/icon.ico") + + +@app.get("/{cid}/") +async def get_viewer_page(request: Request, cid: str = None): + """ + Viewer page + + :param request: FastAPI request + :param cid: User CID + :return: HTML template + """ + + user = requests.get(f"{VATSIM_API_URL}members/{cid}").json() + if "detail" in user and user["detail"] == "Not Found": + return HTTPException(404) + + return templates.TemplateResponse( + name="viewer.html", + context={ + "user": user, + "request": request, + } + ) + + +@app.exception_handler(404) +async def error_handler(request: Request, _): + """ + Handler to the 404 HTTP error + + :param request: FastAPI request + :return: HTML template + """ + + return templates.TemplateResponse( + name="4O4.html", + context={ + "request": request, + } + ) + + +@app.get("/api/request") +def request_handler(request_string: str): + """ + Wrapper to the VATSIM API functions + + :param request_string: String that will fetched from VATSIM API + """ + + if request_string: try: return requests.get(f"{VATSIM_API_URL}{request_string}").json() except requests.exceptions.JSONDecodeError: - return jsonify({"result": "error", "message": "Something went wrong. Report that error please"}) + return {"result": "error", "message": "Something went wrong. Report that error please"} - return jsonify({"result": "not found", "message": "Not found"}) - - -@app.route("//") -def viewer_page(cid): - user = requests.get(f"{VATSIM_API_URL}members/{cid}").json() - - if "detail" in user and user["detail"] == "Not Found": - return abort(404) - - return render_template("viewer.html", user=user) + return {"result": "not found", "message": "Not found"} if __name__ == "__main__": - app.run(host="0.0.0.0", port=80) + uvicorn.run(app=app, host="0.0.0.0", port=80) diff --git a/src/templates/include/template.html b/src/templates/include/template.html index 21f00be..04a6b9f 100644 --- a/src/templates/include/template.html +++ b/src/templates/include/template.html @@ -10,7 +10,7 @@ - + {% block title %}{% endblock %} @@ -50,9 +50,7 @@ diff --git a/src/templates/viewer.html b/src/templates/viewer.html index af2b9af..31baa86 100644 --- a/src/templates/viewer.html +++ b/src/templates/viewer.html @@ -1,7 +1,7 @@ {% extends "/include/template.html" %} {% block title %}User {{user["id"]}} statistic — VATSIM Fox{% endblock %} {% block header_css %} - + {% endblock %} {% block content %} @@ -146,5 +146,5 @@ $(".date_registration").text("{{user['reg_date']}}".replace("T", " ")); - + {% endblock %}