"""Flask application factory.""" from __future__ import annotations from datetime import timedelta from flask import Flask, jsonify from flask.typing import ResponseReturnValue from mimic.api import register_blueprints from mimic.auth.identity import load_user from mimic.config import Settings, get_settings from mimic.extensions import db, login_manager, migrate, socketio from mimic.logging import configure_logging def create_app(settings: Settings | None = None) -> Flask: settings = settings or get_settings() configure_logging(settings.log_level, as_json=settings.log_json) app = Flask(__name__) app.config.update( SECRET_KEY=settings.secret_key.get_secret_value(), SQLALCHEMY_DATABASE_URI=settings.database_url, SQLALCHEMY_TRACK_MODIFICATIONS=False, SESSION_COOKIE_SECURE=settings.session_cookie_secure, SESSION_COOKIE_SAMESITE=settings.session_cookie_samesite, SESSION_COOKIE_HTTPONLY=True, PERMANENT_SESSION_LIFETIME=timedelta(minutes=settings.session_lifetime_minutes), MIMIC_SETTINGS=settings, ) db.init_app(app) migrate.init_app(app, db, directory="src/mimic/db/migrations") login_manager.init_app(app) login_manager.user_loader(load_user) socketio.init_app( app, cors_allowed_origins=settings.cors_origins or "*", async_mode="gevent", ) register_blueprints(app) @app.get("/healthz") def healthz() -> ResponseReturnValue: return jsonify(status="ok"), 200 return app