Files
COC_API/app/__init__.py
2025-11-02 01:14:41 -05:00

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