TorbatYar/backend/services/experience/app/schemas/ai_hooks.py
Mortezakoohjani 203671a7bf feat(experience): ship Experience Platform phases 11.0-11.10
Add the experience service with sites through analytics/AI hooks, migrations through 0011, and phase docs/manifests marking the track complete.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-27 11:43:10 +03:30

122 lines
3.3 KiB
Python

"""AI content hook DTOs — Phase 11.10."""
from datetime import datetime
from uuid import UUID
from pydantic import BaseModel, ConfigDict, Field
from app.models.types import (
AiContentDispatchStatus,
AiContentHookStatus,
AiContentTaskKind,
)
from app.schemas.common import ORMBase
_FORBID = ConfigDict(extra="forbid")
class _Create(BaseModel):
model_config = _FORBID
metadata_json: dict | None = None
class _Update(BaseModel):
model_config = _FORBID
metadata_json: dict | None = None
version: int = Field(ge=1)
class AiContentHookRegistrationCreate(_Create):
workspace_id: UUID
site_id: UUID | None = None
page_id: UUID | None = None
code: str = Field(min_length=1, max_length=50)
name: str = Field(min_length=1, max_length=255)
task_kind: AiContentTaskKind
external_ai_ref: str | None = Field(default=None, max_length=255)
status: AiContentHookStatus = AiContentHookStatus.DRAFT
config_json: dict | None = None
class AiContentHookRegistrationUpdate(_Update):
name: str | None = Field(default=None, min_length=1, max_length=255)
task_kind: AiContentTaskKind | None = None
external_ai_ref: str | None = Field(default=None, max_length=255)
status: AiContentHookStatus | None = None
config_json: dict | None = None
class AiContentHookRegistrationRead(ORMBase):
id: UUID
tenant_id: UUID
workspace_id: UUID
site_id: UUID | None
page_id: UUID | None
code: str
name: str
task_kind: AiContentTaskKind
external_ai_ref: str | None
status: AiContentHookStatus
config_json: dict | None
metadata_json: dict | None
version: int
is_deleted: bool
created_by: str | None
updated_by: str | None
created_at: datetime
updated_at: datetime
class AiContentHookRegistrationListResponse(BaseModel):
items: list[AiContentHookRegistrationRead]
total: int
page: int
page_size: int
class AiContentDispatchCreate(BaseModel):
model_config = _FORBID
registration_id: UUID
workspace_id: UUID
site_id: UUID | None = None
page_id: UUID | None = None
task: str = Field(min_length=1, max_length=100)
context_ref: str | None = Field(default=None, max_length=255)
payload_json: dict | None = None
class AiContentDispatchUpdate(BaseModel):
model_config = _FORBID
task: str | None = Field(default=None, min_length=1, max_length=100)
context_ref: str | None = Field(default=None, max_length=255)
payload_json: dict | None = None
status: AiContentDispatchStatus | None = None
version: int = Field(ge=1)
class AiContentDispatchRead(ORMBase):
id: UUID
tenant_id: UUID
registration_id: UUID
workspace_id: UUID
site_id: UUID | None
page_id: UUID | None
task: str
context_ref: str | None
payload_json: dict | None
status: AiContentDispatchStatus
response_json: dict | None
generated_content_ref: str | None
version: int
is_deleted: bool
created_by: str | None
updated_by: str | None
created_at: datetime
updated_at: datetime
class AiContentDispatchListResponse(BaseModel):
items: list[AiContentDispatchRead]
total: int
page: int
page_size: int