Initial import
This commit is contained in:
0
backend/database/__init__.py
Normal file
0
backend/database/__init__.py
Normal file
63
backend/database/models.py
Normal file
63
backend/database/models.py
Normal file
@@ -0,0 +1,63 @@
|
||||
import enum
|
||||
from datetime import datetime, timezone
|
||||
from sqlalchemy import String, Integer, ForeignKey, DateTime, Enum, Boolean
|
||||
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, relationship
|
||||
|
||||
class Base(DeclarativeBase):
|
||||
pass
|
||||
|
||||
class TicketStatus(str, enum.Enum):
|
||||
AVAILABLE = "AVAILABLE"
|
||||
LOCKED = "LOCKED"
|
||||
PAID = "PAID"
|
||||
SCANNED = "SCANNED"
|
||||
REFUNDED = "REFUNDED"
|
||||
|
||||
class User(Base):
|
||||
__tablename__ = "users"
|
||||
id: Mapped[int] = mapped_column(primary_key=True)
|
||||
email: Mapped[str] = mapped_column(String, unique=True, index=True)
|
||||
hashed_password: Mapped[str] = mapped_column(String)
|
||||
tickets: Mapped[list["Ticket"]] = relationship(back_populates="user")
|
||||
|
||||
class Tournament(Base):
|
||||
__tablename__ = "tournaments"
|
||||
id: Mapped[int] = mapped_column(primary_key=True)
|
||||
title: Mapped[str] = mapped_column(String)
|
||||
event_date: Mapped[datetime] = mapped_column(DateTime(timezone=True))
|
||||
is_active: Mapped[bool] = mapped_column(Boolean, default=True)
|
||||
seats: Mapped[list["Seat"]] = relationship(back_populates="tournament")
|
||||
|
||||
class Seat(Base):
|
||||
__tablename__ = "seats"
|
||||
id: Mapped[int] = mapped_column(primary_key=True)
|
||||
tournament_id: Mapped[int] = mapped_column(ForeignKey("tournaments.id"), index=True)
|
||||
sector: Mapped[str] = mapped_column(String)
|
||||
row: Mapped[int] = mapped_column(Integer)
|
||||
number: Mapped[int] = mapped_column(Integer)
|
||||
price: Mapped[int] = mapped_column(Integer)
|
||||
|
||||
tournament: Mapped["Tournament"] = relationship(back_populates="seats")
|
||||
ticket: Mapped["Ticket"] = relationship(back_populates="seat", uselist=False)
|
||||
|
||||
class Ticket(Base):
|
||||
__tablename__ = "tickets"
|
||||
id: Mapped[int] = mapped_column(primary_key=True)
|
||||
seat_id: Mapped[int] = mapped_column(ForeignKey("seats.id"), unique=True, index=True)
|
||||
user_id: Mapped[int] = mapped_column(ForeignKey("users.id"), nullable=True, index=True)
|
||||
|
||||
status: Mapped[TicketStatus] = mapped_column(
|
||||
Enum(TicketStatus, name="ticket_status_enum", create_type=False),
|
||||
default=TicketStatus.AVAILABLE,
|
||||
index=True
|
||||
)
|
||||
idempotency_key: Mapped[str] = mapped_column(String, unique=True, nullable=True)
|
||||
created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), default=lambda: datetime.now(timezone.utc))
|
||||
updated_at: Mapped[datetime] = mapped_column(
|
||||
DateTime(timezone=True),
|
||||
default=lambda: datetime.now(timezone.utc),
|
||||
onupdate=lambda: datetime.now(timezone.utc)
|
||||
)
|
||||
|
||||
seat: Mapped["Seat"] = relationship(back_populates="ticket")
|
||||
user: Mapped["User"] = relationship(back_populates="tickets")
|
||||
12
backend/database/session.py
Normal file
12
backend/database/session.py
Normal file
@@ -0,0 +1,12 @@
|
||||
import os
|
||||
from sqlalchemy.ext.asyncio import create_async_engine, async_sessionmaker, AsyncSession
|
||||
|
||||
DATABASE_URL = os.getenv("DATABASE_URL", "postgresql+asyncpg://admin:your_strong_password@postgres:5432/ticket_db")
|
||||
|
||||
# Отключаем echo в проде, но для песочницы можно включить (echo=True), чтобы видеть SQL-запросы
|
||||
engine = create_async_engine(DATABASE_URL, echo=False)
|
||||
async_session = async_sessionmaker(engine, expire_on_commit=False, class_=AsyncSession)
|
||||
|
||||
async def get_db():
|
||||
async with async_session() as session:
|
||||
yield session
|
||||
Reference in New Issue
Block a user