a working product with ugly ui
This commit is contained in:
80
app/routers/auth.py
Normal file
80
app/routers/auth.py
Normal file
@@ -0,0 +1,80 @@
|
||||
from fastapi import APIRouter, Depends, HTTPException, status
|
||||
from sqlalchemy.orm import Session
|
||||
from app.database import get_db
|
||||
from app.dependencies import get_current_user
|
||||
from app.schemas.auth import LoginRequest, TokenResponse
|
||||
from app.schemas.user import UserCreate, UserResponse, UserWithToken
|
||||
from app.services.auth_service import authenticate_user, create_user, create_tokens_for_user
|
||||
from app.models.user import User
|
||||
|
||||
router = APIRouter(prefix="/api/auth", tags=["authentication"])
|
||||
|
||||
|
||||
@router.post("/register", response_model=UserWithToken, status_code=status.HTTP_201_CREATED)
|
||||
async def register(
|
||||
user_data: UserCreate,
|
||||
db: Session = Depends(get_db)
|
||||
):
|
||||
"""
|
||||
Register a new user.
|
||||
Registration must be enabled via ALLOW_REGISTRATION environment variable.
|
||||
"""
|
||||
user = create_user(db, user_data)
|
||||
tokens = create_tokens_for_user(user)
|
||||
|
||||
return UserWithToken(
|
||||
id=user.id,
|
||||
username=user.username,
|
||||
email=user.email,
|
||||
is_admin=user.is_admin,
|
||||
created_at=user.created_at,
|
||||
updated_at=user.updated_at,
|
||||
access_token=tokens.access_token,
|
||||
refresh_token=tokens.refresh_token,
|
||||
token_type=tokens.token_type
|
||||
)
|
||||
|
||||
|
||||
@router.post("/login", response_model=TokenResponse)
|
||||
async def login(
|
||||
credentials: LoginRequest,
|
||||
db: Session = Depends(get_db)
|
||||
):
|
||||
"""
|
||||
Login with username and password.
|
||||
Returns JWT access and refresh tokens.
|
||||
"""
|
||||
user = authenticate_user(db, credentials.username, credentials.password)
|
||||
tokens = create_tokens_for_user(user)
|
||||
|
||||
return tokens
|
||||
|
||||
|
||||
@router.get("/me", response_model=UserResponse)
|
||||
async def get_current_user_info(
|
||||
current_user: User = Depends(get_current_user)
|
||||
):
|
||||
"""
|
||||
Get current authenticated user information.
|
||||
Requires valid JWT token in Authorization header.
|
||||
"""
|
||||
return UserResponse(
|
||||
id=current_user.id,
|
||||
username=current_user.username,
|
||||
email=current_user.email,
|
||||
is_admin=current_user.is_admin,
|
||||
created_at=current_user.created_at,
|
||||
updated_at=current_user.updated_at
|
||||
)
|
||||
|
||||
|
||||
@router.post("/refresh", response_model=TokenResponse)
|
||||
async def refresh_access_token(
|
||||
current_user: User = Depends(get_current_user)
|
||||
):
|
||||
"""
|
||||
Refresh access token using a valid refresh token.
|
||||
Returns new access and refresh tokens.
|
||||
"""
|
||||
tokens = create_tokens_for_user(current_user)
|
||||
return tokens
|
||||
Reference in New Issue
Block a user