Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
68 changes: 68 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.3</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>carrusel-rafael-rosario</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>carrusel-rafael-rosario</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>11</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>

<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.10.2</version>
</dependency>

<!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger2 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>

<!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger-ui -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>

<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>

</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

</project>
Original file line number Diff line number Diff line change
@@ -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);
}

}
Original file line number Diff line number Diff line change
@@ -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();

}
}
Original file line number Diff line number Diff line change
@@ -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<Response> getCuponNotExpires(){
return service.getCuponNotExpires();
}
}
Original file line number Diff line number Diff line change
@@ -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;
}
}
Original file line number Diff line number Diff line change
@@ -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<Response> 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<HttpResponse<String>> response = client.sendAsync(request, HttpResponse.BodyHandlers.ofString());
String responseBody = response.thenApply(HttpResponse::body).get(10,TimeUnit.SECONDS);
ObjectMapper mapper = new ObjectMapper();
List<Response> responses = mapper.readValue(responseBody, new TypeReference<List<Response>>(){});
return responses;

}catch(IOException | InterruptedException | ExecutionException | TimeoutException e){
return new ArrayList<>();
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.example.carruselrafaelrosario.repository.interfaces;


import com.example.carruselrafaelrosario.model.Response;

import java.util.List;

public interface ICarruselRepository {
List<Response> getCupon();
}
Original file line number Diff line number Diff line change
@@ -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<Response> getCuponNotExpires(){
List<Response> 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;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.example.carruselrafaelrosario.service.interfaces;

import com.example.carruselrafaelrosario.model.Response;

import java.util.List;

public interface ICarruselService {
List<Response> getCuponNotExpires();
}
1 change: 1 addition & 0 deletions src/main/resources/application.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@

Original file line number Diff line number Diff line change
@@ -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() {
}

}
Original file line number Diff line number Diff line change
@@ -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<Response> 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());

}
}