GitHub Actions
Track large files with LFS
447d423
# 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"}