File size: 1,929 Bytes
5960fdf
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
from __future__ import annotations

from typing import Literal

from pydantic import BaseModel, Field


class CreateBirthProfileRequest(BaseModel):
    name: str
    birth_date: str
    birth_time: str | None = None
    birth_place: str | None = None
    birth_place_adcode: str | None = None
    birth_place_level: Literal["county", "city"] | None = None
    time_confidence: Literal["exact", "approximate", "unknown", "rectified"]

    class Config:
        extra = "forbid"


class ResolvedLocationResponse(BaseModel):
    lat: float
    lng: float
    timezone: str

    class Config:
        extra = "forbid"


class CreateBirthProfileResponse(BaseModel):
    profile_id: str
    resolved_location: ResolvedLocationResponse

    class Config:
        extra = "forbid"


class CalculationProfileRequest(BaseModel):
    ephemeris: Literal["DE440", "DE441"] = "DE440"
    zodiac: Literal["tropical"] = "tropical"
    house_system: Literal["whole_sign", "equal", "porphyry", "placidus"] = "placidus"
    orb_profile: str = "western_default_v1"
    position_type: Literal["apparent", "astrometric"] = "apparent"
    ecliptic_epoch: Literal["date", "J2000"] = "date"

    class Config:
        extra = "forbid"


class CreateNatalChartRequest(BaseModel):
    profile_id: str
    calculation_profile: CalculationProfileRequest

    class Config:
        extra = "forbid"


class CreateChartResponse(BaseModel):
    chart_id: str
    chart_json: dict

    class Config:
        extra = "forbid"


class RenderInputResponse(BaseModel):
    points: dict
    houses: list
    aspects: list
    labels: dict = Field(default_factory=lambda: {"language": "zh-CN"})

    class Config:
        extra = "forbid"


class ValidateChartResponse(BaseModel):
    status: str
    max_delta_arcsec: float | None = None
    warnings: list[str] = Field(default_factory=list)
    report: dict | None = None

    class Config:
        extra = "forbid"