57 lines
2.4 KiB
Python
57 lines
2.4 KiB
Python
import enum
|
|
from datetime import datetime
|
|
from sqlalchemy import String, Boolean, Enum, DateTime, Integer, Float, ForeignKey, JSON, Text
|
|
from sqlalchemy.orm import Mapped, mapped_column
|
|
from app.core.database import Base
|
|
|
|
|
|
class DeckMode(str, enum.Enum):
|
|
GENERATE = "generate"
|
|
COMPLETE = "complete"
|
|
CULL = "cull"
|
|
|
|
|
|
class CardSlot(str, enum.Enum):
|
|
CREATURE = "creature"
|
|
INSTANT = "instant"
|
|
SORCERY = "sorcery"
|
|
ENCHANTMENT = "enchantment"
|
|
ARTIFACT = "artifact"
|
|
PLANESWALKER = "planeswalker"
|
|
LAND = "land"
|
|
BATTLE = "battle"
|
|
|
|
|
|
class Deck(Base):
|
|
__tablename__ = "decks"
|
|
|
|
id: Mapped[int] = mapped_column(primary_key=True)
|
|
owner_id: Mapped[int] = mapped_column(ForeignKey("users.id", ondelete="CASCADE"), nullable=False, index=True)
|
|
name: Mapped[str] = mapped_column(String(200), nullable=False)
|
|
commander: Mapped[str] = mapped_column(String(200), nullable=False)
|
|
description: Mapped[str | None] = mapped_column(Text)
|
|
mode: Mapped[DeckMode] = mapped_column(Enum(DeckMode), nullable=False)
|
|
playstyle: Mapped[str | None] = mapped_column(String(100))
|
|
prefer_owned: Mapped[bool] = mapped_column(Boolean, default=False)
|
|
budget_enabled: Mapped[bool] = mapped_column(Boolean, default=False)
|
|
budget_amount: Mapped[float | None] = mapped_column(Float)
|
|
budget_scope: Mapped[str] = mapped_column(String(20), default="purchase")
|
|
ai_reasoning: Mapped[dict | None] = mapped_column(JSON)
|
|
created_at: Mapped[datetime] = mapped_column(DateTime, default=datetime.utcnow)
|
|
updated_at: Mapped[datetime] = mapped_column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
|
|
|
|
|
|
class DeckCard(Base):
|
|
__tablename__ = "deck_cards"
|
|
|
|
id: Mapped[int] = mapped_column(primary_key=True)
|
|
deck_id: Mapped[int] = mapped_column(ForeignKey("decks.id", ondelete="CASCADE"), nullable=False, index=True)
|
|
scryfall_id: Mapped[str] = mapped_column(String(36), nullable=False)
|
|
card_name: Mapped[str] = mapped_column(String(200), nullable=False)
|
|
slot: Mapped[CardSlot] = mapped_column(Enum(CardSlot), nullable=False)
|
|
quantity: Mapped[int] = mapped_column(Integer, default=1)
|
|
is_owned: Mapped[bool] = mapped_column(Boolean, default=False)
|
|
is_commander: Mapped[bool] = mapped_column(Boolean, default=False)
|
|
ai_reasoning: Mapped[str | None] = mapped_column(Text)
|
|
scryfall_data: Mapped[dict | None] = mapped_column(JSON)
|