Skip to content

Commit 9613354

Browse files
committed
feat: hide spoilers on comments
1 parent eab3998 commit 9613354

5 files changed

Lines changed: 217 additions & 98 deletions

File tree

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
"""Add is_spoiler column to comments
2+
3+
Revision ID: l6m7n8o9p0q1
4+
Revises: k5l6m7n8o9p0
5+
Create Date: 2026-05-22
6+
"""
7+
from alembic import op
8+
import sqlalchemy as sa
9+
10+
revision = 'l6m7n8o9p0q1'
11+
down_revision = 'k5l6m7n8o9p0'
12+
branch_labels = None
13+
depends_on = None
14+
15+
16+
def upgrade() -> None:
17+
op.add_column('comments', sa.Column('is_spoiler', sa.Boolean(), nullable=False, server_default='false'))
18+
19+
20+
def downgrade() -> None:
21+
op.drop_column('comments', 'is_spoiler')

‎backend/models/comments.py‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from datetime import datetime
22
from typing import Optional
3-
from sqlalchemy import Integer, String, Text, ForeignKey, DateTime, func, Index
3+
from sqlalchemy import Integer, String, Text, Boolean, ForeignKey, DateTime, func, Index
44
from sqlalchemy.orm import Mapped, mapped_column, relationship
55
from .base import Base
66

@@ -12,14 +12,15 @@ class Comment(Base):
1212

1313
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
1414
user_id: Mapped[int] = mapped_column(ForeignKey("users.id", ondelete="CASCADE"), nullable=False, index=True)
15-
15+
1616
# Generic entity referencing
1717
media_type: Mapped[str] = mapped_column(String(50), nullable=False) # 'movie', 'series', 'season', 'episode', 'person'
1818
tmdb_id: Mapped[int] = mapped_column(Integer, nullable=False) # For season/episode this is the SHOW's tmdb_id
1919
season_number: Mapped[Optional[int]] = mapped_column(Integer, nullable=True)
2020
episode_number: Mapped[Optional[int]] = mapped_column(Integer, nullable=True)
2121

2222
content: Mapped[str] = mapped_column(Text, nullable=False)
23+
is_spoiler: Mapped[bool] = mapped_column(Boolean, default=False, server_default='false', nullable=False)
2324
created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now(), nullable=False)
2425
updated_at: Mapped[Optional[datetime]] = mapped_column(DateTime(timezone=True), onupdate=func.now())
2526

‎backend/routers/comments.py‎

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,11 @@ class CommentCreate(BaseModel):
1919
season_number: Optional[int] = None
2020
episode_number: Optional[int] = None
2121
content: str
22+
is_spoiler: bool = False
2223

2324
class CommentUpdate(BaseModel):
2425
content: str
26+
is_spoiler: bool = False
2527

2628
class CommentResponse(BaseModel):
2729
id: int
@@ -85,6 +87,7 @@ async def list_comments(
8587
"avatar_url": f"/profile/avatar/{c.user_id}" if (c.user.profile and c.user.profile.avatar_path) else None,
8688
"user_is_public": c.user.profile.privacy_level == PrivacyLevel.public if c.user.profile else False,
8789
"content": c.content,
90+
"is_spoiler": c.is_spoiler,
8891
"created_at": c.created_at.isoformat(),
8992
"updated_at": c.updated_at.isoformat() if c.updated_at else None,
9093
}
@@ -107,11 +110,12 @@ async def create_comment(
107110
season_number=body.season_number,
108111
episode_number=body.episode_number,
109112
content=body.content,
113+
is_spoiler=body.is_spoiler,
110114
)
111115
db.add(comment)
112116
await db.commit()
113117
await db.refresh(comment)
114-
118+
115119
return {
116120
"id": comment.id,
117121
"user_id": comment.user_id,
@@ -120,6 +124,7 @@ async def create_comment(
120124
"avatar_url": f"/profile/avatar/{current_user.id}" if (current_user.profile and current_user.profile.avatar_path) else None,
121125
"user_is_public": current_user.profile.privacy_level == PrivacyLevel.public if current_user.profile else False,
122126
"content": comment.content,
127+
"is_spoiler": comment.is_spoiler,
123128
"created_at": comment.created_at.isoformat(),
124129
}
125130

@@ -144,12 +149,14 @@ async def update_comment(
144149
raise HTTPException(status_code=400, detail="Comment content cannot be empty")
145150

146151
comment.content = stripped
152+
comment.is_spoiler = body.is_spoiler
147153
await db.commit()
148154
await db.refresh(comment)
149155

150156
return {
151157
"id": comment.id,
152158
"content": comment.content,
159+
"is_spoiler": comment.is_spoiler,
153160
"updated_at": comment.updated_at.isoformat() if comment.updated_at else None,
154161
}
155162

0 commit comments

Comments
 (0)