| from fastapi import FastAPI, Depends, HTTPException, status | |
| from fastapi.middleware.cors import CORSMiddleware | |
| from fastapi.security import APIKeyHeader | |
| import os | |
| import uvicorn | |
| from typing import Optional | |
| from dotenv import load_dotenv | |
| load_dotenv() | |
| API_TOKEN = os.getenv("API_ACCESS_TOKEN") | |
| if not API_TOKEN: | |
| print("WARNING: API_ACCESS_TOKEN not set. Generating a random token.") | |
| import secrets | |
| API_TOKEN = secrets.token_urlsafe(32) | |
| print(f"Generated token: {API_TOKEN}") | |
| api_key_header = APIKeyHeader(name="X-API-Token", auto_error=False) | |
| api_key_query = "token" | |
| async def verify_token( | |
| api_key_header: str = Depends(api_key_header), | |
| token: Optional[str] = None, | |
| ) -> bool: | |
| if api_key_header == API_TOKEN: | |
| return True | |
| if token == API_TOKEN: | |
| return True | |
| raise HTTPException( | |
| status_code=status.HTTP_401_UNAUTHORIZED, | |
| detail="Invalid or missing API token", | |
| headers={"WWW-Authenticate": "APIKey"}, | |
| ) | |
| app = FastAPI( | |
| title="Hotel Image API", | |
| description="API for retrieving hotel images with Google Search fallback" | |
| ) | |
| app.add_middleware( | |
| CORSMiddleware, | |
| allow_origins=["*"], | |
| allow_credentials=True, | |
| allow_methods=["*"], | |
| allow_headers=["*"], | |
| ) | |
| from api.routes.hotel_routes import router as hotel_router | |
| from api.routes.system_routes import router as system_router | |
| app.include_router(system_router) | |
| app.include_router(hotel_router, dependencies=[Depends(verify_token)]) | |
| if __name__ == "__main__": | |
| uvicorn.run(app, host="0.0.0.0", port=7860) |