Skip to content

Commit e786a00

Browse files
committed
exceeding maximum value for single transaction and daily transactions.
1 parent 6276f70 commit e786a00

File tree

9 files changed

+95
-15
lines changed

9 files changed

+95
-15
lines changed

BankApplicationBackend/src/main/java/com/demo/bankapp/configuration/DatabaseMocker.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,14 @@ CommandLineRunner initDatabase(UserRepository repository, UserController userCon
2727
cnuRequest2.setPassword("mert1234");
2828
cnuRequest2.setTcno("23141232212");
2929

30+
CreateNewUserRequest cnuRequest3 = new CreateNewUserRequest();
31+
cnuRequest3.setUsername("Mert3");
32+
cnuRequest3.setPassword("mert12345");
33+
cnuRequest3.setTcno("23141232213");
34+
3035
userController.createNewUser(cnuRequest);
3136
userController.createNewUser(cnuRequest2);
37+
userController.createNewUser(cnuRequest3);
3238
// repository.save(new User("Bilbo Baggins", "burglar", "128185822"));
3339
// repository.save(new User("Frodo Baggins", "thief", "21528582"));
3440
};

BankApplicationBackend/src/main/java/com/demo/bankapp/controller/TransferController.java

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
package com.demo.bankapp.controller;
22

3+
import java.math.BigDecimal;
4+
import java.math.RoundingMode;
5+
import java.util.List;
6+
import java.util.Map;
7+
38
import org.springframework.beans.factory.annotation.Autowired;
49
import org.springframework.hateoas.Resource;
510
import org.springframework.http.MediaType;
@@ -11,6 +16,7 @@
1116

1217
import com.demo.bankapp.assembler.TransferResourceAssembler;
1318
import com.demo.bankapp.exception.BadRequestException;
19+
import com.demo.bankapp.exception.TransactionLimitException;
1420
import com.demo.bankapp.model.Transfer;
1521
import com.demo.bankapp.model.User;
1622
import com.demo.bankapp.request.MakeTransferRequest;
@@ -50,11 +56,23 @@ public Resource<Transfer> makeTransfer(@RequestBody MakeTransferRequest request)
5056
throw new BadRequestException("Invalid TCNo.");
5157
}
5258

