82 lines
2.4 KiB
Python
82 lines
2.4 KiB
Python
"""
|
|
Schema definitions for leaderboard API.
|
|
|
|
This module provides Pydantic models for leaderboard-related responses
|
|
and requests.
|
|
"""
|
|
|
|
from datetime import datetime
|
|
from pydantic import BaseModel, Field
|
|
|
|
|
|
class LeaderboardEntry(BaseModel):
|
|
"""Represents a single entry in the leaderboard."""
|
|
user_id: int
|
|
username: str | None = None
|
|
accuracy: float = Field(..., ge=0, le=100, description="Accuracy percentage (0-100)")
|
|
predictions_count: int = Field(..., ge=0, description="Total number of predictions viewed")
|
|
|
|
class Config:
|
|
json_schema_extra = {
|
|
"example": {
|
|
"user_id": 1,
|
|
"username": "JohnDoe",
|
|
"accuracy": 85.5,
|
|
"predictions_count": 42
|
|
}
|
|
}
|
|
|
|
|
|
class PersonalRankData(BaseModel):
|
|
"""Represents personal rank data for the current user."""
|
|
rank: int = Field(..., ge=1, description="User's rank in the leaderboard")
|
|
accuracy: float = Field(..., ge=0, le=100, description="User's accuracy percentage")
|
|
predictions_count: int = Field(..., ge=0, description="User's total predictions viewed")
|
|
|
|
class Config:
|
|
json_schema_extra = {
|
|
"example": {
|
|
"rank": 42,
|
|
"accuracy": 75.5,
|
|
"predictions_count": 25
|
|
}
|
|
}
|
|
|
|
|
|
class LeaderboardResponse(BaseModel):
|
|
"""Response model for leaderboard endpoint."""
|
|
data: list[LeaderboardEntry]
|
|
personal_data: PersonalRankData | None = None
|
|
meta: dict
|
|
|
|
class Config:
|
|
json_schema_extra = {
|
|
"example": {
|
|
"data": [
|
|
{
|
|
"user_id": 1,
|
|
"username": "JohnDoe",
|
|
"accuracy": 95.5,
|
|
"predictions_count": 100
|
|
},
|
|
{
|
|
"user_id": 2,
|
|
"username": "JaneSmith",
|
|
"accuracy": 90.0,
|
|
"predictions_count": 85
|
|
}
|
|
],
|
|
"personal_data": {
|
|
"rank": 42,
|
|
"accuracy": 75.5,
|
|
"predictions_count": 25
|
|
},
|
|
"meta": {
|
|
"total": 2,
|
|
"limit": 100,
|
|
"timestamp": "2026-01-18T10:30:00Z",
|
|
"version": "v1"
|
|
}
|
|
}
|
|
}
|