🎉初次提交
This commit is contained in:
118
router/invite/__init__.py
Normal file
118
router/invite/__init__.py
Normal file
@@ -0,0 +1,118 @@
|
||||
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),
|
||||
)
|
||||
Reference in New Issue
Block a user