from datetime import datetime, timezone from sqlalchemy import DateTime, ForeignKey, Integer, JSON, String, Text, UniqueConstraint from sqlalchemy.orm import Mapped, mapped_column from .database import Base def utc_now() -> datetime: return datetime.now(timezone.utc) class RawEvent(Base): __tablename__ = "raw_events" __table_args__ = (UniqueConstraint("source", "device_id", "external_id", name="uq_raw_event"),) id: Mapped[int] = mapped_column(primary_key=True) source: Mapped[str] = mapped_column(String(32), index=True) device_id: Mapped[str] = mapped_column(String(128), index=True) external_id: Mapped[str] = mapped_column(String(128)) project_slug: Mapped[str | None] = mapped_column(String(255), nullable=True, index=True) occurred_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True, index=True) payload: Mapped[dict] = mapped_column(JSON) received_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), default=utc_now) class TimeEntry(Base): __tablename__ = "time_entries" __table_args__ = (UniqueConstraint("source", "device_id", "external_id", name="uq_time_entry"),) id: Mapped[int] = mapped_column(primary_key=True) source: Mapped[str] = mapped_column(String(32), index=True) device_id: Mapped[str] = mapped_column(String(128), default="server", index=True) external_id: Mapped[str] = mapped_column(String(128)) kind: Mapped[str] = mapped_column(String(32), default="tracked", index=True) status: Mapped[str] = mapped_column(String(32), default="accepted", index=True) start_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), index=True) end_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), index=True) duration_seconds: Mapped[int] = mapped_column(Integer) task: Mapped[str] = mapped_column(String(512), default="") project_slug: Mapped[str | None] = mapped_column(String(255), nullable=True, index=True) notes: Mapped[str] = mapped_column(Text, default="") raw_event_id: Mapped[int | None] = mapped_column(ForeignKey("raw_events.id"), nullable=True) created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), default=utc_now) updated_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), default=utc_now, onupdate=utc_now) class CallImport(Base): __tablename__ = "call_imports" id: Mapped[int] = mapped_column(primary_key=True) filename: Mapped[str] = mapped_column(String(512)) stored_path: Mapped[str] = mapped_column(String(1024)) extraction_status: Mapped[str] = mapped_column(String(32), default="uploaded") extracted_text: Mapped[str] = mapped_column(Text, default="") created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), default=utc_now)