from sqlalchemy import Boolean, Column, DateTime, ForeignKey, String from sqlalchemy.orm import relationship from app.core.db import Base, utc_now class RefreshToken(Base): __tablename__ = "refresh_tokens" id = Column(String, primary_key=True) user_id = Column(String, ForeignKey("users.id"), nullable=False, index=True) token = Column(String, unique=True, nullable=False, index=True) expires_at = Column(DateTime(timezone=True), nullable=False) created_at = Column(DateTime(timezone=True), default=utc_now) is_revoked = Column(Boolean, default=False) device_info = Column(String, nullable=True) replaced_by_token_id = Column( String, ForeignKey("refresh_tokens.id"), nullable=True, index=True ) rotated_at = Column(DateTime(timezone=True), nullable=True) user = relationship("User", back_populates="refresh_tokens") replaced_by = relationship( "RefreshToken", remote_side="RefreshToken.id", foreign_keys=[replaced_by_token_id], ) class SmsVerificationCode(Base): __tablename__ = "sms_verification_codes" id = Column(String, primary_key=True) phone = Column(String, nullable=False, index=True) code = Column(String, nullable=False) purpose = Column(String, nullable=False) is_used = Column(Boolean, default=False) is_expired = Column(Boolean, default=False) expires_at = Column(DateTime(timezone=True), nullable=False) created_at = Column(DateTime(timezone=True), default=utc_now) verified_at = Column(DateTime(timezone=True), nullable=True) ip_address = Column(String, nullable=True)