import os import socket import sys import uvicorn from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from api.routers import auth_router, health_router, todo_router, user_router from db.database import create_tables app = FastAPI( title="SimpleTodoApp API", description="API for a simple todo application with authentication", version="0.1.0", ) # CORS settings app.add_middleware( CORSMiddleware, allow_origins=["*"], # For development, in production specify your frontend domain allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) # Include routers app.include_router(auth_router.router, prefix="/api/auth", tags=["auth"]) app.include_router(user_router.router, prefix="/api/users", tags=["users"]) app.include_router(todo_router.router, prefix="/api/todos", tags=["todos"]) app.include_router(health_router.router, prefix="/api", tags=["health"]) # Create database tables on startup @app.on_event("startup") async def startup(): create_tables() def is_port_in_use(port, host='0.0.0.0'): """Check if a port is in use.""" with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: try: s.bind((host, port)) return False except OSError: return True if __name__ == "__main__": # Get port from environment variable or use default of 8000 port = int(os.environ.get("PORT", 8000)) host = os.environ.get("HOST", "0.0.0.0") # If the preferred port is in use, try to find an available port if is_port_in_use(port, host): print(f"Port {port} is already in use. Trying alternative ports...") for alt_port in [8001, 8002, 8003, 8004, 8005]: if not is_port_in_use(alt_port, host): port = alt_port print(f"Found available port: {port}") break else: print("No available ports found between 8000-8005. Exiting.") sys.exit(1) print(f"Starting server on {host}:{port}") uvicorn.run("main:app", host=host, port=port, reload=True)