Um Projeto Spring Boot - P5.2
Tags: java, spring, tutorial, rest
Published: 2023-01-05 18:54:57

Faala pessoal! Tudo bem? 

Estou de volta para mais um post sobre o projeto Rest API e para relembrar sobre o que já foi mostrado, deixo essa lista dos articles já publicados:

- [Primeiro post](https://dev.to/devs-jequie/um-projeto-rest-api-2pc9)
- [Segundo post](https://dev.to/fllaviacorreia/configurando-o-ambiente-de-desenvolvimento-4a7h)
- [Terceiro post](https://dev.to/fllaviacorreia/um-projeto-spring-boot-p1-nii)
- [Quarto post](https://dev.to/fllaviacorreia/um-projeto-spring-boot-p4-5931)
- [Quinto post](https://dev.to/fllaviacorreia/um-projeto-spring-boot-p51-292f)

Continuando com o tutorial do último post:

---
## Adicionando anotação para URI
Para deixar o código mais organizado, adicionei uma anotação chamada RequestMapping e passei por parâmetro a URI da classe de controle e removi a anotação GetMapping do GET ALL editoras:

![request mappind add](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qy2adivxa9o9wztkwtvf.png)

Isso é bom porque ajuda a fazer uma manutenção mais fácil, por exemplo, se a classe de controle de usuários tivesse 100 métodos de manipulação e a URI fosse "users_controller", caso decidisse mudar para apenas "users", ou sairia removendo o "-controller" nos 100 métodos, ou daria um "Localizar + Substituir" correndo o risco de alterar alguma informação no código. 

---
## GET ONE 
O método para buscar todas as editoras já está pronto. Agora, podemos fazer um método que retorne uma editora em específico de acordo com o ID dessa editora.

Aqui nesse ponto, podemos usar Response Entity que nos dá a possibilidade de manipular o cabeçalho, outras coisas, e o que será usado aqui será a modificação do status, sendo alguns deles que mais usarei:
- 200 OK
- 404 Not Found
- 201 Created 
- 204 No Content

[Aqui](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status) você pode ver mais sobre os códigos de status de respostas HTTP.

O código mais enxuto de retorno de uma editora pode ser escritode 2 formas:

![método get one v1](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zygg282d7627mgzrjqlc.png)

Esse é um método que recebe um id pela URI (por isso a anotação @PathVariable) e que, faz a busca pelo id, mapeia a editora e retorna com status OK(200) incluindo a editora encontrada. Caso não encontre, cai no orElse e retorna a construção de um Not Found (404). 

![método get one v2](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/f1qc2unh3c587uh84hy9.png)

Já nessa segunda versão, o map desse método atua da mesma forma que o primeiro, porém a construção é mais enxuta

Uma terceira versão, menos enxuta, pode ser construída da seguinte forma:
![método get one v3](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5lb9onaxfizi6xrtnq7y.png)

---
## GET BY NAME 
Uma terceira forma de consulta é pelo nome, por exemplo. 

Um modo simples é usando o [Query Methods](https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.query-methods) do JPA, então na Interface repository de editora. Utilizando esse tipo de Query, tem que seguir algumas regras:
1. iniciar o método com **find** ou **query**
2. utilizar o **By** 
3. se for a busca por propriedade, colocar o nome na classe Model da propriedade: por exemplo, na Model de Users tem um atributo chamado _nome_, na Interface ficaria: 

`List<Users> findByNome(String nome)`

Uma outra palavra reservada que pode ser utilizada é o _Containing_ no final do nome do método na Interface, que faz a busca em todas as linhas do banco que contém o conjunto de caracteres passados, ele equivale ao Like em query de DB SQL.

`List<Users> findByNomeContaining(String nome)`

OBS.: O JPA implementa esses métodos em tempo de execução, então não precisa implementá-los.

A passagem do dado a ser buscado pode ser: 
1. pela URI, como o id e ai usa a anotação @PathVariable; 
2. pelo corpo da requisição e ai usa a anotação @RequestBody como é usado na criação e edição.

---
## POST 
Na imagem abaixo, temos o método para salvar uma nova editora no banco de dados:

![método de cadastro de editora](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w3dv6fumbqwkcim88cgl.png)

A anotação @PostMapping indica que aquele método deve ser usado quando uma requisição do tipo POST é iniciada;
A anotação @RequestBody com o status CREATED modifica o status de resposta para 201, 
Esse método retorna os dados da editora cadastrados juntamente com o ID. 

Essa é apenas uma opção, poderia retornar apenas o id com: `pCompanyRepository.save(pCompany).getId()`

Poderia retornar uma mensagem de sucesso, ou apenas o status.  Por ora vamos deixar assim.


---
## PUT

![método put](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hgs2aou0c26nmwqrpo6n.png)

O método de edição é muito parecido com a criação, apenas com alguns detalhes a mais, como na imagem, na ediçção primeiro verifiquei se aquela editora está cadastrada no banco de dados, caso não esteja, retorna o erro 404.

Caso exista:
1. seta o ID no objeto editora que veio na requisição;
2. quando chama o save, pelo fato do atributo ID não estar vazio, o JPA vai entender que precisa editar ao invés de salvar uma nova linha no banco.
3. no final, há o retorno da editora editada com status 200.

---
## DELETE

![método delete](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ebiiuywc74czdfrfecz0.png)

A deleção é bem simples também, há verificação de existência de editora, em seguida remove a editora através do ID e retorna o corpo da requisição vazio com o status 204.

---

Bom pessoal, por hoje é isso, o repositório no GitHub pode ser acessado por [aqui](https://github.com/fllaviacorreia/library-api/tree/develop).

Até a próxima!