from typing import Optional from fastapi import FastAPI from pydantic import BaseModel, Field, condecimal, conint, constr, root_validator from app.types import Order, OrderSide, OrderType from datetime import datetime app = FastAPI() class CreateOrderModel(BaseModel): type_: OrderType = Field(..., alias="type") side: OrderSide instrument: constr(min_length=12, max_length=12) limit_price: Optional[condecimal(decimal_places=2)] quantity: conint(gt=0) @root_validator def validator(cls, values: dict): if values.get("type_") == "market" and values.get("limit_price"): raise ValueError( "Providing a `limit_price` is prohibited for type `market`" ) if values.get("type_") == "limit" and not values.get("limit_price"): raise ValueError("Attribute `limit_price` is required for type `limit`") return values class CreateOrderResponseModel(Order): pass @app.post( "/orders", status_code=201, response_model=CreateOrderResponseModel, response_model_by_alias=True, ) async def create_order(model: CreateOrderModel): return CreateOrderResponseModel( id=1, created_at=datetime.now(), type=model.type_, side=model.side, instrument=model.instrument, limit_price=model.limit_price, quantity=model.quantity )