Files
game-marathon/backend/app/models/user.py

59 lines
2.0 KiB
Python
Raw Normal View History

2025-12-14 02:38:35 +07:00
from datetime import datetime
2025-12-14 20:21:56 +07:00
from enum import Enum
2025-12-14 02:38:35 +07:00
from sqlalchemy import String, BigInteger, DateTime
from sqlalchemy.orm import Mapped, mapped_column, relationship
from app.core.database import Base
2025-12-14 20:21:56 +07:00
class UserRole(str, Enum):
USER = "user"
ADMIN = "admin"
2025-12-14 02:38:35 +07:00
class User(Base):
__tablename__ = "users"
id: Mapped[int] = mapped_column(primary_key=True)
login: Mapped[str] = mapped_column(String(50), unique=True, nullable=False, index=True)
password_hash: Mapped[str] = mapped_column(String(255), nullable=False)
nickname: Mapped[str] = mapped_column(String(50), nullable=False)
avatar_path: Mapped[str | None] = mapped_column(String(500), nullable=True)
telegram_id: Mapped[int | None] = mapped_column(BigInteger, unique=True, nullable=True)
telegram_username: Mapped[str | None] = mapped_column(String(50), nullable=True)
2025-12-14 20:21:56 +07:00
role: Mapped[str] = mapped_column(String(20), default=UserRole.USER.value)
2025-12-14 02:38:35 +07:00
created_at: Mapped[datetime] = mapped_column(DateTime, default=datetime.utcnow)
# Relationships
2025-12-14 20:21:56 +07:00
created_marathons: Mapped[list["Marathon"]] = relationship(
2025-12-14 02:38:35 +07:00
"Marathon",
2025-12-14 20:21:56 +07:00
back_populates="creator",
foreign_keys="Marathon.creator_id"
2025-12-14 02:38:35 +07:00
)
participations: Mapped[list["Participant"]] = relationship(
"Participant",
back_populates="user"
)
2025-12-14 20:21:56 +07:00
proposed_games: Mapped[list["Game"]] = relationship(
"Game",
back_populates="proposed_by",
foreign_keys="Game.proposed_by_id"
)
approved_games: Mapped[list["Game"]] = relationship(
2025-12-14 02:38:35 +07:00
"Game",
2025-12-14 20:21:56 +07:00
back_populates="approved_by",
foreign_keys="Game.approved_by_id"
2025-12-14 02:38:35 +07:00
)
2025-12-14 20:21:56 +07:00
@property
def is_admin(self) -> bool:
return self.role == UserRole.ADMIN.value
@property
def avatar_url(self) -> str | None:
if self.avatar_path:
2025-12-16 01:25:21 +07:00
# Lazy import to avoid circular dependency
from app.services.storage import storage_service
return storage_service.get_url(self.avatar_path, "avatars")
2025-12-14 20:21:56 +07:00
return None