Spaces:
Sleeping
Sleeping
| from fastapi import FastAPI, HTTPException, Query, Header | |
| from fastapi.middleware.cors import CORSMiddleware | |
| from fastapi.responses import JSONResponse, FileResponse | |
| from typing import Optional | |
| from dotenv import load_dotenv | |
| from database import init_db, DB_PATH | |
| from models import UserCreate, UserLogin, SessionCreate, ABADetails, KidDetails, TherapistKid | |
| from crud import ( | |
| create_user, get_user_by_email, create_session, | |
| create_aba_entry, create_kid_entry, get_user_sessions, | |
| get_kid_data_by_user, get_kid_by_nickname_full as get_kid_by_nickname, | |
| nickname_exists, get_sessions_by_therapist_and_nickname, | |
| get_sessions_by_nickname, link_therapist_to_kid, | |
| get_kids_by_therapist, get_therapists_by_kid, | |
| get_user_by_id | |
| ) | |
| import os | |
| # Carrega variáveis de ambiente (.env em local, variáveis em HF Spaces) | |
| if os.getenv("HF_SPACE") is None: | |
| load_dotenv() | |
| API_BACKUP_TOKEN = os.getenv("API_BACKUP_TOKEN") | |
| app = FastAPI() | |
| init_db() | |
| app.add_middleware( | |
| CORSMiddleware, | |
| allow_origins=["*"], | |
| allow_credentials=True, | |
| allow_methods=["*"], | |
| allow_headers=["*"], | |
| ) | |
| def register(user: UserCreate): | |
| if get_user_by_email(user.email): | |
| raise HTTPException(status_code=400, detail="Email já registrado.") | |
| create_user(user.name, user.email, user.password, user.role) | |
| return {"message": "Usuário registrado com sucesso!"} | |
| def login(user: UserLogin): | |
| db_user = get_user_by_email(user.email) | |
| if db_user and db_user[3] == user.password: | |
| return {"message": "Login bem-sucedido!", "user_id": db_user[0], "role": db_user[4]} | |
| raise HTTPException(status_code=401, detail="Credenciais inválidas.") | |
| def add_session(session: SessionCreate): | |
| session_id = create_session(session) | |
| return {"message": session_id} | |
| def add_aba_data(data: ABADetails): | |
| create_aba_entry(data) | |
| return {"message": "Dados ABA registrados!"} | |
| def add_kid_data(data: KidDetails): | |
| create_kid_entry(data) | |
| return {"message": "Dados da criança registrados!"} | |
| def get_kid_by_user(user_id: int): | |
| try: | |
| data = get_kid_data_by_user(user_id) | |
| keys = ["id", "user_id", "nickname", "age", "suport_level"] | |
| dict_data = [dict(zip(keys, row)) for row in data] | |
| return JSONResponse(content=dict_data) | |
| except Exception as e: | |
| raise HTTPException(status_code=500, detail=str(e)) | |
| def get_kid_by_nickname_endpoint(nickname: str): | |
| try: | |
| data = get_kid_by_nickname(nickname) | |
| return JSONResponse(content=data) | |
| except Exception as e: | |
| raise HTTPException(status_code=500, detail=str(e)) | |
| def get_sessions_by_therapist_and_nickname_endpoint( | |
| user_id: int = Query(...), | |
| nickname: str = Query(...) | |
| ): | |
| try: | |
| data = get_sessions_by_therapist_and_nickname(user_id, nickname) | |
| return JSONResponse(content=data) | |
| except Exception as e: | |
| raise HTTPException(status_code=500, detail=str(e)) | |
| def get_sessions(user_id: int, start_date: Optional[str] = None, end_date: Optional[str] = None): | |
| try: | |
| sessions = get_user_sessions(user_id, start_date, end_date) | |
| return JSONResponse(content=sessions) | |
| except Exception as e: | |
| raise HTTPException(status_code=500, detail=str(e)) | |
| def get_latest_sessions(user_id: int): | |
| try: | |
| sessions = get_user_sessions(user_id, limit=5) | |
| keys = ["id", "user_id", "date", "activities", "progress", "challenges", "observations", "performance_score", "fails_score", "task_completion", "behavior_rating"] | |
| session_dicts = [dict(zip(keys, row)) for row in sessions] | |
| return JSONResponse(content=session_dicts) | |
| except Exception as e: | |
| raise HTTPException(status_code=500, detail=str(e)) | |
| def link_kid(data: TherapistKid): | |
| link_therapist_to_kid(data) | |
| return {"message": "Criança vinculada ao terapeuta com sucesso."} | |
| def get_kids(user_id: int): | |
| return get_kids_by_therapist(user_id) | |
| def get_therapists_by_kid_nickname(nickname: str): | |
| try: | |
| data = get_therapists_by_kid(nickname) | |
| return JSONResponse(content=data) | |
| except Exception as e: | |
| raise HTTPException(status_code=500, detail=str(e)) | |
| def check_kid_nickname(nickname: str): | |
| exists = nickname_exists(nickname) | |
| return {"exists": exists} | |
| def get_sessions_by_nickname_endpoint(nickname: str): | |
| try: | |
| data = get_sessions_by_nickname(nickname) | |
| return JSONResponse(content=data) | |
| except Exception as e: | |
| raise HTTPException(status_code=500, detail=str(e)) | |
| def get_user_by_id_endpoint(user_id: int): | |
| user = get_user_by_id(user_id) | |
| if user: | |
| return {"user_id": user[0], "name": user[1], "email": user[2], "role": user[4]} | |
| raise HTTPException(status_code=404, detail="Usuário não encontrado.") | |
| # 🔐 Endpoint de backup protegido por token e verificação de admin | |
| def download_database( | |
| authorization: str = Header(None), | |
| user_id: int = Query(...) | |
| ): | |
| if authorization != f"Bearer {API_BACKUP_TOKEN}": | |
| raise HTTPException(status_code=401, detail="Token inválido.") | |
| user = get_user_by_id(user_id) | |
| if not user or user["role"].lower() != "admin": | |
| raise HTTPException(status_code=403, detail="Acesso restrito a administradores.") | |
| try: | |
| return FileResponse( | |
| path=DB_PATH, | |
| filename="aba_data_backup.db", | |
| media_type="application/octet-stream" | |
| ) | |
| except Exception as e: | |
| raise HTTPException(status_code=500, detail=f"Erro ao baixar o banco de dados: {str(e)}") | |