Skip to content

Commit 766c50d

Browse files
Merge pull request #49 from mohamed-taman/feature/Decompose_Service_layer_resolves_#46
Feature/decompose service layer resolves #46
2 parents b47b519 + 6aeef12 commit 766c50d

File tree

32 files changed

+917
-426
lines changed

32 files changed

+917
-426
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package com.siriusxi.ms.store.ps.api;
2+
3+
import com.siriusxi.ms.store.api.core.product.ProductEndpoint;
4+
import com.siriusxi.ms.store.api.core.product.ProductService;
5+
import com.siriusxi.ms.store.api.core.product.dto.Product;
6+
import lombok.extern.log4j.Log4j2;
7+
import org.springframework.beans.factory.annotation.Autowired;
8+
import org.springframework.beans.factory.annotation.Qualifier;
9+
import org.springframework.web.bind.annotation.RestController;
10+
11+
/**
12+
* Class <code>ProductController</code> is the implementation of the main Product Endpoint API
13+
* definition.
14+
*
15+
* @see ProductEndpoint
16+
* @author mohamed.taman
17+
* @version v1.0
18+
* @since v3.0 codename Storm
19+
*/
20+
@RestController
21+
@Log4j2
22+
public class ProductController implements ProductEndpoint {
23+
24+
/** Product service business logic interface. */
25+
private final ProductService prodService;
26+
27+
@Autowired
28+
public ProductController(@Qualifier("ProductServiceImpl") ProductService prodService) {
29+
this.prodService = prodService;
30+
}
31+
32+
/** {@inheritDoc} */
33+
@Override
34+
public Product getProduct(int id) {
35+
return prodService.getProduct(id);
36+
}
37+
38+
/** {@inheritDoc} */
39+
@Override
40+
public Product createProduct(Product body) {
41+
return prodService.createProduct(body);
42+
}
43+
44+
/** {@inheritDoc} */
45+
@Override
46+
public void deleteProduct(int id) {
47+
prodService.deleteProduct(id);
48+
}
49+
}

product-service/src/main/java/com/siriusxi/ms/store/ps/controller/ProductMapper.java renamed to product-service/src/main/java/com/siriusxi/ms/store/ps/service/ProductMapper.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
package com.siriusxi.ms.store.ps.controller;
1+
package com.siriusxi.ms.store.ps.service;
22

3-
import com.siriusxi.ms.store.api.core.product.Product;
3+
import com.siriusxi.ms.store.api.core.product.dto.Product;
44
import com.siriusxi.ms.store.ps.persistence.ProductEntity;
55
import org.mapstruct.Mapper;
66
import org.mapstruct.Mapping;

product-service/src/main/java/com/siriusxi/ms/store/ps/controller/ProductServiceImpl.java renamed to product-service/src/main/java/com/siriusxi/ms/store/ps/service/ProductServiceImpl.java

+8-4
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
package com.siriusxi.ms.store.ps.controller;
1+
package com.siriusxi.ms.store.ps.service;
22

33
import com.mongodb.DuplicateKeyException;
4-
import com.siriusxi.ms.store.api.core.product.Product;
4+
import com.siriusxi.ms.store.api.core.product.dto.Product;
55
import com.siriusxi.ms.store.api.core.product.ProductService;
66
import com.siriusxi.ms.store.ps.persistence.ProductEntity;
77
import com.siriusxi.ms.store.ps.persistence.ProductRepository;
@@ -10,9 +10,9 @@
1010
import com.siriusxi.ms.store.util.http.ServiceUtil;
1111
import lombok.extern.log4j.Log4j2;
1212
import org.springframework.beans.factory.annotation.Autowired;
13-
import org.springframework.web.bind.annotation.RestController;
13+
import org.springframework.stereotype.Service;
1414

