From 4cdf4f066309d0a0e8a11081aa7bd1b0828a2f91 Mon Sep 17 00:00:00 2001 From: Kostya Date: Thu, 13 Aug 2026 22:26:19 +0000 Subject: Add domain model, repositories, and trading mechanism interfaces to service module Introduces Account/Event/Trade/User/Option/LedgerEntry domain types plus EventRepository/UserRepository and TradingMechanism abstractions. --- .../java/market/guess/service/domain/Account.java | 27 ++++++++++++ .../market/guess/service/domain/AccountType.java | 6 +++ .../guess/service/domain/BigDecimalOptions.java | 14 ++++++ .../java/market/guess/service/domain/Event.java | 51 ++++++++++++++++++++++ .../market/guess/service/domain/LedgerEntry.java | 8 ++++ .../java/market/guess/service/domain/Option.java | 21 +++++++++ .../java/market/guess/service/domain/Trade.java | 19 ++++++++ .../java/market/guess/service/domain/User.java | 21 +++++++++ .../guess/service/mechanism/TradingMechanism.java | 15 +++++++ .../service/repositories/EventRepository.java | 7 +++ .../guess/service/repositories/UserRepository.java | 8 ++++ 11 files changed, 197 insertions(+) create mode 100644 service/src/main/java/market/guess/service/domain/Account.java create mode 100644 service/src/main/java/market/guess/service/domain/AccountType.java create mode 100644 service/src/main/java/market/guess/service/domain/BigDecimalOptions.java create mode 100644 service/src/main/java/market/guess/service/domain/Event.java create mode 100644 service/src/main/java/market/guess/service/domain/LedgerEntry.java create mode 100644 service/src/main/java/market/guess/service/domain/Option.java create mode 100644 service/src/main/java/market/guess/service/domain/Trade.java create mode 100644 service/src/main/java/market/guess/service/domain/User.java create mode 100644 service/src/main/java/market/guess/service/mechanism/TradingMechanism.java create mode 100644 service/src/main/java/market/guess/service/repositories/EventRepository.java create mode 100644 service/src/main/java/market/guess/service/repositories/UserRepository.java diff --git a/service/src/main/java/market/guess/service/domain/Account.java b/service/src/main/java/market/guess/service/domain/Account.java new file mode 100644 index 0000000..8b510a5 --- /dev/null +++ b/service/src/main/java/market/guess/service/domain/Account.java @@ -0,0 +1,27 @@ +package market.guess.service.domain; + +import java.math.BigDecimal; +import java.time.Clock; +import java.util.ArrayList; +import java.util.List; + +public final class Account { + + private final AccountType accountType; + private final String owner; + private final Clock clock; + private final List entries = new ArrayList<>(); + private BigDecimal balance; + + public Account(AccountType accountType, String owner, BigDecimal initialBalance) { + this(accountType, owner, initialBalance, Clock.systemUTC()); + } + + public Account(AccountType accountType, String owner, BigDecimal initialBalance, Clock clock) { + super(); + this.accountType = accountType; + this.owner = owner; + this.balance = initialBalance; + this.clock = clock; + } +} diff --git a/service/src/main/java/market/guess/service/domain/AccountType.java b/service/src/main/java/market/guess/service/domain/AccountType.java new file mode 100644 index 0000000..293ff4e --- /dev/null +++ b/service/src/main/java/market/guess/service/domain/AccountType.java @@ -0,0 +1,6 @@ +package market.guess.service.domain; + +public enum AccountType { + EVENT, + USER +} diff --git a/service/src/main/java/market/guess/service/domain/BigDecimalOptions.java b/service/src/main/java/market/guess/service/domain/BigDecimalOptions.java new file mode 100644 index 0000000..159905f --- /dev/null +++ b/service/src/main/java/market/guess/service/domain/BigDecimalOptions.java @@ -0,0 +1,14 @@ +package market.guess.service.domain; + +import java.math.BigDecimal; +import java.math.RoundingMode; + +public record BigDecimalOptions(int scale, RoundingMode roundingMode) { + public static final BigDecimalOptions DEFAULT = new BigDecimalOptions(2, RoundingMode.HALF_EVEN); + public static final BigDecimal ZERO_MONEY = + BigDecimal.ZERO.setScale(DEFAULT.scale(), DEFAULT.roundingMode()); + + public static BigDecimal valueOf(double v) { + return BigDecimal.valueOf(v).setScale(DEFAULT.scale(), DEFAULT.roundingMode()); + } +} diff --git a/service/src/main/java/market/guess/service/domain/Event.java b/service/src/main/java/market/guess/service/domain/Event.java new file mode 100644 index 0000000..4c33928 --- /dev/null +++ b/service/src/main/java/market/guess/service/domain/Event.java @@ -0,0 +1,51 @@ +package market.guess.service.domain; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; +import market.guess.api.CommissionTiming; +import market.guess.api.EventStatus; +import market.guess.service.mechanism.TradingMechanism; + +public final class Event { + private final String eventKey; + private final int displayId; + private final String name; + private final String description; + private final int commissionPercent; + private final CommissionTiming commissionTiming; + private final TradingMechanism mechanism; + private final List