diff --git a/src/main/java/com/knecon/fforesight/tenantusermanagement/api/external/v2/PublicResourceV2.java b/src/main/java/com/knecon/fforesight/tenantusermanagement/api/external/v2/PublicResourceV2.java new file mode 100644 index 0000000..30ce10f --- /dev/null +++ b/src/main/java/com/knecon/fforesight/tenantusermanagement/api/external/v2/PublicResourceV2.java @@ -0,0 +1,8 @@ +package com.knecon.fforesight.tenantusermanagement.api.external.v2; + +import org.springframework.web.bind.annotation.RequestMapping; + +@RequestMapping("${fforesight.tenant-user-management.base-path-v2:/api}") +public interface PublicResourceV2 { + +} diff --git a/src/main/java/com/knecon/fforesight/tenantusermanagement/api/external/v2/UserResourceV2.java b/src/main/java/com/knecon/fforesight/tenantusermanagement/api/external/v2/UserResourceV2.java new file mode 100644 index 0000000..574e6aa --- /dev/null +++ b/src/main/java/com/knecon/fforesight/tenantusermanagement/api/external/v2/UserResourceV2.java @@ -0,0 +1,38 @@ +package com.knecon.fforesight.tenantusermanagement.api.external.v2; + +import java.util.List; + +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; + +import com.knecon.fforesight.tenantusermanagement.api.external.v2.model.User; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; + +public interface UserResourceV2 { + + String USER_REST_PATH = "/users"; + String USER_ID = "userId"; + String USER_ID_PATH_VARIABLE = "/{" + USER_ID + "}"; + String USERNAME_PARAM = "username"; + + + @ResponseBody + @Operation(summary = "Get a list of users", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "400", description = "Invalid offset or limit specified.")}) + @GetMapping(value = USER_REST_PATH, produces = MediaType.APPLICATION_JSON_VALUE) + List getUsers(@RequestParam(name = USERNAME_PARAM, required = false) String username); + + + @ResponseBody + @Operation(summary = "Retrieve a specific user by its identifier.", description = "None") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "The " + "userId cannot be found."), @ApiResponse(responseCode = "400", description = "The provided user id is empty or " + "null.")}) + @GetMapping(value = USER_REST_PATH + USER_ID_PATH_VARIABLE, produces = MediaType.APPLICATION_JSON_VALUE) + User getUserById(@PathVariable(USER_ID) String userId); + +} diff --git a/src/main/java/com/knecon/fforesight/tenantusermanagement/api/external/v2/model/User.java b/src/main/java/com/knecon/fforesight/tenantusermanagement/api/external/v2/model/User.java new file mode 100644 index 0000000..74be600 --- /dev/null +++ b/src/main/java/com/knecon/fforesight/tenantusermanagement/api/external/v2/model/User.java @@ -0,0 +1,29 @@ +package com.knecon.fforesight.tenantusermanagement.api.external.v2.model; + +import java.util.Set; +import java.util.TreeSet; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(of = "id") +public class User { + + private String id; + private String username; + private String email; + private String firstName; + private String lastName; + private boolean active; + + @Builder.Default + private Set roles = new TreeSet<>(); + +} diff --git a/src/main/java/com/knecon/fforesight/tenantusermanagement/api/external/v2/model/UserList.java b/src/main/java/com/knecon/fforesight/tenantusermanagement/api/external/v2/model/UserList.java new file mode 100644 index 0000000..0df0563 --- /dev/null +++ b/src/main/java/com/knecon/fforesight/tenantusermanagement/api/external/v2/model/UserList.java @@ -0,0 +1,18 @@ +package com.knecon.fforesight.tenantusermanagement.api.external.v2.model; + +import java.util.ArrayList; +import java.util.List; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class UserList { + + private List users = new ArrayList<>(); +} diff --git a/src/main/java/com/knecon/fforesight/tenantusermanagement/controller/external/v2/UserContollerV2.java b/src/main/java/com/knecon/fforesight/tenantusermanagement/controller/external/v2/UserContollerV2.java new file mode 100644 index 0000000..e55d4d2 --- /dev/null +++ b/src/main/java/com/knecon/fforesight/tenantusermanagement/controller/external/v2/UserContollerV2.java @@ -0,0 +1,57 @@ +package com.knecon.fforesight.tenantusermanagement.controller.external.v2; + +import java.util.List; + +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import com.knecon.fforesight.tenantusermanagement.api.external.v2.PublicResourceV2; +import com.knecon.fforesight.tenantusermanagement.api.external.v2.UserResourceV2; +import com.knecon.fforesight.tenantusermanagement.api.external.v2.model.User; +import com.knecon.fforesight.tenantusermanagement.controller.external.UserController; + +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@RestController +@RequiredArgsConstructor +@Tag(name = "6. Users endpoints", description = "Operations related to users.") +public class UserContollerV2 implements UserResourceV2, PublicResourceV2 { + + private final UserController userController; + + + public List getUsers(@RequestParam(name = USERNAME_PARAM, required = false) String username) { + + var users = userController.getAllUsers(false) + .stream() + .map(this::convertUser); + + if (username == null) { + return users.toList(); + } + return users.filter(user -> user.getUsername().equals(username)).toList(); + } + + + public User getUserById(@PathVariable(USER_ID) String userId) { + return convertUser(userController.getUserById(userId)); + } + + + private User convertUser(com.knecon.fforesight.tenantusermanagement.model.User user){ + return User.builder() + .id(user.getUserId()) + .username(user.getUsername()) + .email(user.getEmail()) + .firstName(user.getFirstName()) + .lastName(user.getLastName()) + .active(user.isActive()) + .roles(user.getRoles()) + .build(); + } + +} diff --git a/src/main/java/com/knecon/fforesight/tenantusermanagement/properties/TenantUserManagementProperties.java b/src/main/java/com/knecon/fforesight/tenantusermanagement/properties/TenantUserManagementProperties.java index f72997a..7160308 100644 --- a/src/main/java/com/knecon/fforesight/tenantusermanagement/properties/TenantUserManagementProperties.java +++ b/src/main/java/com/knecon/fforesight/tenantusermanagement/properties/TenantUserManagementProperties.java @@ -22,6 +22,7 @@ public class TenantUserManagementProperties { private String clientId; private String clientSecret; private String basePath = "/"; + private String basePathV2 = "/api"; private int connectionPoolSize = 10; private String applicationName; private Integer accessTokenLifeSpan = 1800;