77 lines
2.0 KiB
Python
77 lines
2.0 KiB
Python
"""
|
|
©AngelaMos | 2026
|
|
__init__.py
|
|
|
|
Flask application factory
|
|
|
|
Creates and configures the Flask app by wiring up MongoDB, Redis,
|
|
CORS, rate limiting, blueprints, CLI commands, consumer groups,
|
|
and the correlation engine daemon. Marks any orphaned scenario
|
|
runs as stopped from a previous process.
|
|
|
|
Connects to:
|
|
extensions.py - init_mongo, init_redis
|
|
core/errors.py - register_error_handlers
|
|
core/rate_limiting.py - init_limiter
|
|
routes/__init__.py - register_blueprints
|
|
cli.py - register_cli
|
|
core/streaming.py - ensure_consumer_group
|
|
models/ScenarioRun.py - marks orphaned runs stopped
|
|
engine/correlation.py - start_engine
|
|
"""
|
|
|
|
from flask import Flask
|
|
from flask_cors import CORS
|
|
|
|
from app.config import settings
|
|
|
|
|
|
def create_app() -> Flask:
|
|
"""
|
|
Application factory that
|
|
wires up all extensions and blueprints
|
|
"""
|
|
app = Flask(__name__)
|
|
app.config.from_mapping(
|
|
MONGO_URI = settings.MONGO_URI,
|
|
MONGO_DB = settings.MONGO_DB,
|
|
REDIS_URL = settings.REDIS_URL,
|
|
SECRET_KEY = settings.SECRET_KEY,
|
|
DEBUG = settings.DEBUG,
|
|
)
|
|
|
|
CORS(app, origins = settings.CORS_ORIGINS)
|
|
|
|
from app.extensions import init_mongo, init_redis
|
|
init_mongo(app)
|
|
init_redis(app)
|
|
|
|
from app.core.errors import register_error_handlers
|
|
register_error_handlers(app)
|
|
|
|
from app.core.rate_limiting import init_limiter
|
|
init_limiter(app)
|
|
|
|
from app.routes import register_blueprints
|
|
register_blueprints(app)
|
|
|
|
from app.cli import register_cli
|
|
register_cli(app)
|
|
|
|
from app.core.streaming import ensure_consumer_group
|
|
ensure_consumer_group(settings.LOG_STREAM_KEY)
|
|
ensure_consumer_group(settings.ALERT_STREAM_KEY)
|
|
|
|
from app.models.ScenarioRun import ScenarioRun
|
|
for orphan in ScenarioRun.get_active_runs():
|
|
orphan.mark_stopped()
|
|
|
|
from app.engine.correlation import start_engine
|
|
start_engine()
|
|
|
|
@app.get("/health")
|
|
def health(): # type: ignore[no-untyped-def]
|
|
return "1"
|
|
|
|
return app
|