|
|
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) |
|
|
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) |
|
|
product_category = Column(String) |
|
|
sub_category = Column(String, nullable=True) |
|
|
size = Column(Integer) |
|
|
extra_metadata = Column(JSON, nullable=True) |
|
|
extracted_content = Column(JSON, nullable=True) |
|
|
analysis_status = Column(String, default="pending") |
|
|
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) |
|
|
product_category = Column(String) |
|
|
scheduled_date = Column(DateTime) |
|
|
status = Column(String) |
|
|
linkedin_post_id = Column(String, nullable=True) |
|
|
canva_design_id = Column(String, nullable=True) |
|
|
assets = Column(JSON) |
|
|
extra_metadata = Column(JSON, nullable=True) |
|
|
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) |
|
|
post_types = Column(JSON) |
|
|
posts_per_week = Column(Integer) |
|
|
status = Column(String) |
|
|
created_at = Column(DateTime, default=datetime.utcnow) |
|
|
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) |
|
|
|
|
|
|