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. --- api/src/main/java/market/guess/api/AccountDTO.java | 1 + .../main/java/market/guess/api/CatalogContext.java | 6 ++++++ .../main/java/market/guess/api/EventDetailDTO.java | 9 --------- .../main/java/market/guess/api/EventStatus.java | 7 ------- .../java/market/guess/api/EventSummaryDTO.java | 15 --------------- .../java/market/guess/api/GuessMarketContext.java | 10 ++-------- .../main/java/market/guess/api/LedgerEntryDTO.java | 4 ---- api/src/main/java/market/guess/api/LedgerType.java | 10 ---------- .../main/java/market/guess/api/LoadResultDTO.java | 14 +------------- .../java/market/guess/api/PurchaseReceiptDTO.java | 11 +++-------- api/src/main/java/market/guess/api/Result.java | 22 ++++++++++++++++------ .../market/guess/model/event/EventDetailDTO.java | 11 +++++++++++ .../java/market/guess/model/event/EventStatus.java | 7 +++++++ .../market/guess/model/event/EventSummaryDTO.java | 17 +++++++++++++++++ .../market/guess/model/ledger/LedgerEntryDTO.java | 4 ++++ .../java/market/guess/model/ledger/LedgerType.java | 10 ++++++++++ 16 files changed, 78 insertions(+), 80 deletions(-) delete mode 100644 api/src/main/java/market/guess/api/EventDetailDTO.java delete mode 100644 api/src/main/java/market/guess/api/EventStatus.java delete mode 100644 api/src/main/java/market/guess/api/EventSummaryDTO.java delete mode 100644 api/src/main/java/market/guess/api/LedgerEntryDTO.java delete mode 100644 api/src/main/java/market/guess/api/LedgerType.java create mode 100644 api/src/main/java/market/guess/model/event/EventDetailDTO.java create mode 100644 api/src/main/java/market/guess/model/event/EventStatus.java create mode 100644 api/src/main/java/market/guess/model/event/EventSummaryDTO.java create mode 100644 api/src/main/java/market/guess/model/ledger/LedgerEntryDTO.java create mode 100644 api/src/main/java/market/guess/model/ledger/LedgerType.java (limited to 'api') diff --git a/api/src/main/java/market/guess/api/AccountDTO.java b/api/src/main/java/market/guess/api/AccountDTO.java index 8e7123e..134c88b 100644 --- a/api/src/main/java/market/guess/api/AccountDTO.java +++ b/api/src/main/java/market/guess/api/AccountDTO.java @@ -1,6 +1,7 @@ package market.guess.api; import java.util.List; +import market.guess.model.ledger.LedgerEntryDTO; public record AccountDTO( String owner, String balance, boolean blocked, List entries) {} diff --git a/api/src/main/java/market/guess/api/CatalogContext.java b/api/src/main/java/market/guess/api/CatalogContext.java index 7e80042..c980ba8 100644 --- a/api/src/main/java/market/guess/api/CatalogContext.java +++ b/api/src/main/java/market/guess/api/CatalogContext.java @@ -2,6 +2,8 @@ package market.guess.api; import java.nio.file.Path; import java.util.List; +import market.guess.model.event.EventDetailDTO; +import market.guess.model.event.EventSummaryDTO; public interface CatalogContext { Result loadEvents(Path path); @@ -9,4 +11,8 @@ public interface CatalogContext { Result> getAllEvents(); Result getEvent(String eventKey); + + Result saveState(Path path); + + Result restoreState(Path path); } diff --git a/api/src/main/java/market/guess/api/EventDetailDTO.java b/api/src/main/java/market/guess/api/EventDetailDTO.java deleted file mode 100644 index 893f153..0000000 --- a/api/src/main/java/market/guess/api/EventDetailDTO.java +++ /dev/null @@ -1,9 +0,0 @@ -package market.guess.api; - -import java.util.List; - -public record EventDetailDTO( - EventSummaryDTO summary, - MarketStateDTO state, - List history, - String winningOption) {} diff --git a/api/src/main/java/market/guess/api/EventStatus.java b/api/src/main/java/market/guess/api/EventStatus.java deleted file mode 100644 index 6580157..0000000 --- a/api/src/main/java/market/guess/api/EventStatus.java +++ /dev/null @@ -1,7 +0,0 @@ -package market.guess.api; - -public enum EventStatus { - DRAFT, - ACTIVE, - SETTLED -} diff --git a/api/src/main/java/market/guess/api/EventSummaryDTO.java b/api/src/main/java/market/guess/api/EventSummaryDTO.java deleted file mode 100644 index d185103..0000000 --- a/api/src/main/java/market/guess/api/EventSummaryDTO.java +++ /dev/null @@ -1,15 +0,0 @@ -package market.guess.api; - -import java.util.List; - -public record EventSummaryDTO( - String key, - int displayId, - String name, - String description, - int commissionPercent, - CommissionTiming commissionTiming, - MechanismType mechanism, - EventStatus status, - List optionNames, - String accountBalance) {} diff --git a/api/src/main/java/market/guess/api/GuessMarketContext.java b/api/src/main/java/market/guess/api/GuessMarketContext.java index 4eee37e..7ec7323 100644 --- a/api/src/main/java/market/guess/api/GuessMarketContext.java +++ b/api/src/main/java/market/guess/api/GuessMarketContext.java @@ -1,16 +1,10 @@ package market.guess.api; -import java.nio.file.Path; +import market.guess.model.event.EventDetailDTO; public interface GuessMarketContext { Result buyShares( String userName, String eventKey, String optionKey, int quantity); - Result closeEvent(String userName, String eventKey, String winningOptionKey); - - Result account(String userName); - - Result saveState(Path path); - - Result restoreState(Path path); + Result settleEvent(String userName, String eventKey, String winningOptionKey); } diff --git a/api/src/main/java/market/guess/api/LedgerEntryDTO.java b/api/src/main/java/market/guess/api/LedgerEntryDTO.java deleted file mode 100644 index b8f994c..0000000 --- a/api/src/main/java/market/guess/api/LedgerEntryDTO.java +++ /dev/null @@ -1,4 +0,0 @@ -package market.guess.api; - -public record LedgerEntryDTO( - long seq, String at, LedgerType type, String amount, String balanceAfter, String note) {} diff --git a/api/src/main/java/market/guess/api/LedgerType.java b/api/src/main/java/market/guess/api/LedgerType.java deleted file mode 100644 index 3402b84..0000000 --- a/api/src/main/java/market/guess/api/LedgerType.java +++ /dev/null @@ -1,10 +0,0 @@ -package market.guess.api; - -public enum LedgerType { - SUBSIDY, - PURCHASE, - COMMISSION, - PAYOUT, - REFUND, - DEPOSIT -} diff --git a/api/src/main/java/market/guess/api/LoadResultDTO.java b/api/src/main/java/market/guess/api/LoadResultDTO.java index 8cae3c0..95c23e7 100644 --- a/api/src/main/java/market/guess/api/LoadResultDTO.java +++ b/api/src/main/java/market/guess/api/LoadResultDTO.java @@ -1,15 +1,3 @@ package market.guess.api; -import java.util.List; - -public record LoadResultDTO( - boolean success, String source, int eventsLoaded, List issues) { - - public static LoadResultDTO success(String sourceLabel, int eventsLoaded) { - return new LoadResultDTO(true, sourceLabel, eventsLoaded, List.of()); - } - - public static LoadResultDTO failure(String sourceLabel, List problems) { - return new LoadResultDTO(false, sourceLabel, 0, List.copyOf(problems)); - } -} +public record LoadResultDTO(String source, int eventsLoaded) {} diff --git a/api/src/main/java/market/guess/api/PurchaseReceiptDTO.java b/api/src/main/java/market/guess/api/PurchaseReceiptDTO.java index bd5b2f7..e98a080 100644 --- a/api/src/main/java/market/guess/api/PurchaseReceiptDTO.java +++ b/api/src/main/java/market/guess/api/PurchaseReceiptDTO.java @@ -1,10 +1,5 @@ package market.guess.api; -public record PurchaseReceiptDTO( - String eventKey, - String optionName, - long quantity, - String sharesCost, - String commission, - String totalPaid, - MarketStateDTO stateAfter) {} +import java.util.List; + +public record PurchaseReceiptDTO(List trades, MarketStateDTO stateAfter) {} diff --git a/api/src/main/java/market/guess/api/Result.java b/api/src/main/java/market/guess/api/Result.java index 15ac5db..ff66761 100644 --- a/api/src/main/java/market/guess/api/Result.java +++ b/api/src/main/java/market/guess/api/Result.java @@ -5,30 +5,36 @@ import java.time.Instant; public final class Result { private final boolean success; private final String message; + private final String details; private final T data; private final Instant timeStamp; - private Result(boolean success, String message, T data) { + private Result(boolean success, String message, String details, T data) { this.success = success; this.message = message; this.data = data; + this.details = details; this.timeStamp = Instant.now(); } public static Result ok() { - return new Result(true, "Operation successful", null); + return new Result(true, "Operation successful", "", null); } public static Result ok(T data) { - return new Result<>(true, "Operation successful", data); + return new Result<>(true, "Operation successful", "", data); } - public static Result error(String message, T data) { - return new Result<>(false, message, data); + public static Result error(String message, String details, T data) { + return new Result<>(false, message, details, data); + } + + public static Result error(String message, String details) { + return error(message, details, null); } public static Result error(String message) { - return new Result<>(false, message, null); + return error(message, null, null); } public boolean isSuccess() { @@ -39,6 +45,10 @@ public final class Result { return message; } + public String getDetails() { + return details; + } + public T getData() { return data; } diff --git a/api/src/main/java/market/guess/model/event/EventDetailDTO.java b/api/src/main/java/market/guess/model/event/EventDetailDTO.java new file mode 100644 index 0000000..e45458b --- /dev/null +++ b/api/src/main/java/market/guess/model/event/EventDetailDTO.java @@ -0,0 +1,11 @@ +package market.guess.model.event; + +import java.util.List; +import market.guess.api.MarketStateDTO; +import market.guess.api.TradeRowDTO; + +public record EventDetailDTO( + EventSummaryDTO summary, + MarketStateDTO state, + List history, + String winningOption) {} diff --git a/api/src/main/java/market/guess/model/event/EventStatus.java b/api/src/main/java/market/guess/model/event/EventStatus.java new file mode 100644 index 0000000..c6460f9 --- /dev/null +++ b/api/src/main/java/market/guess/model/event/EventStatus.java @@ -0,0 +1,7 @@ +package market.guess.model.event; + +public enum EventStatus { + DRAFT, + ACTIVE, + SETTLED +} diff --git a/api/src/main/java/market/guess/model/event/EventSummaryDTO.java b/api/src/main/java/market/guess/model/event/EventSummaryDTO.java new file mode 100644 index 0000000..1595f81 --- /dev/null +++ b/api/src/main/java/market/guess/model/event/EventSummaryDTO.java @@ -0,0 +1,17 @@ +package market.guess.model.event; + +import java.util.List; +import market.guess.api.CommissionTiming; +import market.guess.api.MechanismType; + +public record EventSummaryDTO( + String key, + int displayId, + String name, + String description, + int commissionPercent, + CommissionTiming commissionTiming, + MechanismType mechanism, + EventStatus status, + List optionNames, + String accountBalance) {} diff --git a/api/src/main/java/market/guess/model/ledger/LedgerEntryDTO.java b/api/src/main/java/market/guess/model/ledger/LedgerEntryDTO.java new file mode 100644 index 0000000..733ad03 --- /dev/null +++ b/api/src/main/java/market/guess/model/ledger/LedgerEntryDTO.java @@ -0,0 +1,4 @@ +package market.guess.model.ledger; + +public record LedgerEntryDTO( + long seq, String at, LedgerType type, String amount, String balanceAfter, String note) {} diff --git a/api/src/main/java/market/guess/model/ledger/LedgerType.java b/api/src/main/java/market/guess/model/ledger/LedgerType.java new file mode 100644 index 0000000..b1fe15b --- /dev/null +++ b/api/src/main/java/market/guess/model/ledger/LedgerType.java @@ -0,0 +1,10 @@ +package market.guess.model.ledger; + +public enum LedgerType { + SUBSIDY, + PURCHASE, + COMMISSION, + PAYOUT, + REFUND, + DEPOSIT +} -- cgit v1.2.3