diff --git a/app/src/main/java/ru/dragonestia/picker/controller/NodeController.java b/app/src/main/java/ru/dragonestia/picker/controller/NodeController.java index 9c45ade..fa3a4df 100644 --- a/app/src/main/java/ru/dragonestia/picker/controller/NodeController.java +++ b/app/src/main/java/ru/dragonestia/picker/controller/NodeController.java @@ -8,16 +8,23 @@ import ru.dragonestia.picker.controller.response.NodeDetailsResponse; import ru.dragonestia.picker.controller.response.NodeListResponse; import ru.dragonestia.picker.controller.response.NodeRegisterResponse; import ru.dragonestia.picker.model.Node; +import ru.dragonestia.picker.model.Room; +import ru.dragonestia.picker.model.User; import ru.dragonestia.picker.model.type.PickingMode; import ru.dragonestia.picker.service.NodeService; +import ru.dragonestia.picker.service.RoomService; import ru.dragonestia.picker.util.NamingValidator; +import java.util.LinkedList; +import java.util.Optional; + @RestController @RequestMapping("/nodes") @RequiredArgsConstructor public class NodeController { private final NodeService nodeService; + private final RoomService roomService; @GetMapping NodeListResponse allNodes() { @@ -61,4 +68,36 @@ public class NodeController { return ResponseEntity.ok().build(); } + + @PostMapping("/{nodeId}/pick") + ResponseEntity pickRoom(@PathVariable("nodeId") String nodeId, + @RequestParam(name = "userIds") String userIds) { + + if (!NamingValidator.validateNodeId(nodeId)) { + return new ResponseEntity<>(HttpStatusCode.valueOf(404)); + } + + var nodeOpt = nodeService.find(nodeId); + if (nodeOpt.isEmpty()) { + return new ResponseEntity<>(HttpStatusCode.valueOf(404)); + } + + var node = nodeOpt.get(); + + var list = new LinkedList(); + for (var username: userIds.split(",")) { // TODO: create warnings about invalid usernames + if (!NamingValidator.validateUserId(username)) continue; + + list.add(new User(username)); + } + + Room room; + try { + room = roomService.pickAvailable(node, list); + } catch (RuntimeException ex) { + return new ResponseEntity<>(HttpStatusCode.valueOf(409)); + } + + return ResponseEntity.ok(room); // TODO: make other json schema + } } diff --git a/app/src/main/java/ru/dragonestia/picker/service/impl/RoomServiceImpl.java b/app/src/main/java/ru/dragonestia/picker/service/impl/RoomServiceImpl.java index e5fb7ea..76cbe50 100644 --- a/app/src/main/java/ru/dragonestia/picker/service/impl/RoomServiceImpl.java +++ b/app/src/main/java/ru/dragonestia/picker/service/impl/RoomServiceImpl.java @@ -49,6 +49,7 @@ public class RoomServiceImpl implements RoomService { @Override public Room pickAvailable(Node node, List users) { - throw new RuntimeException("Not implemented"); + return roomRepository.pickFree(node, users) + .orElseThrow(() -> new RuntimeException("There are no rooms available")); } }