... | @@ -7,12 +7,69 @@ Esta página visa apresentar os padrões a serem utilizados no desenvolvimento d |
... | @@ -7,12 +7,69 @@ Esta página visa apresentar os padrões a serem utilizados no desenvolvimento d |
|
1. [Swagger](#swagger)
|
|
1. [Swagger](#swagger)
|
|
2. [📌 DTOs](#-dtos)
|
|
2. [📌 DTOs](#-dtos)
|
|
3. [Estrutura de Exceções](#estrutura-de-exce%C3%A7%C3%B5es)
|
|
3. [Estrutura de Exceções](#estrutura-de-exce%C3%A7%C3%B5es)
|
|
|
|
4. [@Get (Controller + Service)](#-padrão-de-código-get-controller--service)
|
|
|
|
|
|
|
|
|
|
---
|
|
---
|
|
|
|
|
|
## Swagger
|
|
## Swagger
|
|
|
|
|
|
Além de seguir os padrões determinados pela **arquitetura** e **estrutura de pastas** do projeto, é necessário **atualizar a estrutura do Swagger** conforme é realizado o desenvolvimento da aplicação.
|
|
Além de seguir os padrões determinados pela **arquitetura** e **estrutura de pastas** do projeto, é necessário **atualizar a estrutura do Swagger** conforme é realizado o desenvolvimento da aplicação.
|
|
|
|
# :key: Fluxo de uso do Swagger com Login e Token
|
|
|
|
|
|
|
|
1. **Abrir o Swagger**
|
|
|
|
- Acesse no navegador o link:
|
|
|
|
:point_right: [http://localhost:8080/swagger-ui/index.html](http://localhost:8080/swagger-ui/index.html)
|
|
|
|
|
|
|
|
2. **Localizar o endpoint de Login**
|
|
|
|
- Na lista de endpoints, procure pelo recurso **`/login`**.
|
|
|
|
- Clique nele para expandir os detalhes.
|
|
|
|
<p align="center">
|
|
|
|
<img width="800" height="400" alt="image" src="https://github.com/user-attachments/assets/7d931b5f-3a9a-4673-8f7e-fe70b1099df5" />
|
|
|
|
</p>
|
|
|
|
|
|
|
|
3. **Executar o Login**
|
|
|
|
- Clique no botão **`Try it out`**.
|
|
|
|
- Será exibido um corpo **JSON** no campo de request body, parecido com:
|
|
|
|
```json
|
|
|
|
{
|
|
|
|
"user": "string",
|
|
|
|
"senha": "string"
|
|
|
|
}
|
|
|
|
```
|
|
|
|
- Substitua os valores de `"string"` pelos dados que estão cadastrados no banco, por exemplo:
|
|
|
|
```json
|
|
|
|
{
|
|
|
|
"user": "[email protected]",
|
|
|
|
"senha": "Senha"
|
|
|
|
}
|
|
|
|
```
|
|
|
|
- Clique em **Execute**.
|
|
|
|
<p align="center">
|
|
|
|
<img width="800" height="400" alt="image" src="https://github.com/user-attachments/assets/99394542-1040-45dd-820e-ca88d64822c8" />
|
|
|
|
</p>
|
|
|
|
|
|
|
|
4. **Obter o Token**
|
|
|
|
- A resposta da requisição conterá um campo `token`.
|
|
|
|
- Copie apenas o valor do token, ou seja, o texto que aparece **entre as aspas** após `"token":"`.
|
|
|
|
<p align="center">
|
|
|
|
<img width="1367" height="163" alt="image" src="https://github.com/user-attachments/assets/72f81c1e-884a-4c42-9d4b-e2fd8880de4f" />
|
|
|
|
</p>
|
|
|
|
|
|
|
|
5. **Autorizar o Swagger**
|
|
|
|
- No canto superior direito do Swagger, clique no botão **Authorize** (ícone de cadeado :lock:).
|
|
|
|
- Vai abrir um modal pedindo o token de autenticação.
|
|
|
|
- Cole o token copiado.
|
|
|
|
- Confirme clicando em **Authorize** e depois **Close**.
|
|
|
|
<p align="center">
|
|
|
|
<img width="800" height="400" alt="image" src="https://github.com/user-attachments/assets/e11cd8e4-e59a-4d39-ae54-39c3708e44bc" />
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
|
|
6. **Usar os Endpoints Protegidos**
|
|
|
|
- Agora todos os endpoints que exigem autenticação já estarão configurados para enviar o token no header (`Authorization: Bearer <token>`).
|
|
|
|
- Basta navegar pelos endpoints, clicar em **Try it out** e executar normalmente.
|
|
|
|
|
|
|
|
|
|
As marcações do **Swagger** devem ser inseridas em:
|
|
As marcações do **Swagger** devem ser inseridas em:
|
|
- **Controllers**
|
|
- **Controllers**
|
... | @@ -96,6 +153,62 @@ Retorno : |
... | @@ -96,6 +153,62 @@ Retorno : |
|
"status": "NOT_FOUND"
|
|
"status": "NOT_FOUND"
|
|
}
|
|
}
|
|
```
|
|
```
|
|
|
|
# 🔹 Padrão de Código: @Get (Controller + Service)
|
|
|
|
1. A requisição chega no Controller e chama o método da service para buscar todas as instâncias no banco de dados.
|
|
|
|
2. O método cityService.getAllCities() é chamado.
|
|
|
|
3.A resposta é devolvida em formato JSON contendo a lista de CityResponseDTO.
|
|
|
|
### Classe Controller
|
|
|
|
```java
|
|
|
|
@GetMapping
|
|
|
|
@Operation(summary = "Get All Services",
|
|
|
|
description = "Returns a list of all services available in the system")
|
|
|
|
@ApiResponse(responseCode = "200", description = "Cities retrieved successfully")
|
|
|
|
public ResponseEntity<List<CityResponseDTO>> getAllCities() {
|
|
|
|
List<CityResponseDTO> cities = cityService.getAllCities();
|
|
|
|
return ResponseEntity.ok(cities);
|
|
|
|
}
|
|
|
|
|
|
|
|
```
|
|
|
|
### Classe Service
|
|
|
|
```java
|
|
|
|
public List<CityResponseDTO> getAllCities() {
|
|
|
|
List<City> cities = cityRepository.findAll();
|
|
|
|
return cities.stream()
|
|
|
|
.map(city -> new CityResponseDTO(city.getId(), city.getName(), city.getState()))
|
|
|
|
.toList();
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
## Get By id
|
|
|
|
### Classe Controller
|
|
|
|
|
|
|
|
```java
|
|
|
|
@GetMapping("/{id}")
|
|
|
|
@PreAuthorize("hasRole('ADMIN')")
|
|
|
|
public ResponseEntity<UserResponseDTO> getUser(@PathVariable UUID id) {
|
|
|
|
return ResponseEntity.ok(service.getUserById(id));
|
|
|
|
}
|
|
|
|
```
|
|
|
|
### Na service
|
|
|
|
```java
|
|
|
|
@Transactional
|
|
|
|
public UserResponseDTO getUserById(UUID id) {
|
|
|
|
|
|
|
|
User user = userRepository
|
|
|
|
.findById(id)
|
|
|
|
.orElseThrow(() -> new NotFoundException("User not found"));
|
|
|
|
return modelMapper.map(user, UserResponseDTO.class);
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Boas Práticas de Exceções
|
|
Boas Práticas de Exceções
|
|
|
|
|
... | | ... | |