-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathOrderService.java
More file actions
56 lines (45 loc) · 2.33 KB
/
OrderService.java
File metadata and controls
56 lines (45 loc) · 2.33 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
package com.cleanengine.coin.order.application;
import com.cleanengine.coin.order.application.dto.OrderCommand;
import com.cleanengine.coin.order.application.dto.OrderInfo;
import com.cleanengine.coin.order.application.strategy.CreateOrderStrategy;
import jakarta.validation.ConstraintViolation;
import jakarta.validation.ConstraintViolationException;
import jakarta.validation.Validator;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Set;
import static com.cleanengine.coin.common.CommonValues.BUY_ORDER_BOT_ID;
import static com.cleanengine.coin.common.CommonValues.SELL_ORDER_BOT_ID;
@Service
@RequiredArgsConstructor
@Validated
public class OrderService {
private final List<CreateOrderStrategy<?, ?>> createOrderStrategies;
private final Validator validator;
@Transactional(isolation = Isolation.READ_COMMITTED)
public OrderInfo<?> createOrder(OrderCommand.CreateOrder createOrder){
validateCreateOrder(createOrder);
CreateOrderStrategy<?, ?> createOrderStrategy = createOrderStrategies.stream()
.filter(strategy -> strategy.supports(createOrder.isBuyOrder())).findFirst().orElseThrow();
return createOrderStrategy.processCreatingOrder(createOrder);
}
@Transactional(propagation = Propagation.REQUIRES_NEW, isolation = Isolation.READ_COMMITTED)
public void createOrderWithBot(String ticker, Boolean isBuyOrder, Double orderSize, Double price){
Integer userId = isBuyOrder? BUY_ORDER_BOT_ID : SELL_ORDER_BOT_ID;
OrderCommand.CreateOrder createOrder = new OrderCommand.CreateOrder(ticker, userId, isBuyOrder,
false, orderSize, price, LocalDateTime.now(), true);
createOrder(createOrder);
}
protected void validateCreateOrder(OrderCommand.CreateOrder createOrder) {
Set<ConstraintViolation<OrderCommand.CreateOrder>> violations = validator.validate(createOrder);
if (!violations.isEmpty()) {
throw new ConstraintViolationException(violations);
}
}
}