From eed9265be711432f40247f149c07f9e33511192a Mon Sep 17 00:00:00 2001 From: Kostya Date: Sun, 16 Aug 2026 18:50:15 +0000 Subject: Split DTOs into api/model, extract order matching into service/matching Moves Event/Ledger DTOs out of the flat api package into api/model/{event,ledger}, and moves LocalCatalogContext and order matching logic into dedicated service/catalog and service/matching packages, replacing TradingOperation/TradingOperationImpl. --- .../market/guess/service/LocalCatalogContext.java | 45 -------------- .../guess/service/LocalGuessMarketContext.java | 68 +++++++++++----------- .../market/guess/service/TradingOperation.java | 13 ----- .../market/guess/service/TradingOperationImpl.java | 22 ------- .../guess/service/catalog/LocalCatalogContext.java | 64 ++++++++++++++++++++ .../java/market/guess/service/domain/Event.java | 22 ++++--- .../market/guess/service/domain/MarketAction.java | 6 +- .../service/infrastructure/MarketContext.java | 18 +++--- .../infrastructure/mapper/v1/EventMapperV1.java | 2 +- .../infrastructure/mapper/v2/EventMapperV2.java | 2 +- .../infrastructure/provider/LoadValidator.java | 22 ------- .../service/infrastructure/provider/Loader.java | 3 +- .../infrastructure/provider/v1/XMLLoaderV1.java | 14 ++--- .../market/guess/service/ledger/LedgerContext.java | 2 +- .../market/guess/service/ledger/LedgerEntry.java | 2 +- .../service/matching/OrderMatchingContext.java | 13 +++++ .../mechanism/OrderBookTradingMechanism.java | 10 ++-- .../guess/service/mechanism/TradeExecution.java | 5 -- .../guess/service/mechanism/TradingMechanism.java | 3 +- 19 files changed, 158 insertions(+), 178 deletions(-) delete mode 100644 service/src/main/java/market/guess/service/LocalCatalogContext.java delete mode 100644 service/src/main/java/market/guess/service/TradingOperation.java delete mode 100644 service/src/main/java/market/guess/service/TradingOperationImpl.java create mode 100644 service/src/main/java/market/guess/service/catalog/LocalCatalogContext.java delete mode 100644 service/src/main/java/market/guess/service/infrastructure/provider/LoadValidator.java create mode 100644 service/src/main/java/market/guess/service/matching/OrderMatchingContext.java delete mode 100644 service/src/main/java/market/guess/service/mechanism/TradeExecution.java (limited to 'service/src/main/java/market') diff --git a/service/src/main/java/market/guess/service/LocalCatalogContext.java b/service/src/main/java/market/guess/service/LocalCatalogContext.java deleted file mode 100644 index 15a5890..0000000 --- a/service/src/main/java/market/guess/service/LocalCatalogContext.java +++ /dev/null @@ -1,45 +0,0 @@ -package market.guess.service; - -import java.nio.file.Path; -import java.util.List; -import market.guess.api.CatalogContext; -import market.guess.api.EventDetailDTO; -import market.guess.api.EventSummaryDTO; -import market.guess.api.LoadResultDTO; -import market.guess.api.Result; -import market.guess.service.domain.Event; -import market.guess.service.infrastructure.MarketContext; -import market.guess.service.infrastructure.provider.Loader; - -public final class LocalCatalogContext implements CatalogContext { - - private final MarketContext context; - private final Loader provider; - - public LocalCatalogContext(Loader provider, MarketContext context) { - super(); - this.provider = provider; - this.context = context; - } - - @Override - public Result loadEvents(Path path) { - return Result.ok(provider.load(path)); - } - - @Override - public Result> getAllEvents() { - return Result.ok(context.getEvents().getAll().stream().map(Event::toEventSummary).toList()); - } - - @Override - public Result getEvent(String eventKey) { - var optional = context.getEvents().get(eventKey); - - if (optional.isEmpty()) return Result.error("Unable to find event."); - var event = optional.get(); - - return Result.ok( - new EventDetailDTO(event.toEventSummary(), event.toMarketState(), event.getHistory(), "")); - } -} diff --git a/service/src/main/java/market/guess/service/LocalGuessMarketContext.java b/service/src/main/java/market/guess/service/LocalGuessMarketContext.java index 8f97432..3feef6a 100644 --- a/service/src/main/java/market/guess/service/LocalGuessMarketContext.java +++ b/service/src/main/java/market/guess/service/LocalGuessMarketContext.java @@ -1,25 +1,21 @@ package market.guess.service; -import java.nio.file.Path; -import java.util.List; -import market.guess.api.AccountDTO; -import market.guess.api.EventDetailDTO; import market.guess.api.GuessMarketContext; -import market.guess.api.LoadResultDTO; -import market.guess.api.ProblemDTO; import market.guess.api.PurchaseReceiptDTO; import market.guess.api.Result; +import market.guess.api.TradeRowDTO; +import market.guess.model.event.EventDetailDTO; import market.guess.service.infrastructure.MarketContext; +import market.guess.service.matching.OrderMatchingContext; public final class LocalGuessMarketContext implements GuessMarketContext { - - private final TradingOperation tradingOperation; + private final OrderMatchingContext orderMatching; private final MarketContext context; - public LocalGuessMarketContext(MarketContext context, TradingOperation tradingOperation) { + public LocalGuessMarketContext(MarketContext context, OrderMatchingContext orderMatching) { super(); this.context = context; - this.tradingOperation = tradingOperation; + this.orderMatching = orderMatching; } @Override @@ -28,42 +24,46 @@ public final class LocalGuessMarketContext implements GuessMarketContext { var optional = context.getEvents().get(eventKey); var userOptional = context.getUsers().get(userName); - if (optional.isEmpty() || userOptional.isEmpty()) Result.error("Unable to find user/event."); + if (optional.isEmpty() || userOptional.isEmpty()) + return Result.error("Unable to find user/event."); var event = optional.get(); var user = userOptional.get(); var option = event.getOption(optionKey); - var trade = tradingOperation.buy(event, user, option, quantity); - return Result.ok(new PurchaseReceiptDTO()); + + var trades = orderMatching.submitOrder(user, event, option, quantity); + return Result.ok( + new PurchaseReceiptDTO( + trades.stream() + .map( + t -> + new TradeRowDTO( + t.at().toString(), + t.userName(), + t.optionName(), + String.valueOf(t.quantity()), + t.totalPaid().toPlainString())) + .toList(), + event.toMarketState())); } @Override - public Result closeEvent( + public Result settleEvent( String userName, String eventKey, String winningOptionKey) { - throw new UnsupportedOperationException("Unimplemented method 'account'"); - } + var optional = context.getEvents().get(eventKey); - @Override - public Result account(String userName) { - throw new UnsupportedOperationException("Unimplemented method 'account'"); - } + if (optional.isEmpty()) return Result.error("Unknown event."); - @Override - public Result saveState(Path path) { - context.save(); - return Result.ok(); - } + var event = optional.get(); + if (event.canSettle(userName)) { - @Override - public Result restoreState(Path path) { + var payout = event.getPayout(); - try { - context.load(); - } catch (Exception e) { - return Result.error( - "Failed to load.", - LoadResultDTO.failure(path.toString(), List.of(new ProblemDTO("", e.getMessage(), "")))); + return Result.ok( + new EventDetailDTO( + event.toEventSummary(), event.toMarketState(), event.getHistory(), "")); } - return Result.ok(LoadResultDTO.success(path.toString(), context.getEvents().getAll().size())); + + return Result.error("Couldn't settle event."); } } diff --git a/service/src/main/java/market/guess/service/TradingOperation.java b/service/src/main/java/market/guess/service/TradingOperation.java deleted file mode 100644 index 63572c0..0000000 --- a/service/src/main/java/market/guess/service/TradingOperation.java +++ /dev/null @@ -1,13 +0,0 @@ -package market.guess.service; - -import market.guess.service.domain.Event; -import market.guess.service.domain.Market; -import market.guess.service.domain.Settlement; -import market.guess.service.domain.Trade; -import market.guess.service.domain.User; - -public interface TradingOperation { - Trade buy(Event event, User user, Market Option, int quantity); - - Settlement settle(Event event, String winningOption); -} diff --git a/service/src/main/java/market/guess/service/TradingOperationImpl.java b/service/src/main/java/market/guess/service/TradingOperationImpl.java deleted file mode 100644 index 641a3a9..0000000 --- a/service/src/main/java/market/guess/service/TradingOperationImpl.java +++ /dev/null @@ -1,22 +0,0 @@ -package market.guess.service; - -import market.guess.service.domain.Event; -import market.guess.service.domain.Market; -import market.guess.service.domain.Settlement; -import market.guess.service.domain.Trade; -import market.guess.service.domain.User; - -public final class TradingOperationImpl implements TradingOperation { - - @Override - public Trade buy(Event event, User user, Market Option, int quantity) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'buy'"); - } - - @Override - public Settlement settle(Event event, String winningOption) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'settle'"); - } -} diff --git a/service/src/main/java/market/guess/service/catalog/LocalCatalogContext.java b/service/src/main/java/market/guess/service/catalog/LocalCatalogContext.java new file mode 100644 index 0000000..6035ce7 --- /dev/null +++ b/service/src/main/java/market/guess/service/catalog/LocalCatalogContext.java @@ -0,0 +1,64 @@ +package market.guess.service.catalog; + +import java.nio.file.Path; +import java.util.List; +import market.guess.api.CatalogContext; +import market.guess.api.LoadResultDTO; +import market.guess.api.Result; +import market.guess.model.event.EventDetailDTO; +import market.guess.model.event.EventSummaryDTO; +import market.guess.service.domain.Event; +import market.guess.service.infrastructure.MarketContext; +import market.guess.service.infrastructure.provider.Loader; + +public final class LocalCatalogContext implements CatalogContext { + private final MarketContext context; + private final Loader provider; + + public LocalCatalogContext(Loader provider, MarketContext context) { + super(); + this.provider = provider; + this.context = context; + } + + @Override + public Result loadEvents(Path path) { + return provider.load(path); + } + + @Override + public Result> getAllEvents() { + return Result.ok(context.getEvents().getAll().stream().map(Event::toEventSummary).toList()); + } + + @Override + public Result getEvent(String eventKey) { + var optional = context.getEvents().get(eventKey); + + if (optional.isEmpty()) return Result.error("Unable to find event."); + var event = optional.get(); + + return Result.ok( + new EventDetailDTO(event.toEventSummary(), event.toMarketState(), event.getHistory(), "")); + } + + @Override + public Result saveState(Path path) { + try { + context.save(); + } catch (Exception e) { + return Result.error("Failed to save.", e.getMessage()); + } + return Result.ok(); + } + + @Override + public Result restoreState(Path path) { + try { + context.load(); + } catch (Exception e) { + return Result.error("Failed to load.", e.getMessage()); + } + return Result.ok(new LoadResultDTO(path.toString(), context.getEvents().getAll().size())); + } +} diff --git a/service/src/main/java/market/guess/service/domain/Event.java b/service/src/main/java/market/guess/service/domain/Event.java index 5c98908..943328a 100644 --- a/service/src/main/java/market/guess/service/domain/Event.java +++ b/service/src/main/java/market/guess/service/domain/Event.java @@ -5,10 +5,10 @@ import java.time.Instant; import java.util.ArrayList; import java.util.List; import market.guess.api.CommissionTiming; -import market.guess.api.EventStatus; -import market.guess.api.EventSummaryDTO; import market.guess.api.MarketStateDTO; import market.guess.api.TradeRowDTO; +import market.guess.model.event.EventStatus; +import market.guess.model.event.EventSummaryDTO; import market.guess.service.ledger.Ledger; import market.guess.service.mechanism.TradingMechanism; @@ -78,16 +78,12 @@ public final class Event { return commissionTiming; } - public TradingMechanism getMechanism() { - return mechanism; - } - public List getMarkets() { return markets; } public List getOptionsNames() { - return markets.stream().map(Market::getKey).toList(); + return markets.stream().map(Market::getName).toList(); } public Ledger getLedger() { @@ -190,4 +186,16 @@ public final class Event { .findFirst() .orElseThrow(() -> new IllegalArgumentException("No such option.")); } + + public boolean canSettle(String userName) { + if (state != EventStatus.ACTIVE) return false; + if (marketMaker.equalsIgnoreCase(userName)) return true; + + return false; + } + + public BigDecimal getPayout() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getPayout'"); + } } diff --git a/service/src/main/java/market/guess/service/domain/MarketAction.java b/service/src/main/java/market/guess/service/domain/MarketAction.java index c0aabd1..d1a0ad5 100644 --- a/service/src/main/java/market/guess/service/domain/MarketAction.java +++ b/service/src/main/java/market/guess/service/domain/MarketAction.java @@ -5,7 +5,7 @@ public record MarketAction( public static final String BUY = "BUY"; public static final String SELL = "SELL"; - public static final String CLOSE = "CLOSE"; + public static final String SETTLE = "SETTLE"; public static MarketAction buy( String at, String userName, String eventKey, String optionKey, long quantity) { @@ -17,8 +17,8 @@ public record MarketAction( return new MarketAction(SELL, at, userName, eventKey, optionKey, quantity); } - public static MarketAction close( + public static MarketAction settle( String at, String userName, String eventKey, String winningOptionKey) { - return new MarketAction(CLOSE, at, userName, eventKey, winningOptionKey, 0); + return new MarketAction(SETTLE, at, userName, eventKey, winningOptionKey, 0); } } diff --git a/service/src/main/java/market/guess/service/infrastructure/MarketContext.java b/service/src/main/java/market/guess/service/infrastructure/MarketContext.java index d9fe3f8..7113803 100644 --- a/service/src/main/java/market/guess/service/infrastructure/MarketContext.java +++ b/service/src/main/java/market/guess/service/infrastructure/MarketContext.java @@ -10,6 +10,7 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.time.Instant; import java.util.List; +import market.guess.exception.GuessMarketException; import market.guess.service.domain.Event; import market.guess.service.domain.User; import market.guess.service.infrastructure.adapter.InstantTypeAdapter; @@ -41,21 +42,19 @@ public final class MarketContext { return users; } - public void save() { + public void save() throws GuessMarketException { var path = Paths.get("test-file.json"); try { if (path.getParent() != null) Files.createDirectories(path.getParent()); Files.writeString( - path, - GSON.toJson(new Wrapper(events.getAll(), users.getAll())), - StandardCharsets.UTF_8); + path, GSON.toJson(new Wrapper(events.getAll(), users.getAll())), StandardCharsets.UTF_8); } catch (IOException e) { - + throw new GuessMarketException("Failed to sove the file."); } } - public void load() { + public void load() throws GuessMarketException { try { var wrapper = GSON.fromJson( @@ -71,9 +70,10 @@ public final class MarketContext { users.add(user); } - } catch (JsonSyntaxException | IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); + } catch (JsonSyntaxException e) { + throw new GuessMarketException("The JSON file is malformed."); + } catch (IOException e) { + throw new GuessMarketException("Unable the file."); } } } diff --git a/service/src/main/java/market/guess/service/infrastructure/mapper/v1/EventMapperV1.java b/service/src/main/java/market/guess/service/infrastructure/mapper/v1/EventMapperV1.java index 7984c41..f049a0b 100644 --- a/service/src/main/java/market/guess/service/infrastructure/mapper/v1/EventMapperV1.java +++ b/service/src/main/java/market/guess/service/infrastructure/mapper/v1/EventMapperV1.java @@ -3,7 +3,7 @@ package market.guess.service.infrastructure.mapper.v1; import java.util.ArrayList; import java.util.List; import market.guess.api.CommissionTiming; -import market.guess.api.EventStatus; +import market.guess.model.event.EventStatus; import market.guess.service.domain.Event; import market.guess.service.domain.Market; import market.guess.service.infrastructure.mapper.Mapper; diff --git a/service/src/main/java/market/guess/service/infrastructure/mapper/v2/EventMapperV2.java b/service/src/main/java/market/guess/service/infrastructure/mapper/v2/EventMapperV2.java index 0dd8e43..7037c02 100644 --- a/service/src/main/java/market/guess/service/infrastructure/mapper/v2/EventMapperV2.java +++ b/service/src/main/java/market/guess/service/infrastructure/mapper/v2/EventMapperV2.java @@ -3,7 +3,7 @@ package market.guess.service.infrastructure.mapper.v2; import java.util.ArrayList; import java.util.List; import market.guess.api.CommissionTiming; -import market.guess.api.EventStatus; +import market.guess.model.event.EventStatus; import market.guess.service.domain.Event; import market.guess.service.domain.Market; import market.guess.service.infrastructure.mapper.Mapper; diff --git a/service/src/main/java/market/guess/service/infrastructure/provider/LoadValidator.java b/service/src/main/java/market/guess/service/infrastructure/provider/LoadValidator.java deleted file mode 100644 index c1c3895..0000000 --- a/service/src/main/java/market/guess/service/infrastructure/provider/LoadValidator.java +++ /dev/null @@ -1,22 +0,0 @@ -package market.guess.service.infrastructure.provider; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import market.guess.api.ProblemDTO; - -public final class LoadValidator { - private final List problems = new ArrayList<>(); - - public void append(String code, String humanizedMessage, String location) { - problems.add(new ProblemDTO(code, humanizedMessage, location)); - } - - public boolean isValid() { - return problems.isEmpty(); - } - - public List getIssues() { - return Collections.unmodifiableList(problems); - } -} diff --git a/service/src/main/java/market/guess/service/infrastructure/provider/Loader.java b/service/src/main/java/market/guess/service/infrastructure/provider/Loader.java index 7588855..fcca92f 100644 --- a/service/src/main/java/market/guess/service/infrastructure/provider/Loader.java +++ b/service/src/main/java/market/guess/service/infrastructure/provider/Loader.java @@ -2,7 +2,8 @@ package market.guess.service.infrastructure.provider; import java.nio.file.Path; import market.guess.api.LoadResultDTO; +import market.guess.api.Result; public interface Loader { - LoadResultDTO load(Path path); + Result load(Path path); } diff --git a/service/src/main/java/market/guess/service/infrastructure/provider/v1/XMLLoaderV1.java b/service/src/main/java/market/guess/service/infrastructure/provider/v1/XMLLoaderV1.java index 0d5bb9d..412a5d2 100644 --- a/service/src/main/java/market/guess/service/infrastructure/provider/v1/XMLLoaderV1.java +++ b/service/src/main/java/market/guess/service/infrastructure/provider/v1/XMLLoaderV1.java @@ -5,9 +5,9 @@ import jakarta.xml.bind.JAXBException; import java.nio.file.Files; import java.nio.file.Path; import market.guess.api.LoadResultDTO; +import market.guess.api.Result; import market.guess.service.domain.User; import market.guess.service.infrastructure.mapper.v1.EventMapperV1; -import market.guess.service.infrastructure.provider.LoadValidator; import market.guess.service.infrastructure.provider.Loader; import market.guess.service.infrastructure.repository.EventRepository; import market.guess.service.infrastructure.repository.UserRepository; @@ -34,11 +34,11 @@ public final class XMLLoaderV1 implements Loader { } @Override - public LoadResultDTO load(Path path) { - var validator = new LoadValidator(); + public Result load(Path path) { + if (path.getFileName() == null || !path.getFileName().toString().toLowerCase().endsWith(".xml")) { - validator.append("NOT_XML", "The file must be an XML.", path.toString()); + return Result.error("NOT_XML", "The file must be an XML."); } try (var stream = Files.newInputStream(path)) { @@ -51,11 +51,9 @@ public final class XMLLoaderV1 implements Loader { userRepository.add(new User("Tester", 9_999_999)); - return LoadResultDTO.success(path.toString(), eventRepository.getAll().size()); + return Result.ok(new LoadResultDTO(path.toString(), eventRepository.getAll().size())); } catch (Exception e) { - validator.append("UNREADABLE", "The file could not be read.", path.toString()); + return Result.error("UNREADABLE", "The file could not be read."); } - - return LoadResultDTO.failure(path.toString(), validator.getIssues()); } } diff --git a/service/src/main/java/market/guess/service/ledger/LedgerContext.java b/service/src/main/java/market/guess/service/ledger/LedgerContext.java index caecf55..12ec614 100644 --- a/service/src/main/java/market/guess/service/ledger/LedgerContext.java +++ b/service/src/main/java/market/guess/service/ledger/LedgerContext.java @@ -2,7 +2,7 @@ package market.guess.service.ledger; import java.math.BigDecimal; import java.time.Clock; -import market.guess.api.LedgerType; +import market.guess.model.ledger.LedgerType; import market.guess.service.infrastructure.repository.UserRepository; public final class LedgerContext { diff --git a/service/src/main/java/market/guess/service/ledger/LedgerEntry.java b/service/src/main/java/market/guess/service/ledger/LedgerEntry.java index 8008f20..79f12bf 100644 --- a/service/src/main/java/market/guess/service/ledger/LedgerEntry.java +++ b/service/src/main/java/market/guess/service/ledger/LedgerEntry.java @@ -2,7 +2,7 @@ package market.guess.service.ledger; import java.math.BigDecimal; import java.time.Instant; -import market.guess.api.LedgerType; +import market.guess.model.ledger.LedgerType; public final record LedgerEntry( int id, diff --git a/service/src/main/java/market/guess/service/matching/OrderMatchingContext.java b/service/src/main/java/market/guess/service/matching/OrderMatchingContext.java new file mode 100644 index 0000000..8882432 --- /dev/null +++ b/service/src/main/java/market/guess/service/matching/OrderMatchingContext.java @@ -0,0 +1,13 @@ +package market.guess.service.matching; + +import java.util.List; +import market.guess.service.domain.Event; +import market.guess.service.domain.Market; +import market.guess.service.domain.Trade; +import market.guess.service.domain.User; + +public interface OrderMatchingContext { + List submitOrder(User user, Event event, Market market, int quantity); + + boolean cancelOrder(); +} diff --git a/service/src/main/java/market/guess/service/mechanism/OrderBookTradingMechanism.java b/service/src/main/java/market/guess/service/mechanism/OrderBookTradingMechanism.java index 91d5110..43f4843 100644 --- a/service/src/main/java/market/guess/service/mechanism/OrderBookTradingMechanism.java +++ b/service/src/main/java/market/guess/service/mechanism/OrderBookTradingMechanism.java @@ -6,6 +6,7 @@ import java.util.ArrayList; import java.util.List; import market.guess.api.MechanismType; import market.guess.service.domain.BigDecimalOptions; +import market.guess.service.domain.Trade; public final class OrderBookTradingMechanism implements TradingMechanism { public enum Side { @@ -58,12 +59,12 @@ public final class OrderBookTradingMechanism implements TradingMechanism { } @Override - public TradeExecution buy(int optionIndex, int quantity) { + public Trade buy(int optionIndex, int quantity) { return match(optionIndex, Side.BUY, quantity, null, false); } /** Priced limit order — not on the shared interface, no engine call site yet. */ - public TradeExecution placeOrder(int optionIndex, Side side, int quantity, BigDecimal price) { + public Trade placeOrder(int optionIndex, Side side, int quantity, BigDecimal price) { if (price.signum() < 0 || price.compareTo(BigDecimal.valueOf(d)) > 0) { throw new IllegalArgumentException("Price must be between 0 and " + d); } @@ -97,7 +98,7 @@ public final class OrderBookTradingMechanism implements TradingMechanism { return book.isEmpty() ? null : book.get(0).price; } - private TradeExecution match( + private Trade match( int optionIndex, Side side, int quantity, BigDecimal limitPrice, boolean restRemainder) { var opposing = side == Side.BUY ? asks.get(optionIndex) : bids.get(optionIndex); @@ -127,7 +128,8 @@ public final class OrderBookTradingMechanism implements TradingMechanism { new RestingOrder(limitPrice, quantity - filled)); } - return new TradeExecution(filled, BigDecimalOptions.toMoney(proceeds)); + return new Trade( + filled, null, null, null, null, filled, BigDecimalOptions.toMoney(proceeds), proceeds); } private static boolean crosses(Side side, BigDecimal restingPrice, BigDecimal limitPrice) { diff --git a/service/src/main/java/market/guess/service/mechanism/TradeExecution.java b/service/src/main/java/market/guess/service/mechanism/TradeExecution.java deleted file mode 100644 index 3d8df1d..0000000 --- a/service/src/main/java/market/guess/service/mechanism/TradeExecution.java +++ /dev/null @@ -1,5 +0,0 @@ -package market.guess.service.mechanism; - -import java.math.BigDecimal; - -public record TradeExecution(int filledQuantity, BigDecimal cost) {} diff --git a/service/src/main/java/market/guess/service/mechanism/TradingMechanism.java b/service/src/main/java/market/guess/service/mechanism/TradingMechanism.java index fc915fb..204a170 100644 --- a/service/src/main/java/market/guess/service/mechanism/TradingMechanism.java +++ b/service/src/main/java/market/guess/service/mechanism/TradingMechanism.java @@ -2,6 +2,7 @@ package market.guess.service.mechanism; import java.math.BigDecimal; import market.guess.api.MechanismType; +import market.guess.service.domain.Trade; public sealed interface TradingMechanism permits LmsrTradingMechanism, OrderBookTradingMechanism { @@ -9,7 +10,7 @@ public sealed interface TradingMechanism permits LmsrTradingMechanism, OrderBook BigDecimal openingCost(); - TradeExecution buy(int optionIndex, int quantity); + Trade buy(int optionIndex, int quantity); BigDecimal[] prices(); } -- cgit v1.2.3