File size: 4,240 Bytes
3d83b62
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
95
"""Pydantic schemas for API requests and responses."""
from datetime import datetime
from typing import Optional
from pydantic import BaseModel, Field


class BibTeXVerifyRequest(BaseModel):
    """Request model for BibTeX verification."""

    bibtex_content: str = Field(
        ...,
        description="BibTeX content to verify",
        min_length=1,
        examples=[
            """@article{example2023,
  title={Example Paper Title},
  author={Smith, John and Doe, Jane},
  journal={Example Journal},
  year={2023}
}"""
        ],
    )


class EntryComparisonResponse(BaseModel):
    """Response model for a single entry comparison."""

    key: str = Field(..., description="BibTeX entry key")
    status: str = Field(..., description="Verification status: verified, warning, or error")
    is_match: bool = Field(..., description="Whether entry matches a database record")
    has_issues: bool = Field(..., description="Whether entry has metadata issues")
    source: Optional[str] = Field(None, description="Data source that verified the entry")
    confidence: float = Field(..., description="Confidence score (0-1)")
    title_match: bool = Field(..., description="Whether title matches")
    author_match: bool = Field(..., description="Whether authors match")
    year_match: bool = Field(..., description="Whether year matches")
    venue_match: Optional[bool] = Field(None, description="Whether venue matches")
    fetched_title: Optional[str] = Field(None, description="Title from database")
    fetched_authors: Optional[list[str]] = Field(None, description="Authors from database")
    fetched_year: Optional[str] = Field(None, description="Year from database")
    fetched_doi: Optional[str] = Field(None, description="DOI from database")
    fetched_url: Optional[str] = Field(None, description="URL from database")
    original_bibtex: str = Field(..., description="Original BibTeX entry")


class DuplicateGroupResponse(BaseModel):
    """Response model for duplicate entry groups."""

    entry_keys: list[str] = Field(..., description="Keys of duplicate entries")
    reason: str = Field(..., description="Reason for duplicate detection")


class BibTeXVerifyResponse(BaseModel):
    """Response model for BibTeX verification."""

    success: bool = Field(..., description="Whether verification completed successfully")
    message: str = Field(..., description="Status message")
    total_count: int = Field(..., description="Total number of entries")
    verified_count: int = Field(..., description="Number of verified entries")
    warning_count: int = Field(..., description="Number of entries with warnings")
    error_count: int = Field(..., description="Number of entries with errors")
    success_rate: float = Field(..., description="Success rate percentage")
    entries: list[EntryComparisonResponse] = Field(..., description="Verification results for each entry")
    duplicate_groups: list[DuplicateGroupResponse] = Field(
        default_factory=list, description="Groups of duplicate entries"
    )
    timestamp: datetime = Field(default_factory=datetime.utcnow, description="Verification timestamp")


class HealthResponse(BaseModel):
    """Response model for health check."""

    status: str = Field(..., description="Service status")
    version: str = Field(..., description="Application version")
    environment: str = Field(..., description="Runtime environment")
    timestamp: datetime = Field(default_factory=datetime.utcnow, description="Current timestamp")


class StatsResponse(BaseModel):
    """Response model for statistics."""

    cache_enabled: bool = Field(..., description="Whether cache is enabled")
    cache_size: int = Field(..., description="Current cache size")
    cache_max_size: int = Field(..., description="Maximum cache size")
    cache_ttl: int = Field(..., description="Cache TTL in seconds")


class ErrorResponse(BaseModel):
    """Response model for errors."""

    error: str = Field(..., description="Error type")
    message: str = Field(..., description="Error message")
    details: Optional[dict] = Field(None, description="Additional error details")
    timestamp: datetime = Field(default_factory=datetime.utcnow, description="Error timestamp")