|
|
from typing import Optional |
|
|
from sqlmodel import SQLModel, Field, Relationship |
|
|
from datetime import datetime |
|
|
|
|
|
class User(SQLModel, table=True): |
|
|
id: Optional[int] = Field(default=None, primary_key=True) |
|
|
address: str = Field(index=True, unique=True) |
|
|
created_at: datetime = Field(default_factory=datetime.utcnow) |
|
|
visits: list["Visit"] = Relationship(back_populates="user") |
|
|
balances: list["TokenBalance"] = Relationship(back_populates="user") |
|
|
|
|
|
class Venue(SQLModel, table=True): |
|
|
id: Optional[int] = Field(default=None, primary_key=True) |
|
|
name: str |
|
|
slug: str = Field(index=True, unique=True) |
|
|
created_at: datetime = Field(default_factory=datetime.utcnow) |
|
|
|
|
|
class CheckinSession(SQLModel, table=True): |
|
|
id: Optional[int] = Field(default=None, primary_key=True) |
|
|
session_id: str = Field(index=True, unique=True) |
|
|
venue_id: int = Field(foreign_key="venue.id") |
|
|
nonce: str |
|
|
expires_at: datetime |
|
|
used: bool = Field(default=False) |
|
|
|
|
|
class Visit(SQLModel, table=True): |
|
|
id: Optional[int] = Field(default=None, primary_key=True) |
|
|
user_id: int = Field(foreign_key="user.id") |
|
|
venue_id: int = Field(foreign_key="venue.id") |
|
|
session_id: int = Field(foreign_key="checkinsession.id") |
|
|
created_at: datetime = Field(default_factory=datetime.utcnow, index=True) |
|
|
user: User = Relationship(back_populates="visits") |
|
|
|
|
|
class TokenBalance(SQLModel, table=True): |
|
|
id: Optional[int] = Field(default=None, primary_key=True) |
|
|
user_id: int = Field(foreign_key="user.id") |
|
|
symbol: str = Field(default="POINT") |
|
|
amount: int = Field(default=0) |
|
|
user: User = Relationship(back_populates="balances") |
|
|
|
|
|
class RewardLog(SQLModel, table=True): |
|
|
id: Optional[int] = Field(default=None, primary_key=True) |
|
|
user_id: int = Field(foreign_key="user.id") |
|
|
venue_id: int = Field(foreign_key="venue.id") |
|
|
points: int |
|
|
created_at: datetime = Field(default_factory=datetime.utcnow) |
|
|
|