from fastapi import FastAPI from contextlib import asynccontextmanager from fastapi.staticfiles import StaticFiles from app.services.markdown_processor import MarkdownProcessor from app.services.metadata_processor import MetadataProcessor from app.controllers.dynamic_controller import DynamicController from app.controllers.category_controller import CategoryController class Application: def __init__(self): """Initialize the FastAPI app and configure it.""" self.app = FastAPI(lifespan=self._lifespan_event) self._setup_static_files() self._include_routers() @asynccontextmanager async def _lifespan_event(self, app: FastAPI): """Lifespan event for startup and shutdown logic.""" print("App startup: Processing Markdown files...") # Generate dynamic JSON data metadata_processor = MetadataProcessor(input_dir="./data", output_file="generated_data.json") metadata_processor.generate_json() print("Generated dynamic data file.") print("Markdown processing complete!") # Process Markdown files into HTML processor = MarkdownProcessor(input_dir="./data", templates_dir="./templates") processor.run() yield print("App shutdown: Cleanup complete.") def _setup_static_files(self): """Mount static file directories.""" self.app.mount("/data", StaticFiles(directory="data"), name="data") self.app.mount("/static", StaticFiles(directory="static"), name="static") def _include_routers(self): """Include all route controllers.""" category_controller = CategoryController() dynamic_controller = DynamicController( "./data" ) self.app.include_router( category_controller.router ) self.app.include_router( dynamic_controller.router ) def get_app(self): """Return the FastAPI app instance.""" return self.app application = Application() app = application.get_app()