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"}