Skip to content

Commit

Permalink
Merge pull request #49 from mohamed-taman/feature/Decompose_Service_l…
Browse files Browse the repository at this point in the history
…ayer_resolves_#46

Feature/decompose service layer resolves #46
  • Loading branch information
mohamed-taman authored Apr 14, 2020
2 parents b47b519 + 6aeef12 commit 766c50d
Show file tree
Hide file tree
Showing 32 changed files with 917 additions and 426 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package com.siriusxi.ms.store.ps.api;

import com.siriusxi.ms.store.api.core.product.ProductEndpoint;
import com.siriusxi.ms.store.api.core.product.ProductService;
import com.siriusxi.ms.store.api.core.product.dto.Product;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.web.bind.annotation.RestController;

/**
* Class <code>ProductController</code> is the implementation of the main Product Endpoint API
* definition.
*
* @see ProductEndpoint
* @author mohamed.taman
* @version v1.0
* @since v3.0 codename Storm
*/
@RestController
@Log4j2
public class ProductController implements ProductEndpoint {

/** Product service business logic interface. */
private final ProductService prodService;

@Autowired
public ProductController(@Qualifier("ProductServiceImpl") ProductService prodService) {
this.prodService = prodService;
}

/** {@inheritDoc} */
@Override
public Product getProduct(int id) {
return prodService.getProduct(id);
}

/** {@inheritDoc} */
@Override
public Product createProduct(Product body) {
return prodService.createProduct(body);
}

/** {@inheritDoc} */
@Override
public void deleteProduct(int id) {
prodService.deleteProduct(id);
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.siriusxi.ms.store.ps.controller;
package com.siriusxi.ms.store.ps.service;

import com.siriusxi.ms.store.api.core.product.Product;
import com.siriusxi.ms.store.api.core.product.dto.Product;
import com.siriusxi.ms.store.ps.persistence.ProductEntity;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.siriusxi.ms.store.ps.controller;
package com.siriusxi.ms.store.ps.service;

import com.mongodb.DuplicateKeyException;
import com.siriusxi.ms.store.api.core.product.Product;
import com.siriusxi.ms.store.api.core.product.dto.Product;
import com.siriusxi.ms.store.api.core.product.ProductService;
import com.siriusxi.ms.store.ps.persistence.ProductEntity;
import com.siriusxi.ms.store.ps.persistence.ProductRepository;
Expand All @@ -10,9 +10,9 @@
import com.siriusxi.ms.store.util.http.ServiceUtil;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.stereotype.Service;

@RestController
@Service("ProductServiceImpl")
@Log4j2
public class ProductServiceImpl implements ProductService {

Expand Down Expand Up @@ -60,6 +60,10 @@ public Product getProduct(int productId) {
return response;
}

/*
Implementation is idempotent, that is,
it will not report any failure if the entity is not found Always 200
*/
@Override
public void deleteProduct(int productId) {
log.debug("deleteProduct: tries to delete an entity with productId: {}", productId);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
package com.siriusxi.ms.store.ps;

import com.siriusxi.ms.store.api.core.product.Product;
import com.siriusxi.ms.store.ps.controller.ProductMapper;
import com.siriusxi.ms.store.api.core.product.dto.Product;
import com.siriusxi.ms.store.ps.service.ProductMapper;
import com.siriusxi.ms.store.ps.persistence.ProductEntity;
import org.junit.jupiter.api.Test;

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

public class MapperTests {

private final ProductMapper mapper = ProductMapper.INSTANCE;
private final ProductMapper mapper = ProductMapper.INSTANCE;

@Test
public void mapperTests() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.siriusxi.ms.store.ps;

import com.siriusxi.ms.store.api.core.product.Product;
import com.siriusxi.ms.store.api.core.product.dto.Product;
import com.siriusxi.ms.store.ps.persistence.ProductRepository;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Disabled;
Expand Down Expand Up @@ -33,7 +33,6 @@ public void setupDb() {
repository.deleteAll();
}


@Test
public void getProductById() {

Expand Down Expand Up @@ -70,10 +69,10 @@ public void deleteProduct() {
postAndVerifyProduct(productId, OK);
assertTrue(repository.findByProductId(productId).isPresent());

deleteAndVerifyProduct(productId, OK);
deleteAndVerifyProduct(productId);
assertFalse(repository.findByProductId(productId).isPresent());

deleteAndVerifyProduct(productId, OK);
deleteAndVerifyProduct(productId);
}

@Test
Expand Down Expand Up @@ -130,12 +129,12 @@ private WebTestClient.BodyContentSpec postAndVerifyProduct(int productId, HttpSt
.expectBody();
}

private WebTestClient.BodyContentSpec deleteAndVerifyProduct(int productId, HttpStatus expectedStatus) {
return client.delete()
private void deleteAndVerifyProduct(int productId) {
client.delete()
.uri(BASE_URI + productId)
.accept(APPLICATION_JSON)
.exchange()
.expectStatus().isEqualTo(expectedStatus)
.expectStatus().isEqualTo(OK)
.expectBody();
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package com.siriusxi.ms.store.rs.api;

import com.siriusxi.ms.store.api.core.recommendation.RecommendationEndpoint;
import com.siriusxi.ms.store.api.core.recommendation.RecommendationService;
import com.siriusxi.ms.store.api.core.recommendation.dto.Recommendation;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
* Class <code>RecommendationController</code> is the implementation of the main Recommendation
* Endpoint API definition.
*
* @see RecommendationEndpoint
* @author mohamed.taman
* @version v1.0
* @since v3.0 codename Storm
*/
@RestController
@Log4j2
public class RecommendationController implements RecommendationEndpoint {
/** Recommendation service business logic interface. */
private final RecommendationService recommendationService;

@Autowired
public RecommendationController(
@Qualifier("RecommendationServiceImpl") RecommendationService recommendationService) {
this.recommendationService = recommendationService;
}

/** {@inheritDoc} */
@Override
public List<Recommendation> getRecommendations(int productId) {
return recommendationService.getRecommendations(productId);
}

/** {@inheritDoc} */
@Override
public Recommendation createRecommendation(Recommendation body) {
return recommendationService.createRecommendation(body);
}

/** {@inheritDoc} */
@Override
public void deleteRecommendations(int productId) {
recommendationService.deleteRecommendations(productId);
}
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.siriusxi.ms.store.rs.controller;
package com.siriusxi.ms.store.rs.service;

import com.siriusxi.ms.store.api.core.recommendation.Recommendation;
import com.siriusxi.ms.store.api.core.recommendation.dto.Recommendation;
import com.siriusxi.ms.store.rs.persistence.RecommendationEntity;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
package com.siriusxi.ms.store.rs.service;

import com.mongodb.DuplicateKeyException;

import com.siriusxi.ms.store.api.core.recommendation.RecommendationService;
import com.siriusxi.ms.store.api.core.recommendation.dto.Recommendation;
import com.siriusxi.ms.store.rs.persistence.RecommendationEntity;
import com.siriusxi.ms.store.rs.persistence.RecommendationRepository;
import com.siriusxi.ms.store.util.exceptions.InvalidInputException;
import com.siriusxi.ms.store.util.http.ServiceUtil;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service("RecommendationServiceImpl")
@Log4j2
public class RecommendationServiceImpl implements RecommendationService {

private final RecommendationRepository repository;

private final RecommendationMapper mapper;

private final ServiceUtil serviceUtil;

@Autowired
public RecommendationServiceImpl(
RecommendationRepository repository, RecommendationMapper mapper, ServiceUtil serviceUtil) {
this.repository = repository;
this.mapper = mapper;
this.serviceUtil = serviceUtil;
}

@Override
public Recommendation createRecommendation(Recommendation body) {
try {
RecommendationEntity entity = mapper.apiToEntity(body);
RecommendationEntity newEntity = repository.save(entity);

log.debug(
"createRecommendation: created a recommendation entity: {}/{}",
body.getProductId(),
body.getRecommendationId());

return mapper.entityToApi(newEntity);

} catch (DuplicateKeyException dke) {
throw new InvalidInputException(
"Duplicate key, Product Id: "
+ body.getProductId()
+ ", Recommendation Id:"
+ body.getRecommendationId());
}
}

@Override
public List<Recommendation> getRecommendations(int productId) {

if (productId < 1) throw new InvalidInputException("Invalid productId: " + productId);

List<RecommendationEntity> entityList = repository.findByProductId(productId);
List<Recommendation> list = mapper.entityListToApiList(entityList);
list.forEach(e -> e.setServiceAddress(serviceUtil.getServiceAddress()));

log.debug("getRecommendations: response size: {}", list.size());

return list;
}

@Override
public void deleteRecommendations(int productId) {
log.debug(
"deleteRecommendations: tries to delete recommendations for the product with "
+ "productId: {}",
productId);
repository.deleteAll(repository.findByProductId(productId));
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.siriusxi.ms.store.rs;

import com.siriusxi.ms.store.api.core.recommendation.Recommendation;
import com.siriusxi.ms.store.rs.controller.RecommendationMapper;
import com.siriusxi.ms.store.api.core.recommendation.dto.Recommendation;
import com.siriusxi.ms.store.rs.service.RecommendationMapper;
import com.siriusxi.ms.store.rs.persistence.RecommendationEntity;
import org.junit.jupiter.api.Test;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.siriusxi.ms.store.rs;

import com.siriusxi.ms.store.api.core.recommendation.Recommendation;
import com.siriusxi.ms.store.api.core.recommendation.dto.Recommendation;
import com.siriusxi.ms.store.rs.persistence.RecommendationRepository;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Disabled;
Expand Down
Loading

0 comments on commit 766c50d

Please sign in to comment.