diff --git a/pom.xml b/pom.xml new file mode 100644 index 00000000..8a263e61 --- /dev/null +++ b/pom.xml @@ -0,0 +1,68 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.4.3 + + + com.example + carrusel-rafael-rosario + 0.0.1-SNAPSHOT + carrusel-rafael-rosario + Demo project for Spring Boot + + 11 + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-test + test + + + + com.fasterxml.jackson.core + jackson-databind + 2.10.2 + + + + + io.springfox + springfox-swagger2 + 2.9.2 + + + + + io.springfox + springfox-swagger-ui + 2.9.2 + + + + junit + junit + test + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/src/main/java/com/example/carruselrafaelrosario/CarruselRafaelRosarioApplication.java b/src/main/java/com/example/carruselrafaelrosario/CarruselRafaelRosarioApplication.java new file mode 100644 index 00000000..52bfb65a --- /dev/null +++ b/src/main/java/com/example/carruselrafaelrosario/CarruselRafaelRosarioApplication.java @@ -0,0 +1,13 @@ +package com.example.carruselrafaelrosario; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class CarruselRafaelRosarioApplication { + + public static void main(String[] args) { + SpringApplication.run(CarruselRafaelRosarioApplication.class, args); + } + +} diff --git a/src/main/java/com/example/carruselrafaelrosario/config/SwaggerConfig.java b/src/main/java/com/example/carruselrafaelrosario/config/SwaggerConfig.java new file mode 100644 index 00000000..cbc3f62b --- /dev/null +++ b/src/main/java/com/example/carruselrafaelrosario/config/SwaggerConfig.java @@ -0,0 +1,24 @@ +package com.example.carruselrafaelrosario.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; +import springfox.documentation.swagger2.annotations.EnableSwagger2; + +@Configuration +@EnableSwagger2 +public class SwaggerConfig { + + @Bean + public Docket api(){ + return new Docket(DocumentationType.SWAGGER_2) + .select() + .apis(RequestHandlerSelectors.basePackage("com.example.carruselrafaelrosario.controller")) + .paths(PathSelectors.any()) + .build(); + + } +} diff --git a/src/main/java/com/example/carruselrafaelrosario/controller/CarruselController.java b/src/main/java/com/example/carruselrafaelrosario/controller/CarruselController.java new file mode 100644 index 00000000..eef80ddc --- /dev/null +++ b/src/main/java/com/example/carruselrafaelrosario/controller/CarruselController.java @@ -0,0 +1,28 @@ +package com.example.carruselrafaelrosario.controller; + +import com.example.carruselrafaelrosario.model.Response; +import com.example.carruselrafaelrosario.service.CarruselService; +import com.example.carruselrafaelrosario.service.interfaces.ICarruselService; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequestMapping("/concrete") +public class CarruselController { + + @Autowired + private CarruselService service; + + @RequestMapping(value = "/getCupon", method = RequestMethod.GET) + @ApiOperation("Obtiene todos los cupones no expirados de forma asincrona, si el api que suministra los datos no responde en 10 segundos regresa una lista vacia") + @ApiResponse(code = 200, message = "OK") + public List getCuponNotExpires(){ + return service.getCuponNotExpires(); + } +} diff --git a/src/main/java/com/example/carruselrafaelrosario/model/Response.java b/src/main/java/com/example/carruselrafaelrosario/model/Response.java new file mode 100644 index 00000000..fdfdd8e5 --- /dev/null +++ b/src/main/java/com/example/carruselrafaelrosario/model/Response.java @@ -0,0 +1,49 @@ +package com.example.carruselrafaelrosario.model; + +public class Response { + private String id; + private String description; + private String seller; + private String image; + private String expiresAt; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getSeller() { + return seller; + } + + public void setSeller(String seller) { + this.seller = seller; + } + + public String getImage() { + return image; + } + + public void setImage(String image) { + this.image = image; + } + + public String getExpiresAt() { + return expiresAt; + } + + public void setExpiresAt(String expiresAt) { + this.expiresAt = expiresAt; + } +} diff --git a/src/main/java/com/example/carruselrafaelrosario/repository/CarruselRepository.java b/src/main/java/com/example/carruselrafaelrosario/repository/CarruselRepository.java new file mode 100644 index 00000000..6c5029fd --- /dev/null +++ b/src/main/java/com/example/carruselrafaelrosario/repository/CarruselRepository.java @@ -0,0 +1,49 @@ +package com.example.carruselrafaelrosario.repository; + +import com.example.carruselrafaelrosario.model.Response; +import com.example.carruselrafaelrosario.repository.interfaces.ICarruselRepository; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.springframework.stereotype.Repository; + +import java.io.IOException; +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; +import java.util.stream.Collectors; + +@Repository +public class CarruselRepository implements ICarruselRepository { + + @Override + public List getCupon() { + + String POSTS_API_URL = "https://cs-hsa-api-coupons.herokuapp.com/coupons"; + + HttpClient client = HttpClient.newHttpClient(); + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create(POSTS_API_URL)) + .GET() //este es el metodo + .header("accept", "application/json") + .build(); + try{ + CompletableFuture> response = client.sendAsync(request, HttpResponse.BodyHandlers.ofString()); + String responseBody = response.thenApply(HttpResponse::body).get(10,TimeUnit.SECONDS); + ObjectMapper mapper = new ObjectMapper(); + List responses = mapper.readValue(responseBody, new TypeReference>(){}); + return responses; + + }catch(IOException | InterruptedException | ExecutionException | TimeoutException e){ + return new ArrayList<>(); + } + } +} diff --git a/src/main/java/com/example/carruselrafaelrosario/repository/interfaces/ICarruselRepository.java b/src/main/java/com/example/carruselrafaelrosario/repository/interfaces/ICarruselRepository.java new file mode 100644 index 00000000..8efca87f --- /dev/null +++ b/src/main/java/com/example/carruselrafaelrosario/repository/interfaces/ICarruselRepository.java @@ -0,0 +1,10 @@ +package com.example.carruselrafaelrosario.repository.interfaces; + + +import com.example.carruselrafaelrosario.model.Response; + +import java.util.List; + +public interface ICarruselRepository { + List getCupon(); +} diff --git a/src/main/java/com/example/carruselrafaelrosario/service/CarruselService.java b/src/main/java/com/example/carruselrafaelrosario/service/CarruselService.java new file mode 100644 index 00000000..6f7fe1ac --- /dev/null +++ b/src/main/java/com/example/carruselrafaelrosario/service/CarruselService.java @@ -0,0 +1,31 @@ +package com.example.carruselrafaelrosario.service; + +import com.example.carruselrafaelrosario.model.Response; +import com.example.carruselrafaelrosario.repository.CarruselRepository; +import com.example.carruselrafaelrosario.service.interfaces.ICarruselService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +@Service +public class CarruselService implements ICarruselService { + + @Autowired + private CarruselRepository repository; + + @Override + public List getCuponNotExpires(){ + List cupones = repository.getCupon(); + return cupones.size() > 0 ? cupones.stream() + .filter(c-> c.getExpiresAt().compareTo(LocalDate.now().toString()) > 0) + .collect(Collectors.toList()): new ArrayList<>(); + } + + public void setRepository(CarruselRepository repository) { + this.repository = repository; + } +} diff --git a/src/main/java/com/example/carruselrafaelrosario/service/interfaces/ICarruselService.java b/src/main/java/com/example/carruselrafaelrosario/service/interfaces/ICarruselService.java new file mode 100644 index 00000000..a6603c9e --- /dev/null +++ b/src/main/java/com/example/carruselrafaelrosario/service/interfaces/ICarruselService.java @@ -0,0 +1,9 @@ +package com.example.carruselrafaelrosario.service.interfaces; + +import com.example.carruselrafaelrosario.model.Response; + +import java.util.List; + +public interface ICarruselService { + List getCuponNotExpires(); +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/src/main/resources/application.properties @@ -0,0 +1 @@ + diff --git a/src/test/java/com/example/carruselrafaelrosario/CarruselRafaelRosarioApplicationTests.java b/src/test/java/com/example/carruselrafaelrosario/CarruselRafaelRosarioApplicationTests.java new file mode 100644 index 00000000..c04a7352 --- /dev/null +++ b/src/test/java/com/example/carruselrafaelrosario/CarruselRafaelRosarioApplicationTests.java @@ -0,0 +1,13 @@ +package com.example.carruselrafaelrosario; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class CarruselRafaelRosarioApplicationTests { + + @Test + void contextLoads() { + } + +} diff --git a/src/test/java/com/example/carruselrafaelrosario/service/CarruselServiceTest.java b/src/test/java/com/example/carruselrafaelrosario/service/CarruselServiceTest.java new file mode 100644 index 00000000..f8de8124 --- /dev/null +++ b/src/test/java/com/example/carruselrafaelrosario/service/CarruselServiceTest.java @@ -0,0 +1,59 @@ +package com.example.carruselrafaelrosario.service; + +import com.example.carruselrafaelrosario.model.Response; +import com.example.carruselrafaelrosario.repository.CarruselRepository; +import com.example.carruselrafaelrosario.repository.interfaces.ICarruselRepository; +import com.example.carruselrafaelrosario.service.interfaces.ICarruselService; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +import java.util.ArrayList; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) +public class CarruselServiceTest { + + @Mock + private CarruselRepository repository; + + @Test + public void GETCUPON_TEST(){ + List list = new ArrayList<>(); + Response element1 = new Response(); + element1.setId("COUPON_1"); + element1.setDescription("50% Discount"); + element1.setSeller("Crazy Seller"); + element1.setImage("https://i4.visitchile.com/img/GalleryContent/8822/slider/Torres_del_Paine.jpg"); + element1.setExpiresAt("2045-12-01"); + list.add(element1); + + Response element2 = new Response(); + element2.setId("COUPON_2"); + element2.setDescription("5% Discount"); + element2.setSeller("The Seller"); + element2.setImage("https://i4.visitchile.com/img/GalleryContent/8822/slider/Torres_del_Paine.jpg"); + element2.setExpiresAt("2050-12-01"); + list.add(element2); + + Response element3 = new Response(); + element3.setId("COUPON_3"); + element3.setDescription("5% Discount"); + element3.setSeller("The Seller"); + element3.setImage("https://i4.visitchile.com/img/GalleryContent/8822/slider/Torres_del_Paine.jpg"); + element3.setExpiresAt("2019-12-01"); + list.add(element3); + + when(repository.getCupon()).thenReturn(list); + CarruselService service = new CarruselService(); + service.setRepository(repository); + assertEquals(2,service.getCuponNotExpires().size()); + + } +} \ No newline at end of file