|
| 1 | +from fastapi import APIRouter, Depends |
| 2 | +from app.utils.db import get_db_connection_direct |
| 3 | +from app.utils.make_meta import make_meta |
| 4 | +from app.utils.api_key_auth import get_api_key |
| 5 | +import os |
| 6 | +import requests |
| 7 | +import json |
| 8 | +from dotenv import load_dotenv |
| 9 | + |
| 10 | +router = APIRouter() |
| 11 | + |
| 12 | +@router.post("/flickr/sync") |
| 13 | +def sync_flickr(api_key: str = Depends(get_api_key)) -> dict: |
| 14 | + """POST /flickr/sync: Fetches data from Flickr API and stores in DB.""" |
| 15 | + load_dotenv() |
| 16 | + flickr_user = os.getenv("FLICKR_USER") |
| 17 | + flickr_key = os.getenv("FLICKR_KEY") |
| 18 | + flickr_secret = os.getenv("FLICKR_SECRET") |
| 19 | + if not flickr_user or not flickr_key or not flickr_secret: |
| 20 | + return {"meta": make_meta("error", "Missing Flickr API credentials"), "data": {}} |
| 21 | + |
| 22 | + # Example: Fetch public photos for the user |
| 23 | + url = "https://api.flickr.com/services/rest/" |
| 24 | + params = { |
| 25 | + "method": "flickr.people.getPublicPhotos", |
| 26 | + "api_key": flickr_key, |
| 27 | + "user_id": flickr_user, |
| 28 | + "format": "json", |
| 29 | + "nojsoncallback": 1, |
| 30 | + "per_page": 10 |
| 31 | + } |
| 32 | + try: |
| 33 | + resp = requests.get(url, params=params) |
| 34 | + resp.raise_for_status() |
| 35 | + data = resp.json() |
| 36 | + photos = data.get("photos", {}).get("photo", []) |
| 37 | + conn = get_db_connection_direct() |
| 38 | + cur = conn.cursor() |
| 39 | + for photo in photos: |
| 40 | + cur.execute( |
| 41 | + """ |
| 42 | + INSERT INTO flickr_photos (flickr_id, title, payload) |
| 43 | + VALUES (%s, %s, %s) |
| 44 | + ON CONFLICT (flickr_id) DO NOTHING; |
| 45 | + """, |
| 46 | + (photo.get("id"), photo.get("title"), json.dumps(photo)) |
| 47 | + ) |
| 48 | + conn.commit() |
| 49 | + cur.close() |
| 50 | + conn.close() |
| 51 | + return {"meta": make_meta("success", f"Synced {len(photos)} photos from Flickr"), "data": {"count": len(photos)}} |
| 52 | + except Exception as e: |
| 53 | + return {"meta": make_meta("error", f"Sync error: {str(e)}"), "data": {}} |
0 commit comments