AI Analysis and Content Strategy fixes. Enhanced Strategy Routes refactoring.

This commit is contained in:
ajaysi
2026-01-10 19:32:50 +05:30
parent 0b63ae7fc1
commit 8193cdba67
298 changed files with 45678 additions and 10952 deletions

View File

@@ -0,0 +1,113 @@
"""
Research Service
Service layer for managing research project persistence.
Similar to PodcastService, but for research projects.
"""
from sqlalchemy.orm import Session
from sqlalchemy import desc, and_, or_
from typing import Optional, List, Dict, Any
from datetime import datetime
import uuid
from models.research_models import ResearchProject
class ResearchService:
"""Service for managing research projects."""
def __init__(self, db: Session):
self.db = db
def create_project(
self,
user_id: str,
project_id: str,
keywords: List[str],
industry: Optional[str] = None,
target_audience: Optional[str] = None,
research_mode: Optional[str] = "comprehensive",
**kwargs
) -> ResearchProject:
"""Create a new research project."""
# Extract current_step and status from kwargs to avoid conflicts
current_step = kwargs.pop("current_step", 1)
status = kwargs.pop("status", "draft")
project = ResearchProject(
project_id=project_id,
user_id=user_id,
keywords=keywords,
industry=industry,
target_audience=target_audience,
research_mode=research_mode,
status=status,
current_step=current_step,
**kwargs
)
self.db.add(project)
self.db.commit()
self.db.refresh(project)
return project
def get_project(self, user_id: str, project_id: str) -> Optional[ResearchProject]:
"""Get a project by ID, ensuring user ownership."""
return self.db.query(ResearchProject).filter(
and_(
ResearchProject.project_id == project_id,
ResearchProject.user_id == user_id
)
).first()
def update_project(
self,
user_id: str,
project_id: str,
**updates
) -> Optional[ResearchProject]:
"""Update a project's state."""
project = self.get_project(user_id, project_id)
if not project:
return None
# Update fields
for key, value in updates.items():
if hasattr(project, key):
setattr(project, key, value)
project.updated_at = datetime.utcnow()
self.db.commit()
self.db.refresh(project)
return project
def list_projects(
self,
user_id: str,
status: Optional[str] = None,
is_favorite: Optional[bool] = None,
limit: int = 50,
offset: int = 0
) -> List[ResearchProject]:
"""List projects for a user."""
query = self.db.query(ResearchProject).filter(
ResearchProject.user_id == user_id
)
if status:
query = query.filter(ResearchProject.status == status)
if is_favorite is not None:
query = query.filter(ResearchProject.is_favorite == is_favorite)
return query.order_by(desc(ResearchProject.updated_at)).offset(offset).limit(limit).all()
def delete_project(self, user_id: str, project_id: str) -> bool:
"""Delete a project."""
project = self.get_project(user_id, project_id)
if not project:
return False
self.db.delete(project)
self.db.commit()
return True