From 877a70d6e120e369ed2ff5f58a82815f2414835e Mon Sep 17 00:00:00 2001 From: Carlos Rivas Date: Wed, 21 Aug 2024 12:54:46 -0700 Subject: [PATCH] Moved over schema, db and models --- database.py | 2 +- models.py | 54 +++++++++++++++++++++++++++++++++++++++++++++++++++++ schemas.py | 32 +++++++++++++++++++++++++++++++ 3 files changed, 87 insertions(+), 1 deletion(-) diff --git a/database.py b/database.py index 6795142..d28eb1d 100644 --- a/database.py +++ b/database.py @@ -2,7 +2,7 @@ from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker -SQLITE_DATABASE_URL = "sqlite:///./flosms.db" +SQLITE_DATABASE_URL = "sqlite:///./flowsms.db" engine = create_engine( SQLITE_DATABASE_URL, echo=True, connect_args={"check_same_thread": False} diff --git a/models.py b/models.py index e69de29..9e8c96a 100644 --- a/models.py +++ b/models.py @@ -0,0 +1,54 @@ +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) + messages: Mapped[List["SMSMessage"]] = relationship() + created_at = Column(TIMESTAMP(timezone=True), nullable=False, server_default=func.now()) + updated_at = Column(TIMESTAMP(timezone=True), default=None, onupdate=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") + metadata: Mapped["SMSMetadata"] = relationship(back_populates="message") + created_at = Column(TIMESTAMP(timezone=True), nullable=False, server_default=func.now()) + updated_at = Column(TIMESTAMP(timezone=True), default=None, onupdate=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()) + updated_at = Column(TIMESTAMP(timezone=True), default=None, onupdate=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="metadata") + created_at = Column(TIMESTAMP(timezone=True), nullable=False, server_default=func.now()) + updated_at = Column(TIMESTAMP(timezone=True), default=None, onupdate=func.now()) diff --git a/schemas.py b/schemas.py index e69de29..355ee71 100644 --- a/schemas.py +++ b/schemas.py @@ -0,0 +1,32 @@ +from pydantic import BaseModel, Field +from datetime import datetime + + +class SMSAttributes(BaseModel): + amount_display: str + amount_nanodollars: str + message: str = Field(alias="body") + direction: str + from_number: str = Field(alias="from") + is_mms: bool + message_callback_url: str + message_encoding: int + message_type: str + status: str + timestamp: datetime + to_number: str = Field(alias="to") + + +class SMSData(BaseModel): + attributes: SMSAttributes + sms_type: str = Field(alias="type") + sms_id: str = Field(alias="id") + + +class SMSMessage(BaseModel): + data: SMSData + + class Config: + from_attributes = True + arbitrary_types_allowed = True + populate_by_name = True