feat: add class share drafts

This commit is contained in:
2026-07-31 16:07:18 +08:00
parent d8fde93b69
commit 429636f3e8
15 changed files with 410 additions and 5 deletions

View File

@@ -16,13 +16,14 @@ from app.core.dependencies import get_current_admin
from app.core.responses import api_success
from app.models.admin import Admin
from app.models.chat import ChatMessage, ChatSession, TopicSession
from app.models.growth import TeacherHelpCard, TopicSummary
from app.models.growth import ShareDraft, TeacherHelpCard, TopicSummary
from app.models.logs import AiRequestLog, OperationLog
from app.models.user import User
from app.api.pagination import page_result
from app.services.question_insight_service import QuestionInsightService
from app.services.growth_profile_service import topic_dict, topic_summary_dict
from app.services.help_card_service import help_card_dict
from app.services.share_draft_service import share_draft_dict
router = APIRouter()
@@ -141,6 +142,7 @@ def chat_detail(
topics = _topic_rows(db, session_id)
topic_ids = [item["id"] for item in topics]
help_cards = []
share_drafts = []
if topic_ids:
help_cards = list(
db.scalars(
@@ -149,6 +151,13 @@ def chat_detail(
.order_by(TeacherHelpCard.created_at.desc(), TeacherHelpCard.id.desc())
)
)
share_drafts = list(
db.scalars(
select(ShareDraft)
.where(ShareDraft.topic_session_id.in_(topic_ids))
.order_by(ShareDraft.created_at.desc(), ShareDraft.id.desc())
)
)
return api_success(
{
"session": _chat_row_dict(session, user),
@@ -162,6 +171,7 @@ def chat_detail(
"aiLogs": [_ai_log_dict(item, include_prompt=True) for item in ai_logs],
"topics": topics,
"helpCards": [help_card_dict(item) for item in help_cards],
"shareDrafts": [share_draft_dict(item) for item in share_drafts],
}
)

View File

@@ -33,6 +33,7 @@ from app.services.chat_stream_service import ChatStreamService
from app.services.growth_profile_service import GrowthProfileService
from app.services.help_card_service import HelpCardService, help_card_dict
from app.services.reasoning_policy_service import ReasoningPolicyService
from app.services.share_draft_service import ShareDraftService, share_draft_dict
router = APIRouter()
logger = logging.getLogger(__name__)
@@ -126,6 +127,35 @@ def mark_help_card_copied(
return api_success(help_card_dict(HelpCardService.mark_copied(db, user=current_user, card_id=card_id)))
@router.post("/session/{session_id}/share-draft")
def generate_share_draft(
session_id: int,
db: Session = Depends(get_db),
current_user: User = Depends(get_current_user),
) -> dict:
session = ChatService._get_user_session(db, current_user, session_id)
draft = ShareDraftService.generate_for_session(db, user=current_user, session=session)
return api_success(share_draft_dict(draft))
@router.get("/share-draft/list")
def list_share_drafts(
limit: int = Query(default=20, ge=1, le=50),
db: Session = Depends(get_db),
current_user: User = Depends(get_current_user),
) -> dict:
return api_success([share_draft_dict(draft) for draft in ShareDraftService.list_user_drafts(db, user=current_user, limit=limit)])
@router.post("/share-draft/{draft_id}/copied")
def mark_share_draft_copied(
draft_id: int,
db: Session = Depends(get_db),
current_user: User = Depends(get_current_user),
) -> dict:
return api_success(share_draft_dict(ShareDraftService.mark_copied(db, user=current_user, draft_id=draft_id)))
@router.post("/completions")
def completions(
payload: ChatCompletionRequest,