Implemented link users with room

This commit is contained in:
Andrey Terentev 2024-01-11 13:33:21 +07:00
parent 6eda562bc6
commit 4da58baa46
9 changed files with 98 additions and 20 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -0,0 +1,3 @@
package ru.dragonestia.picker.cp.repository.impl.response;
public record LinkUsersWithRoomResponse(boolean success, String message, int usedSlots, int totalSlots) {}