refactors
This commit is contained in:
parent
4e1a339432
commit
82c4d0168e
28 changed files with 1042 additions and 782 deletions
87
backend/schemas/exchange.py
Normal file
87
backend/schemas/exchange.py
Normal file
|
|
@ -0,0 +1,87 @@
|
|||
from datetime import date, datetime
|
||||
|
||||
from pydantic import BaseModel
|
||||
|
||||
from .pagination import PaginatedResponse
|
||||
|
||||
|
||||
class ExchangeRequest(BaseModel):
|
||||
"""Request to create an exchange trade."""
|
||||
|
||||
slot_start: datetime
|
||||
direction: str # "buy" or "sell"
|
||||
bitcoin_transfer_method: str # "onchain" or "lightning"
|
||||
eur_amount: int # EUR cents (e.g., 10000 = €100)
|
||||
|
||||
|
||||
class ExchangeUserContact(BaseModel):
|
||||
"""User contact info for admin view."""
|
||||
|
||||
email: str
|
||||
contact_email: str | None
|
||||
telegram: str | None
|
||||
signal: str | None
|
||||
nostr_npub: str | None
|
||||
|
||||
|
||||
class ExchangeResponse(BaseModel):
|
||||
"""Response model for an exchange trade."""
|
||||
|
||||
id: int # Keep for backward compatibility, but prefer public_id
|
||||
public_id: str # UUID as string
|
||||
user_id: int
|
||||
user_email: str
|
||||
slot_start: datetime
|
||||
slot_end: datetime
|
||||
direction: str
|
||||
bitcoin_transfer_method: str
|
||||
eur_amount: int # EUR cents
|
||||
sats_amount: int # Satoshis
|
||||
market_price_eur: float
|
||||
agreed_price_eur: float
|
||||
premium_percentage: int
|
||||
status: str
|
||||
created_at: datetime
|
||||
cancelled_at: datetime | None
|
||||
completed_at: datetime | None
|
||||
|
||||
|
||||
class AdminExchangeResponse(BaseModel):
|
||||
"""Response model for admin exchange view (includes user contact)."""
|
||||
|
||||
id: int # Keep for backward compatibility, but prefer public_id
|
||||
public_id: str # UUID as string
|
||||
user_id: int
|
||||
user_email: str
|
||||
user_contact: ExchangeUserContact
|
||||
slot_start: datetime
|
||||
slot_end: datetime
|
||||
direction: str
|
||||
bitcoin_transfer_method: str
|
||||
eur_amount: int
|
||||
sats_amount: int
|
||||
market_price_eur: float
|
||||
agreed_price_eur: float
|
||||
premium_percentage: int
|
||||
status: str
|
||||
created_at: datetime
|
||||
cancelled_at: datetime | None
|
||||
completed_at: datetime | None
|
||||
|
||||
|
||||
PaginatedExchanges = PaginatedResponse[ExchangeResponse]
|
||||
PaginatedAdminExchanges = PaginatedResponse[AdminExchangeResponse]
|
||||
|
||||
|
||||
class BookableSlot(BaseModel):
|
||||
"""A single bookable time slot."""
|
||||
|
||||
start_time: datetime
|
||||
end_time: datetime
|
||||
|
||||
|
||||
class AvailableSlotsResponse(BaseModel):
|
||||
"""Response containing available slots for a date."""
|
||||
|
||||
date: date
|
||||
slots: list[BookableSlot]
|
||||
Loading…
Add table
Add a link
Reference in a new issue