async (not working tbh)

This commit is contained in:
2024-04-14 14:45:01 +03:00
parent 17e0f78ecf
commit 033dbc538e
11 changed files with 95 additions and 50 deletions

View File

@ -27,7 +27,7 @@ async def login_for_access_token(
form_data: Annotated[OAuth2PasswordRequestForm, Depends()],
db: Annotated[Session, Depends(get_db)],
) -> schemas.Token:
user = services.authenticate_user(db, form_data.username, form_data.password)
user = await services.authenticate_user(db, form_data.username, form_data.password)
if not user:
raise HTTPException(
status_code=status.HTTP_409_CONFLICT,
@ -46,7 +46,7 @@ async def register(
user_data: schemas.UserRegister,
db: Annotated[Session, Depends(get_db)],
) -> schemas.User:
user = services.get_user_by_username(db, user_data.username)
user = await services.get_user_by_username(db, user_data.username)
if user:
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
@ -59,7 +59,7 @@ async def register(
detail="Passwords do not match",
headers={"WWW-Authenticate": "Bearer"},
)
user = services.create_user(db=db, user_data=user_data)
user = await services.create_user(db=db, user_data=user_data)
return user

View File

@ -27,3 +27,11 @@ class Token(BaseModel):
class TokenData(BaseModel):
username: Union[str, None] = None
class AnonUser(BaseModel):
id: UUID
name: str
class Config:
from_attributes = True

View File

@ -1,6 +1,9 @@
from fastapi import status, HTTPException, Depends
from fastapi import status, HTTPException, Depends, Header
from fastapi.security import OAuth2PasswordBearer
from sqlalchemy.orm import Session
# from sqlalchemy.orm import Session
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.future import select
from jose import JWTError, jwt
from typing import Annotated, Union
from datetime import datetime, timezone, timedelta
@ -24,16 +27,18 @@ def get_password_hash(password) -> str:
return pwd_context.hash(password)
def get_user_by_id(db: Session, user_id: uuid.uuid4) -> models.User:
return db.query(models.User).filter(models.User.id == user_id).first()
async def get_user_by_id(db: AsyncSession, user_id: uuid.uuid4) -> models.User:
u = await db.execute(select(models.User).filter(models.User.id == user_id))
return u.scalar_one_or_none()
def get_user_by_username(db: Session, username: int) -> models.User:
return db.query(models.User).filter(models.User.username == username).first()
async def get_user_by_username(db: AsyncSession, username: int) -> models.User:
u = await db.execute(select(models.User).filter(models.User.username == username))
return u.scalar_one_or_none()
def authenticate_user(db: Session, username: str, password: str):
user = get_user_by_username(db, username)
async def authenticate_user(db: AsyncSession, username: str, password: str):
user = await get_user_by_username(db, username)
if not user:
return False
if not verify_password(password, user.hashed_password):
@ -54,20 +59,22 @@ def create_access_token(data: dict, expires_delta: Union[timedelta, None] = None
return encoded_jwt
def create_user(db: Session, user_data: schemas.UserRegister) -> schemas.UserInDB:
async def create_user(
db: AsyncSession, user_data: schemas.UserRegister
) -> schemas.UserInDB:
user = models.User(
username=user_data.username,
name=user_data.name,
hashed_password=get_password_hash(user_data.password),
)
db.add(user)
db.commit()
await db.commit()
return schemas.UserInDB.model_validate(user)
async def get_current_user(
token: Annotated[str, Depends(oauth2_scheme)],
db: Annotated[Session, Depends(get_db)],
db: Annotated[AsyncSession, Depends(get_db)],
) -> schemas.UserInDB:
credentials_exception = HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
@ -84,7 +91,7 @@ async def get_current_user(
token_data = schemas.TokenData(username=username)
except JWTError:
raise credentials_exception
user = get_user_by_username(db, username=token_data.username)
user = await get_user_by_username(db, username=token_data.username)
if user is None:
raise credentials_exception
return user
@ -92,7 +99,7 @@ async def get_current_user(
async def get_current_user_or_none(
token: Annotated[str, Depends(oauth2_scheme)],
db: Annotated[Session, Depends(get_db)],
db: Annotated[AsyncSession, Depends(get_db)],
) -> Union[schemas.UserInDB, None]:
try:
payload = jwt.decode(
@ -104,7 +111,7 @@ async def get_current_user_or_none(
token_data = schemas.TokenData(username=username)
except JWTError:
return None
user = get_user_by_username(db, username=token_data.username)
user = await get_user_by_username(db, username=token_data.username)
return user
@ -114,3 +121,24 @@ async def get_current_active_user(
if not current_user.is_active:
raise HTTPException(status_code=400, detail="Inactive user")
return current_user
async def create_anon_user(
db: Annotated[AsyncSession, Depends(get_db)]
) -> schemas.AnonUser:
u = models.AnonymousUser()
db.add(u)
await db.commit()
return schemas.AnonUser.model_validate(u)
async def get_anon_user(
db: Annotated[AsyncSession, Depends(get_db)],
device_id: Annotated[Union[str, None], Header()] = None,
) -> schemas.AnonUser:
if device_id:
u = await db.execute(
select(models.AnonymousUser).filter(models.AnonymousUser.id == device_id)
)
return schemas.AnonUser.model_validate(u.scalar_one_or_none())
return await create_anon_user(db)