from __future__ import annotations import uuid from datetime import datetime from typing import Any from sqlalchemy import DateTime, Index, String, UniqueConstraint, func from sqlalchemy.orm import Mapped, mapped_column from sqlalchemy.types import JSON from app.db.base_class import Base class NotificationState(Base): __tablename__ = "notification_states" __table_args__ = ( UniqueConstraint("user_id", "notification_id", name="uq_notification_states_user_notification"), Index("ix_notification_states_user_updated", "user_id", "updated_at"), ) id: Mapped[str] = mapped_column(String(36), primary_key=True, default=lambda: str(uuid.uuid4())) user_id: Mapped[str] = mapped_column(String(100), index=True) notification_id: Mapped[str] = mapped_column(String(180), index=True) read_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True) hidden_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True) context_json: Mapped[dict[str, Any]] = mapped_column(JSON, default=dict) 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(), )