72 lines
2.1 KiB
Python
72 lines
2.1 KiB
Python
import os
|
|
from flask import Flask, request, g, jsonify, current_app
|
|
from app.utils.typed_flask import CoCFlask
|
|
from typing import cast
|
|
|
|
from app.services.appwrite_client import AppWriteClient
|
|
from app.utils.api_response import ApiResponder
|
|
|
|
from app.blueprints.main import main_bp
|
|
from app.blueprints.char import char_bp
|
|
|
|
from app.utils.settings import get_settings
|
|
|
|
settings = get_settings()
|
|
|
|
def create_app() -> CoCFlask:
|
|
app = CoCFlask(__name__)
|
|
|
|
app.config.update(
|
|
SECRET_KEY=settings.flask_secret_key,
|
|
APPWRITE_ENDPOINT=settings.appwrite_endpoint,
|
|
APPWRITE_PROJECT_ID=settings.appwrite_project_id,
|
|
APPWRITE_API_KEY=settings.appwrite_api_key,
|
|
)
|
|
|
|
default_headers = {
|
|
"Cache-Control": "no-store",
|
|
"Content-Type": "application/json; charset=utf-8",
|
|
# Add CORS if needed:
|
|
# "Access-Control-Allow-Origin": "*",
|
|
}
|
|
|
|
full_app_name = f"{settings.app_name} - v {settings.app_version}"
|
|
app.api = ApiResponder(
|
|
app_name=full_app_name,
|
|
version_provider=settings.app_version,
|
|
include_request_id=True,
|
|
default_headers=default_headers
|
|
)
|
|
|
|
app.api.register_error_handlers(app)
|
|
|
|
if not app.config["APPWRITE_ENDPOINT"] or not app.config["APPWRITE_PROJECT_ID"]:
|
|
raise RuntimeError("Missing APPWRITE_ENDPOINT or APPWRITE_PROJECT_ID")
|
|
|
|
# Blueprints
|
|
app.register_blueprint(main_bp)
|
|
app.register_blueprint(char_bp)
|
|
|
|
@app.before_request
|
|
def authenticate():
|
|
auth = request.headers.get("Authorization", "")
|
|
if not auth.startswith("Bearer "):
|
|
return app.api.unauthorized("Missing Bearer Token")
|
|
|
|
token = auth.split(" ", 1)[1].strip()
|
|
try:
|
|
aw = AppWriteClient()
|
|
user = aw.get_user_from_jwt_token(token)
|
|
if isinstance(user,str):
|
|
return app.api.unauthorized("Invalid or Expired JWT")
|
|
except Exception as e:
|
|
return app.api.unauthorized("Invalid or Expired JWT")
|
|
|
|
# make available to routes
|
|
g.appwrite_user = user
|
|
return None
|
|
|
|
|
|
|
|
return app
|