from __future__ import annotations import uuid from datetime import datetime from sqlalchemy import DateTime, ForeignKey, Text, func from sqlalchemy.dialects.postgresql import UUID from sqlalchemy.orm import Mapped, mapped_column from . import Base class DeviceToken(Base): """A long-lived bearer token a native client (Tauri/Android) uses to authenticate sync. Only the token's SHA-256 hash is stored; the plaintext is shown once at creation. Owner-scoped and individually revocable.""" __tablename__ = "device_tokens" 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 ) token_hash: Mapped[str] = mapped_column(Text(), nullable=False, unique=True) name: Mapped[str] = mapped_column(Text(), nullable=False, server_default="") created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), nullable=False, server_default=func.now()) last_used_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True)