119 lines
3.7 KiB
Python
119 lines
3.7 KiB
Python
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),
|
||
)
|