Files
LoveACE-EndF/router/invite/__init__.py
2025-08-03 16:50:56 +08:00

119 lines
3.7 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from fastapi import Depends
from fastapi.routing import APIRouter
from database.user import Invite, User
from database.creator import get_db_session
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy import select
from router.invite.model import (
InviteRequest,
RegisterRequest,
InviteResponse,
RegisterResponse,
InviteTokenData,
AuthMeData,
)
from provider.aufe.client import AUFEConnection
from database.user import AuthME
import secrets
invite_router = APIRouter(prefix="/api/v1/user")
invite_tokens = []
@invite_router.post("/veryfy_invite_code", summary="验证邀请码")
async def verify_invite_code(
data: InviteRequest,
asyncsession: AsyncSession = Depends(get_db_session),
) -> InviteResponse:
"""
验证邀请码
:param data: InviteRequest
:return: InviteResponse
"""
async with asyncsession as session:
invite_code = data.invite_code
invite = select(Invite).where(Invite.invite_code == invite_code)
result = await session.execute(invite)
invite_data = result.scalars().first()
if invite_data:
invite_token = secrets.token_urlsafe(128)
invite_tokens.append(invite_token)
return InviteResponse(
code=200,
message="邀请码验证成功",
data=InviteTokenData(invite_token=invite_token),
)
else:
return InviteResponse(
code=400,
message="邀请码无效或已过期",
data=None,
)
@invite_router.post("/register", summary="注册新用户")
async def register_user(
data: RegisterRequest,
asyncsession: AsyncSession = Depends(get_db_session),
) -> RegisterResponse:
"""
注册新用户
:param data: RegisterRequest
:return: RegisterResponse
"""
async with asyncsession as session:
userid = data.userid
password = data.password
easyconnect_password = data.easyconnect_password
invite_token = data.invite_token
if invite_token not in invite_tokens:
return RegisterResponse(
code=400,
message="无效的邀请令牌",
data=None,
)
# 检查用户是否已存在
existing_user = await session.execute(select(User).where(User.userid == userid))
if existing_user.scalars().first():
return RegisterResponse(
code=400,
message="用户已存在",
data=None,
)
# 检查连接
vpn = AUFEConnection.create_or_get_connection("vpn.aufe.edu.cn", userid)
if not await vpn.login(userid, easyconnect_password):
return RegisterResponse(
code=400,
message="VPN登录失败请检查用户名和密码",
data=None,
)
if not await vpn.uaap_login(userid, password):
return RegisterResponse(
code=400,
message="大学登录失败,请检查用户名和密码",
data=None,
)
# 创建新用户
new_user = User(
userid=userid,
password=password,
easyconnect_password=easyconnect_password,
)
session.add(new_user)
await session.commit()
authme_token = secrets.token_urlsafe(128)
new_authme = AuthME(userid=userid, authme_token=authme_token)
session.add(new_authme)
await session.commit()
invite_tokens.remove(invite_token)
return RegisterResponse(
code=200,
message="注册成功",
data=AuthMeData(authme_token=authme_token),
)