65 lines
1.9 KiB
Python
65 lines
1.9 KiB
Python
"""Competitor schemas for request/response validation."""
|
|
import uuid
|
|
from datetime import datetime
|
|
from typing import Optional
|
|
|
|
from pydantic import BaseModel, Field
|
|
|
|
|
|
class CompetitorBase(BaseModel):
|
|
"""Base schema for Competitor."""
|
|
name: str = Field(..., min_length=2, max_length=50, description="Competitor name")
|
|
aliases: list[str] = Field(default=[], description="Competitor aliases")
|
|
|
|
|
|
class CompetitorCreate(CompetitorBase):
|
|
"""Schema for creating a competitor."""
|
|
pass
|
|
|
|
|
|
class CompetitorUpdate(BaseModel):
|
|
"""Schema for updating a competitor."""
|
|
name: Optional[str] = Field(None, min_length=2, max_length=50)
|
|
aliases: Optional[list[str]] = None
|
|
|
|
|
|
class CompetitorResponse(CompetitorBase):
|
|
"""Schema for competitor response."""
|
|
id: uuid.UUID
|
|
brand_id: uuid.UUID
|
|
created_at: datetime
|
|
|
|
model_config = {"from_attributes": True}
|
|
|
|
|
|
class CompetitorListResponse(BaseModel):
|
|
"""Schema for competitor list response."""
|
|
items: list[CompetitorResponse]
|
|
total: int
|
|
|
|
|
|
class CompetitorBriefResponse(BaseModel):
|
|
"""Schema for brief competitor info."""
|
|
id: uuid.UUID
|
|
name: str
|
|
aliases: list[str]
|
|
score: Optional[int] = None
|
|
|
|
model_config = {"from_attributes": True}
|
|
|
|
|
|
class CompetitorRecommendationItem(BaseModel):
|
|
"""Schema for a single competitor recommendation."""
|
|
name: str = Field(..., description="竞品名称")
|
|
reason: str = Field(..., description="推荐理由")
|
|
industry: Optional[str] = Field(None, description="所属行业")
|
|
|
|
|
|
class CompetitorRecommendationResponse(BaseModel):
|
|
"""Schema for competitor recommendation response."""
|
|
brand_name: str = Field(..., description="品牌名称")
|
|
industry: Optional[str] = Field(None, description="品牌行业")
|
|
recommendations: list[CompetitorRecommendationItem] = Field(
|
|
default_factory=list, description="推荐竞品列表"
|
|
)
|