Skip to content

Commit 57b9ac2

Browse files
author
HERNANDEZ HUERTA Daniel
committed
modicacion
1 parent 87e554b commit 57b9ac2

File tree

10 files changed

+255
-67
lines changed

10 files changed

+255
-67
lines changed

pom.xml

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,19 @@
6060
<optional>true</optional>
6161
</dependency>
6262

63+
<!-- MAPPER -->
64+
<dependency>
65+
<groupId>org.mapstruct</groupId>
66+
<artifactId>mapstruct</artifactId>
67+
<version>1.5.5.Final</version>
68+
</dependency>
69+
<dependency>
70+
<groupId>org.mapstruct</groupId>
71+
<artifactId>mapstruct-processor</artifactId>
72+
<version>1.5.5.Final</version>
73+
<scope>provided</scope>
74+
</dependency>
75+
6376
<!-- TEST -->
6477
<dependency>
6578
<groupId>org.springframework.boot</groupId>
@@ -73,27 +86,24 @@
7386
<plugin>
7487
<groupId>org.apache.maven.plugins</groupId>
7588
<artifactId>maven-compiler-plugin</artifactId>
89+
<version>3.11.0</version> <!-- Puedes ajustar la versión -->
7690
<configuration>
91+
<source>21</source>
92+
<target>21</target>
7793
<annotationProcessorPaths>
94+
<path>
95+
<groupId>org.mapstruct</groupId>
96+
<artifactId>mapstruct-processor</artifactId>
97+
<version>1.5.5.Final</version>
98+
</path>
7899
<path>
79100
<groupId>org.projectlombok</groupId>
80101
<artifactId>lombok</artifactId>
102+
<version>1.18.38</version>
81103
</path>
82104
</annotationProcessorPaths>
83105
</configuration>
84106
</plugin>
85-
<plugin>
86-
<groupId>org.springframework.boot</groupId>
87-
<artifactId>spring-boot-maven-plugin</artifactId>
88-
<configuration>
89-
<excludes>
90-
<exclude>
91-
<groupId>org.projectlombok</groupId>
92-
<artifactId>lombok</artifactId>
93-
</exclude>
94-
</excludes>
95-
</configuration>
96-
</plugin>
97107
</plugins>
98108
</build>
99109

