refactor(api): standardizate API Router
This commit is contained in:
@@ -151,7 +151,7 @@ async def get_beatmapset(
|
||||
"/beatmapsets/{beatmapset_id}/download",
|
||||
tags=["谱面集"],
|
||||
name="下载谱面集",
|
||||
description="**客户端专属**\n下载谱面集文件。基于请求IP地理位置智能分流,支持负载均衡和自动故障转移。中国IP使用Sayobot镜像,其他地区使用Nerinyan和OsuDirect镜像。",
|
||||
description="\n下载谱面集文件。基于请求IP地理位置智能分流,支持负载均衡和自动故障转移。中国IP使用Sayobot镜像,其他地区使用Nerinyan和OsuDirect镜像。",
|
||||
)
|
||||
async def download_beatmapset(
|
||||
request: Request,
|
||||
@@ -189,7 +189,7 @@ async def download_beatmapset(
|
||||
"/beatmapsets/{beatmapset_id}/favourites",
|
||||
tags=["谱面集"],
|
||||
name="收藏或取消收藏谱面集",
|
||||
description="**客户端专属**\n收藏或取消收藏指定谱面集。",
|
||||
description="\n收藏或取消收藏指定谱面集。",
|
||||
)
|
||||
async def favourite_beatmapset(
|
||||
db: Database,
|
||||
|
||||
@@ -53,13 +53,13 @@ class AddFriendResp(BaseModel):
|
||||
tags=["用户关系"],
|
||||
response_model=AddFriendResp,
|
||||
name="添加或更新好友关系",
|
||||
description="**客户端专属**\n添加或更新与目标用户的好友关系。",
|
||||
description="\n添加或更新与目标用户的好友关系。",
|
||||
)
|
||||
@router.post(
|
||||
"/blocks",
|
||||
tags=["用户关系"],
|
||||
name="添加或更新屏蔽关系",
|
||||
description="**客户端专属**\n添加或更新与目标用户的屏蔽关系。",
|
||||
description="\n添加或更新与目标用户的屏蔽关系。",
|
||||
)
|
||||
async def add_relationship(
|
||||
db: Database,
|
||||
@@ -119,13 +119,13 @@ async def add_relationship(
|
||||
"/friends/{target}",
|
||||
tags=["用户关系"],
|
||||
name="取消好友关系",
|
||||
description="**客户端专属**\n删除与目标用户的好友关系。",
|
||||
description="\n删除与目标用户的好友关系。",
|
||||
)
|
||||
@router.delete(
|
||||
"/blocks/{target}",
|
||||
tags=["用户关系"],
|
||||
name="取消屏蔽关系",
|
||||
description="**客户端专属**\n删除与目标用户的屏蔽关系。",
|
||||
description="\n删除与目标用户的屏蔽关系。",
|
||||
)
|
||||
async def delete_relationship(
|
||||
db: Database,
|
||||
|
||||
@@ -135,7 +135,7 @@ async def _participate_room(room_id: int, user_id: int, db_room: Room, session:
|
||||
tags=["房间"],
|
||||
response_model=APICreatedRoom,
|
||||
name="创建房间",
|
||||
description="**客户端专属**\n创建一个新的房间。",
|
||||
description="\n创建一个新的房间。",
|
||||
)
|
||||
async def create_room(
|
||||
db: Database,
|
||||
@@ -181,7 +181,7 @@ async def get_room(
|
||||
"/rooms/{room_id}",
|
||||
tags=["房间"],
|
||||
name="结束房间",
|
||||
description="**客户端专属**\n结束歌单模式房间。",
|
||||
description="\n结束歌单模式房间。",
|
||||
)
|
||||
async def delete_room(
|
||||
db: Database,
|
||||
@@ -201,7 +201,7 @@ async def delete_room(
|
||||
"/rooms/{room_id}/users/{user_id}",
|
||||
tags=["房间"],
|
||||
name="加入房间",
|
||||
description="**客户端专属**\n加入指定歌单模式房间。",
|
||||
description="\n加入指定歌单模式房间。",
|
||||
)
|
||||
async def add_user_to_room(
|
||||
db: Database,
|
||||
@@ -225,7 +225,7 @@ async def add_user_to_room(
|
||||
"/rooms/{room_id}/users/{user_id}",
|
||||
tags=["房间"],
|
||||
name="离开房间",
|
||||
description="**客户端专属**\n离开指定歌单模式房间。",
|
||||
description="\n离开指定歌单模式房间。",
|
||||
)
|
||||
async def remove_user_from_room(
|
||||
db: Database,
|
||||
|
||||
@@ -402,7 +402,7 @@ async def get_user_all_beatmap_scores(
|
||||
tags=["游玩"],
|
||||
response_model=ScoreTokenResp,
|
||||
name="创建单曲成绩提交令牌",
|
||||
description="**客户端专属**\n为指定谱面创建一次性的成绩提交令牌。",
|
||||
description="\n为指定谱面创建一次性的成绩提交令牌。",
|
||||
)
|
||||
async def create_solo_score(
|
||||
background_task: BackgroundTasks,
|
||||
@@ -434,7 +434,7 @@ async def create_solo_score(
|
||||
tags=["游玩"],
|
||||
response_model=ScoreResp,
|
||||
name="提交单曲成绩",
|
||||
description="**客户端专属**\n使用令牌提交单曲成绩。",
|
||||
description="\n使用令牌提交单曲成绩。",
|
||||
)
|
||||
async def submit_solo_score(
|
||||
background_task: BackgroundTasks,
|
||||
@@ -454,7 +454,7 @@ async def submit_solo_score(
|
||||
tags=["游玩"],
|
||||
response_model=ScoreTokenResp,
|
||||
name="创建房间项目成绩令牌",
|
||||
description="**客户端专属**\n为房间游玩项目创建成绩提交令牌。",
|
||||
description="\n为房间游玩项目创建成绩提交令牌。",
|
||||
)
|
||||
async def create_playlist_score(
|
||||
session: Database,
|
||||
@@ -520,7 +520,7 @@ async def create_playlist_score(
|
||||
"/rooms/{room_id}/playlist/{playlist_id}/scores/{token}",
|
||||
tags=["游玩"],
|
||||
name="提交房间项目成绩",
|
||||
description="**客户端专属**\n提交房间游玩项目成绩。",
|
||||
description="\n提交房间游玩项目成绩。",
|
||||
)
|
||||
async def submit_playlist_score(
|
||||
background_task: BackgroundTasks,
|
||||
@@ -753,7 +753,7 @@ async def get_user_playlist_score(
|
||||
"/score-pins/{score_id}",
|
||||
status_code=204,
|
||||
name="置顶成绩",
|
||||
description="**客户端专属**\n将指定成绩置顶到用户主页 (按顺序)。",
|
||||
description="\n将指定成绩置顶到用户主页 (按顺序)。",
|
||||
tags=["成绩"],
|
||||
)
|
||||
async def pin_score(
|
||||
@@ -798,7 +798,7 @@ async def pin_score(
|
||||
"/score-pins/{score_id}",
|
||||
status_code=204,
|
||||
name="取消置顶成绩",
|
||||
description="**客户端专属**\n取消置顶指定成绩。",
|
||||
description="\n取消置顶指定成绩。",
|
||||
tags=["成绩"],
|
||||
)
|
||||
async def unpin_score(
|
||||
@@ -833,7 +833,7 @@ async def unpin_score(
|
||||
"/score-pins/{score_id}/reorder",
|
||||
status_code=204,
|
||||
name="调整置顶成绩顺序",
|
||||
description=("**客户端专属**\n调整已置顶成绩的展示顺序。仅提供 after_score_id 或 before_score_id 之一。"),
|
||||
description=("\n调整已置顶成绩的展示顺序。仅提供 after_score_id 或 before_score_id 之一。"),
|
||||
tags=["成绩"],
|
||||
)
|
||||
async def reorder_score_pin(
|
||||
|
||||
@@ -9,10 +9,8 @@ from typing import Annotated
|
||||
from app.database import User
|
||||
from app.dependencies import get_current_user
|
||||
from app.dependencies.database import Database, get_redis
|
||||
from app.dependencies.geoip import GeoIPHelper, get_geoip_helper
|
||||
from app.service.email_verification_service import (
|
||||
EmailVerificationService,
|
||||
LoginSessionService,
|
||||
)
|
||||
from app.service.login_log_service import LoginLogService
|
||||
|
||||
@@ -32,10 +30,7 @@ class SessionReissueResponse(BaseModel):
|
||||
|
||||
|
||||
@router.post(
|
||||
"/session/verify",
|
||||
name="验证会话",
|
||||
description="验证邮件验证码并完成会话认证",
|
||||
status_code=204,
|
||||
"/session/verify", name="验证会话", description="验证邮件验证码并完成会话认证", status_code=204, tags=["验证"]
|
||||
)
|
||||
async def verify_session(
|
||||
request: Request,
|
||||
@@ -101,6 +96,7 @@ async def verify_session(
|
||||
name="重新发送验证码",
|
||||
description="重新发送邮件验证码",
|
||||
response_model=SessionReissueResponse,
|
||||
tags=["验证"],
|
||||
)
|
||||
async def reissue_verification_code(
|
||||
request: Request,
|
||||
@@ -141,40 +137,3 @@ async def reissue_verification_code(
|
||||
return SessionReissueResponse(success=False, message="无效的用户会话")
|
||||
except Exception:
|
||||
return SessionReissueResponse(success=False, message="重新发送过程中发生错误")
|
||||
|
||||
|
||||
@router.post(
|
||||
"/session/check-new-location",
|
||||
name="检查新位置登录",
|
||||
description="检查登录是否来自新位置(内部接口)",
|
||||
)
|
||||
async def check_new_location(
|
||||
request: Request,
|
||||
db: Database,
|
||||
user_id: int,
|
||||
geoip: GeoIPHelper = Depends(get_geoip_helper),
|
||||
):
|
||||
"""
|
||||
检查是否为新位置登录
|
||||
这是一个内部接口,用于登录流程中判断是否需要邮件验证
|
||||
"""
|
||||
try:
|
||||
from app.dependencies.geoip import get_client_ip
|
||||
|
||||
ip_address = get_client_ip(request)
|
||||
geo_info = geoip.lookup(ip_address)
|
||||
country_code = geo_info.get("country_iso", "XX")
|
||||
|
||||
is_new_location = await LoginSessionService.check_new_location(db, user_id, ip_address, country_code)
|
||||
|
||||
return {
|
||||
"is_new_location": is_new_location,
|
||||
"ip_address": ip_address,
|
||||
"country_code": country_code,
|
||||
}
|
||||
|
||||
except Exception as e:
|
||||
return {
|
||||
"is_new_location": True, # 出错时默认为新位置
|
||||
"error": str(e),
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user