2023-07-24 15:07:44 +02:00

35 lines
1.4 KiB
Python

from fastapi import APIRouter, Depends, status, Request, HTTPException
from sqlalchemy.ext.asyncio import AsyncSession
from app.database import get_db
from app.models.user import User
from app.schemas.user import UserSchema, UserResponse, UserLogin, TokenResponse
from app.services.auth import create_access_token
router = APIRouter(prefix="/v1/user")
@router.post("/", status_code=status.HTTP_201_CREATED, response_model=UserResponse)
async def create_user(payload: UserSchema, request: Request, db_session: AsyncSession = Depends(get_db)):
_user: User = User(**payload.model_dump())
await _user.save(db_session)
# TODO: add refresh token
_user.access_token = await create_access_token(_user, request)
return _user
@router.post("/token", status_code=status.HTTP_201_CREATED, response_model=TokenResponse)
async def get_token_for_user(user: UserLogin, request: Request, db_session: AsyncSession = Depends(get_db)):
_user: User = await User.find(db_session, [User.email == user.email])
# TODO: out exception handling to external module
if not _user:
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="User not found")
if not _user.check_password(user.password):
raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="Password is incorrect")
# TODO: add refresh token
_token = await create_access_token(_user, request)
return {"access_token": _token, "token_type": "bearer"}