Commit cd29ffe2 authored by John Lam's avatar John Lam

Merge branch 'AFP-64' into dev

parents 8034f326 cf3f015f
......@@ -31,3 +31,4 @@ build/
### VS Code ###
.vscode/
/src/main/resources/secret.properties
......@@ -29,7 +29,11 @@
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
......
package com.nisum.ascend.promotions.controller;
import com.nisum.ascend.promotions.dto.PromotionDto;
import com.nisum.ascend.promotions.model.Promotion;
import com.nisum.ascend.promotions.repository.PromotionRepository;
import com.nisum.ascend.promotions.service.PromotionService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import java.util.ArrayList;
@RestController
@RequestMapping("/api/promos")
......@@ -12,4 +18,42 @@ public class PromotionsController {
@Autowired
PromotionService promotionService;
@GetMapping()
public ResponseEntity<Flux<PromotionDto>> getAllPromotions(@RequestParam(required = false) String sku){
if (sku != null){
return ResponseEntity.ok(promotionService.findPromotionsByProductSku(sku));
}
else return ResponseEntity.ok(promotionService.findAll());
}
@GetMapping("/{id}")
public Mono<ResponseEntity<PromotionDto>> getPromotionById(@PathVariable String id){
//TODO: get promo by ID
return null;
}
@PostMapping()
public Mono<ResponseEntity<PromotionDto>> createPromotion(@RequestBody Promotion newPromotion){
//TODO: create promotion
return null;
}
@PostMapping("/bulkSearch")
public Flux<ResponseEntity<PromotionDto>> bulkSearchPromotionsByItemSku(){
//TODO: bulk search by list of item SKUs
return null;
}
@PutMapping("/{promoId}")
public Mono<ResponseEntity<PromotionDto>> updatePromotionById(@PathVariable String promoId, @RequestBody Promotion newPromotion){
//TODO: update promotion
return null;
}
@DeleteMapping("/{promoId}")
public Mono<ResponseEntity<PromotionDto>> deletePromotionById(@PathVariable String promoId){
//TODO: delete promotion
return null;
}
}
package com.nisum.ascend.promotions.dto;
import com.nisum.ascend.promotions.model.Promotion;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public class PromotionDto {
private String promotionId;
private String productSku;
private float discountPercentage;
private int minimumQuantity;
public static PromotionDto generateDtoFromPromotion(Promotion p) {
return new PromotionDto(p.getPromotionId(), p.getProductSku(), p.getDiscountPercentage(),
p.getMinimumQuantity());
}
public PromotionDto() {}
}
......@@ -8,7 +8,7 @@ import org.springframework.data.mongodb.core.mapping.Document;
@Getter
@Setter
@Document
@Document(collection="promotions")
public class Promotion {
@Id
private String id;
......
......@@ -4,7 +4,9 @@ package com.nisum.ascend.promotions.repository;
import com.nisum.ascend.promotions.model.Promotion;
import org.springframework.data.mongodb.repository.ReactiveMongoRepository;
import org.springframework.stereotype.Repository;
import reactor.core.publisher.Flux;
@Repository
public interface PromotionRepository extends ReactiveMongoRepository<Promotion, String> {
Flux<Promotion> findByProductSku(String sku);
}
package com.nisum.ascend.promotions.service;
import com.nisum.ascend.promotions.dto.PromotionDto;
import com.nisum.ascend.promotions.repository.PromotionRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Flux;
@Service
public class PromotionService {
@Autowired
PromotionRepository promotionRepository;
public Flux<PromotionDto> findAll(){
return promotionRepository.findAll().map(PromotionDto::generateDtoFromPromotion);
}
public Flux<PromotionDto> findPromotionsByProductSku(String sku){
return promotionRepository.findByProductSku(sku).map(PromotionDto::generateDtoFromPromotion);
}
}
spring.config.import=classpath:secret.properties
spring.data.mongodb.uri=mongodb+srv://admin:${db.password}@inventory-promotions.d4nfz.mongodb\
.net/${spring.data.mongodb.database}?retryWrites=true&w=majority
spring.data.mongodb.database=test
\ No newline at end of file
spring.config.import=classpath:secret.properties
server.port=8081
spring.data.mongodb.uri=mongodb+srv://admin:${db.password}@inventory-promotions.d4nfz.mongodb\
.net/${spring.data.mongodb.database}?retryWrites=true&w=majority
spring.data.mongodb.database=products-promotions-DB
\ No newline at end of file
package com.nisum.ascend.promotions.controller;
import com.nisum.ascend.promotions.dto.PromotionDto;
import com.nisum.ascend.promotions.model.Promotion;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.reactive.AutoConfigureWebTestClient;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.MediaType;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.springframework.test.web.reactive.server.WebTestClient;
import java.util.List;
import static org.junit.jupiter.api.Assertions.*;
@ExtendWith(SpringExtension.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@DirtiesContext
@AutoConfigureWebTestClient
@ActiveProfiles("test")
@Slf4j
class PromotionsControllerTest {
@Autowired
private WebTestClient webTestClient;
@BeforeEach
void setUp() {
}
@Test
void getAllPromotions() {
webTestClient.get().uri("http://localhost:8081/api/promos").exchange()
.expectStatus().isOk()
.expectHeader().contentType(MediaType.APPLICATION_JSON_VALUE)
.expectBodyList(PromotionDto.class)
.hasSize(2)
.consumeWith(promo ->{
List<PromotionDto> promos = promo.getResponseBody();
assert promos != null;
promos.forEach(p ->{
assertNotNull(p.getPromotionId());
assertNotNull(p.getProductSku());
System.out.println(p.getPromotionId());
});
});
}
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment