Skip to content

Commit

Permalink
#44 - Refactoring - Driver Ports with plain DTOs - Driven Ports with …
Browse files Browse the repository at this point in the history
…primitives and DTOs
  • Loading branch information
valentinacupac committed Jun 27, 2022
1 parent 273ed83 commit 71725a2
Show file tree
Hide file tree
Showing 51 changed files with 513 additions and 396 deletions.
15 changes: 8 additions & 7 deletions src/main/java/com/optivem/kata/banking/core/Facade.java
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
package com.optivem.kata.banking.core;

import com.optivem.kata.banking.core.acl.BankAccountRepositoryImpl;
import com.optivem.kata.banking.core.domain.scoring.DefaultScoreCalculator;
import com.optivem.kata.banking.core.domain.accounts.AccountIdGenerator;
import com.optivem.kata.banking.core.domain.accounts.AccountNumberGenerator;
import com.optivem.kata.banking.core.domain.accounts.BankAccountRepository;
import com.optivem.kata.banking.core.domain.accounts.scoring.*;
import com.optivem.kata.banking.core.ports.driven.DateTimeServicePort;
import com.optivem.kata.banking.core.ports.driven.AccountIdGenerator;
import com.optivem.kata.banking.core.ports.driven.AccountNumberGenerator;
import com.optivem.kata.banking.core.ports.driven.BankAccountStorage;
import com.optivem.kata.banking.core.ports.driven.DateTimeService;
import com.optivem.kata.banking.core.usecases.depositfunds.DepositFundsRequest;
import com.optivem.kata.banking.core.usecases.depositfunds.DepositFundsUseCase;
import com.optivem.kata.banking.core.usecases.openaccount.OpenAccountRequest;
Expand All @@ -22,11 +22,12 @@ public class Facade {
private final ViewAccountUseCase viewAccountUseCase;

// TODO: VC: Perhaps server-side API facade? And server-side API facade?
public Facade(AccountIdGenerator accountIdGenerator, AccountNumberGenerator accountNumberGenerator, DateTimeServicePort dateTimeService, BankAccountRepository bankAccountRepository) {
public Facade(AccountIdGenerator accountIdGenerator, AccountNumberGenerator accountNumberGenerator, DateTimeService dateTimeService, BankAccountStorage bankAccountStorage) {
var scoreCalculator = DefaultScoreCalculator.create(dateTimeService);
var bankAccountRepository = new BankAccountRepositoryImpl(bankAccountStorage, accountIdGenerator, accountNumberGenerator);

this.depositFundsUseCase = new DepositFundsUseCase(bankAccountRepository);
this.openAccountUseCase = new OpenAccountUseCase(accountIdGenerator, accountNumberGenerator, dateTimeService, bankAccountRepository);
this.openAccountUseCase = new OpenAccountUseCase(bankAccountRepository, dateTimeService);
this.viewAccountUseCase = new ViewAccountUseCase(bankAccountRepository, scoreCalculator);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package com.optivem.kata.banking.core.acl;

import com.optivem.kata.banking.core.domain.accounts.*;
import com.optivem.kata.banking.core.ports.driven.BankAccountDto;

public class BankAccountConverter {
public static BankAccount toEntity(BankAccountDto dto) {
var accountId = AccountId.of(dto.getAccountId());
var accountNumber = AccountNumber.of(dto.getAccountNumber());
var accountHolderName = AccountHolderName.of(dto.getFirstName(), dto.getLastName());
var openingDate = dto.getOpeningDate();
var balance = Balance.of(dto.getBalance());

return new BankAccount(accountId, accountNumber, accountHolderName, openingDate, balance);
}

public static BankAccountDto toDto(BankAccount bankAccount) {
var accountId = bankAccount.getAccountId().toLong();
var accountNumber = bankAccount.getAccountNumber().toString();
var firstName = bankAccount.getAccountHolderName().firstName().toString();
var lastName = bankAccount.getAccountHolderName().lastName().toString();
var openingDate = bankAccount.getOpeningDate();
var balance = bankAccount.getBalance().toInt();

var dto = new BankAccountDto();
dto.setAccountId(accountId);
dto.setAccountNumber(accountNumber);
dto.setFirstName(firstName);
dto.setLastName(lastName);
dto.setOpeningDate(openingDate);
dto.setBalance(balance);

return dto;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
package com.optivem.kata.banking.core.acl;

import com.optivem.kata.banking.core.domain.accounts.AccountId;
import com.optivem.kata.banking.core.domain.accounts.AccountNumber;
import com.optivem.kata.banking.core.domain.accounts.BankAccount;
import com.optivem.kata.banking.core.domain.accounts.BankAccountRepository;
import com.optivem.kata.banking.core.ports.driven.AccountIdGenerator;
import com.optivem.kata.banking.core.ports.driven.AccountNumberGenerator;
import com.optivem.kata.banking.core.ports.driven.BankAccountStorage;
import org.springframework.stereotype.Component;

import java.util.Optional;

@Component
public class BankAccountRepositoryImpl implements BankAccountRepository {
private final BankAccountStorage bankAccountStorage;
private final AccountIdGenerator accountIdGenerator;
private final AccountNumberGenerator accountNumberGenerator;

public BankAccountRepositoryImpl(BankAccountStorage bankAccountStorage, AccountIdGenerator accountIdGenerator, AccountNumberGenerator accountNumberGenerator) {
this.bankAccountStorage = bankAccountStorage;
this.accountIdGenerator = accountIdGenerator;
this.accountNumberGenerator = accountNumberGenerator;
}

@Override
public Optional<BankAccount> find(AccountNumber accountNumber) {
var dto = bankAccountStorage.find(accountNumber.toString());

if(dto.isEmpty()) {
return Optional.empty();
}

var entity = BankAccountConverter.toEntity(dto.get());
return Optional.of(entity);
}

@Override
public void add(BankAccount bankAccount) {
var dto = BankAccountConverter.toDto(bankAccount);
bankAccountStorage.add(dto);
}

@Override
public void update(BankAccount bankAccount) {
var dto = BankAccountConverter.toDto(bankAccount);
bankAccountStorage.update(dto);
}

@Override
public AccountId nextAccountId() {
var accountId = accountIdGenerator.next();
return AccountId.of(accountId);
}

@Override
public AccountNumber nextAccountNumber() {
var accountNumber = accountNumberGenerator.next();
return AccountNumber.of(accountNumber);
}
}

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,8 @@ public interface BankAccountRepository {
void add(BankAccount bankAccount);

void update(BankAccount bankAccount);

AccountId nextAccountId();

AccountNumber nextAccountNumber();
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.optivem.kata.banking.core.domain.scoring;

import com.optivem.kata.banking.core.domain.accounts.BankAccount;
import com.optivem.kata.banking.core.ports.driven.DateTimeServicePort;
import com.optivem.kata.banking.core.ports.driven.DateTimeService;

public class DefaultScoreCalculator implements ScoreCalculator {

Expand All @@ -26,7 +26,7 @@ public Score calculate(BankAccount bankAccount) {
return Score.A;
}

public static DefaultScoreCalculator create(DateTimeServicePort dateTimeService) {
public static DefaultScoreCalculator create(DateTimeService dateTimeService) {
var nameFactorCalculator = new NameFactorCalculator();
var balanceFactorCalculator = new BalanceFactorCalculator();
var timeFactorCalculator = new TimeFactorCalculator(dateTimeService);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
package com.optivem.kata.banking.core.domain.scoring;

import com.optivem.kata.banking.core.domain.accounts.BankAccount;
import com.optivem.kata.banking.core.ports.driven.DateTimeServicePort;
import com.optivem.kata.banking.core.ports.driven.DateTimeService;

public class TimeFactorCalculator implements FactorCalculator {
private final DateTimeServicePort dateTimeService;
private final DateTimeService dateTimeService;

public TimeFactorCalculator(DateTimeServicePort dateTimeService) {
public TimeFactorCalculator(DateTimeService dateTimeService) {
this.dateTimeService = dateTimeService;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@

import com.optivem.kata.banking.core.domain.common.base.Generator;

public interface AccountNumberGeneratorPort extends Generator<String> {
public interface AccountIdGenerator extends Generator<Long> {
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.optivem.kata.banking.core.ports.driven;

import com.optivem.kata.banking.core.domain.common.base.Generator;

public interface AccountNumberGenerator extends Generator<String> {
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,17 @@
import com.optivem.kata.banking.core.domain.accounts.AccountId;
import com.optivem.kata.banking.core.domain.accounts.AccountNumber;
import com.optivem.kata.banking.core.domain.accounts.Balance;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.time.LocalDate;

@AllArgsConstructor
@NoArgsConstructor
@Data
@Builder
public class BankAccountDto {
private long accountId;
private String accountNumber;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import java.util.Optional;

public interface BankAccountDtoRepositoryPort {
public interface BankAccountStorage {
Optional<BankAccountDto> find(String accountNumber);

void add(BankAccountDto bankAccount);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,6 @@

import java.time.LocalDateTime;

public interface DateTimeServicePort {
public interface DateTimeService {
LocalDateTime now();
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,24 +2,19 @@

import an.awesome.pipelinr.Command;
import com.optivem.kata.banking.core.domain.accounts.*;
import com.optivem.kata.banking.core.domain.accounts.AccountIdGenerator;
import com.optivem.kata.banking.core.domain.accounts.AccountNumberGenerator;
import com.optivem.kata.banking.core.domain.accounts.BankAccountRepository;
import com.optivem.kata.banking.core.ports.driven.DateTimeServicePort;
import com.optivem.kata.banking.core.ports.driven.DateTimeService;
import org.springframework.stereotype.Component;

@Component
public class OpenAccountUseCase implements Command.Handler<OpenAccountRequest, OpenAccountResponse> {
private final AccountIdGenerator accountIdGenerator;
private final AccountNumberGenerator accountNumberGenerator;
private final DateTimeServicePort dateTimeService;
private final BankAccountRepository bankAccountRepository;
private final DateTimeService dateTimeService;

public OpenAccountUseCase(AccountIdGenerator accountIdGenerator, AccountNumberGenerator accountNumberGenerator, DateTimeServicePort dateTimeService, BankAccountRepository bankAccountRepository) {
this.accountIdGenerator = accountIdGenerator;
this.accountNumberGenerator = accountNumberGenerator;
this.dateTimeService = dateTimeService;

public OpenAccountUseCase(BankAccountRepository bankAccountRepository, DateTimeService dateTimeService) {
this.bankAccountRepository = bankAccountRepository;
this.dateTimeService = dateTimeService;
}

public OpenAccountResponse handle(OpenAccountRequest request) {
Expand All @@ -41,8 +36,8 @@ private Balance getBalance(OpenAccountRequest request) {
}

private BankAccount createBankAccount(AccountHolderName accountHolderName, Balance balance) {
var accountId = accountIdGenerator.next();
var accountNumber = accountNumberGenerator.next();
var accountId = bankAccountRepository.nextAccountId();
var accountNumber = bankAccountRepository.nextAccountNumber();
var dateTime = dateTimeService.now();
var openingDate = dateTime.toLocalDate();
return new BankAccount(accountId, accountNumber, accountHolderName, openingDate, balance);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
package com.optivem.kata.banking.infra.fake;

import com.optivem.kata.banking.core.domain.accounts.AccountId;
import com.optivem.kata.banking.core.domain.accounts.AccountIdGenerator;
import com.optivem.kata.banking.core.domain.common.base.Generator;
import com.optivem.kata.banking.core.ports.driven.AccountIdGenerator;
import com.optivem.kata.banking.infra.fake.base.FakeGenerator;

public class FakeAccountIdGenerator extends FakeGenerator<AccountId> implements AccountIdGenerator {
public class FakeAccountIdGenerator extends FakeGenerator<Long> implements AccountIdGenerator {
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
package com.optivem.kata.banking.infra.fake;

import com.optivem.kata.banking.core.domain.accounts.AccountNumber;
import com.optivem.kata.banking.core.domain.accounts.AccountNumberGenerator;
import com.optivem.kata.banking.core.domain.common.base.Generator;
import com.optivem.kata.banking.core.ports.driven.AccountNumberGenerator;
import com.optivem.kata.banking.infra.fake.base.FakeGenerator;

public class FakeAccountNumberGenerator extends FakeGenerator<AccountNumber> implements AccountNumberGenerator {
public class FakeAccountNumberGenerator extends FakeGenerator<String> implements AccountNumberGenerator {
}

This file was deleted.

0 comments on commit 71725a2

Please sign in to comment.