* feat(database): 添加 beatmap_ratings 表用于用户评分
- 新增 BeatmapRating 模型类,用于表示 beatmap_ratings 表
- 该表包含 id、beatmapset_id、user_id 字段
- 建立与 Beatmapset 和 User 表的关联关系
* feat(beatmapset_ratings): 添加判断用户是否可以对谱面集进行评分的接口
- 新增 /beatmapsets/{beatmapset_id}/can_rate 接口
- 判断用户是否能对谱面集进行过评分,返回True/False
* feat(ratings): 添加为谱面评分的接口
- 新增 POST /beatmapsets/{beatmapset_id} 路由,用于用户给谱面集评分
- 实现谱面集评分的添加和更新逻辑
- 在 BeatmapRating 模型中添加 rating 字段 (漏了最重要的,我真tm丢脸)
* chore(database): 添加alembic数据库迁移脚本
* fix(ratings): 更改上传谱面打分的api路径,防止冲突
* fix(ratings): add changes from pr review
* refactor(ratings): remove swears from code
* feat(ratings): 从beatmapset中移除ratings字段,并改由从beatmap_ratings表中直接计算评分
* chore(deps): 添加 git 包并更新依赖项
- 在 builder 阶段添加了 git 包的安装
* chore(database): 更新数据库连接地址并删除意外的迁移脚本
- 将 Alembic 配置文件中的数据库连接地址从本地地址改为 Docker Compose 中的 mysql 服务地址
- 删除了 migrations/versions 目录下的 dba1f8d9992e_add_beatmap_ratings_table.py 文件
* chore(database): generate alembic script for beatmap ratings
* fix(ratings): apply changes suggested in review
- revert changes to alembic.ini
- add name to apis
- modify migration scripts
* chore: format server.py using ruff
- who forgot to do this?
* fix(migrate): fix remove achievement index
* perf(rating): optimize SQL query
* fix(rating): ensure user can rate beatmapset
* fix(rating): add boundary check
* chore(project): remove submodule
---------
Co-authored-by: MingxuanGame <MingxuanGame@outlook.com>
145 lines
3.5 KiB
Python
145 lines
3.5 KiB
Python
from .achievement import UserAchievement, UserAchievementResp
|
|
from .auth import OAuthClient, OAuthToken, V1APIKeys
|
|
from .beatmap import (
|
|
Beatmap,
|
|
BeatmapResp,
|
|
)
|
|
from .beatmap_playcounts import BeatmapPlaycounts, BeatmapPlaycountsResp
|
|
from .beatmapset import (
|
|
Beatmapset,
|
|
BeatmapsetResp,
|
|
)
|
|
from .beatmapset_ratings import BeatmapRating
|
|
from .best_score import BestScore
|
|
from .chat import (
|
|
ChannelType,
|
|
ChatChannel,
|
|
ChatChannelResp,
|
|
ChatMessage,
|
|
ChatMessageResp,
|
|
)
|
|
from .counts import (
|
|
CountResp,
|
|
MonthlyPlaycounts,
|
|
ReplayWatchedCount,
|
|
)
|
|
from .daily_challenge import DailyChallengeStats, DailyChallengeStatsResp
|
|
from .email_verification import EmailVerification, LoginSession
|
|
from .events import Event
|
|
from .favourite_beatmapset import FavouriteBeatmapset
|
|
from .lazer_user import (
|
|
User,
|
|
UserResp,
|
|
)
|
|
from .multiplayer_event import MultiplayerEvent, MultiplayerEventResp
|
|
from .notification import Notification, UserNotification
|
|
from .password_reset import PasswordReset
|
|
from .playlist_attempts import (
|
|
ItemAttemptsCount,
|
|
ItemAttemptsResp,
|
|
PlaylistAggregateScore,
|
|
)
|
|
from .playlist_best_score import PlaylistBestScore
|
|
from .playlists import Playlist, PlaylistResp
|
|
from .pp_best_score import PPBestScore
|
|
from .rank_history import RankHistory, RankHistoryResp, RankTop
|
|
from .relationship import Relationship, RelationshipResp, RelationshipType
|
|
from .room import APIUploadedRoom, Room, RoomResp
|
|
from .room_participated_user import RoomParticipatedUser
|
|
from .score import (
|
|
MultiplayerScores,
|
|
Score,
|
|
ScoreAround,
|
|
ScoreBase,
|
|
ScoreResp,
|
|
ScoreStatistics,
|
|
)
|
|
from .score_token import ScoreToken, ScoreTokenResp
|
|
from .statistics import (
|
|
UserStatistics,
|
|
UserStatisticsResp,
|
|
)
|
|
from .team import Team, TeamMember, TeamRequest
|
|
from .user_account_history import (
|
|
UserAccountHistory,
|
|
UserAccountHistoryResp,
|
|
UserAccountHistoryType,
|
|
)
|
|
from .user_login_log import UserLoginLog
|
|
|
|
__all__ = [
|
|
"APIUploadedRoom",
|
|
"Beatmap",
|
|
"BeatmapPlaycounts",
|
|
"BeatmapPlaycountsResp",
|
|
"BeatmapRating",
|
|
"BeatmapResp",
|
|
"Beatmapset",
|
|
"BeatmapsetResp",
|
|
"BestScore",
|
|
"ChannelType",
|
|
"ChatChannel",
|
|
"ChatChannelResp",
|
|
"ChatMessage",
|
|
"ChatMessageResp",
|
|
"CountResp",
|
|
"DailyChallengeStats",
|
|
"DailyChallengeStatsResp",
|
|
"EmailVerification",
|
|
"Event",
|
|
"FavouriteBeatmapset",
|
|
"ItemAttemptsCount",
|
|
"ItemAttemptsResp",
|
|
"LoginSession",
|
|
"MonthlyPlaycounts",
|
|
"MultiplayerEvent",
|
|
"MultiplayerEventResp",
|
|
"MultiplayerScores",
|
|
"Notification",
|
|
"OAuthClient",
|
|
"OAuthToken",
|
|
"PPBestScore",
|
|
"PasswordReset",
|
|
"Playlist",
|
|
"PlaylistAggregateScore",
|
|
"PlaylistBestScore",
|
|
"PlaylistResp",
|
|
"RankHistory",
|
|
"RankHistoryResp",
|
|
"RankTop",
|
|
"Relationship",
|
|
"RelationshipResp",
|
|
"RelationshipType",
|
|
"ReplayWatchedCount",
|
|
"Room",
|
|
"RoomParticipatedUser",
|
|
"RoomResp",
|
|
"Score",
|
|
"ScoreAround",
|
|
"ScoreBase",
|
|
"ScoreResp",
|
|
"ScoreStatistics",
|
|
"ScoreToken",
|
|
"ScoreTokenResp",
|
|
"Team",
|
|
"TeamMember",
|
|
"TeamRequest",
|
|
"User",
|
|
"UserAccountHistory",
|
|
"UserAccountHistoryResp",
|
|
"UserAccountHistoryType",
|
|
"UserAchievement",
|
|
"UserAchievement",
|
|
"UserAchievementResp",
|
|
"UserLoginLog",
|
|
"UserNotification",
|
|
"UserResp",
|
|
"UserStatistics",
|
|
"UserStatisticsResp",
|
|
"V1APIKeys",
|
|
]
|
|
|
|
for i in __all__:
|
|
if i.endswith("Resp"):
|
|
globals()[i].model_rebuild() # type: ignore[call-arg]
|