Merge pull request #5 from aljazceru/main

sync
This commit is contained in:
2025-10-02 14:50:24 +02:00
committed by GitHub

View File

@@ -61,9 +61,16 @@ class UserRegisterRequest(BaseModel):
class UserLoginRequest(BaseModel): class UserLoginRequest(BaseModel):
email: EmailStr email: Optional[EmailStr] = None
username: Optional[str] = None
password: str password: str
@validator('email')
def validate_email_or_username(cls, v, values):
if v is None and not values.get('username'):
raise ValueError('Either email or username must be provided')
return v
class TokenResponse(BaseModel): class TokenResponse(BaseModel):
access_token: str access_token: str
@@ -161,10 +168,12 @@ async def login(
): ):
"""Login user and return access tokens""" """Login user and return access tokens"""
# Determine identifier for logging and user lookup
identifier = user_data.email if user_data.email else user_data.username
logger.info( logger.info(
"LOGIN_DEBUG_START", "LOGIN_DEBUG_START",
request_time=datetime.utcnow().isoformat(), request_time=datetime.utcnow().isoformat(),
email=user_data.email, identifier=identifier,
database_url="SET" if settings.DATABASE_URL else "NOT SET", database_url="SET" if settings.DATABASE_URL else "NOT SET",
jwt_secret="SET" if settings.JWT_SECRET else "NOT SET", jwt_secret="SET" if settings.JWT_SECRET else "NOT SET",
admin_email=settings.ADMIN_EMAIL, admin_email=settings.ADMIN_EMAIL,
@@ -173,10 +182,15 @@ async def login(
start_time = datetime.utcnow() start_time = datetime.utcnow()
# Get user by email # Get user by email or username
logger.info("LOGIN_USER_QUERY_START") logger.info("LOGIN_USER_QUERY_START")
query_start = datetime.utcnow() query_start = datetime.utcnow()
stmt = select(User).where(User.email == user_data.email)
if user_data.email:
stmt = select(User).where(User.email == user_data.email)
else:
stmt = select(User).where(User.username == user_data.username)
result = await db.execute(stmt) result = await db.execute(stmt)
query_end = datetime.utcnow() query_end = datetime.utcnow()
logger.info( logger.info(
@@ -187,7 +201,7 @@ async def login(
user = result.scalar_one_or_none() user = result.scalar_one_or_none()
if not user: if not user:
logger.warning("LOGIN_USER_NOT_FOUND", email=user_data.email) logger.warning("LOGIN_USER_NOT_FOUND", identifier=identifier)
# List available users for debugging # List available users for debugging
try: try:
all_users_stmt = select(User).limit(5) all_users_stmt = select(User).limit(5)