Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

User management #12

Merged
merged 3 commits into from
Feb 5, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,14 @@
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.repository.details.RoomDetails;
import ru.dragonestia.picker.api.repository.response.type.RRoom;
import ru.dragonestia.picker.api.repository.response.type.RUser;
import ru.dragonestia.picker.api.repository.details.UserDetails;

import java.util.Collection;
import java.util.List;
import java.util.Optional;
import java.util.Set;

public interface UserRepository {
Expand All @@ -26,4 +28,8 @@ default List<RUser> all(RRoom room) throws NodeNotFoundException, RoomNotFoundEx
List<RUser> all(RRoom room, Set<UserDetails> details) throws NodeNotFoundException, RoomNotFoundException;

List<RUser> search(String input, Set<UserDetails> details);

RUser find(String userId, Set<UserDetails> details);

List<RRoom.Short> getLinkedRoomsWithUsers(RUser user, Set<RoomDetails> roomDetails);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package ru.dragonestia.picker.api.repository.response;

import ru.dragonestia.picker.api.repository.response.type.RRoom;

import java.util.List;

public record LinkedRoomsWithUserResponse(List<RRoom.Short> rooms) {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package ru.dragonestia.picker.api.repository.response;

import ru.dragonestia.picker.api.repository.response.type.RUser;

public record UserDetailsResponse(RUser user) {}
Original file line number Diff line number Diff line change
Expand Up @@ -87,5 +87,5 @@ public boolean equals(Object object) {
return false;
}

public record Short(String id, int slots, boolean locked, Map<RoomDetails, String> details) {}
public record Short(String id, String nodeId, int slots, boolean locked, Map<RoomDetails, String> details) {}
}
Original file line number Diff line number Diff line change
@@ -1,16 +1,17 @@
package ru.dragonestia.picker.controller;

import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import ru.dragonestia.picker.api.repository.details.UserDetails;
import org.springframework.web.bind.annotation.*;
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;
import ru.dragonestia.picker.util.NamingValidator;

import java.util.HashSet;
import java.util.List;

@RequiredArgsConstructor
Expand All @@ -19,6 +20,7 @@
public class UserController {

private final UserService userService;
private final DetailsParser detailsParser;
private final NamingValidator namingValidator;

@GetMapping("/search")
Expand All @@ -29,13 +31,28 @@ SearchUserResponse search(@RequestParam(name = "input") String input,
return new SearchUserResponse(List.of());
}

var details = new HashSet<UserDetails>();
for (var detailStr: detailsSeq.split(",")) {
try {
details.add(UserDetails.valueOf(detailStr.toUpperCase()));
} catch (IllegalArgumentException ignore) {}
return new SearchUserResponse(userService.searchUsers(input, detailsParser.parseUserDetails(detailsSeq)));
}

@GetMapping("/{userId}")
UserDetailsResponse find(@PathVariable(value = "userId") String userId,
@RequestParam(value = "requiredDetails", required = false) String detailsSeq) {

if (!namingValidator.validateUserId(userId)) {
return new UserDetailsResponse(new RUser(userId));
}

return new UserDetailsResponse(userService.getUserDetails(userId, detailsParser.parseUserDetails(detailsSeq)));
}

@GetMapping("/{userId}/rooms")
LinkedRoomsWithUserResponse roomsOf(@PathVariable(value = "userId") String userId,
@RequestParam(value = "requiredDetails", required = false) String detailsSeq) {

if (!namingValidator.validateUserId(userId)) {
return new LinkedRoomsWithUserResponse(List.of());
}

return new SearchUserResponse(userService.searchUsers(input, details));
return new LinkedRoomsWithUserResponse(userService.getUserRoomsWithDetails(new User(userId), detailsParser.parseRoomDetails(detailsSeq)));
}
}
2 changes: 1 addition & 1 deletion app/src/main/java/ru/dragonestia/picker/model/Room.java
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,6 @@ public RRoom toResponseObject() {
}

public RRoom.Short toShortResponseObject() {
return new RRoom.Short(id, slots.getSlots(), locked, new HashMap<>());
return new RRoom.Short(id, nodeId, slots.getSlots(), locked, new HashMap<>());
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package ru.dragonestia.picker.repository;

import ru.dragonestia.picker.api.exception.RoomAreFullException;
import ru.dragonestia.picker.api.repository.response.type.RUser;
import ru.dragonestia.picker.model.Room;
import ru.dragonestia.picker.model.User;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package ru.dragonestia.picker.service;

import ru.dragonestia.picker.api.exception.RoomAreFullException;
import ru.dragonestia.picker.api.repository.details.RoomDetails;
import ru.dragonestia.picker.api.repository.response.type.RRoom;
import ru.dragonestia.picker.api.repository.response.type.RUser;
import ru.dragonestia.picker.api.repository.details.UserDetails;
import ru.dragonestia.picker.model.Room;
Expand All @@ -14,6 +16,8 @@ public interface UserService {

List<Room> getUserRooms(User user);

List<RRoom.Short> getUserRoomsWithDetails(User user, Set<RoomDetails> details);

int linkUsersWithRoom(Room room, Collection<User> users, boolean force) throws RoomAreFullException;

void unlinkUsersFromRoom(Room room, Collection<User> users);
Expand All @@ -23,4 +27,6 @@ public interface UserService {
List<RUser> getRoomUsersWithDetailsResponse(Room room, Set<UserDetails> details);

List<RUser> searchUsers(String input, Set<UserDetails> details);

RUser getUserDetails(String userId, Set<UserDetails> details);
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import ru.dragonestia.picker.model.Node;
import ru.dragonestia.picker.repository.NodeRepository;
import ru.dragonestia.picker.service.NodeService;
import ru.dragonestia.picker.util.DetailsExtractor;
import ru.dragonestia.picker.util.NamingValidator;

import java.util.LinkedList;
Expand All @@ -21,6 +22,7 @@
public class NodeServiceImpl implements NodeService {

private final NodeRepository nodeRepository;
private final DetailsExtractor detailsExtractor;
private final NamingValidator namingValidator;

@Override
Expand All @@ -43,13 +45,7 @@ public List<Node> all() {
public List<RNode> getAllNodesWithDetailsResponse(Set<NodeDetails> details) {
var response = new LinkedList<RNode>();
for (var node: all()) {
var responseNode = node.toResponseObject();

for (var detail: details) {
// TODO...
}

response.add(responseNode);
response.add(detailsExtractor.extract(node, details));
}
return response;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,13 @@
import ru.dragonestia.picker.api.exception.InvalidRoomIdentifierException;
import ru.dragonestia.picker.api.exception.RoomAlreadyExistException;
import ru.dragonestia.picker.api.repository.details.RoomDetails;
import ru.dragonestia.picker.api.repository.details.UserDetails;
import ru.dragonestia.picker.api.repository.response.type.RRoom;
import ru.dragonestia.picker.model.Room;
import ru.dragonestia.picker.model.Node;
import ru.dragonestia.picker.model.User;
import ru.dragonestia.picker.repository.RoomRepository;
import ru.dragonestia.picker.repository.UserRepository;
import ru.dragonestia.picker.service.RoomService;
import ru.dragonestia.picker.util.DetailsExtractor;
import ru.dragonestia.picker.util.NamingValidator;

import java.util.LinkedList;
Expand All @@ -27,7 +26,7 @@
public class RoomServiceImpl implements RoomService {

private final RoomRepository roomRepository;
private final UserRepository userRepository;
private final DetailsExtractor detailsExtractor;
private final NamingValidator namingValidator;

@Override
Expand Down Expand Up @@ -55,16 +54,7 @@ public List<Room> all(Node node) {
public List<RRoom.Short> getAllRoomsWithDetailsResponse(Node node, Set<RoomDetails> details) {
var response = new LinkedList<RRoom.Short>();
for (var room: all(node)) {
var responseRoom = room.toShortResponseObject();

for (var detail: details) {
if (detail == RoomDetails.COUNT_USERS) {
var users = Integer.toString(userRepository.usersOf(room).size());
responseRoom.details().put(RoomDetails.COUNT_USERS, users);
}
}

response.add(responseRoom);
response.add(detailsExtractor.extract(room, details));
}
return response;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,15 @@

import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import ru.dragonestia.picker.api.repository.details.RoomDetails;
import ru.dragonestia.picker.api.repository.response.type.RRoom;
import ru.dragonestia.picker.api.repository.response.type.RUser;
import ru.dragonestia.picker.api.repository.details.UserDetails;
import ru.dragonestia.picker.model.Room;
import ru.dragonestia.picker.model.User;
import ru.dragonestia.picker.repository.UserRepository;
import ru.dragonestia.picker.service.UserService;
import ru.dragonestia.picker.util.DetailsExtractor;

import java.util.*;
import java.util.function.Function;
Expand All @@ -17,13 +20,23 @@
public class UserServiceImpl implements UserService {

private final UserRepository userRepository;
private final DetailsExtractor detailsExtractor;
private final Map<UserDetails, Function<User, String>> detailsMap = new HashMap<>();

@Override
public List<Room> getUserRooms(User user) {
return userRepository.findAllLinkedUserRooms(user);
}

@Override
public List<RRoom.Short> getUserRoomsWithDetails(User user, Set<RoomDetails> details) {
var result = new LinkedList<RRoom.Short>();
for (var room: getUserRooms(user)) {
result.add(detailsExtractor.extract(room, details));
}
return result;
}

@Override
public int linkUsersWithRoom(Room room, Collection<User> users, boolean force) {
userRepository.linkWithRoom(room, users, force);
Expand All @@ -44,32 +57,18 @@ public List<User> getRoomUsers(Room room) {
public List<RUser> getRoomUsersWithDetailsResponse(Room room, Set<UserDetails> details) {
var users = new LinkedList<RUser>();
for (var user: getRoomUsers(room)) {
var responseUser = user.toResponseObject();

for (var detail: details) {
if (detail == UserDetails.COUNT_ROOMS) {
responseUser.putDetail(UserDetails.COUNT_ROOMS, Integer.toString(getUserRooms(user).size()));
}
}

users.add(responseUser);
users.add(detailsExtractor.extract(user, details));
}
return users;
}

@Override
public List<RUser> searchUsers(String input, Set<UserDetails> details) {
return userRepository.search(input).stream()
.map(user -> {
var responseUser = user.toResponseObject();

for (var detail: details) {
if (detail == UserDetails.COUNT_ROOMS) {
responseUser.putDetail(UserDetails.COUNT_ROOMS, Integer.toString(getUserRooms(user).size()));
}
}
return userRepository.search(input).stream().map(user -> detailsExtractor.extract(user, details)).toList();
}

return responseUser;
}).toList();
@Override
public RUser getUserDetails(String userId, Set<UserDetails> details) {
return detailsExtractor.extract(new User(userId), details);
}
}
62 changes: 62 additions & 0 deletions app/src/main/java/ru/dragonestia/picker/util/DetailsExtractor.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package ru.dragonestia.picker.util;

import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
import ru.dragonestia.picker.api.repository.details.NodeDetails;
import ru.dragonestia.picker.api.repository.details.RoomDetails;
import ru.dragonestia.picker.api.repository.details.UserDetails;
import ru.dragonestia.picker.api.repository.response.type.RNode;
import ru.dragonestia.picker.api.repository.response.type.RRoom;
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;
import ru.dragonestia.picker.repository.NodeRepository;
import ru.dragonestia.picker.repository.RoomRepository;
import ru.dragonestia.picker.repository.UserRepository;

import java.util.Set;

@RequiredArgsConstructor
@Component
public class DetailsExtractor {

private final NodeRepository nodeRepository;
private final RoomRepository roomRepository;
private final UserRepository userRepository;

public RNode extract(Node node, Set<NodeDetails> details) {
var response = node.toResponseObject();

for (var detail: details) {
// TODO...
}

return response;
}

public RRoom.Short extract(Room room, Set<RoomDetails> details) {
var response = room.toShortResponseObject();

for (var detail: details) {
if (detail == RoomDetails.COUNT_USERS) {
var users = Integer.toString(userRepository.usersOf(room).size());
response.details().put(RoomDetails.COUNT_USERS, users);
}
}

return response;
}

public RUser extract(User user, Set<UserDetails> details) {
var response = user.toResponseObject();

for (var detail: details) {
if (detail == UserDetails.COUNT_ROOMS) {
response.putDetail(UserDetails.COUNT_ROOMS, Integer.toString(userRepository.findAllLinkedUserRooms(user).size()));
}
}

return response;
}
}
Loading
Loading