Skip to content

Commit 35358ca

Browse files
Harden wallet domain invariants and add regression tests (#37)
1 parent 1fcb3b8 commit 35358ca

70 files changed

Lines changed: 4751 additions & 0 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package dev.amg.payguard;
2+
3+
import org.springframework.boot.SpringApplication;
4+
import org.springframework.boot.autoconfigure.SpringBootApplication;
5+
6+
@SpringBootApplication
7+
public class WalletApp {
8+
9+
public static void main(String[] args) {
10+
SpringApplication.run(WalletApp.class, args);
11+
}
12+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package dev.amg.payguard.domain.enums;
2+
3+
public enum FinancialAccountType {
4+
USER_WALLET,
5+
BANK_CLEARING,
6+
COMPANY_REVENUE,
7+
PROMOTIONAL_EXPENSE,
8+
SETTLEMENT_SUSPENSE
9+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package dev.amg.payguard.domain.enums;
2+
3+
public enum HoldStatus {
4+
PENDING,
5+
CAPTURED,
6+
RELEASED,
7+
EXPIRED
8+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package dev.amg.payguard.domain.enums;
2+
3+
public enum LedgerEntryType {
4+
DEBIT,
5+
CREDIT
6+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package dev.amg.payguard.domain.enums;
2+
3+
public enum TransactionStatus {
4+
INITIATED,
5+
PENDING_SETTLEMENT,
6+
SUCCESSFUL,
7+
FAILED,
8+
REVERSED
9+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package dev.amg.payguard.domain.enums;
2+
3+
public enum TransactionType {
4+
DEPOSIT,
5+
WITHDRAWAL,
6+
P2P_TRANSFER,
7+
PURCHASE,
8+
REFUND,
9+
FEE
10+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package dev.amg.payguard.domain.enums;
2+
3+
public enum WalletStatus {
4+
ACTIVE,
5+
SUSPENDED_DEBIT,
6+
SUSPENDED_CREDIT,
7+
FROZEN,
8+
CLOSED
9+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package dev.amg.payguard.domain.event;
2+
3+
import dev.amg.payguard.domain.value_object.HoldId;
4+
import dev.amg.payguard.domain.value_object.Money;
5+
import dev.amg.payguard.domain.value_object.WalletId;
6+
import domain.DomainEvent;
7+
import java.time.Instant;
8+
import java.util.UUID;
9+
10+
public record FundsHoldCapturedEvent(
11+
UUID eventId, Instant occurredAt, HoldId holdId, WalletId walletId, Money amount)
12+
implements DomainEvent {
13+
@Override
14+
public Instant occurredOn() {
15+
return occurredAt;
16+
}
17+
18+
public static FundsHoldCapturedEvent now(
19+
HoldId holdId, WalletId walletId, Money amount, Instant now) {
20+
return new FundsHoldCapturedEvent(UUID.randomUUID(), now, holdId, walletId, amount);
21+
}
22+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package dev.amg.payguard.domain.event;
2+
3+
import dev.amg.payguard.domain.value_object.HoldId;
4+
import dev.amg.payguard.domain.value_object.Money;
5+
import dev.amg.payguard.domain.value_object.WalletId;
6+
import domain.DomainEvent;
7+
import java.time.Instant;
8+
import java.util.UUID;
9+
10+
public record FundsHoldCreatedEvent(
11+
UUID eventId,
12+
Instant occurredAt,
13+
HoldId holdId,
14+
WalletId walletId,
15+
Money amount,
16+
Instant expiresAt)
17+
implements DomainEvent {
18+
@Override
19+
public Instant occurredOn() {
20+
return occurredAt;
21+
}
22+
23+
public static FundsHoldCreatedEvent now(
24+
HoldId holdId, WalletId walletId, Money amount, Instant expiresAt, Instant now) {
25+
return new FundsHoldCreatedEvent(UUID.randomUUID(), now, holdId, walletId, amount, expiresAt);
26+
}
27+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package dev.amg.payguard.domain.event;
2+
3+
import dev.amg.payguard.domain.value_object.HoldId;
4+
import dev.amg.payguard.domain.value_object.Money;
5+
import dev.amg.payguard.domain.value_object.WalletId;
6+
import domain.DomainEvent;
7+
import java.time.Instant;
8+
import java.util.UUID;
9+
10+
public record FundsHoldExpiredEvent(
11+
UUID eventId, Instant occurredAt, HoldId holdId, WalletId walletId, Money amount)
12+
implements DomainEvent {
13+
public static FundsHoldExpiredEvent now(
14+
HoldId holdId, WalletId walletId, Money amount, Instant now) {
15+
return new FundsHoldExpiredEvent(UUID.randomUUID(), now, holdId, walletId, amount);
16+
}
17+
18+
@Override
19+
public Instant occurredOn() {
20+
return occurredAt;
21+
}
22+
}

0 commit comments

Comments
 (0)