File size: 2,600 Bytes
72d2ab9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
"""
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 = ""