PMFlow/backend/app/schemas/space.py

84 lines
2.6 KiB
Python

"""Personal Space API schemas."""
from __future__ import annotations
from typing import Any, Literal, Optional
from pydantic import BaseModel, Field
SavedIdeaStatus = Literal["saved", "enriched", "needs_more_info", "draft_ready", "promoted", "archived"]
SavedIdeaSourceType = Literal["project_launch", "ai_concierge", "logout_guard", "feishu", "upload", "manual"]
SavedIdeaInputMode = Literal["idea", "import", "template"]
SavedIdeaEnrichmentStatus = Literal["baseline", "ai_enriched", "ai_failed"]
class SavedIdeaAttachment(BaseModel):
type: str = "text"
name: Optional[str] = None
summary: Optional[str] = None
payload: Optional[dict[str, Any]] = None
class SavedIdeaCreateRequest(BaseModel):
raw_text: str = Field(min_length=1, max_length=4000)
title: Optional[str] = Field(default=None, max_length=255)
summary: Optional[str] = Field(default=None, max_length=1000)
source_type: SavedIdeaSourceType = "project_launch"
source_ref: Optional[str] = Field(default=None, max_length=255)
input_mode: SavedIdeaInputMode = "idea"
attachments: list[SavedIdeaAttachment] = Field(default_factory=list)
class SavedIdeaUpdateRequest(BaseModel):
title: Optional[str] = Field(default=None, min_length=1, max_length=255)
raw_text: Optional[str] = Field(default=None, min_length=1, max_length=4000)
summary: Optional[str] = Field(default=None, min_length=1, max_length=1000)
status: Optional[SavedIdeaStatus] = None
class SavedIdeaRead(BaseModel):
id: str
title: str
raw_text: str
summary: str
source_type: str
source_ref: Optional[str] = None
input_mode: str
attachments: list[dict[str, Any]] = Field(default_factory=list)
status: str
status_label: str
ai_summary: Optional[str] = None
missing_questions: list[str] = Field(default_factory=list)
readiness_score: float
enrichment_status: str = "baseline"
enrichment_payload: dict[str, Any] = Field(default_factory=dict)
enrichment_error: Optional[str] = None
enriched_at: Optional[str] = None
launch_draft_id: Optional[str] = None
promoted_project_id: Optional[int] = None
created_at: str
updated_at: str
href: str
class SavedIdeaListResponse(BaseModel):
items: list[SavedIdeaRead] = Field(default_factory=list)
class SavedIdeaPromoteResponse(BaseModel):
idea: SavedIdeaRead
draft: dict[str, Any]
redirect_url: str
__all__ = [
"SavedIdeaAttachment",
"SavedIdeaCreateRequest",
"SavedIdeaEnrichmentStatus",
"SavedIdeaListResponse",
"SavedIdeaPromoteResponse",
"SavedIdeaRead",
"SavedIdeaUpdateRequest",
]