| from fastapi import APIRouter, HTTPException, Query, Security, Depends |
| from fastapi.security import APIKeyHeader |
| import requests |
| import os |
| from typing import List, Optional |
| from pydantic import BaseModel |
| import logging |
|
|
| router = APIRouter() |
|
|
| |
| logger = logging.getLogger(__name__) |
|
|
| |
| api_key_header = APIKeyHeader(name="X-API-Key", auto_error=False) |
| CHAT_AUTH_KEY = os.environ.get("CHAT_AUTH_KEY") |
|
|
| class UnsplashResponse(BaseModel): |
| images: List[str] |
|
|
| async def verify_api_key(api_key: str = Security(api_key_header)): |
| if api_key != CHAT_AUTH_KEY: |
| logger.warning("Invalid API key used") |
| raise HTTPException(status_code=403, detail="Could not validate credentials") |
| return api_key |
|
|
| @router.get("/unsplash-images/", response_model=UnsplashResponse) |
| async def get_unsplash_images( |
| query: str, |
| images_per_page: Optional[int] = Query(4, alias="per_page", ge=1, le=30), |
| page: Optional[int] = Query(1, ge=1), |
| api_key: str = Depends(verify_api_key) |
| ): |
| url = "https://api.unsplash.com/search/photos" |
| params = { |
| "query": query, |
| "client_id": os.environ.get("UNSPLASH_API_KEY"), |
| "per_page": images_per_page, |
| "page": page |
| } |
| response = requests.get(url, params=params) |
| |
| if response.status_code != 200: |
| raise HTTPException(status_code=response.status_code, detail="Failed to fetch images from Unsplash") |
| |
| data = response.json() |
| images = [] |
| if 'results' in data: |
| for photo in data['results']: |
| images.append(photo['urls']['regular']) |
| |
| return UnsplashResponse(images=images) |