from flask import Flask, jsonify from flask_jwt_extended import get_jwt_identity from common.extensions import db, api, jwt, minio_client import os import logging.config from common.utils.database import Database from config.logging_config import LOGGING from .api.document_api import AddDocumentResource from .api.auth import TokenResource from config.config import get_config from common.utils.celery_utils import make_celery, init_celery from common.utils.eveai_exceptions import EveAIException def create_app(config_file=None): app = Flask(__name__) environment = os.getenv('FLASK_ENV', 'development') match environment: case 'development': app.config.from_object(get_config('dev')) case 'production': app.config.from_object(get_config('prod')) case _: app.config.from_object(get_config('dev')) app.config['SESSION_KEY_PREFIX'] = 'eveai_api_' app.celery = make_celery(app.name, app.config) init_celery(app.celery, app) logging.config.dictConfig(LOGGING) logger = logging.getLogger(__name__) logger.info("eveai_api starting up") # Register Necessary Extensions register_extensions(app) # Error handler for the API @app.errorhandler(EveAIException) def handle_eveai_exception(error): response = jsonify(error.to_dict()) response.status_code = error.status_code return response @api.before_request def before_request(): # Extract tenant_id from the JWT token tenant_id = get_jwt_identity() # Switch to the correct schema Database(tenant_id).switch_schema() # Register resources register_api_resources() return app def register_extensions(app): db.init_app(app) api.init_app(app) jwt.init_app(app) minio_client.init_app(app) def register_api_resources(): api.add_resource(AddDocumentResource, '/api/v1/documents/add_document') api.add_resource(TokenResource, '/api/v1/token')