Elliott Duke
Claude Opus 4.8
HomingPet: lost-dog reunification (FastAPI + React) with Render deploy
de1e3fc Download backend/app/api/auth.py from Duke410/PawTrace: direct link, hf CLI and curl.
- Browser
- Download file 2.09 kB
-
https://huggingface.co/spaces/Duke410/PawTrace/resolve/main/backend/app/api/auth.py
- Command line
-
hf download hf://spaces/Duke410/PawTrace/backend/app/api/auth.py
-
curl -L -o auth.py https://huggingface.co/spaces/Duke410/PawTrace/resolve/main/backend/app/api/auth.py
2.09 kB
| from __future__ import annotations | |
| from fastapi import APIRouter, Depends, HTTPException, status | |
| from sqlalchemy import select | |
| from sqlalchemy.orm import Session | |
| from ..db import get_db | |
| from ..models import User | |
| from ..models.base import UserRole | |
| from ..schemas.auth import ( | |
| LoginRequest, | |
| RegisterRequest, | |
| TokenResponse, | |
| UserOut, | |
| ) | |
| from ..schemas.common import Message | |
| from ..security import ( | |
| create_access_token, | |
| get_current_user, | |
| hash_password, | |
| verify_password, | |
| ) | |
| router = APIRouter(prefix="/auth", tags=["auth"]) | |
| def register(payload: RegisterRequest, db: Session = Depends(get_db)) -> TokenResponse: | |
| existing = db.execute(select(User).where(User.email == payload.email)).scalar_one_or_none() | |
| if existing: | |
| raise HTTPException(status.HTTP_409_CONFLICT, "Email already registered") | |
| user = User( | |
| name=payload.name, | |
| email=payload.email, | |
| phone=payload.phone, | |
| zip=payload.zip, | |
| password_hash=hash_password(payload.password), | |
| role=UserRole.owner, | |
| ) | |
| db.add(user) | |
| db.commit() | |
| db.refresh(user) | |
| return TokenResponse(access_token=create_access_token(user.id)) | |
| def login(payload: LoginRequest, db: Session = Depends(get_db)) -> TokenResponse: | |
| user = db.execute(select(User).where(User.email == payload.email)).scalar_one_or_none() | |
| if not user or not user.password_hash or not verify_password(payload.password, user.password_hash): | |
| raise HTTPException(status.HTTP_401_UNAUTHORIZED, "Invalid email or password") | |
| return TokenResponse(access_token=create_access_token(user.id)) | |
| def logout() -> Message: | |
| # Stateless JWT: client simply discards the token. Endpoint exists for symmetry (spec §12). | |
| return Message(detail="Logged out") | |
| def me(user: User = Depends(get_current_user)) -> User: | |
| return user | |