from database import Base from sqlalchemy import TIMESTAMP, Column, String, DateTime, Boolean, ForeignKey from sqlalchemy.orm import Mapped, mapped_column, relationship from sqlalchemy.sql import func from typing import List from uuid import uuid4, UUID class SMSContact(Base): __tablename__ = 'contact' id: Mapped[UUID] = mapped_column(primary_key=True, default=uuid4) phone_number = Column(String, nullable=False, unique=True) messages: Mapped[List["SMSMessage"]] = relationship() created_at = Column(TIMESTAMP(timezone=True), nullable=False, server_default=func.now()) class SMSMessage(Base): __tablename__ = 'message' id: Mapped[UUID] = mapped_column(primary_key=True, default=uuid4) from_number = Column(String, nullable=False) to_number: Mapped[UUID] = mapped_column(ForeignKey("contact.id")) direction = Column(String, nullable=False) is_mms = Column(Boolean, nullable=False) message = Column(String, nullable=False) timestamp = Column(DateTime, nullable=False) cost: Mapped["SMSCost"] = relationship(back_populates="message") sms_metadata: Mapped["SMSMetadata"] = relationship(back_populates="message") created_at = Column(TIMESTAMP(timezone=True), nullable=False, server_default=func.now()) class SMSCost(Base): __tablename__ = 'cost' id: Mapped[UUID] = mapped_column(primary_key=True, default=uuid4) amount_display = Column(String, nullable=False) amount_nanodollars = Column(String, nullable=False) message_id: Mapped[UUID] = mapped_column(ForeignKey("message.id")) message: Mapped["SMSMessage"] = relationship(back_populates="cost") created_at = Column(TIMESTAMP(timezone=True), nullable=False, server_default=func.now()) class SMSMetadata(Base): __tablename__ = 'metadata' id: Mapped[UUID] = mapped_column(primary_key=True, default=uuid4) message_callback_url = Column(String, nullable=False) message_encoding = Column(String, nullable=False) message_type = Column(String, nullable=False) status = Column(String, nullable=False) message_id: Mapped[UUID] = mapped_column(ForeignKey("message.id")) message: Mapped["SMSMessage"] = relationship(back_populates="sms_metadata") created_at = Column(TIMESTAMP(timezone=True), nullable=False, server_default=func.now())