from fastapi import APIRouter, Depends, HTTPException from fastapi.security import OAuth2PasswordRequestForm from sqlalchemy.orm import Session from .. import models, schemas from ..database import get_db from ..security import hash_password, verify_password, create_access_token from ..deps import get_current_user router = APIRouter(prefix="/auth", tags=["auth"]) @router.post("/register", response_model=schemas.UserOut) def register(payload: schemas.UserCreate, db: Session = Depends(get_db)): existing = db.query(models.User).filter(models.User.email == payload.email).first() if existing: raise HTTPException(status_code=400, detail="Пользователь с таким email уже существует") # первый зарегистрированный пользователь становится администратором is_first_user = db.query(models.User).count() == 0 user = models.User( email=payload.email, password_hash=hash_password(payload.password), role=models.Role.admin if is_first_user else models.Role.client, ) db.add(user) db.commit() db.refresh(user) return user @router.post("/login", response_model=schemas.Token) def login(form_data: OAuth2PasswordRequestForm = Depends(), db: Session = Depends(get_db)): user = db.query(models.User).filter(models.User.email == form_data.username).first() if not user or not verify_password(form_data.password, user.password_hash): raise HTTPException(status_code=401, detail="Неверный email или пароль") token = create_access_token({"sub": str(user.id)}) return {"access_token": token, "token_type": "bearer"} @router.get("/me", response_model=schemas.UserOut) def me(current_user: models.User = Depends(get_current_user)): return current_user