File size: 3,740 Bytes
447d423 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 |
# main.py
from fastapi import FastAPI, HTTPException, APIRouter
from fastapi.middleware.cors import CORSMiddleware
import crud
import schemas
from Idiom_Id_Generator import generate_id
from dotenv import load_dotenv
import os
from pydantic import BaseModel
from typing import List, Dict, Optional
load_dotenv()
app = FastAPI(title="Idioms API - Supabase REST")
allowed_origins = [
"http://localhost",
"http://localhost:3000",
"http://localhost:8000",
"https://idiomator.vercel.app",
"https://www.idiomator.vercel.app",
"https://idiomator.com",
"https://www.idiomator.com",
]
app.add_middleware(
CORSMiddleware,
allow_origins= allowed_origins,#allowed_origins,
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
@app.get("/idioms", response_model=list[schemas.IdiomResponse])
async def read_idioms(skip: int = 0, limit: int = 50):
try:
data = await crud.get_idioms(skip=skip, limit=limit)
return data
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
@app.post("/idioms", response_model=schemas.IdiomResponse)
async def create_idiom(idiom: schemas.IdiomCreate):
try:
# keep your ID generation
idiom_id = generate_id(idiom.language, idiom.dialect)
idiom_dict = idiom.dict()
idiom_dict["id"] = idiom_id
created = await crud.create_idiom(idiom_dict)
return created
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
@app.get("/idioms/all_ids", response_model=List[Dict[str, str]])
async def get_all_idioms_route():
idioms = await crud.get_all_idioms()
print(f"Fetched {len(idioms)} idioms")
print(f"Sample idioms: {idioms[:3]}") # Print first 3 idioms for verification
return [
{"id": idiom["id"], "idiom": idiom["idiom"], "language": idiom["language"]}
for idiom in idioms
]
@app.get("/idioms/search", response_model=List[schemas.IdiomResponse])
async def search_idioms(
q: Optional[str] = None,
language: Optional[str] = None,
skip: int = 0,
limit: int = 50
):
try:
results = await crud.search_idioms(query=q, language=language, skip=skip, limit=limit)
return results
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
@app.get("/idioms/{idiom_id}", response_model=schemas.IdiomResponse)
async def read_idiom(idiom_id: str):
try:
db_idiom = await crud.get_idiom(idiom_id)
if not db_idiom:
raise HTTPException(status_code=404, detail="Idiom not found")
# Transform validation_count if needed
if isinstance(db_idiom.get("validation_count"), int):
db_idiom["validation_count"] = {"count": db_idiom["validation_count"]}
return db_idiom
except HTTPException:
raise
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
@app.patch("/idioms/{idiom_id}", response_model=schemas.IdiomResponse)
async def patch_idiom(idiom_id: str, idiom_update: schemas.IdiomBase):
try:
updated = await crud.update_idiom(idiom_id, idiom_update.dict(exclude_unset=True))
if not updated:
raise HTTPException(status_code=404, detail="Idiom not found")
return updated
except HTTPException:
raise
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
@app.delete("/idioms/{idiom_id}")
async def delete_idiom(idiom_id: str):
try:
return await crud.delete_idiom(idiom_id)
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
@app.get("/ping")
async def ping():
return {"status": "ok"}
|