invoice-processing-google-d.../api/routers/users.py
2025-08-26 12:26:03 +02:00

63 lines
2.1 KiB
Python

# api/routers/users.py
from fastapi import APIRouter, Depends, HTTPException, status
from fastapi.security import OAuth2PasswordRequestForm
from sqlalchemy.orm import Session
from datetime import timedelta
from api import schemas
from db import crud
from db.database import get_db
from core import security
from core.config import settings
router = APIRouter()
# ================== ¡ENDPOINT DE REGISTRO! ==================
# Este es el endpoint que faltaba y que arregla el error 404
@router.post("/register", response_model=schemas.User)
def register_user(user: schemas.UserCreate, db: Session = Depends(get_db)):
"""
Crea un nuevo usuario en la base de datos.
"""
db_user = crud.get_user_by_username(db, username=user.username)
if db_user:
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
detail="Username already registered"
)
db_user_email = crud.get_user_by_email(db, email=user.email)
if db_user_email:
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
detail="Email already registered"
)
return crud.create_user(db=db, user=user)
# =============================================================
# ================== ENDPOINT DE LOGIN ==================
@router.post("/token", response_model=schemas.Token)
def login_for_access_token(
db: Session = Depends(get_db),
form_data: OAuth2PasswordRequestForm = Depends()
):
"""
Procesa el formulario de login y devuelve un token de acceso JWT.
"""
user = crud.authenticate_user(db, username=form_data.username, password=form_data.password)
if not user:
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="Incorrect username or password",
headers={"WWW-Authenticate": "Bearer"},
)
access_token_expires = timedelta(minutes=settings.ACCESS_TOKEN_EXPIRE_MINUTES)
access_token = security.create_access_token(
data={"sub": user.username}, expires_delta=access_token_expires
)
return {"access_token": access_token, "token_type": "bearer"}