From 817d3b9c397d31549fbda28827045c09f1f15315 Mon Sep 17 00:00:00 2001 From: Hossein Date: Thu, 7 Aug 2025 00:27:44 +0330 Subject: [PATCH] create DB --- database.py | 38 +++++++++++++++++++++++++++++++++++--- main.py | 2 +- 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/database.py b/database.py index b5e2e8c..2bf3b53 100644 --- a/database.py +++ b/database.py @@ -1,8 +1,10 @@ -from sqlalchemy import create_engine, Column, Integer, String, Float, DateTime +from sqlalchemy import create_engine, Column, Integer, String, Float, DateTime, Boolean, Text, ForeignKey from sqlalchemy.ext.declarative import declarative_base -from sqlalchemy.orm import sessionmaker +from sqlalchemy.orm import sessionmaker, relationship from sqlalchemy.sql import func +from sqlalchemy.dialects.postgresql import UUID, JSONB import os +import uuid # Database URL from environment variable DATABASE_URL = os.getenv("DATABASE_URL") @@ -24,7 +26,7 @@ SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) # Create Base class Base = declarative_base() -# Database model +# Basic Item model (for backward compatibility) class Item(Base): __tablename__ = "items" @@ -35,6 +37,36 @@ class Item(Base): created_at = Column(DateTime(timezone=True), server_default=func.now()) updated_at = Column(DateTime(timezone=True), onupdate=func.now()) +# Instagram Account Model +class InstagramAccount(Base): + __tablename__ = "instagram_accounts" + + id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) + seller_id = Column(UUID(as_uuid=True), nullable=False) + username = Column(String(100), nullable=False, unique=True) + is_active = Column(Boolean, default=True) + last_synced = Column(DateTime(timezone=True), nullable=True) + + # Relationship + posts = relationship("InstagramPost", back_populates="account", cascade="all, delete-orphan") + +# Instagram Post Model +class InstagramPost(Base): + __tablename__ = "instagram_posts" + + id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) + account_id = Column(UUID(as_uuid=True), ForeignKey("instagram_accounts.id"), nullable=False) + ig_post_id = Column(String(100), nullable=False, unique=True) + media_type = Column(String(10), nullable=False) # 'image', 'video', 'carousel' + caption = Column(Text, nullable=True) + thumbnail_url = Column(Text, nullable=True) + local_media = Column(JSONB, nullable=True) # List of media items with type and local path + created_at = Column(DateTime(timezone=True), nullable=False) # Original post time on Instagram + fetched_at = Column(DateTime(timezone=True), server_default=func.now()) # Time when scraped + + # Relationship + account = relationship("InstagramAccount", back_populates="posts") + # Dependency to get database session def get_db(): db = SessionLocal() diff --git a/main.py b/main.py index 0cceb22..f9f2d93 100644 --- a/main.py +++ b/main.py @@ -22,7 +22,7 @@ app.add_middleware( allow_headers=eval(os.getenv("ALLOWED_HEADERS", '["*"]')), ) -# Pydantic models +# Pydantic models for basic items class ItemBase(BaseModel): name: str description: Optional[str] = None