Compare commits

..

1 Commits

7 changed files with 5 additions and 146 deletions
+1 -1
View File
@@ -8,7 +8,7 @@ from sqlalchemy.ext.asyncio import create_async_engine
from app.config import settings from app.config import settings
from app.database import Base from app.database import Base
from app.models import user, session, world, asset, world_visit # noqa: F401 from app.models import user, session, world, asset # noqa: F401
# this is the Alembic Config object, which provides # this is the Alembic Config object, which provides
# access to the values within the .ini file in use. # access to the values within the .ini file in use.
@@ -1,104 +0,0 @@
"""add discovery metadata to worlds and create world_visits
Revision ID: 0003_add_discovery_metadata
Revises: 0002_add_date_of_birth_to_users
Create Date: 2025-01-02 00:00:00.000000
"""
from typing import Sequence, Union
from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects import postgresql
# revision identifiers, used by Alembic.
revision: str = "0003_add_discovery_metadata"
down_revision: Union[str, None] = "0002_add_date_of_birth_to_users"
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None
def upgrade() -> None:
"""Add discovery metadata columns to worlds and create world_visits."""
# Add discovery metadata columns to worlds.
op.add_column(
"worlds",
sa.Column("category", sa.String(length=100), nullable=True),
)
op.add_column(
"worlds",
sa.Column(
"tags",
postgresql.ARRAY(sa.String()),
nullable=True,
server_default="{}",
),
)
op.add_column(
"worlds",
sa.Column("play_count", sa.Integer(), nullable=False, server_default="0"),
)
op.add_column(
"worlds",
sa.Column("last_played_at", sa.DateTime(timezone=True), nullable=True),
)
# B-tree index on category, GIN index on tags.
op.create_index(
"ix_worlds_category",
"worlds",
["category"],
unique=False,
)
op.create_index(
"ix_worlds_tags",
"worlds",
["tags"],
unique=False,
postgresql_using="gin",
)
# Create world_visits table.
op.create_table(
"world_visits",
sa.Column("id", sa.Integer(), primary_key=True),
sa.Column("world_id", sa.Integer(), nullable=False),
sa.Column("user_id", sa.Integer(), nullable=True),
sa.Column("anonymous_token", sa.String(length=255), nullable=True),
sa.Column(
"visited_at",
sa.DateTime(timezone=True),
server_default=sa.func.now(),
),
sa.ForeignKeyConstraint(
["world_id"], ["worlds.id"], ondelete="CASCADE"
),
sa.ForeignKeyConstraint(
["user_id"], ["users.id"], ondelete="CASCADE"
),
)
op.create_index(
op.f("ix_world_visits_id"), "world_visits", ["id"], unique=False
)
op.create_index(
"ix_world_visits_world_id_visited_at",
"world_visits",
["world_id", "visited_at"],
unique=False,
)
def downgrade() -> None:
"""Drop world_visits and discovery metadata columns from worlds."""
op.drop_index(
"ix_world_visits_world_id_visited_at", table_name="world_visits"
)
op.drop_index(op.f("ix_world_visits_id"), table_name="world_visits")
op.drop_table("world_visits")
op.drop_index("ix_worlds_tags", table_name="worlds")
op.drop_index("ix_worlds_category", table_name="worlds")
op.drop_column("worlds", "last_played_at")
op.drop_column("worlds", "play_count")
op.drop_column("worlds", "tags")
op.drop_column("worlds", "category")
+1 -2
View File
@@ -2,6 +2,5 @@ from app.models.user import User
from app.models.session import Session from app.models.session import Session
from app.models.world import World from app.models.world import World
from app.models.asset import Asset from app.models.asset import Asset
from app.models.world_visit import WorldVisit
__all__ = ["User", "Session", "World", "Asset", "WorldVisit"] __all__ = ["User", "Session", "World", "Asset"]
+1 -13
View File
@@ -1,4 +1,4 @@
from sqlalchemy import Column, Integer, String, Text, DateTime, ForeignKey, ARRAY, Index from sqlalchemy import Column, Integer, String, Text, DateTime, ForeignKey
from sqlalchemy.dialects.postgresql import ENUM from sqlalchemy.dialects.postgresql import ENUM
from sqlalchemy.orm import relationship from sqlalchemy.orm import relationship
from sqlalchemy.sql import func from sqlalchemy.sql import func
@@ -27,17 +27,5 @@ class World(Base):
created_at = Column(DateTime(timezone=True), server_default=func.now()) created_at = Column(DateTime(timezone=True), server_default=func.now())
updated_at = Column(DateTime(timezone=True), onupdate=func.now()) updated_at = Column(DateTime(timezone=True), onupdate=func.now())
# Discovery metadata
category = Column(String(100), nullable=True, index=True)
tags = Column(ARRAY(String), nullable=True, server_default="{}")
play_count = Column(Integer, nullable=False, server_default="0")
last_played_at = Column(DateTime(timezone=True), nullable=True)
# GIN index on tags for efficient tag-based queries
__table_args__ = (
Index("ix_worlds_tags", "tags", postgresql_using="gin"),
)
owner = relationship("User", back_populates="worlds") owner = relationship("User", back_populates="worlds")
assets = relationship("Asset", back_populates="world", cascade="all, delete-orphan") assets = relationship("Asset", back_populates="world", cascade="all, delete-orphan")
visits = relationship("WorldVisit", back_populates="world", cascade="all, delete-orphan")
-26
View File
@@ -1,26 +0,0 @@
from sqlalchemy import Column, DateTime, ForeignKey, Index, Integer, String
from sqlalchemy.orm import relationship
from sqlalchemy.sql import func
from app.database import Base
class WorldVisit(Base):
__tablename__ = "world_visits"
id = Column(Integer, primary_key=True, index=True)
world_id = Column(
Integer, ForeignKey("worlds.id", ondelete="CASCADE"), nullable=False
)
user_id = Column(
Integer, ForeignKey("users.id", ondelete="CASCADE"), nullable=True
)
anonymous_token = Column(String(255), nullable=True)
visited_at = Column(DateTime(timezone=True), server_default=func.now())
__table_args__ = (
Index("ix_world_visits_world_id_visited_at", "world_id", "visited_at"),
)
world = relationship("World", back_populates="visits")
user = relationship("User")
+1
View File
@@ -0,0 +1 @@
uid://ctqseajls16vv
+1
View File
@@ -0,0 +1 @@
uid://bqp1qfc6by0xs