101 lines
5.5 KiB
Python
101 lines
5.5 KiB
Python
# emsal_mcp_module/models.py
|
||
|
||
from pydantic import BaseModel, Field, HttpUrl, ConfigDict
|
||
from typing import List, Optional, Dict, Any
|
||
|
||
class EmsalDetailedSearchRequestData(BaseModel):
|
||
"""
|
||
Internal model for the 'data' object in the Emsal detailed search payload.
|
||
Field names use aliases to match the exact keys in the API payload
|
||
(e.g., "Bam Hukuk Mahkemeleri" with spaces).
|
||
The API expects empty strings for None/omitted optional fields.
|
||
"""
|
||
arananKelime: Optional[str] = ""
|
||
|
||
Bam_Hukuk_Mahkemeleri: Optional[str] = Field(None, alias="Bam Hukuk Mahkemeleri")
|
||
Hukuk_Mahkemeleri: Optional[str] = Field(None, alias="Hukuk Mahkemeleri")
|
||
# Add other specific court type fields from the form if they are separate keys in payload
|
||
# E.g., "Ceza Mahkemeleri", "İdari Mahkemeler" etc.
|
||
|
||
birimHukukMah: Optional[str] = Field("", description="List of selected Regional Civil Chambers (Bölge Hukuk Mahkemeleri), '+' separated.")
|
||
|
||
esasYil: Optional[str] = ""
|
||
esasIlkSiraNo: Optional[str] = ""
|
||
esasSonSiraNo: Optional[str] = ""
|
||
kararYil: Optional[str] = ""
|
||
kararIlkSiraNo: Optional[str] = ""
|
||
kararSonSiraNo: Optional[str] = ""
|
||
baslangicTarihi: Optional[str] = ""
|
||
bitisTarihi: Optional[str] = ""
|
||
siralama: str # Mandatory in payload example
|
||
siralamaDirection: str # Mandatory in payload example
|
||
pageSize: int
|
||
pageNumber: int
|
||
|
||
model_config = ConfigDict(populate_by_name=True) # Enables use of alias in serialization (when dumping to dict for payload)
|
||
|
||
class EmsalSearchRequest(BaseModel): # This is the model the MCP tool will accept
|
||
"""Model for Emsal detailed search request, with user-friendly field names."""
|
||
keyword: Optional[str] = Field(None, description="Keyword (Anahtar Kelime) to search.")
|
||
|
||
selected_bam_civil_court: Optional[str] = Field(None, description="Selected BAM Civil Court (Seçilen BAM Hukuk Mahkemesi) (maps to 'Bam Hukuk Mahkemeleri' payload key).")
|
||
selected_civil_court: Optional[str] = Field(None, description="Selected Civil Court (Seçilen Hukuk Mahkemesi) (maps to 'Hukuk Mahkemeleri' payload key).")
|
||
selected_regional_civil_chambers: Optional[List[str]] = Field(default_factory=list, description="Selected Regional Civil Chambers (Seçilen Bölge Hukuk Daireleri) (for 'birimHukukMah', joined by '+').")
|
||
|
||
case_year_esas: Optional[str] = Field(None, description="Case year (Dava Yılı) for 'Esas No'.")
|
||
case_start_seq_esas: Optional[str] = Field(None, description="Starting sequence (Başlangıç Sırası) for 'Esas No'.")
|
||
case_end_seq_esas: Optional[str] = Field(None, description="Ending sequence (Bitiş Sırası) for 'Esas No'.")
|
||
|
||
decision_year_karar: Optional[str] = Field(None, description="Decision year (Karar Yılı) for 'Karar No'.")
|
||
decision_start_seq_karar: Optional[str] = Field(None, description="Starting sequence (Başlangıç Sırası) for 'Karar No'.")
|
||
decision_end_seq_karar: Optional[str] = Field(None, description="Ending sequence (Bitiş Sırası) for 'Karar No'.")
|
||
|
||
start_date: Optional[str] = Field(None, description="Start date (Başlangıç Tarihi) for decision (DD.MM.YYYY).")
|
||
end_date: Optional[str] = Field(None, description="End date (Bitiş Tarihi) for decision (DD.MM.YYYY).")
|
||
|
||
sort_criteria: str = Field("1", description="Sorting criteria (Sıralama Kriteri) (e.g., 1: Esas No).")
|
||
sort_direction: str = Field("desc", description="Sorting direction (Sıralama Yönü) ('asc' or 'desc').")
|
||
|
||
page_number: int = Field(default=1, ge=1)
|
||
page_size: int = Field(default=10, ge=1, le=100)
|
||
|
||
|
||
class EmsalApiDecisionEntry(BaseModel):
|
||
"""Model for an individual decision entry from the Emsal API search response."""
|
||
id: str
|
||
daire: Optional[str] = Field(None, description="The chamber/court (Daire/Mahkeme) that made the decision.")
|
||
esasNo: Optional[str] = Field(None)
|
||
kararNo: Optional[str] = Field(None)
|
||
kararTarihi: Optional[str] = Field(None)
|
||
arananKelime: Optional[str] = Field(None, description="Matched keyword (Aranan Kelime) from the search.")
|
||
durum: Optional[str] = Field(None, description="Status (Durum) of the decision (e.g., 'KESİNLEŞMEDİ').")
|
||
# index: Optional[int] = None # Present in Emsal response, can be added if tool needs it
|
||
|
||
document_url: Optional[HttpUrl] = Field(None, description="URL (Belge URL) to the full document, constructed by the client.")
|
||
|
||
model_config = ConfigDict(extra='ignore')
|
||
|
||
class EmsalApiResponseInnerData(BaseModel):
|
||
"""Model for the inner 'data' object in the Emsal API search response."""
|
||
data: List[EmsalApiDecisionEntry]
|
||
recordsTotal: int
|
||
recordsFiltered: int
|
||
draw: Optional[int] = Field(None, description="Draw counter (Çizim Sayıcısı) from API, usually for DataTables.")
|
||
|
||
class EmsalApiResponse(BaseModel):
|
||
"""Model for the complete search response from the Emsal API."""
|
||
data: EmsalApiResponseInnerData
|
||
metadata: Optional[Dict[str, Any]] = Field(None, description="Optional metadata (Meta Veri) from API, if any.")
|
||
|
||
class EmsalDocumentMarkdown(BaseModel):
|
||
"""Model for an Emsal decision document, containing only Markdown content."""
|
||
id: str
|
||
markdown_content: Optional[str] = Field(None, description="The decision content (Karar İçeriği) converted to Markdown.")
|
||
source_url: HttpUrl
|
||
|
||
class CompactEmsalSearchResult(BaseModel):
|
||
"""A compact search result model for the MCP tool to return."""
|
||
decisions: List[EmsalApiDecisionEntry]
|
||
total_records: int
|
||
requested_page: int
|
||
page_size: int |