diff --git a/transaction-processor/src/main/java/cz/muni/pa165/banking/application/controller/TransactionController.java b/transaction-processor/src/main/java/cz/muni/pa165/banking/application/controller/TransactionController.java index 8057cd7b5a522bd8bf0aae91cac62c108f90b1d8..af908faf0d588d58dce85daa6baf617e1dae317c 100644 --- a/transaction-processor/src/main/java/cz/muni/pa165/banking/application/controller/TransactionController.java +++ b/transaction-processor/src/main/java/cz/muni/pa165/banking/application/controller/TransactionController.java @@ -5,7 +5,6 @@ import cz.muni.pa165.banking.transaction.processor.TransactionApi; import cz.muni.pa165.banking.transaction.processor.dto.ProcessDetailDto; import cz.muni.pa165.banking.transaction.processor.dto.ProcessDto; import cz.muni.pa165.banking.transaction.processor.dto.TransactionDto; -import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -32,11 +31,11 @@ public class TransactionController implements TransactionApi { ProcessDetailDto result = facade.getStatus(xProcessUuid); return ResponseEntity.ok(result); } - + @Override - public ResponseEntity<Void> revertTransactionProcess(UUID xProcessUuid) { - facade.revertProcess(xProcessUuid); - return new ResponseEntity<>(HttpStatus.OK); + public ResponseEntity<ProcessDto> revertTransactionProcess(UUID xProcessUuid) { + ProcessDto revertingProcess = facade.revertProcess(xProcessUuid); + return ResponseEntity.ok(revertingProcess); } } diff --git a/transaction-processor/src/main/java/cz/muni/pa165/banking/application/facade/TransactionFacade.java b/transaction-processor/src/main/java/cz/muni/pa165/banking/application/facade/TransactionFacade.java index 13af297a947d7d6f212b617943286c2328db4779..56c784e7ab36b5e05ab54054812d9e9edc913c6b 100644 --- a/transaction-processor/src/main/java/cz/muni/pa165/banking/application/facade/TransactionFacade.java +++ b/transaction-processor/src/main/java/cz/muni/pa165/banking/application/facade/TransactionFacade.java @@ -38,8 +38,8 @@ public class TransactionFacade { return mapper.map(process, processTransaction); } - public void revertProcess(UUID uuid) { - service.revertProcess(uuid); + public ProcessDto revertProcess(UUID uuid) { + return mapper.map(service.revertProcess(uuid)); } } diff --git a/transaction-processor/src/main/java/cz/muni/pa165/banking/application/service/AccountServiceImpl.java b/transaction-processor/src/main/java/cz/muni/pa165/banking/application/service/AccountServiceImpl.java index 333e74d9a83f79960ac8c8501466db7714d39a0d..a65602e495288f5f6f501cd3534608dfd332ce10 100644 --- a/transaction-processor/src/main/java/cz/muni/pa165/banking/application/service/AccountServiceImpl.java +++ b/transaction-processor/src/main/java/cz/muni/pa165/banking/application/service/AccountServiceImpl.java @@ -31,7 +31,7 @@ public class AccountServiceImpl implements AccountService { } @Override - public void publishAccountChange(UUID processUuid, TransactionType transactionType, BigDecimal amount, Account account) { + public void publishAccountChange(UUID processUuid, TransactionType transactionType, BigDecimal amount, Account account, String information) { } } diff --git a/transaction-processor/src/main/java/cz/muni/pa165/banking/application/service/TransactionProcessesService.java b/transaction-processor/src/main/java/cz/muni/pa165/banking/application/service/TransactionProcessesService.java index beb5fdf5e0b8331e0ee7e6ed3fd5e99b99563061..b161b366c0cc6e91198c81033f1e5a302dd9bdb3 100644 --- a/transaction-processor/src/main/java/cz/muni/pa165/banking/application/service/TransactionProcessesService.java +++ b/transaction-processor/src/main/java/cz/muni/pa165/banking/application/service/TransactionProcessesService.java @@ -1,12 +1,18 @@ package cz.muni.pa165.banking.application.service; import cz.muni.pa165.banking.application.messaging.ProcessProducer; +import cz.muni.pa165.banking.domain.money.Money; import cz.muni.pa165.banking.domain.process.Process; import cz.muni.pa165.banking.domain.process.ProcessFactory; import cz.muni.pa165.banking.domain.process.ProcessTransaction; import cz.muni.pa165.banking.domain.process.repository.ProcessRepository; +import cz.muni.pa165.banking.domain.process.status.Status; import cz.muni.pa165.banking.domain.transaction.Transaction; import cz.muni.pa165.banking.domain.process.repository.ProcessTransactionRepository; +import cz.muni.pa165.banking.domain.transaction.TransactionType; +import cz.muni.pa165.banking.exception.UnexpectedValueException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -15,6 +21,8 @@ import java.util.UUID; @Service public class TransactionProcessesService { + private final Logger LOGGER = LoggerFactory.getLogger(TransactionProcessesService.class); + private final ProcessTransactionRepository processTransactionRepository; private final ProcessRepository processRepository; @@ -30,7 +38,11 @@ public class TransactionProcessesService { @Transactional(rollbackFor = Exception.class) public Process createProcessForTransaction(Transaction newTransaction) { ProcessFactory factory = new ProcessFactory(processTransactionRepository, processRepository); - return factory.create(newTransaction, processProducer); + Process process = factory.create(newTransaction, processProducer); + + LOGGER.info("[Create Process] %s" + process.uuid()); + + return process; } @Transactional(readOnly = true) @@ -44,8 +56,40 @@ public class TransactionProcessesService { } @Transactional(rollbackFor = Exception.class) - public void revertProcess(UUID uuid) { + public Process revertProcess(UUID uuid) { + Process process = processRepository.findById(uuid); + + if (!process.getStatus().equals(Status.PROCESSED)) { + LOGGER.error("[Revert Process] Process " + uuid + " not finalized successfully, unable to revert"); + throw new UnexpectedValueException( + "Unable to revert process, which is not successfully processed!", + process.toString() + ); + } + + ProcessTransaction processTransaction = processTransactionRepository.findTransactionByProcessId(uuid); + + if (!processTransaction.getType().equals(TransactionType.CROSS_ACCOUNT) || processTransaction.getType().equals(TransactionType.SCHEDULED)) { + LOGGER.error("[Revert Process] Process " + uuid + " not of type CROSS_ACCOUNT/SCHEDULED, unable to revert"); + throw new UnexpectedValueException("Unable to revert transaction not type of CROSS_ACCOUNT or SCHEDULED!"); + } + + Money original = processTransaction.getMoney(); + Money reverted = new Money(original.getAmount().negate(), original.getCurrency()); + Transaction revertingTransaction = new Transaction( + processTransaction.getTarget(), + processTransaction.getSource(), + processTransaction.getType(), + reverted, + String.format("Admin reversal of executed %s transaction {%s}", processTransaction.getType(), uuid) + ); + + ProcessFactory factory = new ProcessFactory(processTransactionRepository, processRepository); + Process revertingProcess = factory.create(revertingTransaction, processProducer); + + LOGGER.info(String.format("[Revert Process] Created new process {%s} in order to revert process {%s}", revertingProcess.uuid(), uuid)); + return revertingProcess; } } diff --git a/transaction-processor/src/main/java/cz/muni/pa165/banking/domain/process/handler/CrossAccountHandler.java b/transaction-processor/src/main/java/cz/muni/pa165/banking/domain/process/handler/CrossAccountHandler.java index b1c8e20056e1155ee65d32bcc5a0156df855d5a6..58ef14865ba18d45f52c7e643a7c6e907a5e50c3 100644 --- a/transaction-processor/src/main/java/cz/muni/pa165/banking/domain/process/handler/CrossAccountHandler.java +++ b/transaction-processor/src/main/java/cz/muni/pa165/banking/domain/process/handler/CrossAccountHandler.java @@ -50,8 +50,8 @@ public class CrossAccountHandler extends ProcessHandler { targetAmount = currencyConverter.convertTo(currency, targetAccountCurrency, targetAmount); } - accountService.publishAccountChange(processTransaction.getUuid(), TransactionType.CROSS_ACCOUNT, sourceAmount, source); - accountService.publishAccountChange(processTransaction.getUuid(), TransactionType.CROSS_ACCOUNT, targetAmount, target); + accountService.publishAccountChange(processTransaction.getUuid(), TransactionType.CROSS_ACCOUNT, sourceAmount, source, processTransaction.getDetail()); + accountService.publishAccountChange(processTransaction.getUuid(), TransactionType.CROSS_ACCOUNT, targetAmount, target, processTransaction.getDetail()); } } diff --git a/transaction-processor/src/main/java/cz/muni/pa165/banking/domain/process/handler/DepositHandler.java b/transaction-processor/src/main/java/cz/muni/pa165/banking/domain/process/handler/DepositHandler.java index f562cdd508d5f9735d6783a2d713998cd1fd748a..469593d837c4036b0bac5e119092ae3530356811 100644 --- a/transaction-processor/src/main/java/cz/muni/pa165/banking/domain/process/handler/DepositHandler.java +++ b/transaction-processor/src/main/java/cz/muni/pa165/banking/domain/process/handler/DepositHandler.java @@ -30,7 +30,7 @@ class DepositHandler extends ProcessHandler { BigDecimal convertedAmount = currencyConverter.convertTo(money.getCurrency(), accountCurrency, money.getAmount()); - accountService.publishAccountChange(processTransaction.getUuid(), TransactionType.DEPOSIT, convertedAmount, account); + accountService.publishAccountChange(processTransaction.getUuid(), TransactionType.DEPOSIT, convertedAmount, account, processTransaction.getDetail()); } } diff --git a/transaction-processor/src/main/java/cz/muni/pa165/banking/domain/process/handler/ScheduledHandler.java b/transaction-processor/src/main/java/cz/muni/pa165/banking/domain/process/handler/ScheduledHandler.java index c03bc5ed4fcdc3027190d7effa2c57eb900467a6..cdf8e167b43f2ef707b12905d9d5e5d924b79779 100644 --- a/transaction-processor/src/main/java/cz/muni/pa165/banking/domain/process/handler/ScheduledHandler.java +++ b/transaction-processor/src/main/java/cz/muni/pa165/banking/domain/process/handler/ScheduledHandler.java @@ -46,8 +46,8 @@ public class ScheduledHandler extends ProcessHandler { targetAmount = currencyConverter.convertTo(currency, targetAccountCurrency, targetAmount); } - accountService.publishAccountChange(processTransaction.getUuid(), TransactionType.SCHEDULED, sourceAmount, source); - accountService.publishAccountChange(processTransaction.getUuid(), TransactionType.SCHEDULED, targetAmount, target); + accountService.publishAccountChange(processTransaction.getUuid(), TransactionType.SCHEDULED, sourceAmount, source, processTransaction.getDetail()); + accountService.publishAccountChange(processTransaction.getUuid(), TransactionType.SCHEDULED, targetAmount, target, processTransaction.getDetail()); } } diff --git a/transaction-processor/src/main/java/cz/muni/pa165/banking/domain/process/handler/WithdrawHandler.java b/transaction-processor/src/main/java/cz/muni/pa165/banking/domain/process/handler/WithdrawHandler.java index f1b49666d791322de4ebf7394d02252ef8219a7d..1accd49f435e873505f73a190e31d85561e05fd6 100644 --- a/transaction-processor/src/main/java/cz/muni/pa165/banking/domain/process/handler/WithdrawHandler.java +++ b/transaction-processor/src/main/java/cz/muni/pa165/banking/domain/process/handler/WithdrawHandler.java @@ -42,7 +42,7 @@ public class WithdrawHandler extends ProcessHandler { BigDecimal convertedAmount = currencyConverter.convertTo(money.getCurrency(), accountCurrency, money.getAmount()); BigDecimal calculatedAmount = convertedAmount.multiply(BigDecimal.valueOf(-1L)); - accountService.publishAccountChange(processTransaction.getUuid(), TransactionType.WITHDRAW, calculatedAmount, account); + accountService.publishAccountChange(processTransaction.getUuid(), TransactionType.WITHDRAW, calculatedAmount, account, processTransaction.getDetail()); } } diff --git a/transaction-processor/src/main/java/cz/muni/pa165/banking/domain/remote/AccountService.java b/transaction-processor/src/main/java/cz/muni/pa165/banking/domain/remote/AccountService.java index 37ebc5d9ef9464705b43946fa18e10199835cd02..010f2731127f4ef98981d9f4f745a227cf1aa6ff 100644 --- a/transaction-processor/src/main/java/cz/muni/pa165/banking/domain/remote/AccountService.java +++ b/transaction-processor/src/main/java/cz/muni/pa165/banking/domain/remote/AccountService.java @@ -30,6 +30,6 @@ public interface AccountService { /** * Publish transaction results to update balance of account within processed transaction */ - void publishAccountChange(UUID processUuid, TransactionType transactionType, BigDecimal amount, Account account); + void publishAccountChange(UUID processUuid, TransactionType transactionType, BigDecimal amount, Account account, String information); } diff --git a/transaction-processor/src/main/resources/openapi.yaml b/transaction-processor/src/main/resources/openapi.yaml index a4ba6e2fdb05c8af2cb2dc5694a455e54db4117e..f28a6e3fd226e1b5f1816b898d9eae49707dc6c4 100644 --- a/transaction-processor/src/main/resources/openapi.yaml +++ b/transaction-processor/src/main/resources/openapi.yaml @@ -54,7 +54,7 @@ paths: required: true responses: '200': - description: xx + description: OK content: application/json: schema: @@ -80,7 +80,11 @@ paths: required: true responses: '200': - description: Process found and reverted changes in account(s) + description: Process found and created new process reverting changes in accounts + content: + application/json: + schema: + $ref: '#/components/schemas/ProcessDto' '400': description: Process found by UUID but not in expected state (PROCESSED) '404':