import uuid from datetime import datetime, timezone from typing import TYPE_CHECKING from sqlalchemy import String, DateTime, ForeignKey, UniqueConstraint, Index from sqlalchemy.orm import Mapped, mapped_column, relationship from sqlalchemy.dialects.postgresql import UUID from app.core.database import Base if TYPE_CHECKING: from app.models.user import User class OAuthIdentity(Base): __tablename__ = "oauth_identities" __table_args__ = ( UniqueConstraint("provider", "provider_subject", name="uq_oauth_identities_provider_subject"), Index("ix_oauth_identities_user_id", "user_id"), ) id: Mapped[uuid.UUID] = mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) user_id: Mapped[uuid.UUID] = mapped_column( UUID(as_uuid=True), ForeignKey("users.id", ondelete="CASCADE"), nullable=False ) provider: Mapped[str] = mapped_column(String(20), nullable=False) provider_subject: Mapped[str] = mapped_column(String(255), nullable=False) provider_email_at_link: Mapped[str] = mapped_column(String(255), nullable=False) created_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), default=lambda: datetime.now(timezone.utc) ) updated_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), default=lambda: datetime.now(timezone.utc), onupdate=lambda: datetime.now(timezone.utc), ) user: Mapped["User"] = relationship("User", backref="oauth_identities")