Skip to content

Commit de7c1b5

Browse files
author
Sorin Zamfir
committed
BAEL-3777: Working version
1 parent 7766e43 commit de7c1b5

File tree

10 files changed

+280
-7
lines changed

10 files changed

+280
-7
lines changed

ddd/src/main/java/com/baeldung/dddhexagonalspring/domain/Order.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import java.util.ArrayList;
55
import java.util.Collections;
66
import java.util.List;
7+
import java.util.Objects;
78
import java.util.UUID;
89

910
public class Order {
@@ -77,6 +78,22 @@ public List<OrderItem> getOrderItems() {
7778
return Collections.unmodifiableList(orderItems);
7879
}
7980

81+
82+
@Override
83+
public int hashCode() {
84+
return Objects.hash(id, orderItems, price, status);
85+
}
86+
87+
@Override
88+
public boolean equals(Object obj) {
89+
if (this == obj)
90+
return true;
91+
if (!(obj instanceof Order))
92+
return false;
93+
Order other = (Order) obj;
94+
return Objects.equals(id, other.id) && Objects.equals(orderItems, other.orderItems) && Objects.equals(price, other.price) && status == other.status;
95+
}
96+
8097
private Order() {
8198
}
8299
}

ddd/src/main/java/com/baeldung/dddhexagonalspring/infrastracture/repository/CassandraDbOrderRepository.java

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,31 +4,36 @@
44
import java.util.UUID;
55

66
import org.springframework.beans.factory.annotation.Autowired;
7+
import org.springframework.context.annotation.Primary;
78
import org.springframework.stereotype.Component;
89

910
import com.baeldung.dddhexagonalspring.domain.Order;
1011
import com.baeldung.dddhexagonalspring.domain.repository.OrderRepository;
1112

1213
@Component
14+
@Primary
1315
public class CassandraDbOrderRepository implements OrderRepository {
1416

1517
private final SpringDataCassandraOrderRepository orderRepository;
16-
18+
1719
@Autowired
1820
public CassandraDbOrderRepository(SpringDataCassandraOrderRepository orderRepository) {
1921
this.orderRepository = orderRepository;
2022
}
2123

2224
@Override
2325
public Optional<Order> findById(UUID id) {
24-
// TODO Auto-generated method stub
25-
return null;
26+
Optional<OrderEntity> orderEntity = orderRepository.findById(id);
27+
if (orderEntity.isPresent()) {
28+
return Optional.of(orderEntity.get().toOrder());
29+
} else {
30+
return Optional.empty();
31+
}
2632
}
2733

2834
@Override
2935
public void save(Order order) {
30-
// TODO Auto-generated method stub
31-
36+
orderRepository.save(new OrderEntity(order));
3237
}
3338

3439
}

ddd/src/main/java/com/baeldung/dddhexagonalspring/infrastracture/repository/MongoDbOrderRepository.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
import java.util.UUID;
1111

