This commit is contained in:
Saedbhati 2025-10-10 10:05:44 +05:30
parent 08143704f7
commit 6f36829c93
33 changed files with 278 additions and 114 deletions

View file

@ -9,7 +9,7 @@ from app.component.stack_auth import StackAuth
from app.exception.exception import UserException
from app.model.user.user import LoginByPasswordIn, LoginResponse, Status, User, RegisterIn
from app.component.environment import env
from app.utils import traceroot_wrapper as traceroot
from utils import traceroot_wrapper as traceroot
logger = traceroot.get_logger("server_login_controller")
@ -18,35 +18,44 @@ router = APIRouter(tags=["Login/Registration"])
@router.post("/login", name="login by email or password")
@traceroot.trace()
async def by_password(data: LoginByPasswordIn, session: Session = Depends(session)) -> LoginResponse:
"""
User login with email and password
"""
logger.info(f"Login attempt for email: {data.email}")
user = User.by(User.email == data.email, s=session).one_or_none()
if not user or not password_verify(data.password, user.password):
logger.warning(f"Failed login attempt for email: {data.email}")
raise UserException(code.password, _("Account or password error"))
logger.info(f"Successful login for user: {user.id}")
return LoginResponse(token=Auth.create_access_token(user.id), email=user.email)
@router.post("/login-by_stack", name="login by stack")
@traceroot.trace()
async def by_stack_auth(
token: str,
type: str = "signup",
invite_code: str | None = None,
session: Session = Depends(session),
):
logger.info(f"Stack auth attempt, type: {type}")
try:
stack_id = await StackAuth.user_id(token)
info = await StackAuth.user_info(token)
logger.debug(f"Stack auth successful for stack_id: {stack_id}")
except Exception as e:
logger.error(e)
logger.error(f"Stack auth failed: {e}", exc_info=True)
raise HTTPException(500, detail=_(f"{e}"))
user = User.by(User.stack_id == stack_id, s=session).one_or_none()
if not user:
# Only signup can create user
if type != "signup":
logger.warning(f"User not found for stack_id: {stack_id}, type: {type}")
raise UserException(code.error, _("User not found"))
logger.info(f"Creating new user via stack auth: {info.get('primary_email')}")
with session as s:
try:
user = User(
@ -59,21 +68,27 @@ async def by_stack_auth(
s.add(user)
s.commit()
session.refresh(user)
logger.info(f"New user registered via stack auth: {user.id}")
return LoginResponse(token=Auth.create_access_token(user.id), email=user.email)
except Exception as e:
s.rollback()
logger.error(f"Failed to register: {e}")
logger.error(f"Failed to register via stack auth: {e}", exc_info=True)
raise UserException(code.error, _("Failed to register"))
else:
if user.status == Status.Block:
logger.warning(f"Blocked user attempted login: {user.id}")
raise UserException(code.error, _("Your account has been blocked."))
logger.info(f"Existing user logged in via stack auth: {user.id}")
return LoginResponse(token=Auth.create_access_token(user.id), email=user.email)
@router.post("/register", name="register by email/password")
@traceroot.trace()
async def register(data: RegisterIn, session: Session = Depends(session)):
logger.info(f"Registration attempt for email: {data.email}")
# Check if email is already registered
if User.by(User.email == data.email, s=session).one_or_none():
logger.warning(f"Registration failed - email already exists: {data.email}")
raise UserException(code.error, _("Email already registered"))
with session as s:
@ -85,8 +100,9 @@ async def register(data: RegisterIn, session: Session = Depends(session)):
s.add(user)
s.commit()
s.refresh(user)
logger.info(f"New user registered: {user.id}, email: {user.email}")
except Exception as e:
s.rollback()
logger.error(f"Failed to register: {e}")
logger.error(f"Failed to register user: {e}", exc_info=True)
raise UserException(code.error, _("Failed to register"))
return {"status": "success"}