# app/main.py from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from app import ssl_heidi from pathlib import Path import os import json from app.routers import address, contact, proposal, dewar, shipment, puck, spreadsheet, logistics, auth, sample from app.database import Base, engine, SessionLocal, load_sample_data app = FastAPI() # Determine environment and configuration file path environment = os.getenv('ENVIRONMENT', 'dev') config_file = Path(__file__).resolve().parent.parent / f'config_{environment}.json' # Load configuration with open(config_file) as f: config = json.load(f) cert_path = config['ssl_cert_path'] key_path = config['ssl_key_path'] # Generate SSL Key and Certificate if not exist (only for development) if environment == 'development': Path("ssl").mkdir(parents=True, exist_ok=True) if not Path(cert_path).exists() or not Path(key_path).exists(): ssl_heidi.generate_self_signed_cert(cert_path, key_path) # Apply CORS middleware app.add_middleware( CORSMiddleware, allow_origins=["*"], # Enable CORS for all origins allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) @app.on_event("startup") def on_startup(): # Drop and recreate database schema Base.metadata.drop_all(bind=engine) Base.metadata.create_all(bind=engine) db = SessionLocal() try: load_sample_data(db) finally: db.close() # Include routers with correct configuration app.include_router(auth.router, prefix="/auth", tags=["auth"]) app.include_router(contact.router, prefix="/contacts", tags=["contacts"]) app.include_router(address.router, prefix="/addresses", tags=["addresses"]) app.include_router(proposal.router, prefix="/proposals", tags=["proposals"]) app.include_router(dewar.router, prefix="/dewars", tags=["dewars"]) app.include_router(shipment.router, prefix="/shipments", tags=["shipments"]) app.include_router(puck.router, prefix="/pucks", tags=["pucks"]) app.include_router(spreadsheet.router, tags=["spreadsheet"]) app.include_router(logistics.router, prefix="/logistics", tags=["logistics"]) app.include_router(sample.router, prefix="/samples", tags=["samples"]) if __name__ == "__main__": import uvicorn import os # Get environment from an environment variable environment = os.getenv('ENVIRONMENT', 'dev') # Paths for SSL certificates cert_path = "ssl/cert.pem" key_path = "ssl/key.pem" if environment == 'testing': cert_path = "ssl/mx-aare-test.psi.ch.pem" key_path = "ssl/mx-aare-test.psi.ch.key" # Run the application with appropriate SSL setup uvicorn.run(app, host="127.0.0.1", port=8000, log_level="debug", ssl_keyfile=key_path, ssl_certfile=cert_path)