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_service import ImageService class Application: def __init__(self): """Initialize the FastAPI app and configure it.""" self.app = FastAPI( lifespan = self._lifespan_event ) self._set_image_sizes() 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",app=self.app) metadata_processor.generate_json() print("Generated dynamic data file.") # Process Markdown files into HTML processor = MarkdownProcessor(input_dir="./data", templates_dir="./templates",app=self.app) 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") self.app.mount( "/images", StaticFiles( directory = "static/images" ), name = "images" ) def _include_routers(self): """Include all route controllers.""" category_controller = CategoryController() image_service = ImageService(self.app) route_to_web = RouteToWeb(self.app) self.app.include_router( category_controller.router ) self.app.include_router(route_to_web.router) self.app.include_router( image_service.router ) def _include_middelware(self): self.app.add_middleware( GZipMiddleware, minimum_size = 500 ) def _set_image_sizes(self): self.app.state.IMAGE_SIZES = { 'thumbnails': {'width': 150, 'height': 150}, 'large': {'width': 800, 'height': 600}, 'small': {'width': 300, 'height': 200}, 'original': {'width': None, 'height': None}, # Original størrelse } def get_app(self): """Return the FastAPI app instance.""" return self.app application = Application() app = application.get_app()