File size: 3,701 Bytes
f80e9b3
 
 
aabbd76
f80e9b3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ebd72bb
6d1e595
 
 
f80e9b3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ebd72bb
f80e9b3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
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)