1212
@Component
13-
@Primary
1413
public class MongoDbOrderRepository implements OrderRepository {
1514

1615
private final SpringDataMongoOrderRepository orderRepository;
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
package com.baeldung.dddhexagonalspring.infrastracture.repository;
2+
3+
import java.math.BigDecimal;
4+
import java.util.List;
5+
import java.util.UUID;
6+
import java.util.stream.Collectors;
7+
8+
import org.springframework.data.cassandra.core.mapping.PrimaryKey;
9+
10+
import com.baeldung.dddhexagonalspring.domain.Order;
11+
import com.baeldung.dddhexagonalspring.domain.OrderItem;
12+
import com.baeldung.dddhexagonalspring.domain.OrderStatus;
13+
import com.baeldung.dddhexagonalspring.domain.Product;
14+
15+
public class OrderEntity {
16+
17+
@PrimaryKey
18+
private UUID id;
19+
private OrderStatus status;
20+
private List<OrderItemEntity> orderItemEntities;
21+
private BigDecimal price;
22+
23+
public OrderEntity(UUID id, OrderStatus status, List<OrderItemEntity> orderItemEntities, BigDecimal price) {
24+
this.id = id;
25+
this.status = status;
26+
this.orderItemEntities = orderItemEntities;
27+
this.price = price;
28+
}
29+
30+
public OrderEntity() {
31+
}
32+
33+
public OrderEntity(Order order) {
34+
this.id = order.getId();
35+
this.price = order.getPrice();
36+
this.status = order.getStatus();
37+
this.orderItemEntities = order.getOrderItems()
38+
.stream()
39+
.map(OrderItemEntity::new)
40+
.collect(Collectors.toList());
41+
42+
}
43+
44+
public Order toOrder() {
45+
List<OrderItem> orderItems = orderItemEntities.stream()
46+
.map(OrderItemEntity::toOrderItem)
47+
.collect(Collectors.toList());
48+
List<Product> namelessProducts = orderItems.stream()
49+
.map(orderItem -> new Product(orderItem.getProductId(), orderItem.getPrice(), ""))
50+
.collect(Collectors.toList());
51+
Order order = new Order(id, namelessProducts.remove(0));
52+
namelessProducts.forEach(product -> order.addOrder(product));
53+
if (status == OrderStatus.COMPLETED) {
54+
order.complete();
55+
}
56+
return order;
57+
}
58+
59+
public UUID getId() {
60+
return id;
61+
}
62+
63+
public OrderStatus getStatus() {
64+
return status;
65+
}
66+
67+
public List<OrderItemEntity> getOrderItems() {
68+
return orderItemEntities;
69+
}
70+
71+
public BigDecimal getPrice() {
72+
return price;
73+
}
74+
75+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package com.baeldung.dddhexagonalspring.infrastracture.repository;
2+
3+
import java.math.BigDecimal;
4+
import java.util.UUID;
5+
6+
import org.springframework.data.cassandra.core.mapping.UserDefinedType;
7+
8+
import com.baeldung.dddhexagonalspring.domain.OrderItem;
9+
import com.baeldung.dddhexagonalspring.domain.Product;
10+
11+
@UserDefinedType
12+
public class OrderItemEntity {
13+
14+
private UUID productId;
15+
private BigDecimal price;
16+
17+
public OrderItemEntity() {
18+
}
19+
20+
public OrderItemEntity(final OrderItem orderItem) {
21+
this.productId = orderItem.getProductId();
22+
this.price = orderItem.getPrice();
23+
}
24+
25+
public OrderItem toOrderItem() {
26+
return new OrderItem(new Product(productId, price, ""));
27+
}
28+
29+
public UUID getProductId() {
30+
return productId;
31+
}
32+
33+
public void setProductId(UUID productId) {
34+
this.productId = productId;
35+
}
36+
37+
public BigDecimal getPrice() {
38+
return price;
39+
}
40+
41+
public void setPrice(BigDecimal price) {
42+
this.price = price;
43+
}
44+
}

ddd/src/main/java/com/baeldung/dddhexagonalspring/infrastracture/repository/SpringDataCassandraOrderRepository.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,6 @@
88
import com.baeldung.dddhexagonalspring.domain.Order;
99

1010
@Repository
11-
public interface SpringDataCassandraOrderRepository extends CassandraRepository<Order, UUID>{
11+
public interface SpringDataCassandraOrderRepository extends CassandraRepository<OrderEntity, UUID>{
1212

1313
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package com.baeldung.dddhexagonalspring.infrastracture.repository;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
5+
import java.math.BigDecimal;
6+
import java.util.Optional;
7+
import java.util.UUID;
8+
9+
import org.junit.After;
10+
import org.junit.jupiter.api.Test;
11+
import org.springframework.beans.factory.annotation.Autowired;
12+
import org.springframework.boot.test.context.SpringBootTest;
13+
import org.springframework.test.context.TestPropertySource;
14+
import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
15+
16+
import com.baeldung.dddhexagonalspring.domain.Order;
17+
import com.baeldung.dddhexagonalspring.domain.Product;
18+
import com.baeldung.dddhexagonalspring.domain.repository.OrderRepository;
19+
20+
@SpringJUnitConfig
21+
@SpringBootTest
22+
@TestPropertySource("classpath:ddd-layers-test.properties")
23+
class CassandraDbOrderRepositoryIntegrationTest {
24+
25+
@Autowired
26+
private SpringDataCassandraOrderRepository cassandraOrderRepository;
27+
28+
@Autowired
29+
private OrderRepository orderRepository;
30+
31+
@After
32+
void cleanUp(){
33+
cassandraOrderRepository.deleteAll();
34+
}
35+
36+
@Test
37+
void shouldFindById_thenReturnOrder() {
38+
39+
// given
40+
final UUID id = UUID.randomUUID();
41+
final Order order = createOrder(id);
42+
order.complete();
43+
44+
// when
45+
orderRepository.save(order);
46+
47+
final Optional<Order> result = orderRepository.findById(id);
48+
49+
assertEquals(order, result.get());
50+
}
51+
52+
private Order createOrder(UUID id) {
53+
return new Order(id, new Product(UUID.randomUUID(), BigDecimal.TEN, "product"));
54+
}
55+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package com.baeldung.dddhexagonalspring.infrastracture.repository;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
5+
import java.math.BigDecimal;
6+
import java.util.Optional;
7+
import java.util.UUID;
8+
9+
import org.junit.After;
10+
import org.junit.jupiter.api.Test;
11+
import org.springframework.beans.factory.annotation.Autowired;
12+
import org.springframework.boot.test.context.SpringBootTest;
13+
import org.springframework.test.context.TestPropertySource;
14+
import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
15+
16+
import com.baeldung.dddhexagonalspring.domain.Order;
17+
import com.baeldung.dddhexagonalspring.domain.Product;
18+
import com.baeldung.dddhexagonalspring.domain.repository.OrderRepository;
19+
20+
@SpringJUnitConfig
21+
@SpringBootTest
22+
@TestPropertySource("classpath:ddd-layers-test.properties")
23+
class MongoDbOrderRepositoryIntegrationTest {
24+
25+
@Autowired
26+
private SpringDataMongoOrderRepository mongoOrderRepository;
27+
28+
@Autowired
29+
private OrderRepository orderRepository;
30+
31+
@After
32+
void cleanUp(){
33+
mongoOrderRepository.deleteAll();
34+
}
35+
36+
@Test
37+
void shouldFindById_thenReturnOrder() {
38+
39+
// given
40+
final UUID id = UUID.randomUUID();
41+
final Order order = createOrder(id);
42+
43+
// when
44+
orderRepository.save(order);
45+
46+
final Optional<Order> result = orderRepository.findById(id);
47+
48+
assertEquals(order, result.get());
49+
}
50+
51+
private Order createOrder(UUID id) {
52+
return new Order(id, new Product(UUID.randomUUID(), BigDecimal.TEN, "product"));
53+
}
54+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
CREATE KEYSPACE IF NOT exists order_database
2+
WITH replication = {'class':'SimpleStrategy', 'replication_factor':1};
3+
4+
CREATE TYPE order_database.orderitementity (productid uuid, price decimal);
5+
6+
CREATE TABLE order_database.orderentity(
7+
id uuid,
8+
status text,
9+
orderitementities list<frozen<orderitementity>>,
10+
price decimal,
11+
primary key(id)
12+
);
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongoAutoConfiguration
2+
spring.data.mongodb.host=127.0.0.1
3+
spring.data.mongodb.port=27017
4+
spring.data.mongodb.database=order-database
5+
spring.data.mongodb.username=order
6+
spring.data.mongodb.password=order
7+
8+
spring.data.cassandra.keyspaceName=order_database
9+
spring.data.cassandra.username=cassandra
10+
spring.data.cassandra.password=cassandra
11+
spring.data.cassandra.contactPoints=127.0.0.1
12+
spring.data.cassandra.port=9042

0 commit comments

Comments
 (0)