from pydantic import BaseModel, EmailStr from datetime import datetime from typing import Optional, List, Dict, Any class IntegrationCreate(BaseModel): provider: str access_token: str refresh_token: Optional[str] = None expires_at: Optional[datetime] = None account_info: Optional[Dict[str, Any]] = None class IntegrationResponse(BaseModel): id: int provider: str connected: bool account_info: Optional[Dict[str, Any]] = None created_at: datetime class Config: from_attributes = True class AssetCreate(BaseModel): name: str file_type: str product_category: str sub_category: Optional[str] = None size: int metadata: Optional[Dict[str, Any]] = None class AssetResponse(BaseModel): id: str # Changed to str to preserve precision for large CockroachDB IDs (bigint) name: str file_type: str product_category: str sub_category: Optional[str] = None size: int extracted_content: Optional[Dict[str, Any]] = None analysis_status: Optional[str] = None analyzed_at: Optional[datetime] = None created_at: datetime class Config: from_attributes = True class PostCreate(BaseModel): title: str content: str post_type: str product_category: str scheduled_date: datetime assets: Optional[List[int]] = None class PostResponse(BaseModel): id: int title: str content: str post_type: str product_category: str scheduled_date: datetime status: str created_at: datetime class Config: from_attributes = True class CampaignCreate(BaseModel): name: str date_range_start: datetime date_range_end: datetime products: List[str] post_types: List[str] posts_per_week: int class CampaignResponse(BaseModel): id: int name: str date_range_start: datetime date_range_end: datetime products: List[str] post_types: List[str] posts_per_week: int status: str created_at: datetime class Config: from_attributes = True class CanvaBrandTemplate(BaseModel): id: str title: str view_url: str create_url: str thumbnail: Optional[Dict[str, Any]] = None class CanvaAutofillRequest(BaseModel): brand_template_id: str title: str data: Dict[str, Any] class CanvaAutofillResponse(BaseModel): job_id: str status: str class LinkedInPostRequest(BaseModel): text: str media_uris: Optional[List[str]] = None scheduled_time: Optional[datetime] = None class AIContentRequest(BaseModel): product_category: str post_type: str context: Optional[str] = None assets: Optional[List[int]] = None class AIContentResponse(BaseModel): content: str suggested_hashtags: List[str]