src/main/java/com/dhh/apiRestSpringboot3/ApiRestSpringboot3Application.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
@SpringBootApplication
77
public class ApiRestSpringboot3Application {
88

9-
public static void main(String[] args) {
10-
SpringApplication.run(ApiRestSpringboot3Application.class, args);
11-
}
9+
public static void main(String[] args) {
10+
SpringApplication.run(ApiRestSpringboot3Application.class, args);
11+
}
1212

1313
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.dhh.apiRestSpringboot3.config;
2+
3+
import io.swagger.v3.oas.models.OpenAPI;
4+
import io.swagger.v3.oas.models.info.Contact;
5+
import io.swagger.v3.oas.models.info.Info;
6+
import org.springframework.context.annotation.Bean;
7+
import org.springframework.context.annotation.Configuration;
8+
9+
@Configuration
10+
public class OpenApiConfig {
11+
12+
@Bean
13+
public OpenAPI apiInfo() {
14+
return new OpenAPI()
15+
.info(new Info()
16+
.title("API - API-REST en Spring Boot 3.X")
17+
.version("1.0.0")
18+
.description("API REST con Spring Boot 3.x, Virtual Threads y PostgreSQL")
19+
.contact(new Contact()
20+
.name("Daniel Hernández")
21+
.email("daniel@email.com")
22+
.url("https://github.com/danielhhdev")));
23+
}
24+
}
Lines changed: 55 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,66 @@
11
package com.dhh.apiRestSpringboot3.controller;
22

3-
import com.dhh.apiRestSpringboot3.model.Client;
4-
import com.dhh.apiRestSpringboot3.service.ClientService;
5-
import lombok.RequiredArgsConstructor;
3+
import com.dhh.apiRestSpringboot3.dto.ClientDTO;
4+
import io.swagger.v3.oas.annotations.Operation;
5+
import io.swagger.v3.oas.annotations.Parameter;
6+
import io.swagger.v3.oas.annotations.responses.ApiResponse;
7+
import io.swagger.v3.oas.annotations.responses.ApiResponses;
8+
import io.swagger.v3.oas.annotations.tags.Tag;
69
import org.springframework.http.ResponseEntity;
7-
import org.springframework.web.bind.annotation.*;
810

911
import java.util.List;
1012

11-
@RestController
12-
@RequestMapping("/api")
13-
@RequiredArgsConstructor
14-
public class ClientController {
13+
@Tag(name = "Cliente", description = "Operaciones CRUD para clientes")
14+
public interface ClientController {
1515

16-
private final ClientService clientService;
16+
@Operation(
17+
summary = "Obtener todos los clientes",
18+
description = "Devuelve una lista de todos los clientes registrados"
19+
)
20+
@ApiResponses(value = {
21+
@ApiResponse(responseCode = "200", description = "Lista de clientes obtenida correctamente"),
22+
@ApiResponse(responseCode = "500", description = "Error interno del servidor")
23+
})
24+
ResponseEntity<List<ClientDTO>> getAll();
1725

18-
@GetMapping
19-
public ResponseEntity<List<Client>> getAll() {
20-
return ResponseEntity.ok(clientService.findAll());
21-
}
26+
@Operation(
27+
summary = "Crear un cliente",
28+
description = "Crea un nuevo cliente en la base de datos"
29+
)
30+
@ApiResponses(value = {
31+
@ApiResponse(responseCode = "201", description = "Cliente creado correctamente"),
32+
@ApiResponse(responseCode = "400", description = "Datos de entrada inválidos"),
33+
@ApiResponse(responseCode = "500", description = "Error interno del servidor")
34+
})
35+
ResponseEntity<ClientDTO> create(
36+
@Parameter(description = "DTO del cliente a crear", required = true) ClientDTO clienteDTO
37+
);
2238

23-
@PostMapping
24-
public ResponseEntity<Client> create(@RequestBody Client clienteDTO) {
25-
return ResponseEntity.status(201).body(clientService.save(clienteDTO));
26-
}
27-
28-
@PutMapping("/{id}")
29-
public ResponseEntity<Client> update(@PathVariable Long id, @RequestBody Client clienteDTO) {
30-
return ResponseEntity.ok(clientService.update(id, clienteDTO));
31-
}
32-
33-
@DeleteMapping("/{id}")
34-
public ResponseEntity<Void> delete(@PathVariable Long id) {
35-
clientService.delete(id);
36-
return ResponseEntity.noContent().build();
37-
}
39+
@Operation(
40+
summary = "Actualizar un cliente",
41+
description = "Actualiza un cliente por ID"
42+
)
43+
@ApiResponses(value = {
44+
@ApiResponse(responseCode = "200", description = "Cliente actualizado correctamente"),
45+
@ApiResponse(responseCode = "400", description = "Datos de entrada inválidos"),
46+
@ApiResponse(responseCode = "404", description = "Cliente no encontrado"),
47+
@ApiResponse(responseCode = "500", description = "Error interno del servidor")
48+
})
49+
ResponseEntity<ClientDTO> update(
50+
@Parameter(description = "ID del cliente a actualizar", required = true) Long id,
51+
@Parameter(description = "DTO del cliente con los nuevos datos", required = true) ClientDTO clienteDTO
52+
);
3853

54+
@Operation(
55+
summary = "Eliminar un cliente",
56+
description = "Elimina un cliente por ID"
57+
)
58+
@ApiResponses(value = {
59+
@ApiResponse(responseCode = "204", description = "Cliente eliminado correctamente"),
60+
@ApiResponse(responseCode = "404", description = "Cliente no encontrado"),
61+
@ApiResponse(responseCode = "500", description = "Error interno del servidor")
62+
})
63+
ResponseEntity<Void> delete(
64+
@Parameter(description = "ID del cliente a eliminar", required = true) Long id
65+
);
3966
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package com.dhh.apiRestSpringboot3.controller;
2+
3+
import com.dhh.apiRestSpringboot3.dto.ClientDTO;
4+
import com.dhh.apiRestSpringboot3.service.ClientServiceImpl;
5+
import lombok.RequiredArgsConstructor;
6+
import org.springframework.http.ResponseEntity;
7+
import org.springframework.web.bind.annotation.DeleteMapping;
8+
import org.springframework.web.bind.annotation.GetMapping;
9+
import org.springframework.web.bind.annotation.PathVariable;
10+
import org.springframework.web.bind.annotation.PostMapping;
11+
import org.springframework.web.bind.annotation.PutMapping;
12+
import org.springframework.web.bind.annotation.RequestBody;
13+
import org.springframework.web.bind.annotation.RequestMapping;
14+
import org.springframework.web.bind.annotation.RestController;
15+
16+
import java.util.List;
17+
18+
@RestController
19+
@RequestMapping("/api")
20+
@RequiredArgsConstructor
21+
public class ClientControllerImpl implements ClientController {
22+
23+
private final ClientServiceImpl clientServiceImpl;
24+
25+
@GetMapping
26+
public ResponseEntity<List<ClientDTO>> getAll() {
27+
return ResponseEntity.ok(clientServiceImpl.findAll());
28+
}
29+
30+
@PostMapping
31+
public ResponseEntity<ClientDTO> create(@RequestBody ClientDTO clienteDTO) {
32+
return ResponseEntity.status(201).body(clientServiceImpl.save(clienteDTO));
33+
}
34+
35+
@PutMapping("/{id}")
36+
public ResponseEntity<ClientDTO> update(@PathVariable Long id, @RequestBody ClientDTO clienteDTO) {
37+
return ResponseEntity.ok(clientServiceImpl.update(id, clienteDTO));
38+
}
39+
40+
@DeleteMapping("/{id}")
41+
public ResponseEntity<Void> delete(@PathVariable Long id) {
42+
clientServiceImpl.delete(id);
43+
return ResponseEntity.noContent().build();
44+
}
45+
46+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.dhh.apiRestSpringboot3.dto;
2+
3+
import jakarta.validation.constraints.Email;
4+
import jakarta.validation.constraints.NotBlank;
5+
import jakarta.validation.constraints.Size;
6+
import lombok.AllArgsConstructor;
7+
import lombok.Data;
8+
import lombok.NoArgsConstructor;
9+
10+
@Data
11+
@AllArgsConstructor
12+
@NoArgsConstructor
13+
public class ClientDTO {
14+
15+
private Long id;
16+
17+
@NotBlank(message = "El nombre no puede estar vacío")
18+
@Size(max = 100, message = "El nombre no puede superar los 100 caracteres")
19+
private String name;
20+
21+
@NotBlank(message = "El email es obligatorio")
22+
@Email(message = "El email debe tener un formato válido")
23+
private String email;
24+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.dhh.apiRestSpringboot3.mapper;
2+
3+
import com.dhh.apiRestSpringboot3.dto.ClientDTO;
4+
import com.dhh.apiRestSpringboot3.model.Client;
5+
import org.mapstruct.Mapper;
6+
import org.mapstruct.Mapping;
7+
8+
@Mapper(componentModel = "spring", nullValuePropertyMappingStrategy = org.mapstruct.NullValuePropertyMappingStrategy.IGNORE)
9+
public interface ClientMapper {
10+
11+
@Mapping(source = "id", target = "id")
12+
@Mapping(source = "name", target = "name")
13+
@Mapping(source = "email", target = "email")
14+
ClientDTO toDTO(Client cliente);
15+
16+
@Mapping(source = "id", target = "id")
17+
@Mapping(source = "name", target = "name")
18+
@Mapping(source = "email", target = "email")
19+
Client toEntity(ClientDTO clienteDTO);
20+
21+
}

src/main/java/com/dhh/apiRestSpringboot3/repository/ClientRepository.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@
33
import com.dhh.apiRestSpringboot3.model.Client;
44
import org.springframework.data.jpa.repository.JpaRepository;
55

6-
public interface ClientRepository extends JpaRepository<Client, Long> {
6+
public interface ClientRepository extends JpaRepository<Client, Long> {
77
}
Lines changed: 6 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,17 @@
11
package com.dhh.apiRestSpringboot3.service;
22

3-
import com.dhh.apiRestSpringboot3.model.Client;
4-
import com.dhh.apiRestSpringboot3.repository.ClientRepository;
5-
import lombok.RequiredArgsConstructor;
6-
import org.springframework.stereotype.Service;
3+
import com.dhh.apiRestSpringboot3.dto.ClientDTO;
74

85
import java.util.List;
96

10-
@Service
11-
@RequiredArgsConstructor
12-
public class ClientService {
7+
public interface ClientService {
138

14-
private final ClientRepository repository;
9+
public List<ClientDTO> findAll();
1510

11+
public ClientDTO save(ClientDTO clienteDTO);
1612

17-
public List<Client> findAll() {
18-
return repository.findAll();
19-
}
13+
public ClientDTO update(Long id, ClientDTO clienteDTO);
2014

21-
public Client save(Client clienteDTO) {
22-
return repository.save(clienteDTO);
23-
}
15+
public void delete(Long id);
2416

25-
public Client update(Long id, Client clienteDTO) {
26-
clienteDTO.setId(id);
27-
return repository.save(clienteDTO);
28-
29-
}
30-
31-
public void delete(Long id) {
32-
repository.deleteById(id);
33-
}
3417
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package com.dhh.apiRestSpringboot3.service;
2+
3+
import com.dhh.apiRestSpringboot3.dto.ClientDTO;
4+
import com.dhh.apiRestSpringboot3.mapper.ClientMapper;
5+
import com.dhh.apiRestSpringboot3.model.Client;
6+
import com.dhh.apiRestSpringboot3.repository.ClientRepository;
7+
import lombok.RequiredArgsConstructor;
8+
import org.springframework.stereotype.Service;
9+
10+
import java.util.List;
11+
12+
@Service
13+
@RequiredArgsConstructor
14+
public class ClientServiceImpl implements ClientService {
15+
16+
private final ClientRepository repository;
17+
private final ClientMapper clientMapper;
18+
19+
20+
public List<ClientDTO> findAll() {
21+
var listClientes = repository.findAll();
22+
23+
return listClientes.stream()
24+
.map(clientMapper::toDTO)
25+
.toList();
26+
}
27+
28+
public ClientDTO save(ClientDTO clienteDTO) {
29+
Client cliente;
30+
31+
try {
32+
cliente = repository.save(clientMapper.toEntity(clienteDTO));
33+
} catch (RuntimeException e) {
34+
throw new RuntimeException(e);
35+
}
36+
return clientMapper.toDTO(cliente);
37+
}
38+
39+
public ClientDTO update(Long id, ClientDTO clienteDTO) {
40+
clienteDTO.setId(id);
41+
Client cliente;
42+
try {
43+
cliente = repository.save(clientMapper.toEntity(clienteDTO));
44+
} catch (RuntimeException e) {
45+
throw new RuntimeException(e);
46+
}
47+
return clientMapper.toDTO(cliente);
48+
}
49+
50+
public void delete(Long id) {
51+
repository.deleteById(id);
52+
}
53+
}

0 commit comments

Comments
 (0)