# ================================================================ # services/auth/app/models/tokens.py # ================================================================ """ Token models for authentication service """ from sqlalchemy import Column, String, Boolean, DateTime, Text, ForeignKey from sqlalchemy.dialects.postgresql import UUID from sqlalchemy.orm import relationship from datetime import datetime import uuid from shared.database.base import Base class RefreshToken(Base): """Refresh token model""" __tablename__ = "refresh_tokens" id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) user_id = Column(UUID(as_uuid=True), ForeignKey("users.id", ondelete="CASCADE"), nullable=False, index=True) token_hash = Column(String(255), nullable=False, unique=True) is_active = Column(Boolean, default=True) expires_at = Column(DateTime, nullable=False) # Session metadata ip_address = Column(String(45)) user_agent = Column(Text) device_info = Column(Text) created_at = Column(DateTime, default=datetime.utcnow) revoked_at = Column(DateTime) def __repr__(self): return f"" class LoginAttempt(Base): """Login attempt tracking model""" __tablename__ = "login_attempts" id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) email = Column(String(255), nullable=False, index=True) ip_address = Column(String(45), nullable=False) user_agent = Column(Text) success = Column(Boolean, default=False) failure_reason = Column(String(255)) created_at = Column(DateTime, default=datetime.utcnow) def __repr__(self): return f""