AI Analysis and Content Strategy fixes. Enhanced Strategy Routes refactoring.
This commit is contained in:
58
backend/models/research_models.py
Normal file
58
backend/models/research_models.py
Normal file
@@ -0,0 +1,58 @@
|
||||
"""
|
||||
Research Project Models
|
||||
|
||||
Database models for research project persistence and state management.
|
||||
Similar to PodcastProject, but for research projects.
|
||||
"""
|
||||
|
||||
from sqlalchemy import Column, Integer, String, DateTime, Boolean, JSON, Index
|
||||
from datetime import datetime
|
||||
|
||||
# Use the same Base as subscription models for consistency
|
||||
from models.subscription_models import Base
|
||||
|
||||
|
||||
class ResearchProject(Base):
|
||||
"""
|
||||
Database model for research project state.
|
||||
Stores complete research project state to enable cross-device resume.
|
||||
"""
|
||||
|
||||
__tablename__ = "research_projects"
|
||||
|
||||
# Primary fields
|
||||
id = Column(Integer, primary_key=True, autoincrement=True)
|
||||
project_id = Column(String(255), unique=True, nullable=False, index=True) # User-facing project ID
|
||||
user_id = Column(String(255), nullable=False, index=True) # Clerk user ID
|
||||
|
||||
# Project metadata
|
||||
title = Column(String(500), nullable=True) # Project title
|
||||
keywords = Column(JSON, nullable=False) # List of keywords
|
||||
industry = Column(String(255), nullable=True)
|
||||
target_audience = Column(String(255), nullable=True)
|
||||
research_mode = Column(String(50), nullable=True, default="comprehensive") # basic, comprehensive, expert
|
||||
|
||||
# Project state (stored as JSON)
|
||||
config = Column(JSON, nullable=True) # ResearchConfig
|
||||
intent_analysis = Column(JSON, nullable=True) # AnalyzeIntentResponse
|
||||
confirmed_intent = Column(JSON, nullable=True) # ResearchIntent
|
||||
intent_result = Column(JSON, nullable=True) # IntentDrivenResearchResponse
|
||||
legacy_result = Column(JSON, nullable=True) # BlogResearchResponse (for backward compatibility)
|
||||
trends_config = Column(JSON, nullable=True) # Google Trends configuration
|
||||
|
||||
# UI state
|
||||
current_step = Column(Integer, default=1, nullable=False) # 1=Input, 2=Progress, 3=Results
|
||||
|
||||
# Status
|
||||
status = Column(String(50), default="draft", nullable=False, index=True) # draft, in_progress, completed, archived
|
||||
is_favorite = Column(Boolean, default=False, index=True)
|
||||
|
||||
# Timestamps
|
||||
created_at = Column(DateTime, default=datetime.utcnow, nullable=False, index=True)
|
||||
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False, index=True)
|
||||
|
||||
# Composite indexes for common query patterns
|
||||
__table_args__ = (
|
||||
Index('idx_user_status_created', 'user_id', 'status', 'created_at'),
|
||||
Index('idx_user_favorite_updated', 'user_id', 'is_favorite', 'updated_at'),
|
||||
)
|
||||
Reference in New Issue
Block a user