diff --git a/app/src/main/java/ru/dragonestia/picker/controller/UserController.java b/app/src/main/java/ru/dragonestia/picker/controller/UserController.java index bac8bab..1afe677 100644 --- a/app/src/main/java/ru/dragonestia/picker/controller/UserController.java +++ b/app/src/main/java/ru/dragonestia/picker/controller/UserController.java @@ -5,11 +5,10 @@ import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; +import ru.dragonestia.picker.api.model.user.ResponseUser; import ru.dragonestia.picker.api.repository.response.LinkedRoomsWithUserResponse; import ru.dragonestia.picker.api.repository.response.SearchUserResponse; import ru.dragonestia.picker.api.repository.response.UserDetailsResponse; -import ru.dragonestia.picker.api.repository.response.type.RUser; -import ru.dragonestia.picker.model.Room; import ru.dragonestia.picker.model.User; import ru.dragonestia.picker.service.UserService; import ru.dragonestia.picker.util.DetailsParser; @@ -47,7 +46,7 @@ public class UserController { @Parameter(description = "Required addition user data", example = "COUNT_ROOMS") @RequestParam(value = "requiredDetails", required = false) String detailsSeq ) { if (!namingValidator.validateUserId(userId)) { - return new UserDetailsResponse(new RUser(userId)); + return new UserDetailsResponse(new ResponseUser(userId)); } return new UserDetailsResponse(userService.getUserDetails(userId, detailsParser.parseUserDetails(detailsSeq))); diff --git a/app/src/main/java/ru/dragonestia/picker/model/User.java b/app/src/main/java/ru/dragonestia/picker/model/User.java index 9848007..f28f5c7 100644 --- a/app/src/main/java/ru/dragonestia/picker/model/User.java +++ b/app/src/main/java/ru/dragonestia/picker/model/User.java @@ -1,7 +1,7 @@ package ru.dragonestia.picker.model; import lombok.NonNull; -import ru.dragonestia.picker.api.repository.response.type.RUser; +import ru.dragonestia.picker.api.model.user.ResponseUser; public record User(@NonNull String id) { @@ -20,7 +20,7 @@ public record User(@NonNull String id) { return false; } - public RUser toResponseObject() { - return new RUser(id); + public ResponseUser toResponseObject() { + return new ResponseUser(id); } } diff --git a/app/src/main/java/ru/dragonestia/picker/service/UserService.java b/app/src/main/java/ru/dragonestia/picker/service/UserService.java index 8751bc6..00e843c 100644 --- a/app/src/main/java/ru/dragonestia/picker/service/UserService.java +++ b/app/src/main/java/ru/dragonestia/picker/service/UserService.java @@ -3,8 +3,8 @@ package ru.dragonestia.picker.service; import ru.dragonestia.picker.api.exception.RoomAreFullException; import ru.dragonestia.picker.api.model.room.RoomDetails; import ru.dragonestia.picker.api.model.room.ShortResponseRoom; +import ru.dragonestia.picker.api.model.user.ResponseUser; import ru.dragonestia.picker.api.model.user.UserDetails; -import ru.dragonestia.picker.api.repository.response.type.RUser; import ru.dragonestia.picker.model.Room; import ru.dragonestia.picker.model.User; @@ -24,9 +24,9 @@ public interface UserService { List getRoomUsers(Room room); - List getRoomUsersWithDetailsResponse(Room room, Set details); + List getRoomUsersWithDetailsResponse(Room room, Set details); - List searchUsers(String input, Set details); + List searchUsers(String input, Set details); - RUser getUserDetails(String userId, Set details); + ResponseUser getUserDetails(String userId, Set details); } diff --git a/app/src/main/java/ru/dragonestia/picker/service/impl/UserServiceImpl.java b/app/src/main/java/ru/dragonestia/picker/service/impl/UserServiceImpl.java index a6f42ab..ad9c1cb 100644 --- a/app/src/main/java/ru/dragonestia/picker/service/impl/UserServiceImpl.java +++ b/app/src/main/java/ru/dragonestia/picker/service/impl/UserServiceImpl.java @@ -4,8 +4,8 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import ru.dragonestia.picker.api.model.room.RoomDetails; import ru.dragonestia.picker.api.model.room.ShortResponseRoom; +import ru.dragonestia.picker.api.model.user.ResponseUser; import ru.dragonestia.picker.api.model.user.UserDetails; -import ru.dragonestia.picker.api.repository.response.type.RUser; import ru.dragonestia.picker.model.Room; import ru.dragonestia.picker.model.User; import ru.dragonestia.picker.repository.UserRepository; @@ -52,8 +52,8 @@ public class UserServiceImpl implements UserService { } @Override - public List getRoomUsersWithDetailsResponse(Room room, Set details) { - var users = new LinkedList(); + public List getRoomUsersWithDetailsResponse(Room room, Set details) { + var users = new LinkedList(); for (var user: getRoomUsers(room)) { users.add(detailsExtractor.extract(user, details)); } @@ -61,12 +61,12 @@ public class UserServiceImpl implements UserService { } @Override - public List searchUsers(String input, Set details) { + public List searchUsers(String input, Set details) { return userRepository.search(input).stream().map(user -> detailsExtractor.extract(user, details)).toList(); } @Override - public RUser getUserDetails(String userId, Set details) { + public ResponseUser getUserDetails(String userId, Set details) { return detailsExtractor.extract(new User(userId), details); } } diff --git a/app/src/main/java/ru/dragonestia/picker/util/DetailsExtractor.java b/app/src/main/java/ru/dragonestia/picker/util/DetailsExtractor.java index 860b0e6..7bad143 100644 --- a/app/src/main/java/ru/dragonestia/picker/util/DetailsExtractor.java +++ b/app/src/main/java/ru/dragonestia/picker/util/DetailsExtractor.java @@ -6,8 +6,8 @@ import ru.dragonestia.picker.api.model.node.NodeDetails; import ru.dragonestia.picker.api.model.node.ResponseNode; import ru.dragonestia.picker.api.model.room.RoomDetails; import ru.dragonestia.picker.api.model.room.ShortResponseRoom; +import ru.dragonestia.picker.api.model.user.ResponseUser; import ru.dragonestia.picker.api.model.user.UserDetails; -import ru.dragonestia.picker.api.repository.response.type.RUser; import ru.dragonestia.picker.model.Node; import ru.dragonestia.picker.model.Room; import ru.dragonestia.picker.model.User; @@ -57,7 +57,7 @@ public class DetailsExtractor { return response; } - public RUser extract(User user, Set details) { + public ResponseUser extract(User user, Set details) { var response = user.toResponseObject(); for (var detail: details) { diff --git a/client-api/src/main/java/ru/dragonestia/picker/api/model/user/IUser.java b/client-api/src/main/java/ru/dragonestia/picker/api/model/user/IUser.java index 5279b5d..89ff2c5 100644 --- a/client-api/src/main/java/ru/dragonestia/picker/api/model/user/IUser.java +++ b/client-api/src/main/java/ru/dragonestia/picker/api/model/user/IUser.java @@ -1,4 +1,11 @@ package ru.dragonestia.picker.api.model.user; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + public interface IUser { + + @NotNull String getIdentifier(); + + @Nullable String getDetail(@NotNull UserDetails detail); } diff --git a/client-api/src/main/java/ru/dragonestia/picker/api/repository/response/type/RUser.java b/client-api/src/main/java/ru/dragonestia/picker/api/model/user/ResponseUser.java similarity index 51% rename from client-api/src/main/java/ru/dragonestia/picker/api/repository/response/type/RUser.java rename to client-api/src/main/java/ru/dragonestia/picker/api/model/user/ResponseUser.java index 85990af..0086ceb 100644 --- a/client-api/src/main/java/ru/dragonestia/picker/api/repository/response/type/RUser.java +++ b/client-api/src/main/java/ru/dragonestia/picker/api/model/user/ResponseUser.java @@ -1,41 +1,42 @@ -package ru.dragonestia.picker.api.repository.response.type; +package ru.dragonestia.picker.api.model.user; import io.swagger.v3.oas.annotations.media.Schema; -import ru.dragonestia.picker.api.model.user.UserDetails; +import org.jetbrains.annotations.ApiStatus.Internal; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.HashMap; import java.util.Map; @Schema(title = "User") -public class RUser { +public class ResponseUser implements IUser { @Schema(description = "User identifier", example = "test-user") private String id; @Schema(description = "Additional data requested (Key-Value)") - private Map details = new HashMap<>(); + private Map details; - private RUser() {} + @Internal + public ResponseUser() {} - public RUser(String id) { + public ResponseUser(@NotNull String id) { this.id = id; this.details = new HashMap<>(); } - public String getId() { + @Override + public @NotNull String getIdentifier() { return id; } - public void putDetail(UserDetails detail, String value) { - details.put(detail, value); - } - - public String getDetail(UserDetails detail) { + @Override + public @Nullable String getDetail(@NotNull UserDetails detail) { return details.get(detail); } - public Map getDetails() { - return details; + public void putDetail(@NotNull UserDetails detail, @NotNull String value) { + details.put(detail, value); } @Override @@ -47,9 +48,14 @@ public class RUser { public boolean equals(Object object) { if (object == this) return true; if (object == null) return false; - if (object instanceof RUser other) { + if (object instanceof ResponseUser other) { return id.equals(other.id); } return false; } + + @Override + public String toString() { + return "[ResponseUser id='%s]".formatted(id); + } } diff --git a/client-api/src/main/java/ru/dragonestia/picker/api/model/user/UserDefinition.java b/client-api/src/main/java/ru/dragonestia/picker/api/model/user/UserDefinition.java new file mode 100644 index 0000000..961141b --- /dev/null +++ b/client-api/src/main/java/ru/dragonestia/picker/api/model/user/UserDefinition.java @@ -0,0 +1,24 @@ +package ru.dragonestia.picker.api.model.user; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import ru.dragonestia.picker.api.repository.type.UserIdentifier; + +public class UserDefinition implements IUser { + + private final String id; + + public UserDefinition(@NotNull UserIdentifier identifier) { + id = identifier.getValue(); + } + + @Override + public @NotNull String getIdentifier() { + return id; + } + + @Override + public @Nullable String getDetail(@NotNull UserDetails detail) { + throw new UnsupportedOperationException(); + } +} diff --git a/client-api/src/main/java/ru/dragonestia/picker/api/repository/UserRepository.java b/client-api/src/main/java/ru/dragonestia/picker/api/repository/UserRepository.java index 3db542e..c23a626 100644 --- a/client-api/src/main/java/ru/dragonestia/picker/api/repository/UserRepository.java +++ b/client-api/src/main/java/ru/dragonestia/picker/api/repository/UserRepository.java @@ -1,13 +1,10 @@ package ru.dragonestia.picker.api.repository; -import ru.dragonestia.picker.api.exception.NodeNotFoundException; -import ru.dragonestia.picker.api.exception.RoomAreFullException; -import ru.dragonestia.picker.api.exception.RoomNotFoundException; import ru.dragonestia.picker.api.model.room.ResponseRoom; import ru.dragonestia.picker.api.model.room.RoomDetails; import ru.dragonestia.picker.api.model.room.ShortResponseRoom; +import ru.dragonestia.picker.api.model.user.ResponseUser; import ru.dragonestia.picker.api.model.user.UserDetails; -import ru.dragonestia.picker.api.repository.response.type.RUser; import java.util.Collection; import java.util.List; @@ -15,21 +12,15 @@ import java.util.Set; public interface UserRepository { - Set ALL_DETAILS = Set.of(UserDetails.COUNT_ROOMS); + void linkWithRoom(ResponseRoom room, Collection users, boolean force); - void linkWithRoom(ResponseRoom room, Collection users, boolean force) throws NodeNotFoundException, RoomNotFoundException, RoomAreFullException; + void unlinkFromRoom(ResponseRoom room, Collection users); - void unlinkFromRoom(ResponseRoom room, Collection users) throws NodeNotFoundException, RoomNotFoundException; + List all(ResponseRoom room, Set details); - default List all(ResponseRoom room) throws NodeNotFoundException, RoomNotFoundException { - return all(room, Set.of()); - } + List search(String input, Set details); - List all(ResponseRoom room, Set details) throws NodeNotFoundException, RoomNotFoundException; + ResponseUser find(String userId, Set details); - List search(String input, Set details); - - RUser find(String userId, Set details); - - List getLinkedRoomsWithUsers(RUser user, Set roomDetails); + List getLinkedRoomsWithUsers(ResponseUser user, Set roomDetails); } diff --git a/client-api/src/main/java/ru/dragonestia/picker/api/repository/response/RoomUserListResponse.java b/client-api/src/main/java/ru/dragonestia/picker/api/repository/response/RoomUserListResponse.java index 4e4c939..808d657 100644 --- a/client-api/src/main/java/ru/dragonestia/picker/api/repository/response/RoomUserListResponse.java +++ b/client-api/src/main/java/ru/dragonestia/picker/api/repository/response/RoomUserListResponse.java @@ -1,7 +1,7 @@ package ru.dragonestia.picker.api.repository.response; import io.swagger.v3.oas.annotations.media.Schema; -import ru.dragonestia.picker.api.repository.response.type.RUser; +import ru.dragonestia.picker.api.model.user.ResponseUser; import java.util.List; @@ -9,5 +9,5 @@ import java.util.List; public record RoomUserListResponse( @Schema(description = "Number of users in room", example = "15") int slots, @Schema(description = "Maximum number of users in room", example = "20") int usedSlots, - @Schema(description = "Users") List users + @Schema(description = "Users") List users ) {} diff --git a/client-api/src/main/java/ru/dragonestia/picker/api/repository/response/SearchUserResponse.java b/client-api/src/main/java/ru/dragonestia/picker/api/repository/response/SearchUserResponse.java index 4565a70..1f3d87a 100644 --- a/client-api/src/main/java/ru/dragonestia/picker/api/repository/response/SearchUserResponse.java +++ b/client-api/src/main/java/ru/dragonestia/picker/api/repository/response/SearchUserResponse.java @@ -1,9 +1,9 @@ package ru.dragonestia.picker.api.repository.response; import io.swagger.v3.oas.annotations.media.Schema; -import ru.dragonestia.picker.api.repository.response.type.RUser; +import ru.dragonestia.picker.api.model.user.ResponseUser; import java.util.List; @Schema(title = "Search user", hidden = true) -public record SearchUserResponse(List users) {} +public record SearchUserResponse(List users) {} diff --git a/client-api/src/main/java/ru/dragonestia/picker/api/repository/response/UserDetailsResponse.java b/client-api/src/main/java/ru/dragonestia/picker/api/repository/response/UserDetailsResponse.java index b5778d8..f95f055 100644 --- a/client-api/src/main/java/ru/dragonestia/picker/api/repository/response/UserDetailsResponse.java +++ b/client-api/src/main/java/ru/dragonestia/picker/api/repository/response/UserDetailsResponse.java @@ -1,7 +1,7 @@ package ru.dragonestia.picker.api.repository.response; import io.swagger.v3.oas.annotations.media.Schema; -import ru.dragonestia.picker.api.repository.response.type.RUser; +import ru.dragonestia.picker.api.model.user.ResponseUser; @Schema(title = "User details", hidden = true) -public record UserDetailsResponse(RUser user) {} +public record UserDetailsResponse(ResponseUser user) {} diff --git a/client-api/src/main/java/ru/dragonestia/picker/api/repository/type/UserIdentifier.java b/client-api/src/main/java/ru/dragonestia/picker/api/repository/type/UserIdentifier.java new file mode 100644 index 0000000..6fe9b7b --- /dev/null +++ b/client-api/src/main/java/ru/dragonestia/picker/api/repository/type/UserIdentifier.java @@ -0,0 +1,24 @@ +package ru.dragonestia.picker.api.repository.type; + +import org.jetbrains.annotations.NotNull; +import ru.dragonestia.picker.api.util.IdentifierValidator; + +import java.security.InvalidParameterException; + +public class UserIdentifier extends ValueObject { + + private UserIdentifier(String value) { + super(value); + } + + @Override + protected void validate(String value) { + if (IdentifierValidator.forUser(value)) return; + + throw new InvalidParameterException("Invalid user identifier"); + } + + public static @NotNull UserIdentifier of(@NotNull String identifier) { + return new UserIdentifier(identifier); + } +}