Implemented link users with room
This commit is contained in:
parent
6eda562bc6
commit
4da58baa46
@ -52,7 +52,7 @@ public class UserRoomController {
|
|||||||
var temp = getNodeAndRoom(nodeId, roomId);
|
var temp = getNodeAndRoom(nodeId, roomId);
|
||||||
room = temp.room();
|
room = temp.room();
|
||||||
} catch (Error error) {
|
} catch (Error error) {
|
||||||
return ResponseEntity.status(404).body(new LinkUsersWithRoomResponse(false, error.getMessage()));
|
return ResponseEntity.status(404).body(new LinkUsersWithRoomResponse(false, error.getMessage(), -1, -1));
|
||||||
}
|
}
|
||||||
|
|
||||||
var list = new LinkedList<User>();
|
var list = new LinkedList<User>();
|
||||||
@ -63,12 +63,12 @@ public class UserRoomController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
userService.linkUsersWithRoom(room, list, force);
|
int usedSlots = userService.linkUsersWithRoom(room, list, force);
|
||||||
} catch (Error error) {
|
|
||||||
return ResponseEntity.status(400).body(new LinkUsersWithRoomResponse(false, error.getMessage()));
|
|
||||||
}
|
|
||||||
|
|
||||||
return ResponseEntity.ok(new LinkUsersWithRoomResponse(true, "Success"));
|
return ResponseEntity.ok(new LinkUsersWithRoomResponse(true, "Success", usedSlots, room.getSlots().getSlots()));
|
||||||
|
} catch (Error error) {
|
||||||
|
return ResponseEntity.status(400).body(new LinkUsersWithRoomResponse(false, error.getMessage(), -1, -1));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@DeleteMapping
|
@DeleteMapping
|
||||||
@ -76,17 +76,24 @@ public class UserRoomController {
|
|||||||
@PathVariable(name = "roomId") String roomId,
|
@PathVariable(name = "roomId") String roomId,
|
||||||
@RequestParam(name = "userIds") String userIds) {
|
@RequestParam(name = "userIds") String userIds) {
|
||||||
|
|
||||||
Node node;
|
|
||||||
Room room;
|
Room room;
|
||||||
try {
|
try {
|
||||||
var temp = getNodeAndRoom(nodeId, roomId);
|
var temp = getNodeAndRoom(nodeId, roomId);
|
||||||
node = temp.node();
|
|
||||||
room = temp.room();
|
room = temp.room();
|
||||||
|
|
||||||
|
var list = new LinkedList<User>();
|
||||||
|
for (var username: userIds.split(",")) {
|
||||||
|
if (!NamingValidator.validateUserId(username)) continue;
|
||||||
|
|
||||||
|
list.add(new User(username));
|
||||||
|
}
|
||||||
|
|
||||||
|
userService.unlinkUsersFromRoom(room, list);
|
||||||
} catch (Error error) {
|
} catch (Error error) {
|
||||||
return ResponseEntity.notFound().build();
|
return ResponseEntity.notFound().build();
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
return ResponseEntity.ok().build();
|
||||||
}
|
}
|
||||||
|
|
||||||
private record NodeAndRoom(Node node, Room room) {}
|
private record NodeAndRoom(Node node, Room room) {}
|
||||||
|
|||||||
@ -1,3 +1,3 @@
|
|||||||
package ru.dragonestia.picker.controller.response;
|
package ru.dragonestia.picker.controller.response;
|
||||||
|
|
||||||
public record LinkUsersWithRoomResponse(boolean success, String message) {}
|
public record LinkUsersWithRoomResponse(boolean success, String message, int usedSlots, int totalSlots) {}
|
||||||
|
|||||||
@ -10,7 +10,7 @@ public interface UserService {
|
|||||||
|
|
||||||
List<Room> getUserRooms(User user);
|
List<Room> getUserRooms(User user);
|
||||||
|
|
||||||
void linkUsersWithRoom(Room room, Collection<User> users, boolean force);
|
int linkUsersWithRoom(Room room, Collection<User> users, boolean force);
|
||||||
|
|
||||||
void unlinkUsersFromRoom(Room room, Collection<User> users);
|
void unlinkUsersFromRoom(Room room, Collection<User> users);
|
||||||
|
|
||||||
|
|||||||
@ -22,8 +22,9 @@ public class UserServiceImpl implements UserService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void linkUsersWithRoom(Room room, Collection<User> users, boolean force) {
|
public int linkUsersWithRoom(Room room, Collection<User> users, boolean force) {
|
||||||
userRepository.linkWithRoom(room, users, force);
|
userRepository.linkWithRoom(room, users, force);
|
||||||
|
return userRepository.usersOf(room).size();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@ -9,24 +9,31 @@ import com.vaadin.flow.component.html.Div;
|
|||||||
import com.vaadin.flow.component.html.H2;
|
import com.vaadin.flow.component.html.H2;
|
||||||
import com.vaadin.flow.component.icon.Icon;
|
import com.vaadin.flow.component.icon.Icon;
|
||||||
import com.vaadin.flow.component.icon.VaadinIcon;
|
import com.vaadin.flow.component.icon.VaadinIcon;
|
||||||
|
import com.vaadin.flow.component.notification.Notification;
|
||||||
|
import com.vaadin.flow.component.notification.NotificationVariant;
|
||||||
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
|
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
|
||||||
import com.vaadin.flow.component.textfield.TextField;
|
import com.vaadin.flow.component.textfield.TextField;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import ru.dragonestia.picker.cp.model.Room;
|
import ru.dragonestia.picker.cp.model.Room;
|
||||||
import ru.dragonestia.picker.cp.model.User;
|
import ru.dragonestia.picker.cp.model.User;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.function.BiConsumer;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
public class AddUsers extends Details {
|
public class AddUsers extends Details {
|
||||||
|
|
||||||
private final Room room;
|
private final Room room;
|
||||||
|
private final BiConsumer<Collection<User>, Boolean> onCommit;
|
||||||
private final Checkbox ignoreSlots;
|
private final Checkbox ignoreSlots;
|
||||||
private final VerticalLayout usersLayout;
|
private final VerticalLayout usersLayout;
|
||||||
|
|
||||||
public AddUsers(Room room) {
|
public AddUsers(Room room, BiConsumer<Collection<User>, Boolean> onCommit) {
|
||||||
super(new H2("Add users"));
|
super(new H2("Add users"));
|
||||||
|
|
||||||
this.room = room;
|
this.room = room;
|
||||||
|
this.onCommit = onCommit;
|
||||||
usersLayout = new VerticalLayout();
|
usersLayout = new VerticalLayout();
|
||||||
|
|
||||||
add(addUserToTransacionButton());
|
add(addUserToTransacionButton());
|
||||||
@ -69,7 +76,12 @@ public class AddUsers extends Details {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void onClick() {
|
private void onClick() {
|
||||||
//TODO: save data
|
try {
|
||||||
|
onCommit.accept(readAllUsers(), ignoreSlots.getValue());
|
||||||
|
} catch (Error error) {
|
||||||
|
Notification.show(error.getMessage(), 3000, Notification.Position.TOP_END)
|
||||||
|
.addThemeVariants(NotificationVariant.LUMO_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
clear();
|
clear();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,7 +1,6 @@
|
|||||||
package ru.dragonestia.picker.cp.page;
|
package ru.dragonestia.picker.cp.page;
|
||||||
|
|
||||||
import com.vaadin.flow.component.Html;
|
import com.vaadin.flow.component.Html;
|
||||||
import com.vaadin.flow.component.Text;
|
|
||||||
import com.vaadin.flow.component.Unit;
|
import com.vaadin.flow.component.Unit;
|
||||||
import com.vaadin.flow.component.button.Button;
|
import com.vaadin.flow.component.button.Button;
|
||||||
import com.vaadin.flow.component.html.H2;
|
import com.vaadin.flow.component.html.H2;
|
||||||
@ -23,10 +22,14 @@ import ru.dragonestia.picker.cp.component.NavPath;
|
|||||||
import ru.dragonestia.picker.cp.component.UserList;
|
import ru.dragonestia.picker.cp.component.UserList;
|
||||||
import ru.dragonestia.picker.cp.model.Room;
|
import ru.dragonestia.picker.cp.model.Room;
|
||||||
import ru.dragonestia.picker.cp.model.Node;
|
import ru.dragonestia.picker.cp.model.Node;
|
||||||
|
import ru.dragonestia.picker.cp.model.User;
|
||||||
import ru.dragonestia.picker.cp.repository.RoomRepository;
|
import ru.dragonestia.picker.cp.repository.RoomRepository;
|
||||||
import ru.dragonestia.picker.cp.repository.NodeRepository;
|
import ru.dragonestia.picker.cp.repository.NodeRepository;
|
||||||
import ru.dragonestia.picker.cp.repository.UserRepository;
|
import ru.dragonestia.picker.cp.repository.UserRepository;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
|
|
||||||
@PageTitle("Room details")
|
@PageTitle("Room details")
|
||||||
@Route("/nodes/:nodeId/rooms/:roomId")
|
@Route("/nodes/:nodeId/rooms/:roomId")
|
||||||
public class RoomDetailsPage extends VerticalLayout implements BeforeEnterObserver {
|
public class RoomDetailsPage extends VerticalLayout implements BeforeEnterObserver {
|
||||||
@ -95,7 +98,7 @@ public class RoomDetailsPage extends VerticalLayout implements BeforeEnterObserv
|
|||||||
add(new H2("Room details"));
|
add(new H2("Room details"));
|
||||||
printRoomDetails();
|
printRoomDetails();
|
||||||
add(new Hr());
|
add(new Hr());
|
||||||
add(addUsers = new AddUsers(room));
|
add(addUsers = new AddUsers(room, (users, ignoreLimitation) -> appendUsers(room, users, ignoreLimitation)));
|
||||||
add(new Hr());
|
add(new Hr());
|
||||||
add(new H2("Users"));
|
add(new H2("Users"));
|
||||||
add(userList = new UserList(room, userRepository.all(room)));
|
add(userList = new UserList(room, userRepository.all(room)));
|
||||||
@ -151,4 +154,34 @@ public class RoomDetailsPage extends VerticalLayout implements BeforeEnterObserv
|
|||||||
Notification.show("Success", 3000, Notification.Position.TOP_END)
|
Notification.show("Success", 3000, Notification.Position.TOP_END)
|
||||||
.addThemeVariants(NotificationVariant.LUMO_SUCCESS);
|
.addThemeVariants(NotificationVariant.LUMO_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void appendUsers(Room room, Collection<User> users, boolean ignoreLimitation) {
|
||||||
|
AtomicBoolean validationFail = new AtomicBoolean(false);
|
||||||
|
|
||||||
|
var newUsers = users.stream()
|
||||||
|
.filter(user -> {
|
||||||
|
if (user.id().matches("^[aA-zZ\\d-.\\s:/@%?!~$)(+=_|;*]+$")) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
validationFail.set(true);
|
||||||
|
return false;
|
||||||
|
}).toList();
|
||||||
|
|
||||||
|
userRepository.linkWithRoom(room, newUsers, ignoreLimitation);
|
||||||
|
userList.update(userRepository.all(room));
|
||||||
|
|
||||||
|
if (validationFail.get()) {
|
||||||
|
if (newUsers.isEmpty()) {
|
||||||
|
Notification.show("All users entered were added because they do not comply with the rule for writing the user identifier", 3000, Notification.Position.TOP_END)
|
||||||
|
.addThemeVariants(NotificationVariant.LUMO_ERROR);
|
||||||
|
} else {
|
||||||
|
Notification.show("Not all users entered were added because they do not comply with the rule for writing the user identifier", 3000, Notification.Position.TOP_END)
|
||||||
|
.addThemeVariants(NotificationVariant.LUMO_WARNING);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Notification.show("Success", 3000, Notification.Position.TOP_END)
|
||||||
|
.addThemeVariants(NotificationVariant.LUMO_SUCCESS);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -8,7 +8,7 @@ import java.util.List;
|
|||||||
|
|
||||||
public interface UserRepository {
|
public interface UserRepository {
|
||||||
|
|
||||||
void linkWithRoom(Room room, Collection<User> users);
|
void linkWithRoom(Room room, Collection<User> users, boolean force);
|
||||||
|
|
||||||
void unlinkFromRoom(Room room, Collection<User> users);
|
void unlinkFromRoom(Room room, Collection<User> users);
|
||||||
|
|
||||||
|
|||||||
@ -6,6 +6,7 @@ import lombok.extern.log4j.Log4j2;
|
|||||||
import ru.dragonestia.picker.cp.model.Room;
|
import ru.dragonestia.picker.cp.model.Room;
|
||||||
import ru.dragonestia.picker.cp.model.User;
|
import ru.dragonestia.picker.cp.model.User;
|
||||||
import ru.dragonestia.picker.cp.repository.UserRepository;
|
import ru.dragonestia.picker.cp.repository.UserRepository;
|
||||||
|
import ru.dragonestia.picker.cp.repository.impl.response.LinkUsersWithRoomResponse;
|
||||||
import ru.dragonestia.picker.cp.repository.impl.response.RoomUserListResponse;
|
import ru.dragonestia.picker.cp.repository.impl.response.RoomUserListResponse;
|
||||||
|
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
@ -20,13 +21,34 @@ public class UserRepositoryImpl implements UserRepository {
|
|||||||
private final RestUtil rest;
|
private final RestUtil rest;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void linkWithRoom(Room room, Collection<User> users) {
|
public void linkWithRoom(Room room, Collection<User> users, boolean force) {
|
||||||
// TODO
|
try {
|
||||||
|
var response = rest.post(URI.create("/nodes/%s/rooms/%s/users".formatted(room.getNodeId(), room.getId())),
|
||||||
|
LinkUsersWithRoomResponse.class,
|
||||||
|
params -> {
|
||||||
|
params.put("userIds", String.join(",", users.stream().map(User::id).toList()));
|
||||||
|
params.put("force", Boolean.toString(force));
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
if (!response.success()) {
|
||||||
|
throw new Error(response.message());
|
||||||
|
}
|
||||||
|
} catch (Exception ex) {
|
||||||
|
log.throwing(ex);
|
||||||
|
throw new Error("Internal error");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void unlinkFromRoom(Room room, Collection<User> users) {
|
public void unlinkFromRoom(Room room, Collection<User> users) {
|
||||||
// TODO
|
try {
|
||||||
|
rest.delete(URI.create("/nodes/%s/rooms/%s/users".formatted(room.getNodeId(), room.getId())),
|
||||||
|
params -> params.put("userIds", String.join(",", users.stream().map(User::id).toList())));
|
||||||
|
} catch (Exception ex) {
|
||||||
|
log.throwing(ex);
|
||||||
|
throw new Error("Internal error");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@ -0,0 +1,3 @@
|
|||||||
|
package ru.dragonestia.picker.cp.repository.impl.response;
|
||||||
|
|
||||||
|
public record LinkUsersWithRoomResponse(boolean success, String message, int usedSlots, int totalSlots) {}
|
||||||
Loading…
x
Reference in New Issue
Block a user