Compare commits
3 Commits
0de7d63817
...
9099120ee2
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9099120ee2 | ||
|
|
c642b89581 | ||
|
|
e0cddbdd34 |
@@ -14,8 +14,9 @@ router = APIRouter(prefix=settings.api.v1.users, tags=["Users"])
|
||||
|
||||
|
||||
@router.get("/me")
|
||||
async def get_me(user: ActiveUser):
|
||||
return user
|
||||
async def get_me(session: sessionDep, user: ActiveUser):
|
||||
cur_user = await UserService(session).get_user_by_filter_or_raise(id=user.id)
|
||||
return cur_user
|
||||
|
||||
|
||||
@router.get("/")
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
from pydantic import BaseModel
|
||||
from pydantic import BaseModel, ConfigDict, Field
|
||||
|
||||
|
||||
class Token(BaseModel):
|
||||
@@ -8,5 +8,8 @@ class Token(BaseModel):
|
||||
|
||||
class TokenData(BaseModel):
|
||||
id: int
|
||||
sub: str
|
||||
sub: str = Field(alias='username')
|
||||
is_superuser: bool
|
||||
is_active: bool
|
||||
|
||||
model_config = ConfigDict(populate_by_name=True)
|
||||
@@ -3,7 +3,7 @@ from typing import Annotated
|
||||
from pydantic import BaseModel, BeforeValidator, ConfigDict, EmailStr
|
||||
|
||||
from src.schemas.tasks import TaskWithId
|
||||
from src.schemas.validators import ensure_password
|
||||
from src.schemas.validators import ensure_password, ensure_username
|
||||
|
||||
|
||||
class UserUpdate(BaseModel):
|
||||
@@ -19,6 +19,8 @@ class User(BaseModel):
|
||||
username: str
|
||||
is_active: bool
|
||||
is_superuser: bool
|
||||
telegram_id: int | None
|
||||
avatar_path: str | None
|
||||
model_config = ConfigDict(from_attributes=True, extra="ignore")
|
||||
|
||||
|
||||
@@ -36,7 +38,7 @@ class UserRequest(BaseModel):
|
||||
|
||||
|
||||
class UserRequestADD(BaseModel):
|
||||
username: str
|
||||
username: Annotated[str, BeforeValidator(ensure_username)]
|
||||
email: EmailStr | None = None
|
||||
password: Annotated[str, BeforeValidator(ensure_password)]
|
||||
|
||||
|
||||
@@ -1,11 +1,21 @@
|
||||
from typing import Any
|
||||
|
||||
|
||||
def ensure_password(value: Any) -> Any:
|
||||
def ensure_password(value: Any) -> str:
|
||||
if not isinstance(value, str):
|
||||
raise TypeError("Password must be a string")
|
||||
value = value.strip()
|
||||
if len(value) < 8:
|
||||
raise ValueError("Password must be at least 8 characters")
|
||||
if value.strip() == "":
|
||||
elif value.strip() == "":
|
||||
raise ValueError("Password cannot be empty")
|
||||
return value
|
||||
|
||||
|
||||
def ensure_username(value: str) -> str:
|
||||
value = value.strip()
|
||||
if len(value) < 3:
|
||||
raise ValueError("Username must be at least 3 characters")
|
||||
elif value.lower() in ['admin', 'moderator', 'админ', 'модератор']:
|
||||
raise ValueError("Login is already taken")
|
||||
return value
|
||||
@@ -2,7 +2,7 @@ from fastapi import HTTPException
|
||||
|
||||
from src.core.auth_manager import AuthManager
|
||||
from src.core.settings import settings
|
||||
from src.schemas.auth import Token
|
||||
from src.schemas.auth import Token, TokenData
|
||||
from src.schemas.users import User, UserAdd, UserRequestADD, UserWithHashedPass
|
||||
from src.services.base import BaseService
|
||||
|
||||
@@ -27,6 +27,7 @@ class AuthService(BaseService):
|
||||
detail="Incorrect username or password",
|
||||
)
|
||||
user = UserWithHashedPass.model_validate(result)
|
||||
user_token = TokenData.model_validate(user.model_dump())
|
||||
verify = AuthManager.verify_password(
|
||||
plain_password=password, hashed_password=user.hashed_password
|
||||
)
|
||||
@@ -36,7 +37,7 @@ class AuthService(BaseService):
|
||||
detail="Incorrect username or password",
|
||||
)
|
||||
access_token = AuthManager.create_access_token(
|
||||
data={"id": user.id, "sub": user.username, "is_active": user.is_active}
|
||||
user_token.model_dump()
|
||||
)
|
||||
return Token(
|
||||
access_token=access_token, token_type=settings.access_token.token_type
|
||||
|
||||
Reference in New Issue
Block a user