Skip to content

Commit 6ae024d

Browse files
committed
add templates with Thymeleaf
create templates: view all, create user
1 parent 19ec8da commit 6ae024d

File tree

10 files changed

+303
-27
lines changed

10 files changed

+303
-27
lines changed

uol/pom.xml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,10 @@
3030
<java.version>17</java.version>
3131
</properties>
3232
<dependencies>
33-
<!-- <dependency>-->
34-
<!-- <groupId>org.springframework.boot</groupId>-->
35-
<!-- <artifactId>spring-boot-starter-thymeleaf</artifactId>-->
36-
<!-- </dependency>-->
33+
<dependency>
34+
<groupId>org.springframework.boot</groupId>
35+
<artifactId>spring-boot-starter-thymeleaf</artifactId>
36+
</dependency>
3737
<dependency>
3838
<groupId>org.springframework.boot</groupId>
3939
<artifactId>spring-boot-starter-web</artifactId>
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package com.testbackend.uol.controller;
2+
3+
import com.testbackend.uol.dto.UsuarioDTO;
4+
import com.testbackend.uol.model.Usuario;
5+
import com.testbackend.uol.service.UsuarioService;
6+
import jakarta.validation.Valid;
7+
import org.springframework.stereotype.Controller;
8+
import org.springframework.ui.Model;
9+
import org.springframework.validation.BindingResult;
10+
import org.springframework.validation.FieldError;
11+
import org.springframework.web.bind.annotation.GetMapping;
12+
import org.springframework.web.bind.annotation.ModelAttribute;
13+
import org.springframework.web.bind.annotation.PostMapping;
14+
15+
import java.util.List;
16+
17+
@Controller
18+
public class HomeController {
19+
20+
private final UsuarioService usuarioService;
21+
22+
public HomeController(UsuarioService usuarioService) {
23+
this.usuarioService = usuarioService;
24+
}
25+
26+
@GetMapping({"","/"})
27+
public String index(){
28+
return "index";
29+
}
30+
31+
@GetMapping("/users")
32+
public String getPlayers(Model model){
33+
List<Usuario> users = usuarioService.getAll();
34+
model.addAttribute("users", users);
35+
return "clients/index";
36+
}
37+
38+
39+
@GetMapping("/users/create")
40+
public String showCreatePage(Model model){
41+
UsuarioDTO usuarioDTO = new UsuarioDTO();
42+
model.addAttribute("usuarioDTO", usuarioDTO);
43+
return "clients/create";
44+
}
45+
46+
@PostMapping("/users/create")
47+
public String createClient(@Valid @ModelAttribute("usuarioDTO") UsuarioDTO usuarioDTO, BindingResult result){
48+
49+
if (usuarioService.getByEmail(usuarioDTO.getEmail()) != null){
50+
result.addError(
51+
new FieldError("usuarioDTO", "email", usuarioDTO.getEmail(), false, null,null,"Email ja cadastrado")
52+
);
53+
}
54+
55+
56+
if (result.hasErrors()){
57+
return "clients/create";
58+
}
59+
60+
usuarioService.saveUsuario(usuarioDTO);
61+
62+
return "redirect:/users/create";
63+
}
64+
}

uol/src/main/java/com/testbackend/uol/controller/UsuarioController.java

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,18 @@
22

33

44
import com.testbackend.uol.dto.UsuarioDTO;
5+
import com.testbackend.uol.model.Usuario;
56
import com.testbackend.uol.service.UsuarioService;
67
import jakarta.validation.Valid;
78
import org.springframework.http.HttpStatus;
89
import org.springframework.http.ResponseEntity;
10+
import org.springframework.ui.Model;
911
import org.springframework.web.bind.annotation.*;
1012

1113
import java.util.List;
1214

1315
@RestController
14-
@RequestMapping("/api/v1/usuario")
16+
@RequestMapping("/api/v1/users")
1517
public class UsuarioController {
1618

1719

@@ -22,18 +24,26 @@ public UsuarioController(UsuarioService usuarioService) {
2224
this.usuarioService = usuarioService;
2325
}
2426

25-
@GetMapping
26-
public ResponseEntity<List<UsuarioDTO>> getAll(){
27-
28-
return ResponseEntity.status(HttpStatus.FOUND).body(usuarioService.getAll());
29-
}
3027

28+
// @GetMapping
29+
// public ResponseEntity<List<Usuario>> getAll(){
30+
//
31+
// return ResponseEntity.status(HttpStatus.FOUND).body(usuarioService.getAll());
32+
// }
3133

32-
@PostMapping("/new")
33-
public ResponseEntity<UsuarioDTO> saveUsuario(@Valid @RequestBody UsuarioDTO dto){
34+
@GetMapping
35+
public String getPlayers(Model model){
36+
List<Usuario> users = usuarioService.getAll();
37+
model.addAttribute("users", users);
38+
return "clients/index";
39+
}
3440

35-
var usuarioCriado = usuarioService.saveUsuario(dto);
3641

37-
return ResponseEntity.status(HttpStatus.CREATED).body(usuarioCriado);
38-
}
42+
// @PostMapping("/new")
43+
// public ResponseEntity<UsuarioDTO> saveUsuario(@Valid @RequestBody UsuarioDTO dto){
44+
//
45+
// var usuarioCriado = usuarioService.saveUsuario(dto);
46+
//
47+
// return ResponseEntity.status(HttpStatus.CREATED).body(usuarioCriado);
48+
// }
3949
}

