from sqlalchemy import Column, Integer, String, DateTime, Boolean, JSON, Text, ForeignKey from sqlalchemy.orm import relationship from datetime import datetime from app.database import Base class User(Base): __tablename__ = "users" id = Column(Integer, primary_key=True, index=True) email = Column(String, unique=True, index=True) name = Column(String) created_at = Column(DateTime, default=datetime.utcnow) integrations = relationship("Integration", back_populates="user") assets = relationship("Asset", back_populates="user") posts = relationship("Post", back_populates="user") class Integration(Base): __tablename__ = "integrations" id = Column(Integer, primary_key=True, index=True) user_id = Column(Integer, ForeignKey("users.id")) provider = Column(String) # 'linkedin' or 'canva' access_token = Column(Text) refresh_token = Column(Text) expires_at = Column(DateTime) account_info = Column(JSON) connected = Column(Boolean, default=False) created_at = Column(DateTime, default=datetime.utcnow) updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) user = relationship("User", back_populates="integrations") class Asset(Base): __tablename__ = "assets" id = Column(Integer, primary_key=True, index=True) user_id = Column(Integer, ForeignKey("users.id")) name = Column(String) file_path = Column(String) file_type = Column(String) # 'image', 'document', 'video' product_category = Column(String) # 'ocr', 'p2p', 'o2c' sub_category = Column(String, nullable=True) size = Column(Integer) # in bytes extra_metadata = Column(JSON, nullable=True) # Renamed from 'metadata' to avoid SQLAlchemy conflict extracted_content = Column(JSON, nullable=True) # OCR/extracted content from document parsing API analysis_status = Column(String, default="pending") # 'pending', 'processing', 'completed', 'failed' analyzed_at = Column(DateTime, nullable=True) created_at = Column(DateTime, default=datetime.utcnow) user = relationship("User", back_populates="assets") class Post(Base): __tablename__ = "posts" id = Column(Integer, primary_key=True, index=True) user_id = Column(Integer, ForeignKey("users.id")) title = Column(String) content = Column(Text) post_type = Column(String) # 'carousel', 'cover_content', 'content_only', 'webinar' product_category = Column(String) scheduled_date = Column(DateTime) status = Column(String) # 'draft', 'scheduled', 'published', 'failed' linkedin_post_id = Column(String, nullable=True) canva_design_id = Column(String, nullable=True) assets = Column(JSON) # List of asset IDs extra_metadata = Column(JSON, nullable=True) # Renamed from 'metadata' to avoid SQLAlchemy conflict created_at = Column(DateTime, default=datetime.utcnow) updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) user = relationship("User", back_populates="posts") class Campaign(Base): __tablename__ = "campaigns" id = Column(Integer, primary_key=True, index=True) user_id = Column(Integer, ForeignKey("users.id")) name = Column(String) date_range_start = Column(DateTime) date_range_end = Column(DateTime) products = Column(JSON) # List of product IDs post_types = Column(JSON) # List of post type IDs posts_per_week = Column(Integer) status = Column(String) # 'active', 'paused', 'completed' created_at = Column(DateTime, default=datetime.utcnow) updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)