File size: 1,996 Bytes
48a3682
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
93
94
"""
Pydantic models for request/response validation.
"""

from pydantic import BaseModel
from typing import Optional
from enum import Enum


class LeadStatus(str, Enum):
    new = "new"
    contacted = "contacted"
    replied = "replied"
    closed = "closed"


class ScrapeRequest(BaseModel):
    query: str  # e.g. "gym in Mumbai"
    limit: int = 50
    lat: Optional[float] = None
    lng: Optional[float] = None
    zoom: int = 14


class ScrapeStatusResponse(BaseModel):
    status: str  # "idle", "running", "completed", "failed"
    total_found: int = 0
    message: str = ""


class LeadCreate(BaseModel):
    name: str
    phone: Optional[str] = None
    address: Optional[str] = None
    website: Optional[str] = None
    email: Optional[str] = None
    instagram: Optional[str] = None
    linkedin: Optional[str] = None
    status: LeadStatus = LeadStatus.new
    notes: Optional[str] = ""


class LeadUpdate(BaseModel):
    name: Optional[str] = None
    phone: Optional[str] = None
    address: Optional[str] = None
    website: Optional[str] = None
    email: Optional[str] = None
    instagram: Optional[str] = None
    linkedin: Optional[str] = None
    status: Optional[LeadStatus] = None
    notes: Optional[str] = None
    follow_up_date: Optional[str] = None


class LeadResponse(BaseModel):
    id: int
    name: str
    phone: Optional[str]
    address: Optional[str]
    website: Optional[str]
    email: Optional[str]
    instagram: Optional[str]
    linkedin: Optional[str]
    status: str
    notes: Optional[str]
    follow_up_date: Optional[str]
    created_at: str


class TemplateCreate(BaseModel):
    name: str
    content: str


class TemplateUpdate(BaseModel):
    name: Optional[str] = None
    content: Optional[str] = None


class TemplateResponse(BaseModel):
    id: int
    name: str
    content: str
    created_at: str


class DashboardStats(BaseModel):
    total: int = 0
    new: int = 0
    contacted: int = 0
    replied: int = 0
    closed: int = 0