im1d's picture
initial deploy
72d2ab9
"""
Pydantic models ู„ุฌุฏุงูˆู„ Supabase.
ุชุณุชุฎุฏู… ู„ู„ุชุญู‚ู‚ ู…ู† ุงู„ุจูŠุงู†ุงุช ุฏุงุฎู„ ุงู„ู€ API endpoints ูˆุงู„ู€ workers.
ุงู„ุฃุณู…ุงุก ูˆุฃู†ูˆุงุน ุงู„ุญู‚ูˆู„ ู…ุทุงุจู‚ุฉ ุชู…ุงู…ุงู‹ ู„ู„ู€ schema ููŠ Supabase.
"""
from __future__ import annotations
from datetime import date, datetime
from typing import Any, List, Optional
from uuid import UUID
from pydantic import BaseModel, Field
class AnalysisRequest(BaseModel):
"""ุตู ู…ู† ุฌุฏูˆู„ analysis_requests."""
id: UUID
user_id: UUID
title: str
keywords: List[str]
platforms: List[str] = Field(default_factory=lambda: ["twitter"])
analysis_type: str # reputation | campaign | audience | influencer | strategic
date_from: date
date_to: date
status: str = "pending"
progress: int = 0
error_message: Optional[str] = None
created_at: Optional[datetime] = None
completed_at: Optional[datetime] = None
updated_at: Optional[datetime] = None
# ุญู‚ู„ ุงุฎุชูŠุงุฑูŠ ู†ุถูŠูู‡ ู†ุญู†: ู‚ุงุฆู…ุฉ dataset ids ู„ู„ุชุญู„ูŠู„
dataset_ids: Optional[List[str]] = None
class AnalysisResults(BaseModel):
"""ุตู ู…ู† ุฌุฏูˆู„ analysis_results - ุงู„ุดูƒู„ ุงู„ู…ุชูˆู‚ุน ู…ู† ุงู„ู€ Frontend."""
request_id: UUID
total_posts: int = 0
total_users: int = 0
total_reach: int = 0
sentiment_positive: float = 0.0
sentiment_neutral: float = 0.0
sentiment_negative: float = 0.0
top_topics: List[dict] = Field(default_factory=list)
top_influencers: List[dict] = Field(default_factory=list)
sentiment_timeline: List[dict] = Field(default_factory=list)
network_nodes: List[dict] = Field(default_factory=list)
network_edges: List[dict] = Field(default_factory=list)
summary: Optional[str] = None
recommendations: List[str] = Field(default_factory=list)
class TriggerRequest(BaseModel):
request_id: UUID
user_id: Optional[UUID] = None
class StatusResponse(BaseModel):
request_id: UUID
status: str
progress: int
error_message: Optional[str] = None
updated_at: Optional[datetime] = None
class HealthResponse(BaseModel):
status: str = "healthy"
version: str = "1.0.0"
spark_available: bool = False
supabase_configured: bool = False
class DatasetInfo(BaseModel):
"""ู…ุนู„ูˆู…ุงุช dataset ู„ุฅุฑุฌุงุนู‡ุง ู„ู„ู€ Frontend."""
id: str
name: str
name_ar: str
domain: str
source: str
size_estimate_rows: int
has_timestamp: bool
has_user_metadata: bool
has_engagement: bool
description_ar: str = ""
homepage: str = ""