Desafio Orange Talents
Desafio: Orange Talents
Pedro Henrique Gonçalves Barcelos
Resumo
Minha história
Vamos ao desafio!!!
Tecnologias usadas
1. Spring Boot
<?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>
<groupId>io.github.pedrobarcelos</groupId>
<artifactId>OrangeTalents</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.4.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project> 2. Maven
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>3. Intellij IDEA
4. JPA + H2 Database Engine + Hibernate
5. Postman
Agora, utilizando o método GET e passando como parâmetro a chave primária {cpf} do cliente, percebe-se que os dados foram gravados com sucesso no banco de dados!
6. GitHub Manter o seu GitHub em dia com os seus projetos é mais do que essencial para qualquer profissional da área de Ciência da Computação e afins. Não foi diferente nesse projeto! A plataforma de versionamento de códigos foi utilizada para manter a organização do código e fazer alguns "saves", isto é, algumas versões do projeto foram postadas no git em forma de repositório, para serem facilmente acessadas depois.
Na imagem a seguir vemos o repositório criado por mim na ultima versão do coódigo.


Como o projeto foi feito
1. Analisar os dados, e projetar o BD
Seguindo essa premissa, já podemos definir as entidades:
Cliente
Vacinas
Agora, podemos atribuir à eles, seus respectivos atributos (exemplo):
CREATE TABLE CLIENTE (
CPF INTEGER PRIMARY KEY,
EMAIL VARCHAR(100),
NASCIMENTO TIMESTAMP,
NOME VARCHAR(100),
VACINADO BIT NOT NULL
);
CREATE TABLE VACINA (
ID INTEGER PRIMARY KEY AUTO_INCREMENT,
NOME VARCHAR(100),
EMAIL_VACINADO VARCHAR(100) REFERENCES CLIENTE (EMAIL),
DATA_APLICACAO TIMESTAMP,
);
2. Injeção de dependências e pom.xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.4.RELEASE</version>
</parent>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
3. Criar as classes entidades
package io.github.pedrobarcelos.domain.entity;
import javax.persistence.*;
import java.time.LocalDate;
import java.util.Set;
@Entity
@Table( name = "cliente" )
public class Cliente {
@Id
@Column(name = "cpf", length = 11)
private String cpf;
@Column(name = "email", length = 100)
private String email;
@Column(name = "nome", length = 100)
private String nome;
@OneToMany(mappedBy = "cliente", fetch = FetchType.LAZY)
private Set<Vacina> vacinas;
@Column(name = "nascimento")
private LocalDate nascimento;
@Column(name = "vacinado")
private boolean vacinado = false;
public Cliente() {
}
public String getCpf() {
return cpf;
}
public void setCpf(String cpf) {
this.cpf = cpf;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public LocalDate getNascimento() {
return nascimento;
}
public void setNascimento(LocalDate nascimento) {
this.nascimento = nascimento;
}
public boolean isVacinado() {
return vacinado;
}
public void setVacinado(boolean vacinado) {
this.vacinado = vacinado;
}
@Override
public String toString() {
return "Cliente{" +
"cpf='" + cpf + '\'' +
", nome='" + nome + '\'' +
", email='" + email + '\'' +
", nascimento=" + nascimento +
", vacinado=" + vacinado +
'}';
}
}
4. Criar os repositórios das respectivas entidades
Os repositórios em como objetivo criar beans para a parte de persistência, além de capturar exceções específicas de persistência e repeti-las novamente como uma das exceções não verificadas e unificadas do Spring. As annotations que são usadas nessa etapa são:
@Repository - mapeia o arquivo como um respository
@Query - permite fazer consultas e modificações no banco de dados. Lembrando sempre que, quando a requisição for fazer alguma mudança no banco, é necessário utilizar também a annotation @Modifying ( exemplo: delete )
@Query(" delete from Cliente c where c.nome =:nome ")
@Modifying
void deleteByNome(String nome); 5. Criando os controllers, de Cliente e de Vacina
Nos controllers, iremos definir e configurar o fluxo da aplicação. Nele definimos as rotas usadas nas requisições HTTP, definimos todas as exceções possíveis, como por exemplo: um erro na requisição HTTP (BAD REQUEST), a tentativa de acessar um cliente ou vacina inexistente no banco, etc. As annotation usadas nos Controllers são:
@RestController - permite definir um controller com características REST
@RequestMapping - permite definir uma rota
@GetMapping - indica que lidará com Requests HTTP do tipo : GET
@DeleteMapping - indica que lidará com Requests HTTP do tipo : DELETE
@PostMapping - indica que lidará com Requests HTTP do tipo : POST
@PutMapping - indica que lidará com Requests HTTP do tipo : PUT
@RequestBody indica que o valor do objeto virá do corpo da requisição em forma de parâmetro.
Abaixo temos métodos do controller de Vacina:
@PostMapping
@ResponseStatus(CREATED)
public Vacina save(@RequestBody Vacina vacina ){
return repository.save(vacina);
}
@PutMapping("{id}")
@ResponseStatus(NO_CONTENT)
public void update( @PathVariable Integer id, @RequestBody Vacina vacina ){
repository
.findById(id)
.map( p -> {
vacina.setId(p.getId());
repository.save(vacina);
return vacina;
}).orElseThrow( () ->
new ResponseStatusException(HttpStatus.NOT_FOUND,
"Vacina não encontrado."));
}
@DeleteMapping("{id}")
@ResponseStatus(NO_CONTENT)
public void delete(@PathVariable Integer id){
repository
.findById(id)
.map( p -> {
repository.delete(p);
return Void.TYPE;
}).orElseThrow( () ->
new ResponseStatusException(HttpStatus.NOT_FOUND,
"Vacina não encontrado."));
}
@GetMapping("{id}")
public Vacina getById(@PathVariable Integer id){
return repository
.findById(id)
.orElseThrow( () ->
new ResponseStatusException(HttpStatus.NOT_FOUND,
"Vacina não encontrado."));
}6. Testes com o Postman
Nessa etapa, iremos testar a nossa aplicação por meio do Postman. Nele, iremos inserir requisições HTTP por meio das rotas definidas nos controllers, e, se tudo der certo, obteremos as respostas esperadas.
Popular um banco com um cliente X apenas como seu CPF (primary key):
http://localhost:8080/api/clientes
body em Jason:
{
"cpf" : 98542154879
}
Status HTTP esperado: 201 Created
Status HTTP obtido: 201 Created
Popular um banco com um cliente Pedro, que possui o CPF 98542154879, email Pedro.icloud.com e que ja foi vacinado contra covid:
http://localhost:8080/api/clientes
body em Jason:
{
"cpf" : 98542154879,
"vacinado" : true,
"nome" : "Pedro",
"email" : "pedro.icloud.com"
}
Status HTTP esperado: 201 Created
Status HTTP obtido: 201 Created
Com esse cliente criado, agora queremos acessá-lo por meio do método GET, passando como parâmetro o seu CPF:
http://localhost:8080/api/clientes/98542154879
Status HTTP esperado: 200 OK
Status HTTP obtido: 200 OK
E se tentarmos acessar esse cliente passando o CPF errado (inexistente) ?
http://localhost:8080/api/clientes/99999999999
Status HTTP esperado: 404 NOT FOUND
Status HTTP obtido: 404 NOT FOUND
























Comentários
Postar um comentário