From 5bc7c4ed9d052668af66d3116a6b7afbe62c6eec Mon Sep 17 00:00:00 2001 From: Kostya Date: Sun, 6 Sep 2026 12:22:58 +0300 Subject: api: extend contexts and DTOs for order books and event creation The desktop UI needs to create events, trade on both sides of an order book, and show who is participating in an event, none of which the api module could express so far. Add AccountContext for looking up ledger accounts by owner, and give CatalogContext an openEvent operation plus createEvent, taking either a CreateEventRequest or its fields spelled out. createEvent defaults to a "Not implemented" error so existing implementations keep compiling until they support it. Let GuessMarketContext.placeOrder take an explicit side, keeping the old signature as a default method that places a BUY so current callers are unaffected. Add OrderBookDTO and BookOrderDTO to describe per-option books with best bid, best ask and spread, and ParticipantDTO for a user's position, fees and P&L in an event. Carry the order books and participants on EventDetailDTO and the market maker's name on EventSummaryDTO. --- .../main/java/market/guess/api/AccountContext.java | 10 ++++++++ .../main/java/market/guess/api/CatalogContext.java | 28 ++++++++++++++++++++++ .../java/market/guess/api/GuessMarketContext.java | 12 +++++++++- .../guess/model/event/CreateEventRequest.java | 16 +++++++++++++ .../market/guess/model/event/EventDetailDTO.java | 5 +++- .../market/guess/model/event/EventSummaryDTO.java | 3 ++- .../market/guess/model/event/ParticipantDTO.java | 10 ++++++++ .../market/guess/model/market/BookOrderDTO.java | 8 +++++++ .../market/guess/model/market/OrderBookDTO.java | 11 +++++++++ 9 files changed, 100 insertions(+), 3 deletions(-) create mode 100644 api/src/main/java/market/guess/api/AccountContext.java create mode 100644 api/src/main/java/market/guess/model/event/CreateEventRequest.java create mode 100644 api/src/main/java/market/guess/model/event/ParticipantDTO.java create mode 100644 api/src/main/java/market/guess/model/market/BookOrderDTO.java create mode 100644 api/src/main/java/market/guess/model/market/OrderBookDTO.java diff --git a/api/src/main/java/market/guess/api/AccountContext.java b/api/src/main/java/market/guess/api/AccountContext.java new file mode 100644 index 0000000..8d880aa --- /dev/null +++ b/api/src/main/java/market/guess/api/AccountContext.java @@ -0,0 +1,10 @@ +package market.guess.api; + +import java.util.List; +import market.guess.model.ledger.LedgerDTO; + +public interface AccountContext { + Result> getAllAccounts(); + + Result getAccount(String owner); +} diff --git a/api/src/main/java/market/guess/api/CatalogContext.java b/api/src/main/java/market/guess/api/CatalogContext.java index 413a81c..ca75409 100644 --- a/api/src/main/java/market/guess/api/CatalogContext.java +++ b/api/src/main/java/market/guess/api/CatalogContext.java @@ -2,8 +2,11 @@ package market.guess.api; import java.nio.file.Path; import java.util.List; +import market.guess.model.event.CommissionTiming; +import market.guess.model.event.CreateEventRequest; import market.guess.model.event.EventDetailDTO; import market.guess.model.event.EventSummaryDTO; +import market.guess.model.event.MechanismType; public interface CatalogContext { Result loadEvents(Path path); @@ -15,4 +18,29 @@ public interface CatalogContext { Result saveState(Path path); Result restoreState(Path path); + + default Result createEvent(CreateEventRequest request) { + if (request == null) { + return Result.error("Request cannot be null"); + } + return createEvent( + request.name(), + request.description(), + request.mechanism(), + request.commissionPercent(), + request.commissionTiming(), + request.mmUserName()); + } + + default Result createEvent( + String name, + String description, + MechanismType mechanism, + int commissionPercent, + CommissionTiming commissionTiming, + String mmUserName) { + return Result.error("Not implemented"); + } + + Result openEvent(String eventKey); } diff --git a/api/src/main/java/market/guess/api/GuessMarketContext.java b/api/src/main/java/market/guess/api/GuessMarketContext.java index 4edb437..0182ac3 100644 --- a/api/src/main/java/market/guess/api/GuessMarketContext.java +++ b/api/src/main/java/market/guess/api/GuessMarketContext.java @@ -5,8 +5,18 @@ import market.guess.model.event.EventDetailDTO; import market.guess.model.market.PurchaseReceiptDTO; public interface GuessMarketContext { + default Result placeOrder( + String userName, String eventKey, String optionKey, BigDecimal price, long quantity) { + return placeOrder(userName, eventKey, optionKey, "BUY", price, quantity); + } + Result placeOrder( - String userName, String eventKey, String optionKey, BigDecimal price, long quantity); + String userName, + String eventKey, + String optionKey, + String side, + BigDecimal price, + long quantity); Result settleEvent(String userName, String eventKey, String winningOptionKey); } diff --git a/api/src/main/java/market/guess/model/event/CreateEventRequest.java b/api/src/main/java/market/guess/model/event/CreateEventRequest.java new file mode 100644 index 0000000..bac4cad --- /dev/null +++ b/api/src/main/java/market/guess/model/event/CreateEventRequest.java @@ -0,0 +1,16 @@ +package market.guess.model.event; + +import java.math.BigDecimal; +import java.util.List; + +public record CreateEventRequest( + String name, + String description, + MechanismType mechanism, + int commissionPercent, + CommissionTiming commissionTiming, + String mmUserName, + Integer liquidityB, + BigDecimal baseValueD, + List options, + boolean allowMinting) {} diff --git a/api/src/main/java/market/guess/model/event/EventDetailDTO.java b/api/src/main/java/market/guess/model/event/EventDetailDTO.java index f5c4edf..1d2e415 100644 --- a/api/src/main/java/market/guess/model/event/EventDetailDTO.java +++ b/api/src/main/java/market/guess/model/event/EventDetailDTO.java @@ -2,10 +2,13 @@ package market.guess.model.event; import java.util.List; import market.guess.model.market.MarketStateDTO; +import market.guess.model.market.OrderBookDTO; import market.guess.model.market.TradeRowDTO; public record EventDetailDTO( EventSummaryDTO summary, MarketStateDTO state, List history, - String settledMarket) {} + String settledMarket, + List orderBooks, + List participants) {} diff --git a/api/src/main/java/market/guess/model/event/EventSummaryDTO.java b/api/src/main/java/market/guess/model/event/EventSummaryDTO.java index 42762c2..d62b7b3 100644 --- a/api/src/main/java/market/guess/model/event/EventSummaryDTO.java +++ b/api/src/main/java/market/guess/model/event/EventSummaryDTO.java @@ -12,4 +12,5 @@ public record EventSummaryDTO( MechanismType mechanism, EventStatus status, List optionNames, - String accountBalance) {} + String accountBalance, + String marketMaker) {} diff --git a/api/src/main/java/market/guess/model/event/ParticipantDTO.java b/api/src/main/java/market/guess/model/event/ParticipantDTO.java new file mode 100644 index 0000000..3b15c89 --- /dev/null +++ b/api/src/main/java/market/guess/model/event/ParticipantDTO.java @@ -0,0 +1,10 @@ +package market.guess.model.event; + +public record ParticipantDTO( + String user, + String tag, + int yes, + int no, + String value, + String fees, + String pnl) {} diff --git a/api/src/main/java/market/guess/model/market/BookOrderDTO.java b/api/src/main/java/market/guess/model/market/BookOrderDTO.java new file mode 100644 index 0000000..9656f44 --- /dev/null +++ b/api/src/main/java/market/guess/model/market/BookOrderDTO.java @@ -0,0 +1,8 @@ +package market.guess.model.market; + +public record BookOrderDTO( + String side, + String user, + long quantity, + String price, + boolean isBid) {} diff --git a/api/src/main/java/market/guess/model/market/OrderBookDTO.java b/api/src/main/java/market/guess/model/market/OrderBookDTO.java new file mode 100644 index 0000000..be0355e --- /dev/null +++ b/api/src/main/java/market/guess/model/market/OrderBookDTO.java @@ -0,0 +1,11 @@ +package market.guess.model.market; + +import java.util.List; + +public record OrderBookDTO( + String optionKey, + String optionName, + String bestBid, + String bestAsk, + String spread, + List orders) {} -- cgit v1.2.3