87 lines
2.1 KiB
Python
87 lines
2.1 KiB
Python
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]
|