File size: 2,232 Bytes
0387a1c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
from __future__ import annotations

import os

from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from fastapi.responses import JSONResponse, RedirectResponse
from fastapi.staticfiles import StaticFiles
from fastapi.openapi.docs import get_swagger_ui_html

from app.memory import init_db
from app.openenv_env.api import router as openenv_router
from app.routes import router
from app.utils import setup_logging
from app.config import settings


def create_app() -> FastAPI:
    setup_logging(settings.log_level)
    init_db(settings.sqlite_path)

    app = FastAPI(title="AI Email Assistant", version="1.0.0", docs_url=None)

    # Dev-friendly CORS. Restrict allow_origins in production.
    app.add_middleware(
        CORSMiddleware,
        allow_origins=["*"],
        allow_credentials=True,
        allow_methods=["*"],
        allow_headers=["*"],
    )

    app.include_router(router)
    app.include_router(openenv_router)

    # Serve the optional frontend for convenience.
    frontend_dir = os.path.join(os.path.dirname(__file__), "frontend")
    has_frontend = os.path.isdir(frontend_dir)
    if has_frontend:
        app.mount("/ui", StaticFiles(directory=frontend_dir, html=True), name="ui")

    static_dir = os.path.join(os.path.dirname(__file__), "static")
    os.makedirs(static_dir, exist_ok=True)
    app.mount("/static", StaticFiles(directory=static_dir), name="static")

    @app.get("/docs", include_in_schema=False)
    async def custom_swagger_ui_html():
        return get_swagger_ui_html(
            openapi_url=app.openapi_url,
            title=app.title + " - Swagger UI",
            oauth2_redirect_url=app.swagger_ui_oauth2_redirect_url,
            swagger_css_url="/static/swagger.css",
        )

    @app.get("/", include_in_schema=True)
    async def root():
        if has_frontend:
            return RedirectResponse(url="/ui/")
        return JSONResponse(
            {
                "name": app.title,
                "version": app.version,
                "docs": {"swagger_ui": "/docs", "redoc": "/redoc", "openapi_json": "/openapi.json"},
                "endpoints": {"api": ["/api/v1"]},
            }
        )

    return app


app = create_app()