feat(backend): Implement AVE Cloud integration for Data and Trading APIs
- Add tier field to User model for plan detection (free/normal/pro)
- Create AVE Cloud API client with all Data API endpoints:
- Token search (GET /v2/tokens)
- Batch prices (POST /v2/tokens/price)
- Token details (GET /v2/tokens/{id})
- Kline data (GET /v2/klines/token/{id})
- Trending tokens (GET /v2/tokens/trending)
- Token risk (GET /v2/contracts/{id})
- Add Trading API endpoints:
- Chain wallet quote (POST /v1/chain/quote)
- Chain wallet swap (POST /v1/chain/swap)
- Add tier gating with upsell messaging for Pro features
- Handle rate limiting gracefully with 429 responses
- Add Pydantic schemas for AVE API requests/responses
Fixes #11
This commit is contained in:
@@ -25,6 +25,7 @@ class User(Base):
|
||||
id = Column(String, primary_key=True, default=generate_uuid)
|
||||
email = Column(String, unique=True, nullable=False)
|
||||
password_hash = Column(String, nullable=False)
|
||||
tier = Column(String, default="free")
|
||||
created_at = Column(DateTime, default=datetime.utcnow)
|
||||
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
|
||||
|
||||
|
||||
@@ -144,3 +144,72 @@ class SignalResponse(BaseModel):
|
||||
|
||||
class Config:
|
||||
from_attributes = True
|
||||
|
||||
|
||||
class AveTokenSearchResponse(BaseModel):
|
||||
tokens: List[dict]
|
||||
upsell_message: Optional[str] = None
|
||||
|
||||
|
||||
class AveBatchPricesRequest(BaseModel):
|
||||
token_ids: List[str]
|
||||
|
||||
|
||||
class AveBatchPricesResponse(BaseModel):
|
||||
prices: Dict[str, dict]
|
||||
upsell_message: Optional[str] = None
|
||||
|
||||
|
||||
class AveTokenDetailsResponse(BaseModel):
|
||||
token: Optional[dict] = None
|
||||
upsell_message: Optional[str] = None
|
||||
|
||||
|
||||
class AveKlinesRequest(BaseModel):
|
||||
token_id: str
|
||||
interval: str = "1h"
|
||||
limit: int = 100
|
||||
start_time: Optional[int] = None
|
||||
end_time: Optional[int] = None
|
||||
|
||||
|
||||
class AveKlinesResponse(BaseModel):
|
||||
klines: List[dict]
|
||||
upsell_message: Optional[str] = None
|
||||
|
||||
|
||||
class AveTrendingTokensResponse(BaseModel):
|
||||
tokens: List[dict]
|
||||
upsell_message: Optional[str] = None
|
||||
|
||||
|
||||
class AveTokenRiskResponse(BaseModel):
|
||||
risk: Optional[dict] = None
|
||||
upsell_message: Optional[str] = None
|
||||
|
||||
|
||||
class AveChainQuoteRequest(BaseModel):
|
||||
chain: str
|
||||
from_token: str
|
||||
to_token: str
|
||||
amount: str
|
||||
slippage: float = 0.5
|
||||
|
||||
|
||||
class AveChainQuoteResponse(BaseModel):
|
||||
quote: Optional[dict] = None
|
||||
upsell_message: Optional[str] = None
|
||||
|
||||
|
||||
class AveChainSwapRequest(BaseModel):
|
||||
chain: str
|
||||
from_token: str
|
||||
to_token: str
|
||||
amount: str
|
||||
slippage: float = 0.5
|
||||
wallet_address: Optional[str] = None
|
||||
|
||||
|
||||
class AveChainSwapResponse(BaseModel):
|
||||
swap: Optional[dict] = None
|
||||
upsell_message: Optional[str] = None
|
||||
|
||||
Reference in New Issue
Block a user