feat(score_token): add room_id to score token table

This commit is contained in:
MingxuanGame
2025-12-20 19:42:14 +08:00
parent a24302c2df
commit f628061971
4 changed files with 54 additions and 29 deletions

View File

@@ -975,8 +975,6 @@ async def process_score(
score_token: ScoreToken, score_token: ScoreToken,
info: SoloScoreSubmissionInfo, info: SoloScoreSubmissionInfo,
session: AsyncSession, session: AsyncSession,
item_id: int | None = None,
room_id: int | None = None,
) -> Score: ) -> Score:
gamemode = GameMode.from_int(info.ruleset_id).to_special_mode(info.mods) gamemode = GameMode.from_int(info.ruleset_id).to_special_mode(info.mods)
logger.info( logger.info(
@@ -1014,8 +1012,8 @@ async def process_score(
nsmall_tick_hit=info.statistics.get(HitResult.SMALL_TICK_HIT, 0), nsmall_tick_hit=info.statistics.get(HitResult.SMALL_TICK_HIT, 0),
nlarge_tick_hit=info.statistics.get(HitResult.LARGE_TICK_HIT, 0), nlarge_tick_hit=info.statistics.get(HitResult.LARGE_TICK_HIT, 0),
nslider_tail_hit=info.statistics.get(HitResult.SLIDER_TAIL_HIT, 0), nslider_tail_hit=info.statistics.get(HitResult.SLIDER_TAIL_HIT, 0),
playlist_item_id=item_id, playlist_item_id=score_token.playlist_item_id,
room_id=room_id, room_id=score_token.room_id,
maximum_statistics=info.maximum_statistics, maximum_statistics=info.maximum_statistics,
processed=True, processed=True,
ranked=ranked, ranked=ranked,

View File

@@ -13,17 +13,6 @@ from sqlmodel import BigInteger, Field, ForeignKey, Relationship, SQLModel
class ScoreTokenBase(SQLModel, UTCBaseModel): class ScoreTokenBase(SQLModel, UTCBaseModel):
score_id: int | None = Field(sa_column=Column(BigInteger), default=None)
ruleset_id: GameMode
playlist_item_id: int | None = Field(default=None) # playlist
created_at: datetime = Field(default_factory=utcnow, sa_column=Column(DateTime))
updated_at: datetime = Field(default_factory=utcnow, sa_column=Column(DateTime))
class ScoreToken(ScoreTokenBase, table=True):
__tablename__: str = "score_tokens"
__table_args__ = (Index("idx_user_playlist", "user_id", "playlist_item_id"),)
id: int | None = Field( id: int | None = Field(
default=None, default=None,
sa_column=Column( sa_column=Column(
@@ -33,18 +22,28 @@ class ScoreToken(ScoreTokenBase, table=True):
autoincrement=True, autoincrement=True,
), ),
) )
score_id: int | None = Field(sa_column=Column(BigInteger), default=None)
ruleset_id: GameMode
user_id: int = Field(sa_column=Column(BigInteger, ForeignKey("lazer_users.id"))) user_id: int = Field(sa_column=Column(BigInteger, ForeignKey("lazer_users.id")))
beatmap_id: int = Field(foreign_key="beatmaps.id") beatmap_id: int = Field(foreign_key="beatmaps.id")
user: Mapped[User] = Relationship() room_id: int | None = Field(default=None)
playlist_item_id: int | None = Field(default=None) # playlist
created_at: datetime = Field(default_factory=utcnow, sa_column=Column(DateTime))
updated_at: datetime = Field(default_factory=utcnow, sa_column=Column(DateTime))
class ScoreToken(ScoreTokenBase, table=True):
__tablename__: str = "score_tokens"
__table_args__ = (
Index("idx_user_playlist", "user_id", "playlist_item_id"),
Index("idx_playlist_room", "playlist_item_id", "room_id"),
)
user: Mapped[User] = Relationship()
beatmap: Mapped[Beatmap] = Relationship() beatmap: Mapped[Beatmap] = Relationship()
class ScoreTokenResp(ScoreTokenBase): class ScoreTokenResp(ScoreTokenBase):
id: int
user_id: int
beatmap_id: int
@classmethod @classmethod
def from_db(cls, obj: ScoreToken) -> "ScoreTokenResp": def from_db(cls, obj: ScoreToken) -> "ScoreTokenResp":
return cls.model_validate(obj) return cls.model_validate(obj)

View File

@@ -123,14 +123,11 @@ async def _process_user(score_id: int, user_id: int, redis: Redis, fetcher: Fetc
async def submit_score( async def submit_score(
background_task: BackgroundTasks, background_task: BackgroundTasks,
info: SoloScoreSubmissionInfo, info: SoloScoreSubmissionInfo,
beatmap: int,
token: int, token: int,
current_user: User, current_user: User,
db: AsyncSession, db: AsyncSession,
redis: Redis, redis: Redis,
fetcher: Fetcher, fetcher: Fetcher,
item_id: int | None = None,
room_id: int | None = None,
): ):
# 立即获取用户ID避免后续的懒加载问题 # 立即获取用户ID避免后续的懒加载问题
user_id = current_user.id user_id = current_user.id
@@ -154,6 +151,7 @@ async def submit_score(
if not score: if not score:
raise HTTPException(status_code=404, detail="Score not found") raise HTTPException(status_code=404, detail="Score not found")
else: else:
beatmap = score_token.beatmap_id
try: try:
cache_service = get_beatmap_cache_service(redis, fetcher) cache_service = get_beatmap_cache_service(redis, fetcher)
await cache_service.smart_preload_for_score(beatmap) await cache_service.smart_preload_for_score(beatmap)
@@ -172,8 +170,6 @@ async def submit_score(
score_token, score_token,
info, info,
db, db,
item_id,
room_id,
) )
await db.refresh(score_token) await db.refresh(score_token)
score_id = score.id score_id = score.id
@@ -474,7 +470,7 @@ async def submit_solo_score(
redis: Redis, redis: Redis,
fetcher: Fetcher, fetcher: Fetcher,
): ):
return await submit_score(background_task, info, beatmap_id, token, current_user, db, redis, fetcher) return await submit_score(background_task, info, token, current_user, db, redis, fetcher)
@router.post( @router.post(
@@ -555,6 +551,7 @@ async def create_playlist_score(
beatmap_id=beatmap_id, beatmap_id=beatmap_id,
ruleset_id=GameMode.from_int(ruleset_id), ruleset_id=GameMode.from_int(ruleset_id),
playlist_item_id=playlist_id, playlist_item_id=playlist_id,
room_id=room_id,
) )
session.add(score_token) session.add(score_token)
await session.commit() await session.commit()
@@ -595,14 +592,11 @@ async def submit_playlist_score(
score_resp = await submit_score( score_resp = await submit_score(
background_task, background_task,
info, info,
item.beatmap_id,
token, token,
current_user, current_user,
session, session,
redis, redis,
fetcher, fetcher,
item.id,
room_id,
) )
await process_playlist_best_score( await process_playlist_best_score(
room_id, room_id,

View File

@@ -0,0 +1,34 @@
"""score_token: add room_id
Revision ID: 96c4f4b3f0ab
Revises: d430db6fc051
Create Date: 2025-12-20 11:39:02.640676
"""
from collections.abc import Sequence
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision: str = "96c4f4b3f0ab"
down_revision: str | Sequence[str] | None = "d430db6fc051"
branch_labels: str | Sequence[str] | None = None
depends_on: str | Sequence[str] | None = None
def upgrade() -> None:
"""Upgrade schema."""
# ### commands auto generated by Alembic - please adjust! ###
op.add_column("score_tokens", sa.Column("room_id", sa.Integer(), nullable=True))
op.create_index("idx_playlist_room", "score_tokens", ["playlist_item_id", "room_id"], unique=False)
# ### end Alembic commands ###
def downgrade() -> None:
"""Downgrade schema."""
# ### commands auto generated by Alembic - please adjust! ###
op.drop_index("idx_playlist_room", table_name="score_tokens")
op.drop_column("score_tokens", "room_id")
# ### end Alembic commands ###