from fastapi import FastAPI from contextlib import asynccontextmanager from fastapi.staticfiles import StaticFiles from app.controllers.route_to_web import RouteToWeb from app.services.markdown_processor import MarkdownProcessor from app.services.metadata_processor import MetadataProcessor from app.controllers.category_controller import CategoryController from fastapi.middleware.gzip import GZipMiddleware from app.services.image_controller import ImageHandler 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() self._include_middelware() @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" ) route_to_web = RouteToWeb(self.app) self.app.include_router( category_controller.router ) #self.app.include_router( dynamic_controller.router ) self.app.include_router(route_to_web.router) def _include_middelware(self): self.app.add_middleware( GZipMiddleware, minimum_size = 500 ) def get_app(self): """Return the FastAPI app instance.""" return self.app application = Application() app = application.get_app()