Skip to content

Commit 5bb51bc

Browse files
committed
Tests update
1 parent 29555dd commit 5bb51bc

File tree

10 files changed

+218
-0
lines changed

10 files changed

+218
-0
lines changed
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package test.org.springdoc.ui.app37.config;
2+
3+
public class ApiVersionParser implements org.springframework.web.accept.ApiVersionParser {
4+
5+
// allows us to use /api/v2/users instead of /api/2.0/users
6+
@Override
7+
public Comparable parseVersion(String version) {
8+
// Remove "v" prefix if it exists (v1 becomes 1, v2 becomes 2)
9+
if (version.startsWith("v") || version.startsWith("V")) {
10+
version = version.substring(1);
11+
}
12+
13+
return version;
14+
}
15+
16+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package test.org.springdoc.ui.app37.config;
2+
3+
import org.springframework.context.annotation.Configuration;
4+
import org.springframework.web.reactive.config.ApiVersionConfigurer;
5+
import org.springframework.web.reactive.config.WebFluxConfigurer;
6+
7+
@Configuration
8+
public class WebConfig implements WebFluxConfigurer {
9+
10+
@Override
11+
public void configureApiVersioning(ApiVersionConfigurer configurer) {
12+
configurer.usePathSegment(1)
13+
.detectSupportedVersions(false)
14+
.addSupportedVersions("1.0", "2.0")
15+
.setDefaultVersion("1.0")
16+
.setVersionRequired(false)
17+
.setVersionParser(new ApiVersionParser());
18+
}
19+
20+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package test.org.springdoc.ui.app37.user;
2+
3+
public record User(Integer id, String name, String email
4+
5+
// a lot more fields here
6+
) {
7+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package test.org.springdoc.ui.app37.user;
2+
3+
import java.util.List;
4+
5+
import org.slf4j.Logger;
6+
import org.slf4j.LoggerFactory;
7+
8+
import org.springframework.web.bind.annotation.GetMapping;
9+
import org.springframework.web.bind.annotation.RequestMapping;
10+
import org.springframework.web.bind.annotation.RestController;
11+
12+
@RestController
13+
@RequestMapping("/api")
14+
public class UserController {
15+
16+
private static final Logger log = LoggerFactory.getLogger(UserController.class);
17+
18+
private final UserRepository userRepository;
19+
20+
private final UserMapper userMapper;
21+
22+
public UserController(UserRepository userRepository, UserMapper userMapper) {
23+
this.userRepository = userRepository;
24+
this.userMapper = userMapper;
25+
}
26+
27+
// USING PATH SEGMENT ======================================================
28+
29+
@GetMapping(value = "/v{api}/users", version = "1.0")
30+
public List<User> findAllv1() {
31+
log.info("Finding all users v1");
32+
return userRepository.findAll();
33+
}
34+
35+
@GetMapping(value = "/{version}/users", version = "2.0")
36+
public List<User> findAllv2() {
37+
log.info("Finding all users v2");
38+
return userRepository.findAll();
39+
}
40+
41+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package test.org.springdoc.ui.app37.user;
2+
3+
public record UserDTOv1(Integer id, String name, String email) {
4+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package test.org.springdoc.ui.app37.user;
2+
3+
public record UserDTOv2(Integer id, String firstName, String lastName, String email) {
4+
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package test.org.springdoc.ui.app37.user;
2+
3+
import org.springframework.stereotype.Component;
4+
5+
/*
6+
* you could also use a library like MapStruct
7+
*/
8+
@Component
9+
public class UserMapper {
10+
11+
// User to DTOs
12+
public UserDTOv1 toV1(User user) {
13+
return new UserDTOv1(user.id(), user.name(), user.email());
14+
}
15+
16+
public UserDTOv2 toV2(User user) {
17+
String[] nameParts = splitName(user.name());
18+
return new UserDTOv2(user.id(), nameParts[0], // firstName
19+
nameParts[1], // lastName
20+
user.email());
21+
}
22+
23+
// DTOs to User
24+
public User fromV1(UserDTOv1 dto) {
25+
return new User(dto.id(), dto.name(), dto.email());
26+
}
27+
28+
public User fromV2(UserDTOv2 dto) {
29+
String combinedName = combineName(dto.firstName(), dto.lastName());
30+
return new User(dto.id(), combinedName, dto.email());
31+
}
32+
33+
// Helper methods
34+
private String[] splitName(String fullName) {
35+
if (fullName == null || fullName.trim().isEmpty()) {
36+
return new String[] { "", "" };
37+
}
38+
39+
String trimmed = fullName.trim();
40+
int lastSpaceIndex = trimmed.lastIndexOf(' ');
41+
42+
if (lastSpaceIndex == -1) {
43+
// Single word name - put it as firstName
44+
return new String[] { trimmed, "" };
45+
}
46+
47+
// Split at last space (handles middle names better)
48+
// "John Smith Jr" -> "John Smith" and "Jr"
49+
// "Mary Ann Smith" -> "Mary Ann" and "Smith"
50+
return new String[] { trimmed.substring(0, lastSpaceIndex), trimmed.substring(lastSpaceIndex + 1) };
51+
}
52+
53+
private String combineName(String firstName, String lastName) {
54+
firstName = firstName != null ? firstName.trim() : "";
55+
lastName = lastName != null ? lastName.trim() : "";
56+
57+
if (firstName.isEmpty()) {
58+
return lastName;
59+
}
60+
if (lastName.isEmpty()) {
61+
return firstName;
62+
}
63+
return firstName + " " + lastName;
64+
}
65+
66+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package test.org.springdoc.ui.app37.user;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
6+
import jakarta.annotation.PostConstruct;
7+
8+
import org.springframework.stereotype.Repository;
9+
10+
@Repository
11+
public class UserRepository {
12+
13+
private final List<User> users = new ArrayList<>();
14+
15+
public List<User> findAll() {
16+
return users;
17+
}
18+
19+
public User findById(Integer id) {
20+
return users.stream().filter(u -> u.id().equals(id)).findFirst().orElse(null);
21+
}
22+
23+
@PostConstruct
24+
private void init() {
25+
users.add(new User(1, "Dan Vega", "danvega@gmail.com"));
26+
}
27+
28+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
org.springdoc.core.configuration.SpringDocConfiguration
2+
org.springdoc.core.properties.SpringDocConfigProperties
3+
org.springdoc.core.configuration.SpringDocSpecPropertiesConfiguration
4+
org.springdoc.core.configuration.SpringDocJavadocConfiguration
5+
org.springdoc.core.configuration.SpringDocGroovyConfiguration
6+
org.springdoc.core.configuration.SpringDocSecurityConfiguration
7+
org.springdoc.core.configuration.SpringDocFunctionCatalogConfiguration
8+
org.springdoc.core.configuration.SpringDocHateoasConfiguration
9+
org.springdoc.core.configuration.SpringDocPageableConfiguration
10+
org.springdoc.core.configuration.SpringDocSortConfiguration
11+
org.springdoc.core.configuration.SpringDocDataRestConfiguration
12+
org.springdoc.core.configuration.SpringDocKotlinConfiguration
13+
org.springdoc.core.configuration.SpringDocKotlinxConfiguration
14+
org.springdoc.core.configuration.SpringDocJacksonKotlinModuleConfiguration
15+
org.springdoc.webmvc.core.configuration.SpringDocWebMvcConfiguration
16+
org.springdoc.webmvc.core.configuration.MultipleOpenApiSupportConfiguration
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
org.springdoc.core.configuration.SpringDocConfiguration
2+
org.springdoc.core.properties.SpringDocConfigProperties
3+
org.springdoc.core.configuration.SpringDocSpecPropertiesConfiguration
4+
org.springdoc.core.configuration.SpringDocJavadocConfiguration
5+
org.springdoc.core.configuration.SpringDocGroovyConfiguration
6+
org.springdoc.core.configuration.SpringDocSecurityConfiguration
7+
org.springdoc.core.configuration.SpringDocFunctionCatalogConfiguration
8+
org.springdoc.core.configuration.SpringDocHateoasConfiguration
9+
org.springdoc.core.configuration.SpringDocPageableConfiguration
10+
org.springdoc.core.configuration.SpringDocSortConfiguration
11+
org.springdoc.core.configuration.SpringDocDataRestConfiguration
12+
org.springdoc.core.configuration.SpringDocKotlinConfiguration
13+
org.springdoc.core.configuration.SpringDocKotlinxConfiguration
14+
org.springdoc.core.configuration.SpringDocJacksonKotlinModuleConfiguration
15+
org.springdoc.webmvc.core.configuration.SpringDocWebMvcConfiguration
16+
org.springdoc.webmvc.core.configuration.MultipleOpenApiSupportConfiguration

0 commit comments

Comments
 (0)