This commit is contained in:
2026-01-02 10:43:20 -06:00
commit 14d9af3036
112 changed files with 14274 additions and 0 deletions

View File

@ -0,0 +1,47 @@
from app.schemas.user import (
UserCreate,
UserLogin,
UserUpdate,
UserSummary,
UserResponse,
UserStats,
TokenResponse,
TokenData,
)
from app.schemas.wallet import (
WalletResponse,
DepositRequest,
WithdrawalRequest,
TransactionResponse,
)
from app.schemas.bet import (
BetCreate,
BetUpdate,
BetResponse,
BetDetailResponse,
SettleBetRequest,
ProposalCreate,
ProposalResponse,
)
__all__ = [
"UserCreate",
"UserLogin",
"UserUpdate",
"UserSummary",
"UserResponse",
"UserStats",
"TokenResponse",
"TokenData",
"WalletResponse",
"DepositRequest",
"WithdrawalRequest",
"TransactionResponse",
"BetCreate",
"BetUpdate",
"BetResponse",
"BetDetailResponse",
"SettleBetRequest",
"ProposalCreate",
"ProposalResponse",
]

View File

@ -0,0 +1,89 @@
from pydantic import BaseModel, Field, ConfigDict
from decimal import Decimal
from datetime import datetime
from app.models.bet import BetCategory, BetStatus, BetVisibility, ProposalStatus
from app.schemas.user import UserSummary
class BetCreate(BaseModel):
title: str = Field(..., min_length=5, max_length=200)
description: str = Field(..., max_length=2000)
category: BetCategory
event_name: str = Field(..., max_length=200)
event_date: datetime | None = None
creator_position: str = Field(..., max_length=500)
opponent_position: str = Field(..., max_length=500)
stake_amount: Decimal = Field(..., gt=0, le=10000)
creator_odds: float = Field(default=1.0, gt=0)
opponent_odds: float = Field(default=1.0, gt=0)
visibility: BetVisibility = BetVisibility.PUBLIC
expires_at: datetime | None = None
class BetUpdate(BaseModel):
title: str | None = Field(None, min_length=5, max_length=200)
description: str | None = Field(None, max_length=2000)
event_date: datetime | None = None
creator_position: str | None = Field(None, max_length=500)
opponent_position: str | None = Field(None, max_length=500)
stake_amount: Decimal | None = Field(None, gt=0, le=10000)
creator_odds: float | None = Field(None, gt=0)
opponent_odds: float | None = Field(None, gt=0)
expires_at: datetime | None = None
class BetResponse(BaseModel):
id: int
title: str
description: str
category: BetCategory
event_name: str
event_date: datetime | None
creator_position: str
opponent_position: str
creator_odds: float
opponent_odds: float
stake_amount: Decimal
currency: str
status: BetStatus
visibility: BetVisibility
creator: UserSummary
opponent: UserSummary | None
expires_at: datetime | None
created_at: datetime
updated_at: datetime
model_config = ConfigDict(from_attributes=True)
class BetDetailResponse(BetResponse):
winner_id: int | None
settled_at: datetime | None
settled_by: str | None
class SettleBetRequest(BaseModel):
winner_id: int
class ProposalCreate(BaseModel):
proposed_stake: Decimal = Field(..., gt=0, le=10000)
proposed_creator_odds: float = Field(..., gt=0)
proposed_opponent_odds: float = Field(..., gt=0)
message: str | None = Field(None, max_length=500)
expires_at: datetime
class ProposalResponse(BaseModel):
id: int
bet_id: int
proposer_id: int
proposed_stake: Decimal
proposed_creator_odds: float
proposed_opponent_odds: float
message: str | None
status: ProposalStatus
created_at: datetime
expires_at: datetime
model_config = ConfigDict(from_attributes=True)

View File

@ -0,0 +1,67 @@
from pydantic import BaseModel, EmailStr, Field, ConfigDict
from datetime import datetime
from app.models.user import UserStatus
class UserCreate(BaseModel):
email: EmailStr
username: str = Field(..., min_length=3, max_length=50)
password: str = Field(..., min_length=8)
display_name: str | None = None
class UserLogin(BaseModel):
email: EmailStr
password: str
class UserUpdate(BaseModel):
display_name: str | None = None
avatar_url: str | None = None
bio: str | None = None
class UserSummary(BaseModel):
id: int
username: str
display_name: str | None
avatar_url: str | None
model_config = ConfigDict(from_attributes=True)
class UserResponse(BaseModel):
id: int
email: str
username: str
display_name: str | None
avatar_url: str | None
bio: str | None
total_bets: int
wins: int
losses: int
win_rate: float
status: UserStatus
created_at: datetime
model_config = ConfigDict(from_attributes=True)
class UserStats(BaseModel):
total_bets: int
wins: int
losses: int
win_rate: float
active_bets: int
model_config = ConfigDict(from_attributes=True)
class TokenResponse(BaseModel):
access_token: str
refresh_token: str
token_type: str = "bearer"
class TokenData(BaseModel):
user_id: int | None = None

View File

@ -0,0 +1,38 @@
from pydantic import BaseModel, Field, ConfigDict
from decimal import Decimal
from datetime import datetime
from app.models.transaction import TransactionType, TransactionStatus
class WalletResponse(BaseModel):
id: int
user_id: int
balance: Decimal
escrow: Decimal
currency: str
created_at: datetime
updated_at: datetime
model_config = ConfigDict(from_attributes=True)
class DepositRequest(BaseModel):
amount: Decimal = Field(..., gt=0, le=10000)
class WithdrawalRequest(BaseModel):
amount: Decimal = Field(..., gt=0)
class TransactionResponse(BaseModel):
id: int
user_id: int
type: TransactionType
amount: Decimal
balance_after: Decimal
reference_id: int | None
description: str
status: TransactionStatus
created_at: datetime
model_config = ConfigDict(from_attributes=True)