Init.
This commit is contained in:
47
backend/app/schemas/__init__.py
Normal file
47
backend/app/schemas/__init__.py
Normal 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",
|
||||
]
|
||||
89
backend/app/schemas/bet.py
Normal file
89
backend/app/schemas/bet.py
Normal 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)
|
||||
67
backend/app/schemas/user.py
Normal file
67
backend/app/schemas/user.py
Normal 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
|
||||
38
backend/app/schemas/wallet.py
Normal file
38
backend/app/schemas/wallet.py
Normal 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)
|
||||
Reference in New Issue
Block a user