Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Resposta do desafio #21

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
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
29 changes: 29 additions & 0 deletions backend-challenge/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
HELP.md
/target/
!.mvn/wrapper/maven-wrapper.jar

### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache

### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr

### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
/build/

### VS Code ###
.vscode/
19 changes: 19 additions & 0 deletions backend-challenge/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
Backend Challenge BIT - SP

Esse projeto foi construído usando uma versão simplificada da Clean Architecture (http://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html).

Utilizamos o Spring Boot como facilitador, na sua última versão disponível (2.1.3).

Para construir a aplicação, utilize o comando:

mvn clean package

Desta forma, no diretório "target" será gerado o jar "backend-challenge-0.0.1-SNAPSHOT.jar", que pode ser executado com o comando:

java -jar target\backend-challenge-0.0.1-SNAPSHOT.jar

Ou, utilizando o plugin do maven do Spring Boot, sem precisar pré construir a aplicação:

mvn spring-boot:run


48 changes: 48 additions & 0 deletions backend-challenge/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
<?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 http://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.1.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>br.com.bonaldo</groupId>
<artifactId>backend-challenge</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>backend-challenge</name>
<description>backend-challenge</description>

<properties>
<java.version>1.8</java.version>
</properties>

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</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,11 @@
package br.com.bonaldo.backendchallenge;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class BackendChallengeApplication {
public static void main(String[] args) {
SpringApplication.run(BackendChallengeApplication.class, args);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package br.com.bonaldo.backendchallenge.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class RestTemplateConfig {

@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package br.com.bonaldo.backendchallenge.domains;

import br.com.bonaldo.backendchallenge.gateways.http.json.DimensionResponse;
import lombok.AllArgsConstructor;
import lombok.Data;

import java.math.BigDecimal;

@Data
@AllArgsConstructor
public class Dimension {
private BigDecimal weight;
private BigDecimal height;
private BigDecimal width;
private BigDecimal length;

public Dimension(final DimensionResponse dimensionResponse) {
this.weight = dimensionResponse.getWeight();
this.height = dimensionResponse.getHeight();
this.length = dimensionResponse.getLength();
this.width = dimensionResponse.getWidth();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package br.com.bonaldo.backendchallenge.domains;

import br.com.bonaldo.backendchallenge.gateways.http.json.OrderItemResponse;
import lombok.Data;

import java.time.LocalDateTime;

@Data
public class OrderItem {
private String name;
private String code;
private LocalDateTime date;
private Dimension dimension;

public OrderItem(final OrderItemResponse orderItemResponse) {
this.name = orderItemResponse.getName();
this.code = orderItemResponse.getCode();
this.date = orderItemResponse.getDate();
this.dimension = new Dimension(orderItemResponse.getDimension());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package br.com.bonaldo.backendchallenge.gateways;

import br.com.bonaldo.backendchallenge.gateways.http.json.OrderItemResponse;

import java.util.List;

public interface OrderGateway {
List<OrderItemResponse> getOrderItems();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package br.com.bonaldo.backendchallenge.gateways.controllers;

import br.com.bonaldo.backendchallenge.gateways.controllers.json.ItemResponse;
import br.com.bonaldo.backendchallenge.usecases.FilterOrderItems;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.stream.Collectors;

@Slf4j
@RestController
@RequestMapping("/item")
@RequiredArgsConstructor
public class ItemController {

private final FilterOrderItems filterOrderItems;

@GetMapping(produces = MediaType.APPLICATION_JSON_VALUE)
public List<ItemResponse> findItems(
@RequestParam(value = "begindate") final String beginDate,
@RequestParam(value = "finaldate") final String finalDate) {

log.info("Searching for items with date between {} and {}", beginDate, finalDate);

LocalDate startDate = parseStringDate(beginDate);
LocalDate endDate = parseStringDate(finalDate);

return filterOrderItems.execute(startDate, endDate)
.stream()
.map(ItemResponse::new)
.collect(Collectors.toList());
}

private LocalDate parseStringDate(final String stringDate) {
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd-MM-yyyy");
return LocalDate.from(dtf.parse(stringDate));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package br.com.bonaldo.backendchallenge.gateways.controllers.json;

import br.com.bonaldo.backendchallenge.domains.Dimension;
import lombok.Data;

import java.io.Serializable;
import java.math.BigDecimal;

@Data
public class DimensionResponse implements Serializable {
private BigDecimal weight;
private BigDecimal height;
private BigDecimal width;
private BigDecimal length;

public DimensionResponse(final Dimension dimension) {
this.weight = dimension.getWeight();
this.height = dimension.getHeight();
this.width = dimension.getWidth();
this.length = dimension.getLength();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package br.com.bonaldo.backendchallenge.gateways.controllers.json;

import br.com.bonaldo.backendchallenge.domains.OrderItem;
import lombok.Data;

import java.io.Serializable;
import java.time.LocalDateTime;

@Data
public class ItemResponse implements Serializable {
private String name;
private String code;
private LocalDateTime date;
private DimensionResponse dimension;

public ItemResponse(final OrderItem orderItem) {
this.name = orderItem.getName();
this.code = orderItem.getCode();
this.date = orderItem.getDate();
this.dimension = new DimensionResponse(orderItem.getDimension());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package br.com.bonaldo.backendchallenge.gateways.http;

import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;

import javax.servlet.http.HttpServletRequest;
import java.time.DateTimeException;

@Slf4j
@ControllerAdvice
public class CustomExceptionHandler {

@ExceptionHandler(DateTimeException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ResponseBody
public ResponseEntity<String> handleInvalidDateException(HttpServletRequest req, Exception ex) {
log.info("Invalid date format on request: {}, with params: {}, exception: {}", req.getRequestURI(), req.getQueryString(), ex.getMessage());
return ResponseEntity.badRequest().body("Invalid date format");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package br.com.bonaldo.backendchallenge.gateways.http;

import br.com.bonaldo.backendchallenge.gateways.OrderGateway;
import br.com.bonaldo.backendchallenge.gateways.http.json.OrderItemResponse;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;

import java.util.List;

@Component
@RequiredArgsConstructor
public class OrderGatewayAPI implements OrderGateway {

@Value("${integration.order-api.url}")
private String API_URL;

private final RestTemplate restTemplate;

@Override
public List<OrderItemResponse> getOrderItems() {
ResponseEntity<List<OrderItemResponse>> response = restTemplate
.exchange(API_URL, HttpMethod.GET, null, new ParameterizedTypeReference<List<OrderItemResponse>>() {});
return response.getBody();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package br.com.bonaldo.backendchallenge.gateways.http.json;

import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;
import java.math.BigDecimal;

@Data
@NoArgsConstructor
public class DimensionResponse implements Serializable {
private BigDecimal weight;
private BigDecimal height;
private BigDecimal width;
private BigDecimal length;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package br.com.bonaldo.backendchallenge.gateways.http.json;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;
import java.time.LocalDateTime;

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class OrderItemResponse implements Serializable {
private String name;
private String code;
private LocalDateTime date;
private DimensionResponse dimension;
}
Loading