""" Pydantic schemas for SEC filing endpoints. """ from datetime import datetime from typing import Any, Dict, List, Optional from pydantic import BaseModel, Field class FilingDocumentInfo(BaseModel): type: Optional[str] = None description: Optional[str] = None filename: Optional[str] = None url: Optional[str] = None size: Optional[str] = None class FilingSummary(BaseModel): accession_number: str form_type: str filing_date: str accepted_at: Optional[str] = None primary_document: Optional[str] = None filing_description: Optional[str] = None documents_count: Optional[int] = None class FilingSearchResponse(BaseModel): ticker: str filings: List[FilingSummary] total_count: int metadata: dict = Field(default_factory=dict) class FilingDocumentListResponse(BaseModel): accession_number: str documents: List[FilingDocumentInfo] metadata: dict = Field(default_factory=dict) class ExhibitContentResponse(BaseModel): accession_number: str exhibit_type: str content: str content_type: Optional[str] = None filename: Optional[str] = None url: Optional[str] = None # ── Bulk filing search ────────────────────────────────────────────────────── class BulkFilingSearchRequest(BaseModel): tickers: List[str] = Field(..., min_length=1, max_length=200) form_type: Optional[str] = None start_date: Optional[str] = None end_date: Optional[str] = None limit_per_ticker: int = Field(default=20, ge=1, le=100) class BulkFilingSearchItem(BaseModel): ticker: str success: bool filings: List[FilingSummary] = [] total_count: int = 0 error: Optional[str] = None class BulkFilingSearchResponse(BaseModel): results: List[BulkFilingSearchItem] total_tickers: int successful_count: int failed_count: int query_time_seconds: float metadata: Dict[str, Any] = Field(default_factory=dict) # ── Bulk exhibit ──────────────────────────────────────────────────────────── class BulkExhibitRequest(BaseModel): items: List[Dict[str, str]] = Field(..., min_length=1, max_length=50) # Each item: {"accession_number": "...", "exhibit_type": "EX-99.1"} class BulkExhibitItem(BaseModel): accession_number: str exhibit_type: str success: bool content: Optional[str] = None content_type: Optional[str] = None filename: Optional[str] = None url: Optional[str] = None error: Optional[str] = None class BulkExhibitResponse(BaseModel): results: List[BulkExhibitItem] total_items: int successful_count: int failed_count: int query_time_seconds: float