Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions payguard-wallet/src/main/java/dev/amg/payguard/WalletApp.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package dev.amg.payguard;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class WalletApp {

public static void main(String[] args) {
SpringApplication.run(WalletApp.class, args);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package dev.amg.payguard.domain.enums;

public enum FinancialAccountType {
USER_WALLET,
BANK_CLEARING,
COMPANY_REVENUE,
PROMOTIONAL_EXPENSE,
SETTLEMENT_SUSPENSE
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package dev.amg.payguard.domain.enums;

public enum HoldStatus {
PENDING,
CAPTURED,
RELEASED,
EXPIRED
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package dev.amg.payguard.domain.enums;

public enum LedgerEntryType {
DEBIT,
CREDIT
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package dev.amg.payguard.domain.enums;

public enum TransactionStatus {
INITIATED,
PENDING_SETTLEMENT,
SUCCESSFUL,
FAILED,
REVERSED
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package dev.amg.payguard.domain.enums;

public enum TransactionType {
DEPOSIT,
WITHDRAWAL,
P2P_TRANSFER,
PURCHASE,
REFUND,
FEE
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package dev.amg.payguard.domain.enums;

public enum WalletStatus {
ACTIVE,
SUSPENDED_DEBIT,
SUSPENDED_CREDIT,
FROZEN,
CLOSED
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package dev.amg.payguard.domain.event;

import dev.amg.payguard.domain.value_object.HoldId;
import dev.amg.payguard.domain.value_object.Money;
import dev.amg.payguard.domain.value_object.WalletId;
import domain.DomainEvent;
import java.time.Instant;
import java.util.UUID;

public record FundsHoldCapturedEvent(
UUID eventId, Instant occurredAt, HoldId holdId, WalletId walletId, Money amount)
implements DomainEvent {
@Override
public Instant occurredOn() {
return occurredAt;
}

public static FundsHoldCapturedEvent now(
HoldId holdId, WalletId walletId, Money amount, Instant now) {
return new FundsHoldCapturedEvent(UUID.randomUUID(), now, holdId, walletId, amount);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package dev.amg.payguard.domain.event;

import dev.amg.payguard.domain.value_object.HoldId;
import dev.amg.payguard.domain.value_object.Money;
import dev.amg.payguard.domain.value_object.WalletId;
import domain.DomainEvent;
import java.time.Instant;
import java.util.UUID;

public record FundsHoldCreatedEvent(
UUID eventId,
Instant occurredAt,
HoldId holdId,
WalletId walletId,
Money amount,
Instant expiresAt)
implements DomainEvent {
@Override
public Instant occurredOn() {
return occurredAt;
}

public static FundsHoldCreatedEvent now(
HoldId holdId, WalletId walletId, Money amount, Instant expiresAt, Instant now) {
return new FundsHoldCreatedEvent(UUID.randomUUID(), now, holdId, walletId, amount, expiresAt);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package dev.amg.payguard.domain.event;

import dev.amg.payguard.domain.value_object.HoldId;
import dev.amg.payguard.domain.value_object.Money;
import dev.amg.payguard.domain.value_object.WalletId;
import domain.DomainEvent;
import java.time.Instant;
import java.util.UUID;

public record FundsHoldExpiredEvent(
UUID eventId, Instant occurredAt, HoldId holdId, WalletId walletId, Money amount)
implements DomainEvent {
public static FundsHoldExpiredEvent now(
HoldId holdId, WalletId walletId, Money amount, Instant now) {
return new FundsHoldExpiredEvent(UUID.randomUUID(), now, holdId, walletId, amount);
}

@Override
public Instant occurredOn() {
return occurredAt;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package dev.amg.payguard.domain.event;

import dev.amg.payguard.domain.value_object.HoldId;
import dev.amg.payguard.domain.value_object.Money;
import dev.amg.payguard.domain.value_object.WalletId;
import domain.DomainEvent;
import java.time.Instant;
import java.util.UUID;

public record FundsHoldReleasedEvent(
UUID eventId, Instant occurredAt, HoldId holdId, WalletId walletId, Money amount)
implements DomainEvent {
@Override
public Instant occurredOn() {
return occurredAt;
}

public static FundsHoldReleasedEvent now(
HoldId holdId, WalletId walletId, Money amount, Instant now) {
return new FundsHoldReleasedEvent(UUID.randomUUID(), now, holdId, walletId, amount);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package dev.amg.payguard.domain.event;

import dev.amg.payguard.domain.value_object.Money;
import dev.amg.payguard.domain.value_object.TransactionId;
import dev.amg.payguard.domain.value_object.WalletId;
import domain.DomainEvent;
import java.time.Instant;
import java.util.UUID;

public record MoneyDepositedEvent(
UUID eventId, Instant occurredAt, TransactionId transactionId, WalletId walletId, Money amount)
implements DomainEvent {
@Override
public Instant occurredOn() {
return occurredAt;
}

public static MoneyDepositedEvent now(
TransactionId transactionId, WalletId walletId, Money amount, Instant now) {
return new MoneyDepositedEvent(UUID.randomUUID(), now, transactionId, walletId, amount);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package dev.amg.payguard.domain.event;

import dev.amg.payguard.domain.value_object.Money;
import dev.amg.payguard.domain.value_object.TransactionId;
import dev.amg.payguard.domain.value_object.WalletId;
import domain.DomainEvent;
import java.time.Instant;
import java.util.UUID;

public record MoneyWithdrawnEvent(
UUID eventId, Instant occurredAt, TransactionId transactionId, WalletId walletId, Money amount)
implements DomainEvent {
@Override
public Instant occurredOn() {
return occurredAt;
}

public static MoneyWithdrawnEvent now(
TransactionId transactionId, WalletId walletId, Money amount, Instant now) {
return new MoneyWithdrawnEvent(UUID.randomUUID(), now, transactionId, walletId, amount);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package dev.amg.payguard.domain.event;

import dev.amg.payguard.domain.value_object.AccountId;
import dev.amg.payguard.domain.value_object.Money;
import dev.amg.payguard.domain.value_object.TransactionId;
import domain.DomainEvent;
import java.time.Instant;
import java.util.UUID;

public record TransferCompletedEvent(
UUID eventId,
Instant occurredAt,
TransactionId transactionId,
AccountId sourceAccountId,
AccountId destinationAccountId,
Money amount,
Money fee)
implements DomainEvent {
@Override
public Instant occurredOn() {
return occurredAt;
}

public static TransferCompletedEvent now(
TransactionId transactionId,
AccountId source,
AccountId destination,
Money amount,
Money fee,
Instant now) {
return new TransferCompletedEvent(
UUID.randomUUID(), now, transactionId, source, destination, amount, fee);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package dev.amg.payguard.domain.event;

import dev.amg.payguard.domain.value_object.WalletId;
import domain.DomainEvent;
import java.time.Instant;
import java.util.UUID;

public record WalletClosedEvent(UUID eventId, Instant occurredAt, WalletId walletId)
implements DomainEvent {
@Override
public Instant occurredOn() {
return occurredAt;
}

public static WalletClosedEvent now(WalletId walletId, Instant now) {
return new WalletClosedEvent(UUID.randomUUID(), now, walletId);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package dev.amg.payguard.domain.event;

import dev.amg.payguard.domain.value_object.UserId;
import dev.amg.payguard.domain.value_object.WalletId;
import domain.DomainEvent;
import java.time.Instant;
import java.util.Currency;
import java.util.UUID;

public record WalletCreatedEvent(
UUID eventId, Instant occurredAt, WalletId walletId, UserId userId, Currency currency)
implements DomainEvent {
@Override
public Instant occurredOn() {
return occurredAt;
}

public static WalletCreatedEvent now(
WalletId walletId, UserId userId, Currency currency, Instant now) {
return new WalletCreatedEvent(UUID.randomUUID(), now, walletId, userId, currency);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package dev.amg.payguard.domain.event;

import dev.amg.payguard.domain.enums.WalletStatus;
import dev.amg.payguard.domain.value_object.WalletId;
import domain.DomainEvent;
import java.time.Instant;
import java.util.UUID;

public record WalletStatusChangedEvent(
UUID eventId,
Instant occurredAt,
WalletId walletId,
WalletStatus previousStatus,
WalletStatus newStatus,
String reason)
implements DomainEvent {
@Override
public Instant occurredOn() {
return occurredAt;
}

public static WalletStatusChangedEvent now(
WalletId walletId, WalletStatus previous, WalletStatus current, String reason, Instant now) {
return new WalletStatusChangedEvent(
UUID.randomUUID(), now, walletId, previous, current, reason);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package dev.amg.payguard.domain.exception;

import domain.DomainException;

public class CurrencyMismatchException extends DomainException {
private static final long serialVersionUID = 1L;

public CurrencyMismatchException() {
this("Currency mismatch");
}

public CurrencyMismatchException(String message) {
super(message);
}

@Override
public String getErrorCode() {
return "CURRENCY_MISMATCH";
}

@Override
public String getTitle() {
return "Currency mismatch";
}

@Override
public int getHttpStatus() {
return 400;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package dev.amg.payguard.domain.exception;

import domain.DomainException;

public class DoubleEntryImbalanceException extends DomainException {
private static final long serialVersionUID = 1L;

public DoubleEntryImbalanceException() {
this("Double-entry transaction is imbalanced");
}

public DoubleEntryImbalanceException(String message) {
super(message);
}

@Override
public String getErrorCode() {
return "DOUBLE_ENTRY_IMBALANCE";
}

@Override
public String getTitle() {
return "Double-entry imbalance";
}

@Override
public int getHttpStatus() {
return 400;
}
}
Loading
Loading