|
|
"""Authentication endpoints.""" |
|
|
|
|
|
from fastapi import APIRouter, HTTPException, Depends |
|
|
|
|
|
from api.schemas import LoginRequest, LoginResponse |
|
|
from services.database import db_service |
|
|
from services.auth import auth_service |
|
|
|
|
|
router = APIRouter(tags=["auth"]) |
|
|
|
|
|
|
|
|
@router.post("/auth/login", response_model=LoginResponse) |
|
|
async def login(request: LoginRequest): |
|
|
""" |
|
|
Authenticate a user and return a JWT token. |
|
|
Credentials must be created manually using the create_user.py script. |
|
|
""" |
|
|
user = await db_service.get_user(request.username) |
|
|
if not user: |
|
|
raise HTTPException(status_code=401, detail="Invalid username or password") |
|
|
|
|
|
hashed_password = user.get("hashed_password") |
|
|
if not hashed_password: |
|
|
raise HTTPException(status_code=500, detail="User data corrupted") |
|
|
|
|
|
if not auth_service.verify_password(request.password, hashed_password): |
|
|
raise HTTPException(status_code=401, detail="Invalid username or password") |
|
|
|
|
|
token = auth_service.create_access_token(request.username) |
|
|
return { |
|
|
"token": token, |
|
|
"username": request.username, |
|
|
"message": "Login successful", |
|
|
} |
|
|
|