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