create DB

This commit is contained in:
Hossein 2025-08-07 00:27:44 +03:30
parent 991073ce1b
commit 817d3b9c39
2 changed files with 36 additions and 4 deletions

View File

@ -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.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker from sqlalchemy.orm import sessionmaker, relationship
from sqlalchemy.sql import func from sqlalchemy.sql import func
from sqlalchemy.dialects.postgresql import UUID, JSONB
import os import os
import uuid
# Database URL from environment variable # Database URL from environment variable
DATABASE_URL = os.getenv("DATABASE_URL") DATABASE_URL = os.getenv("DATABASE_URL")
@ -24,7 +26,7 @@ SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
# Create Base class # Create Base class
Base = declarative_base() Base = declarative_base()
# Database model # Basic Item model (for backward compatibility)
class Item(Base): class Item(Base):
__tablename__ = "items" __tablename__ = "items"
@ -35,6 +37,36 @@ class Item(Base):
created_at = Column(DateTime(timezone=True), server_default=func.now()) created_at = Column(DateTime(timezone=True), server_default=func.now())
updated_at = Column(DateTime(timezone=True), onupdate=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 # Dependency to get database session
def get_db(): def get_db():
db = SessionLocal() db = SessionLocal()

View File

@ -22,7 +22,7 @@ app.add_middleware(
allow_headers=eval(os.getenv("ALLOWED_HEADERS", '["*"]')), allow_headers=eval(os.getenv("ALLOWED_HEADERS", '["*"]')),
) )
# Pydantic models # Pydantic models for basic items
class ItemBase(BaseModel): class ItemBase(BaseModel):
name: str name: str
description: Optional[str] = None description: Optional[str] = None