Refactored 'RUser' to 'ResponseUser'

This commit is contained in:
Andrey Terentev 2024-03-12 13:03:38 +07:00 committed by Andrey Terentev
parent 96c7a2e529
commit d92a3fed6e
13 changed files with 105 additions and 54 deletions

View File

@ -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)));

View File

@ -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);
}
}

View File

@ -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<User> getRoomUsers(Room room);
List<RUser> getRoomUsersWithDetailsResponse(Room room, Set<UserDetails> details);
List<ResponseUser> getRoomUsersWithDetailsResponse(Room room, Set<UserDetails> details);
List<RUser> searchUsers(String input, Set<UserDetails> details);
List<ResponseUser> searchUsers(String input, Set<UserDetails> details);
RUser getUserDetails(String userId, Set<UserDetails> details);
ResponseUser getUserDetails(String userId, Set<UserDetails> details);
}

View File

@ -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<RUser> getRoomUsersWithDetailsResponse(Room room, Set<UserDetails> details) {
var users = new LinkedList<RUser>();
public List<ResponseUser> getRoomUsersWithDetailsResponse(Room room, Set<UserDetails> details) {
var users = new LinkedList<ResponseUser>();
for (var user: getRoomUsers(room)) {
users.add(detailsExtractor.extract(user, details));
}
@ -61,12 +61,12 @@ public class UserServiceImpl implements UserService {
}
@Override
public List<RUser> searchUsers(String input, Set<UserDetails> details) {
public List<ResponseUser> searchUsers(String input, Set<UserDetails> details) {
return userRepository.search(input).stream().map(user -> detailsExtractor.extract(user, details)).toList();
}
@Override
public RUser getUserDetails(String userId, Set<UserDetails> details) {
public ResponseUser getUserDetails(String userId, Set<UserDetails> details) {
return detailsExtractor.extract(new User(userId), details);
}
}

View File

@ -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<UserDetails> details) {
public ResponseUser extract(User user, Set<UserDetails> details) {
var response = user.toResponseObject();
for (var detail: details) {

View File

@ -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);
}

View File

@ -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<UserDetails, String> details = new HashMap<>();
private Map<UserDetails, String> 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<UserDetails, String> 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);
}
}

View File

@ -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();
}
}

View File

@ -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<UserDetails> ALL_DETAILS = Set.of(UserDetails.COUNT_ROOMS);
void linkWithRoom(ResponseRoom room, Collection<ResponseUser> users, boolean force);
void linkWithRoom(ResponseRoom room, Collection<RUser> users, boolean force) throws NodeNotFoundException, RoomNotFoundException, RoomAreFullException;
void unlinkFromRoom(ResponseRoom room, Collection<ResponseUser> users);
void unlinkFromRoom(ResponseRoom room, Collection<RUser> users) throws NodeNotFoundException, RoomNotFoundException;
List<ResponseUser> all(ResponseRoom room, Set<UserDetails> details);
default List<RUser> all(ResponseRoom room) throws NodeNotFoundException, RoomNotFoundException {
return all(room, Set.of());
}
List<RUser> all(ResponseRoom room, Set<UserDetails> details) throws NodeNotFoundException, RoomNotFoundException;
List<RUser> search(String input, Set<UserDetails> details);
RUser find(String userId, Set<UserDetails> details);
List<ShortResponseRoom> getLinkedRoomsWithUsers(RUser user, Set<RoomDetails> roomDetails);
List<ResponseUser> search(String input, Set<UserDetails> details);
ResponseUser find(String userId, Set<UserDetails> details);
List<ShortResponseRoom> getLinkedRoomsWithUsers(ResponseUser user, Set<RoomDetails> roomDetails);
}

View File

@ -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<RUser> users
@Schema(description = "Users") List<ResponseUser> users
) {}

View File

@ -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<RUser> users) {}
public record SearchUserResponse(List<ResponseUser> users) {}

View File

@ -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) {}

View File

@ -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<String> {
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);
}
}