uol/src/main/java/com/testbackend/uol/dto/UsuarioDTO.java

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,24 @@
22

33
import com.testbackend.uol.enums.HeroGrupo;
44
import com.testbackend.uol.model.Usuario;
5-
import jakarta.validation.constraints.NotNull;
6-
import lombok.AllArgsConstructor;
5+
import jakarta.validation.constraints.Email;
6+
import jakarta.validation.constraints.NotEmpty;
77
import lombok.Getter;
8+
import lombok.NoArgsConstructor;
89
import lombok.Setter;
910
import org.springframework.beans.BeanUtils;
1011

1112
@Getter
1213
@Setter
13-
@AllArgsConstructor
14+
@NoArgsConstructor
1415
public class UsuarioDTO {
1516

16-
@NotNull
17+
@NotEmpty(message = "O nome deve ser informado!")
1718
private String nome;
18-
@NotNull
19+
@NotEmpty(message = "O email deve ser informado!")
20+
@Email(message = "infome um email valido")
1921
private String email;
20-
2122
private String telefone;
22-
23-
@NotNull
2423
private HeroGrupo grupo;
2524

2625

uol/src/main/java/com/testbackend/uol/repository/UsuarioRepository.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.testbackend.uol.repository;
22

3+
import com.testbackend.uol.dto.UsuarioDTO;
34
import com.testbackend.uol.enums.HeroGrupo;
45
import com.testbackend.uol.model.Usuario;
56
import org.springframework.data.jpa.repository.JpaRepository;
@@ -12,4 +13,8 @@ public interface UsuarioRepository extends JpaRepository<Usuario, Long> {
1213

1314
@Query("SELECT u.codinome FROM Usuario u WHERE u.grupo = ?1")
1415
List<String> getCodinomeByGrupo(HeroGrupo grupo);
16+
17+
@Query("SELECT u FROM Usuario u WHERE u.email= ?1")
18+
UsuarioDTO getUsuarioByEmail(String email);
19+
1520
}

uol/src/main/java/com/testbackend/uol/service/UsuarioService.java

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,22 +23,27 @@ public class UsuarioService {
2323
private final LigaChoice ligaChoiceStrategy;
2424

2525

26-
public List<UsuarioDTO> getAll(){
26+
public List<Usuario> getAll(){
2727

28-
return usuarioRepository.findAll().stream().map(UsuarioDTO::new).toList();
28+
return usuarioRepository.findAll();
2929

3030
}
3131

32+
public UsuarioDTO getByEmail(String email){
33+
return usuarioRepository.getUsuarioByEmail(email);
34+
}
35+
3236
public UsuarioDTO saveUsuario(UsuarioDTO usuario) {
3337
var entity = new Usuario(usuario);
34-
String codinome;
38+
String codinome = "";
3539
List<String> list;
3640

3741
if (entity.getGrupo().getValue().equals(HeroGrupo.VINGADORES.getValue())) {
3842
list = usuarioRepository.getCodinomeByGrupo(entity.getGrupo());
3943

4044
codinome = vingadoresChoiceStrategy.choiceHeroClass(list);
41-
}else{
45+
}
46+
if(entity.getGrupo().getValue().equals(HeroGrupo.LIGADAJUSTICA.getValue())){
4247
list = usuarioRepository.getCodinomeByGrupo(entity.getGrupo());
4348

4449
codinome = ligaChoiceStrategy.choiceHeroClass(list);
@@ -48,4 +53,5 @@ public UsuarioDTO saveUsuario(UsuarioDTO usuario) {
4853

4954
return new UsuarioDTO(usuarioRepository.save(entity));
5055
}
56+
5157
}
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
<!doctype html>
2+
<html lang="pt-br" xmlns:th="http://www.thymeleaf.org">
3+
<head th:replace="~{layout :: page_head}"></head>
4+
<body>
5+
6+
<nav th:replace="~{layout :: page_navbar}"></nav>
7+
8+
<div class="container py-3">
9+
<div class="row">
10+
<div class="col-md-8 mx-auto rounded border p-4 m-4">
11+
<h2 class="text-center mb-5">Novo jogador</h2>
12+
13+
<form method="post" th:object="${usuarioDTO}">
14+
<div class="row mb-3">
15+
<label class="col-sm-4 col-form-label" for="nome">Nome</label>
16+
<div class="col-sm-8">
17+
<input class="form-control" th:field="*{nome}" id="nome">
18+
<p th:if="${#fields.hasErrors('nome')}"
19+
th:classappend="${#fields.hasErrors('nome')} ? 'text-danger' : ''"
20+
th:errors="*{nome}"></p>
21+
</div>
22+
</div>
23+
24+
<div class="row mb-3">
25+
<label class="col-sm-4 col-form-label" for="email">Email</label>
26+
<div class="col-sm-8">
27+
<input class="form-control" th:field="*{email}" id="email">
28+
<p th:if="${#fields.hasErrors('email')}"
29+
th:classappend="${#fields.hasErrors('email')} ? 'text-danger' : ''"
30+
th:errors="*{email}"></p>
31+
</div>
32+
</div>
33+
34+
<div class="row mb-3">
35+
<label class="col-sm-4 col-form-label" for="telefone">Telefone</label>
36+
<div class="col-sm-8">
37+
<input class="form-control" th:field="*{telefone}" id="telefone">
38+
<p th:if="${#fields.hasErrors('telefone')}"
39+
th:classappend="${#fields.hasErrors('telefone')} ? 'text-danger' : ''"
40+
th:errors="*{telefone}"></p>
41+
</div>
42+
</div>
43+
44+
<div class="row mb-3">
45+
<label class="col-sm-4 col-form-label">Quero ser do grupo:</label>
46+
<div class="col-sm-8">
47+
<label>
48+
<input type="radio" name="grupo" th:field="*{grupo}" value="LIGADAJUSTICA">
49+
Liga da Justiça
50+
</label><br>
51+
<label>
52+
<input type="radio" name="grupo" th:field="*{grupo}" value="VINGADORES">
53+
Os Vingadores
54+
</label>
55+
</div>
56+
</div>
57+
58+
<div class="row">
59+
<div class="offset-sm-4 col-sm-4 d-grid">
60+
<button type="submit" class="btn btn-primary">Cadastrar</button>
61+
</div>
62+
<div class="col-sm-4 d-grid">
63+
<a class="btn btn-outline-primary" href="/users">Cancelar</a>
64+
</div>
65+
</div>
66+
67+
</form>
68+
</div>
69+
</div>
70+
</div>
71+
72+
<footer th:replace="~{layout :: page_footer}"></footer>
73+
74+
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz" crossorigin="anonymous"></script>
75+
</body>
76+
</html>
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
<!doctype html>
2+
<html lang="en" xmlns:th="http://www.thymeleaf.org">
3+
<head th:replace="~{layout :: page_head}"></head>
4+
<body>
5+
6+
<nav th:replace="~{layout :: page_navbar}"></nav>
7+
8+
9+
<div class="container py-3">
10+
11+
<h1 class="text-center my-4"> Jogadores cadastrados</h1>
12+
<a class="btn btn-primary mb-3" href="/users/create">Cadastrar Jogador</a>
13+
14+
<table class="table">
15+
<thead>
16+
<tr>
17+
<th>id</th>
18+
<th>nome</th>
19+
<th>email</th>
20+
<th>telefone</th>
21+
<th>codinome</th>
22+
<th>grupo</th>
23+
</tr>
24+
</thead>
25+
<tbody class="table-group-divider">
26+
<tr th:each="users : ${users}">
27+
<td th:text="${users.id}"></td>
28+
<td th:text="${users.nome}"></td>
29+
<td th:text="${users.email}"></td>
30+
<td th:text="${users.telefone}"></td>
31+
<td th:text="${users.codinome}"></td>
32+
<td th:text="${users.grupo}"></td>
33+
34+
<td style="white-space:nowrap">
35+
<a class="btn btn-primary btn-sm"
36+
th:href="@{/users/edit(id=${users.id})}">Editar</a>
37+
38+
<a class="btn btn-danger btn-sm"
39+
th:href="@{/users/delete(id=${users.id})}"
40+
onclick="return confirm('Are you sure?')">Excluir</a>
41+
</td>
42+
</tr>
43+
</tbody>
44+
</table>
45+
</div>
46+
47+
<footer th:replace="~{layout :: page_footer}"></footer>
48+
49+
50+
51+
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz" crossorigin="anonymous"></script>
52+
</body>
53+
</html>
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<!doctype html>
2+
<html lang="en" xmlns:th="http://www.thymeleaf.org">
3+
<head th:replace="~{layout :: page_head}"></head>
4+
<body>
5+
6+
<nav th:replace="~{layout :: page_navbar}"></nav>
7+
8+
9+
<div class="container py-3">
10+
11+
<h1 class="text-center my-4"> Welcome to our new website</h1>
12+
</div>
13+
14+
<footer th:replace="~{layout :: page_footer}"></footer>
15+
16+
17+
18+
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz" crossorigin="anonymous"></script>
19+
</body>
20+
</html>

0 commit comments

Comments
 (0)