15-
@RestController
15+
@Service("ProductServiceImpl")
1616
@Log4j2
1717
public class ProductServiceImpl implements ProductService {
1818

@@ -60,6 +60,10 @@ public Product getProduct(int productId) {
6060
return response;
6161
}
6262

63+
/*
64+
Implementation is idempotent, that is,
65+
it will not report any failure if the entity is not found Always 200
66+
*/
6367
@Override
6468
public void deleteProduct(int productId) {
6569
log.debug("deleteProduct: tries to delete an entity with productId: {}", productId);

product-service/src/test/java/com/siriusxi/ms/store/ps/MapperTests.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
package com.siriusxi.ms.store.ps;
22

3-
import com.siriusxi.ms.store.api.core.product.Product;
4-
import com.siriusxi.ms.store.ps.controller.ProductMapper;
3+
import com.siriusxi.ms.store.api.core.product.dto.Product;
4+
import com.siriusxi.ms.store.ps.service.ProductMapper;
55
import com.siriusxi.ms.store.ps.persistence.ProductEntity;
66
import org.junit.jupiter.api.Test;
77

88
import static org.junit.jupiter.api.Assertions.*;
99

1010
public class MapperTests {
1111

12-
private final ProductMapper mapper = ProductMapper.INSTANCE;
12+
private final ProductMapper mapper = ProductMapper.INSTANCE;
1313

1414
@Test
1515
public void mapperTests() {

product-service/src/test/java/com/siriusxi/ms/store/ps/ProductServiceApplicationTests.java

+6-7
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package com.siriusxi.ms.store.ps;
22

3-
import com.siriusxi.ms.store.api.core.product.Product;
3+
import com.siriusxi.ms.store.api.core.product.dto.Product;
44
import com.siriusxi.ms.store.ps.persistence.ProductRepository;
55
import org.junit.jupiter.api.BeforeEach;
66
import org.junit.jupiter.api.Disabled;
@@ -33,7 +33,6 @@ public void setupDb() {
3333
repository.deleteAll();
3434
}
3535

36-
3736
@Test
3837
public void getProductById() {
3938

@@ -70,10 +69,10 @@ public void deleteProduct() {
7069
postAndVerifyProduct(productId, OK);
7170
assertTrue(repository.findByProductId(productId).isPresent());
7271

73-
deleteAndVerifyProduct(productId, OK);
72+
deleteAndVerifyProduct(productId);
7473
assertFalse(repository.findByProductId(productId).isPresent());
7574

76-
deleteAndVerifyProduct(productId, OK);
75+
deleteAndVerifyProduct(productId);
7776
}
7877

7978
@Test
@@ -130,12 +129,12 @@ private WebTestClient.BodyContentSpec postAndVerifyProduct(int productId, HttpSt
130129
.expectBody();
131130
}
132131

133-
private WebTestClient.BodyContentSpec deleteAndVerifyProduct(int productId, HttpStatus expectedStatus) {
134-
return client.delete()
132+
private void deleteAndVerifyProduct(int productId) {
133+
client.delete()
135134
.uri(BASE_URI + productId)
136135
.accept(APPLICATION_JSON)
137136
.exchange()
138-
.expectStatus().isEqualTo(expectedStatus)
137+
.expectStatus().isEqualTo(OK)
139138
.expectBody();
140139
}
141140

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package com.siriusxi.ms.store.rs.api;
2+
3+
import com.siriusxi.ms.store.api.core.recommendation.RecommendationEndpoint;
4+
import com.siriusxi.ms.store.api.core.recommendation.RecommendationService;
5+
import com.siriusxi.ms.store.api.core.recommendation.dto.Recommendation;
6+
import lombok.extern.log4j.Log4j2;
7+
import org.springframework.beans.factory.annotation.Autowired;
8+
import org.springframework.beans.factory.annotation.Qualifier;
9+
import org.springframework.web.bind.annotation.RestController;
10+
11+
import java.util.List;
12+
13+
/**
14+
* Class <code>RecommendationController</code> is the implementation of the main Recommendation
15+
* Endpoint API definition.
16+
*
17+
* @see RecommendationEndpoint
18+
* @author mohamed.taman
19+
* @version v1.0
20+
* @since v3.0 codename Storm
21+
*/
22+
@RestController
23+
@Log4j2
24+
public class RecommendationController implements RecommendationEndpoint {
25+
/** Recommendation service business logic interface. */
26+
private final RecommendationService recommendationService;
27+
28+
@Autowired
29+
public RecommendationController(
30+
@Qualifier("RecommendationServiceImpl") RecommendationService recommendationService) {
31+
this.recommendationService = recommendationService;
32+
}
33+
34+
/** {@inheritDoc} */
35+
@Override
36+
public List<Recommendation> getRecommendations(int productId) {
37+
return recommendationService.getRecommendations(productId);
38+
}
39+
40+
/** {@inheritDoc} */
41+
@Override
42+
public Recommendation createRecommendation(Recommendation body) {
43+
return recommendationService.createRecommendation(body);
44+
}
45+
46+
/** {@inheritDoc} */
47+
@Override
48+
public void deleteRecommendations(int productId) {
49+
recommendationService.deleteRecommendations(productId);
50+
}
51+
}

recommendation-service/src/main/java/com/siriusxi/ms/store/rs/controller/RecommendationServiceImpl.java

-73
This file was deleted.
+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
package com.siriusxi.ms.store.rs.controller;
1+
package com.siriusxi.ms.store.rs.service;
22

3-
import com.siriusxi.ms.store.api.core.recommendation.Recommendation;
3+
import com.siriusxi.ms.store.api.core.recommendation.dto.Recommendation;
44
import com.siriusxi.ms.store.rs.persistence.RecommendationEntity;
55
import org.mapstruct.Mapper;
66
import org.mapstruct.Mapping;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
package com.siriusxi.ms.store.rs.service;
2+
3+
import com.mongodb.DuplicateKeyException;
4+
5+
import com.siriusxi.ms.store.api.core.recommendation.RecommendationService;
6+
import com.siriusxi.ms.store.api.core.recommendation.dto.Recommendation;
7+
import com.siriusxi.ms.store.rs.persistence.RecommendationEntity;
8+
import com.siriusxi.ms.store.rs.persistence.RecommendationRepository;
9+
import com.siriusxi.ms.store.util.exceptions.InvalidInputException;
10+
import com.siriusxi.ms.store.util.http.ServiceUtil;
11+
import lombok.extern.log4j.Log4j2;
12+
import org.springframework.beans.factory.annotation.Autowired;
13+
import org.springframework.stereotype.Service;
14+
15+
import java.util.List;
16+
17+
@Service("RecommendationServiceImpl")
18+
@Log4j2
19+
public class RecommendationServiceImpl implements RecommendationService {
20+
21+
private final RecommendationRepository repository;
22+
23+
private final RecommendationMapper mapper;
24+
25+
private final ServiceUtil serviceUtil;
26+
27+
@Autowired
28+
public RecommendationServiceImpl(
29+
RecommendationRepository repository, RecommendationMapper mapper, ServiceUtil serviceUtil) {
30+
this.repository = repository;
31+
this.mapper = mapper;
32+
this.serviceUtil = serviceUtil;
33+
}
34+
35+
@Override
36+
public Recommendation createRecommendation(Recommendation body) {
37+
try {
38+
RecommendationEntity entity = mapper.apiToEntity(body);
39+
RecommendationEntity newEntity = repository.save(entity);
40+
41+
log.debug(
42+
"createRecommendation: created a recommendation entity: {}/{}",
43+
body.getProductId(),
44+
body.getRecommendationId());
45+
46+
return mapper.entityToApi(newEntity);
47+
48+
} catch (DuplicateKeyException dke) {
49+
throw new InvalidInputException(
50+
"Duplicate key, Product Id: "
51+
+ body.getProductId()
52+
+ ", Recommendation Id:"
53+
+ body.getRecommendationId());
54+
}
55+
}
56+
57+
@Override
58+
public List<Recommendation> getRecommendations(int productId) {
59+
60+
if (productId < 1) throw new InvalidInputException("Invalid productId: " + productId);
61+
62+
List<RecommendationEntity> entityList = repository.findByProductId(productId);
63+
List<Recommendation> list = mapper.entityListToApiList(entityList);
64+
list.forEach(e -> e.setServiceAddress(serviceUtil.getServiceAddress()));
65+
66+
log.debug("getRecommendations: response size: {}", list.size());
67+
68+
return list;
69+
}
70+
71+
@Override
72+
public void deleteRecommendations(int productId) {
73+
log.debug(
74+
"deleteRecommendations: tries to delete recommendations for the product with "
75+
+ "productId: {}",
76+
productId);
77+
repository.deleteAll(repository.findByProductId(productId));
78+
}
79+
}

recommendation-service/src/test/java/com/siriusxi/ms/store/rs/MapperTests.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.siriusxi.ms.store.rs;
22

3-
import com.siriusxi.ms.store.api.core.recommendation.Recommendation;
4-
import com.siriusxi.ms.store.rs.controller.RecommendationMapper;
3+
import com.siriusxi.ms.store.api.core.recommendation.dto.Recommendation;
4+
import com.siriusxi.ms.store.rs.service.RecommendationMapper;
55
import com.siriusxi.ms.store.rs.persistence.RecommendationEntity;
66
import org.junit.jupiter.api.Test;
77

recommendation-service/src/test/java/com/siriusxi/ms/store/rs/RecommendationServiceApplicationTests.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package com.siriusxi.ms.store.rs;
22

3-
import com.siriusxi.ms.store.api.core.recommendation.Recommendation;
3+
import com.siriusxi.ms.store.api.core.recommendation.dto.Recommendation;
44
import com.siriusxi.ms.store.rs.persistence.RecommendationRepository;
55
import org.junit.jupiter.api.BeforeEach;
66
import org.junit.jupiter.api.Disabled;

0 commit comments

Comments
 (0)