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);
|
||||
room = temp.room();
|
||||
} 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>();
|
||||
@ -63,12 +63,12 @@ public class UserRoomController {
|
||||
}
|
||||
|
||||
try {
|
||||
userService.linkUsersWithRoom(room, list, force);
|
||||
} catch (Error error) {
|
||||
return ResponseEntity.status(400).body(new LinkUsersWithRoomResponse(false, error.getMessage()));
|
||||
}
|
||||
int usedSlots = userService.linkUsersWithRoom(room, list, force);
|
||||
|
||||
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
|
||||
@ -76,17 +76,24 @@ public class UserRoomController {
|
||||
@PathVariable(name = "roomId") String roomId,
|
||||
@RequestParam(name = "userIds") String userIds) {
|
||||
|
||||
Node node;
|
||||
Room room;
|
||||
try {
|
||||
var temp = getNodeAndRoom(nodeId, roomId);
|
||||
node = temp.node();
|
||||
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) {
|
||||
return ResponseEntity.notFound().build();
|
||||
}
|
||||
|
||||
return null;
|
||||
return ResponseEntity.ok().build();
|
||||
}
|
||||
|
||||
private record NodeAndRoom(Node node, Room room) {}
|
||||
|
||||
@ -1,3 +1,3 @@
|
||||
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);
|
||||
|
||||
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);
|
||||
|
||||
|
||||
@ -22,8 +22,9 @@ public class UserServiceImpl implements UserService {
|
||||
}
|
||||
|
||||
@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);
|
||||
return userRepository.usersOf(room).size();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@ -9,24 +9,31 @@ import com.vaadin.flow.component.html.Div;
|
||||
import com.vaadin.flow.component.html.H2;
|
||||
import com.vaadin.flow.component.icon.Icon;
|
||||
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.textfield.TextField;
|
||||
import lombok.Getter;
|
||||
import ru.dragonestia.picker.cp.model.Room;
|
||||
import ru.dragonestia.picker.cp.model.User;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.function.BiConsumer;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
public class AddUsers extends Details {
|
||||
|
||||
private final Room room;
|
||||
private final BiConsumer<Collection<User>, Boolean> onCommit;
|
||||
private final Checkbox ignoreSlots;
|
||||
private final VerticalLayout usersLayout;
|
||||
|
||||
public AddUsers(Room room) {
|
||||
public AddUsers(Room room, BiConsumer<Collection<User>, Boolean> onCommit) {
|
||||
super(new H2("Add users"));
|
||||
|
||||
this.room = room;
|
||||
this.onCommit = onCommit;
|
||||
usersLayout = new VerticalLayout();
|
||||
|
||||
add(addUserToTransacionButton());
|
||||
@ -69,7 +76,12 @@ public class AddUsers extends Details {
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
|
||||
@ -1,7 +1,6 @@
|
||||
package ru.dragonestia.picker.cp.page;
|
||||
|
||||
import com.vaadin.flow.component.Html;
|
||||
import com.vaadin.flow.component.Text;
|
||||
import com.vaadin.flow.component.Unit;
|
||||
import com.vaadin.flow.component.button.Button;
|
||||
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.model.Room;
|
||||
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.NodeRepository;
|
||||
import ru.dragonestia.picker.cp.repository.UserRepository;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
|
||||
@PageTitle("Room details")
|
||||
@Route("/nodes/:nodeId/rooms/:roomId")
|
||||
public class RoomDetailsPage extends VerticalLayout implements BeforeEnterObserver {
|
||||
@ -95,7 +98,7 @@ public class RoomDetailsPage extends VerticalLayout implements BeforeEnterObserv
|
||||
add(new H2("Room details"));
|
||||
printRoomDetails();
|
||||
add(new Hr());
|
||||
add(addUsers = new AddUsers(room));
|
||||
add(addUsers = new AddUsers(room, (users, ignoreLimitation) -> appendUsers(room, users, ignoreLimitation)));
|
||||
add(new Hr());
|
||||
add(new H2("Users"));
|
||||
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)
|
||||
.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 {
|
||||
|
||||
void linkWithRoom(Room room, Collection<User> users);
|
||||
void linkWithRoom(Room room, Collection<User> users, boolean force);
|
||||
|
||||
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.User;
|
||||
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 java.net.URI;
|
||||
@ -20,13 +21,34 @@ public class UserRepositoryImpl implements UserRepository {
|
||||
private final RestUtil rest;
|
||||
|
||||
@Override
|
||||
public void linkWithRoom(Room room, Collection<User> users) {
|
||||
// TODO
|
||||
public void linkWithRoom(Room room, Collection<User> users, boolean force) {
|
||||
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
|
||||
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
|
||||
|
||||
@ -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