from datetime import datetime, timezone from sqlalchemy import BigInteger, DateTime, Integer, String, func from sqlalchemy.orm import Mapped, Session, mapped_column from bot.models.database import Base class User(Base): __tablename__ = "users" id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True) telegram_id: Mapped[int] = mapped_column(BigInteger, unique=True, nullable=False) username: Mapped[str | None] = mapped_column(String(128)) timezone: Mapped[str] = mapped_column(String(64), default="Asia/Shanghai") created_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), server_default=func.now() ) updated_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), server_default=func.now(), onupdate=func.now() ) @classmethod def get_or_create( cls, session: Session, telegram_id: int, username: str | None = None ) -> "User": user = session.query(cls).filter_by(telegram_id=telegram_id).first() if user is None: user = cls(telegram_id=telegram_id, username=username) session.add(user) session.commit() elif username and user.username != username: user.username = username user.updated_at = datetime.now(timezone.utc) session.commit() return user