from __future__ import annotations from datetime import datetime from typing import Optional from sqlalchemy import BigInteger, DateTime, ForeignKey, String, func from sqlalchemy.orm import Mapped, mapped_column, relationship from app.db.base import Base class User(Base): __tablename__ = "users" id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True) telegram_id: Mapped[int] = mapped_column(BigInteger, unique=True, index=True) username: Mapped[Optional[str]] = mapped_column(String(255), nullable=True) first_name: Mapped[Optional[str]] = mapped_column(String(255), nullable=True) created_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), server_default=func.now(), ) referrer_id: Mapped[Optional[int]] = mapped_column( ForeignKey("users.id", ondelete="SET NULL"), nullable=True, index=True, ) referrer: Mapped[Optional[User]] = relationship( back_populates="referrals", remote_side="User.id", ) referrals: Mapped[list[User]] = relationship( back_populates="referrer", )