53-
if (request.getAmount().signum() == 0 || request.getAmount().signum() == -1) {
59+
if (request.getAmount() == null || request.getAmount().signum() == 0 || request.getAmount().signum() == -1) {
5460
throw new BadRequestException("Please enter a valid amount.");
5561
}
5662

63+
Map<String, Double> currencyRates = wealthService.getCurrencyRates();
64+
65+
BigDecimal singleTransferLimit = new BigDecimal(20000);
66+
BigDecimal tryEquivalent = getTryEquivalent(currencyRates, request.getCurrency(), request.getAmount());
67+
if (tryEquivalent.compareTo(singleTransferLimit) == 1) {
68+
throw new TransactionLimitException("Exceeded Maximum Value Per Transaction.");
69+
}
70+
5771
User senderUser = userService.findByUserName(request.getSenderUsername());
72+
73+
List<Transfer> last24HourTransfers = transferService.findAllTransfersFrom24Hours(senderUser.getId());
74+
checkDailyTransferLimitExceedition(currencyRates, last24HourTransfers, tryEquivalent);
75+
5876
User receiverUser = userService.findByTcno(request.getReceiverTcno());
5977

6078
if (senderUser.equals(receiverUser)) {
@@ -68,4 +86,27 @@ public Resource<Transfer> makeTransfer(@RequestBody MakeTransferRequest request)
6886
return assembler.toResource(transfer);
6987
}
7088

89+
private BigDecimal getTryEquivalent(Map<String, Double> currencyRates, String currency, BigDecimal amount) {
90+
BigDecimal transferCurrRate = new BigDecimal(currencyRates.get(currency));
91+
return amount.divide(transferCurrRate, 9, RoundingMode.HALF_UP);
92+
}
93+
94+
private void checkDailyTransferLimitExceedition(Map<String, Double> currencyRates, List<Transfer> last24HourTransfers, BigDecimal transferTryEquivalent) {
95+
96+
BigDecimal dailyTransferLimit = new BigDecimal(100000);
97+
98+
BigDecimal rate;
99+
BigDecimal tryEquivalent;
100+
for (Transfer transfer : last24HourTransfers) {
101+
rate = new BigDecimal(currencyRates.get(transfer.getCurrency()));
102+
tryEquivalent = transfer.getAmount().divide(rate, 9, RoundingMode.HALF_UP);
103+
104+
transferTryEquivalent = transferTryEquivalent.add(tryEquivalent);
105+
if (transferTryEquivalent.compareTo(dailyTransferLimit) != -1) {
106+
throw new TransactionLimitException("Exceeded Maximum Transaction Value For the Day.");
107+
}
108+
}
109+
110+
}
111+
71112
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.demo.bankapp.exception;
2+
3+
public class TransactionLimitException extends RuntimeException {
4+
5+
public TransactionLimitException(String message) {
6+
super("Transaction Limit: " + message);
7+
}
8+
9+
}

BankApplicationBackend/src/main/java/com/demo/bankapp/exception/configuration/RestExceptionHandler.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import com.demo.bankapp.exception.BadCredentialsException;
2929
import com.demo.bankapp.exception.BadRequestException;
3030
import com.demo.bankapp.exception.InsufficientFundsException;
31+
import com.demo.bankapp.exception.TransactionLimitException;
3132
import com.demo.bankapp.exception.UserNotFoundException;
3233

3334
@ControllerAdvice
@@ -175,6 +176,12 @@ public ResponseEntity<Object> handle(final InsufficientFundsException ex, final
175176
final ApiError apiError = new ApiError(HttpStatus.UNAUTHORIZED, ex.getLocalizedMessage(), "error occurred");
176177
return buildResponseEntity(ex, apiError);
177178
}
179+
180+
@ExceptionHandler({ TransactionLimitException.class })
181+
public ResponseEntity<Object> handle(final TransactionLimitException ex, final WebRequest request) {
182+
final ApiError apiError = new ApiError(HttpStatus.UNAUTHORIZED, ex.getLocalizedMessage(), "error occurred");
183+
return buildResponseEntity(ex, apiError);
184+
}
178185

179186
private ResponseEntity<Object> buildResponseEntity(Exception ex, ApiError apiError) {
180187
logger.info(ex.getClass().getName());
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,18 @@
11
package com.demo.bankapp.repository;
22

3+
import java.util.List;
4+
35
import org.springframework.data.jpa.repository.JpaRepository;
6+
import org.springframework.data.jpa.repository.Query;
7+
import org.springframework.data.repository.query.Param;
48
import org.springframework.data.rest.core.annotation.RepositoryRestResource;
59

610
import com.demo.bankapp.model.Transfer;
711

812
@RepositoryRestResource(exported = false)
913
public interface TransferRepository extends JpaRepository<Transfer, Long> {
1014

15+
@Query(value = "SELECT t FROM Transfer t WHERE t.fromUserId = :userId and t.transferTime >= DATEADD(day, -1, GETDATE())")
16+
List<Transfer> findAllTransfersFrom24Hours(@Param("userId") Long userId);
17+
1118
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
package com.demo.bankapp.service.abstractions;
22

3+
import java.util.List;
4+
35
import com.demo.bankapp.model.Transfer;
46

57
public interface ITransferService {
68

79
Transfer createNewTransfer(Transfer transfer);
10+
11+
List<Transfer> findAllTransfersFrom24Hours(Long userId);
812

913
}

BankApplicationBackend/src/main/java/com/demo/bankapp/service/abstractions/IWealthService.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.demo.bankapp.service.abstractions;
22

33
import java.math.BigDecimal;
4+
import java.util.Map;
45

56
import com.demo.bankapp.model.Wealth;
67

@@ -9,6 +10,8 @@ public interface IWealthService {
910
void newWealthRecord(Long userId);
1011

1112
Wealth findWealth(Long userId);
13+
14+
Map<String, Double> getCurrencyRates();
1215

1316
void makeWealthExchange(Long userId, String currency, BigDecimal amount, boolean isBuying);
1417

BankApplicationBackend/src/main/java/com/demo/bankapp/service/concretions/TransferService.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.demo.bankapp.service.concretions;
22

3+
import java.util.List;
4+
35
import org.springframework.beans.factory.annotation.Autowired;
46
import org.springframework.stereotype.Service;
57

@@ -17,5 +19,10 @@ public class TransferService implements ITransferService {
1719
public Transfer createNewTransfer(Transfer transfer) {
1820
return repository.save(transfer);
1921
}
22+
23+
@Override
24+
public List<Transfer> findAllTransfersFrom24Hours(Long userId) {
25+
return repository.findAllTransfersFrom24Hours(userId);
26+
}
2027

2128
}

BankApplicationBackend/src/main/java/com/demo/bankapp/service/concretions/WealthService.java

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public void makeWealthExchange(Long userId, String currency, BigDecimal amount,
3232
throw new BadRequestException("Invalid currency.");
3333
}
3434

35-
BigDecimal rate = new BigDecimal(getCurrencyRate(currency));
35+
BigDecimal rate = new BigDecimal(getCurrencyRates().get(currency));
3636
BigDecimal tryEquivalent = amount.divide(rate, 9, RoundingMode.HALF_UP);
3737

3838
if (isBuying) {
@@ -86,7 +86,7 @@ public void newWealthRecord(Long userId) {
8686

8787
Map<String, BigDecimal> wealthMap = new HashMap<>();
8888

89-
Map<String, Double> currencyMap = getCurrencyMap();
89+
Map<String, Double> currencyMap = getCurrencyRates();
9090
for (Map.Entry<String, Double> entry : currencyMap.entrySet()) {
9191
wealthMap.put(entry.getKey(), BigDecimal.ZERO);
9292
}
@@ -102,6 +102,14 @@ public Wealth findWealth(Long userId) {
102102
return repository.findById(userId).orElseThrow(() -> new UserNotFoundException());
103103
}
104104

105+
@Override
106+
public Map<String, Double> getCurrencyRates() {
107+
final String uri = "https://api.exchangeratesapi.io/latest?base=TRY";
108+
109+
RestTemplate restTemplate = new RestTemplate();
110+
return ((Map<String, Map<String, Double>>) restTemplate.getForObject(uri, Map.class)).get("rates");
111+
}
112+
105113
private void addInitialBalance(Map<String, BigDecimal> wealthMap) {
106114
String currency = "TRY";
107115

@@ -112,16 +120,4 @@ private void addInitialBalance(Map<String, BigDecimal> wealthMap) {
112120
wealthMap.put(currency, finalAmount);
113121
}
114122

115-
private Map<String, Double> getCurrencyMap() {
116-
final String uri = "https://api.exchangeratesapi.io/latest?base=TRY";
117-
118-
RestTemplate restTemplate = new RestTemplate();
119-
return ((Map<String, Map<String, Double>>) restTemplate.getForObject(uri, Map.class)).get("rates");
120-
}
121-
122-
private double getCurrencyRate(String currency) {
123-
Map<String, Double> currencyMap = getCurrencyMap();
124-
return currencyMap.get(currency);
125-
}
126-
127123
}

0 commit comments

Comments
 (0)