Files
g0v0-server/migrations/versions/2025-10-06_fa4952dc70df_user_add_user_preference.py
MingxuanGame 10caa82320 feat(user-preference): add user preference support (#55)
APIs:

- GET `/api/private/user/preferences`: Get current user's preferences.
- PATCH `/api/private/user/preferences`: Modify current user's preferences. (body: Preferences)
- PUT `/api/private/user/preferences`: Overwrite current user's preferences. (body: Preferences)
- DELETE `/api/private/user/preferences`: Reset current user's preferences. (body: list[str])
  - body specifies the content to be reset. If body is empty, reset all preferences.

User:

- `User.g0v0_playmode`: show the special ruleset like `OSURX`, and custom rulesets in the future.

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-10-06 20:57:17 +08:00

67 lines
2.8 KiB
Python

"""user: add user_preference
Revision ID: fa4952dc70df
Revises: 425b91532cb4
Create Date: 2025-10-06 04:13:47.131043
"""
from collections.abc import Sequence
from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects import mysql
import sqlmodel
# revision identifiers, used by Alembic.
revision: str = "fa4952dc70df"
down_revision: str | Sequence[str] | None = "425b91532cb4"
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.create_table(
"userpreference",
sa.Column("user_id", sa.BigInteger(), nullable=False),
sa.Column("theme", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
sa.Column("language", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
sa.Column("extra", sa.JSON(), nullable=True),
sa.Column("audio_autoplay", sa.Boolean(), nullable=False),
sa.Column("audio_muted", sa.Boolean(), nullable=False),
sa.Column("audio_volume", sa.Float(), nullable=False),
sa.Column("beatmapset_card_size", sa.Enum("NORMAL", "EXTRA", name="beatmapcardsize"), nullable=False),
sa.Column("beatmap_download", sa.Enum("ALL", "NO_VIDEO", "direct", name="beatmapdownload"), nullable=False),
sa.Column("beatmapset_show_nsfw", sa.Boolean(), nullable=False),
sa.Column("extras_order", sa.JSON(), nullable=True),
sa.Column("legacy_score_only", sa.Boolean(), nullable=False),
sa.Column("profile_cover_expanded", sa.Boolean(), nullable=False),
sa.Column("scoring_mode", sa.Enum("STANDARDISED", "CLASSIC", name="scoringmode"), nullable=False),
sa.Column("user_list_filter", sa.Enum("ALL", "ONLINE", "OFFLINE", name="userlistfilter"), nullable=False),
sa.Column("user_list_sort", sa.Enum("LAST_VISIT", "RANK", "USERNAME", name="userlistsort"), nullable=False),
sa.Column("user_list_view", sa.Enum("CARD", "LIST", "BRICK", name="userlistview"), nullable=False),
sa.ForeignKeyConstraint(["user_id"], ["lazer_users.id"], ondelete="CASCADE"),
sa.PrimaryKeyConstraint("user_id"),
)
op.add_column(
"lazer_users",
sa.Column(
"g0v0_playmode",
sa.Enum("OSU", "TAIKO", "FRUITS", "MANIA", "OSURX", "OSUAP", "TAIKORX", "FRUITSRX", name="gamemode"),
nullable=False,
),
)
op.drop_column("lazer_users", "profile_order")
# ### end Alembic commands ###
def downgrade() -> None:
"""Downgrade schema."""
# ### commands auto generated by Alembic - please adjust! ###
op.add_column("lazer_users", sa.Column("profile_order", mysql.JSON(), nullable=True))
op.drop_column("lazer_users", "g0v0_playmode")
op.drop_table("userpreference")
# ### end Alembic commands ###