This commit is contained in:
Sun Tao 2025-09-03 10:43:17 +08:00
parent a83484cce3
commit 983f2d00f8
13 changed files with 44 additions and 192 deletions

View file

@ -8,20 +8,13 @@ from app.component.encrypt import password_verify
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 pydantic import BaseModel
from loguru import logger
from app.component.environment import env
from datetime import datetime
import jwt
router = APIRouter(tags=["Login/Registration"])
class RefreshTokenRequest(BaseModel):
refresh_token: str
@router.post("/login", name="login by email or password")
async def by_password(data: LoginByPasswordIn, session: Session = Depends(session)) -> LoginResponse:
"""
@ -30,11 +23,7 @@ async def by_password(data: LoginByPasswordIn, session: Session = Depends(sessio
user = User.by(User.email == data.email, s=session).one_or_none()
if not user or not password_verify(data.password, user.password):
raise UserException(code.password, _("Account or password error"))
return LoginResponse(
access_token=Auth.create_access_token(user.id),
refresh_token=Auth.create_refresh_token(user.id),
email=user.email
)
return LoginResponse(token=Auth.create_access_token(user.id), email=user.email)
@router.post("/login-by_stack", name="login by stack")
@ -68,11 +57,7 @@ async def by_stack_auth(
s.add(user)
s.commit()
session.refresh(user)
return LoginResponse(
access_token=Auth.create_access_token(user.id),
refresh_token=Auth.create_refresh_token(user.id),
email=user.email
)
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}")
@ -80,11 +65,7 @@ async def by_stack_auth(
else:
if user.status == Status.Block:
raise UserException(code.error, _("Your account has been blocked."))
return LoginResponse(
access_token=Auth.create_access_token(user.id),
refresh_token=Auth.create_refresh_token(user.id),
email=user.email
)
return LoginResponse(token=Auth.create_access_token(user.id), email=user.email)
@router.post("/register", name="register by email/password")
@ -107,40 +88,3 @@ async def register(data: RegisterIn, session: Session = Depends(session)):
logger.error(f"Failed to register: {e}")
raise UserException(code.error, _("Failed to register"))
return {"status": "success"}
@router.post("/refresh", name="refresh access token")
async def refresh_token(data: RefreshTokenRequest, session: Session = Depends(session)) -> LoginResponse:
"""
Refresh the access token using a valid refresh token.
"""
try:
# Decode the refresh token
payload = jwt.decode(data.refresh_token, Auth.SECRET_KEY, algorithms=["HS256"])
# Verify it's a refresh token
if payload.get("type") != "refresh":
raise HTTPException(status_code=401, detail="Invalid token type")
# Check if expired
if payload["exp"] < int(datetime.now().timestamp()):
raise HTTPException(status_code=401, detail="Refresh token expired")
# Get the user
user_id = payload["id"]
user = session.get(User, user_id)
if not user:
raise HTTPException(status_code=401, detail="User not found")
# Check if user is blocked
if user.status == Status.Block:
raise HTTPException(status_code=401, detail="User account is blocked")
# Generate new tokens
return LoginResponse(
access_token=Auth.create_access_token(user.id),
refresh_token=Auth.create_refresh_token(user.id),
email=user.email
)
except jwt.InvalidTokenError:
raise HTTPException(status_code=401, detail="Invalid refresh token")

View file

@ -50,7 +50,7 @@ def get_privacy(session: Session = Depends(session), auth: Auth = Depends(auth_m
if not model:
return UserPrivacySettings.default_settings()
return model.privacy_setting
return model.pricacy_setting
@router.put("/user/privacy", name="update user privacy")
@ -61,13 +61,13 @@ def put_privacy(data: UserPrivacySettings, session: Session = Depends(session),
default_settings = UserPrivacySettings.default_settings()
if model:
model.privacy_setting = {**model.privacy_setting, **data.model_dump()}
model.pricacy_setting = {**model.pricacy_setting, **data.model_dump()}
model.save(session)
else:
model = UserPrivacy(user_id=user_id, privacy_setting={**default_settings, **data.model_dump()})
model = UserPrivacy(user_id=user_id, pricacy_setting={**default_settings, **data.model_dump()})
model.save(session)
return model.privacy_setting
return model.pricacy_setting
@router.get("/user/current_credits", name="get user current credits")