diff --git a/LoadBalancerWeb/src/main/java/ru/dragonestia/loadbalancer/web/component/BucketList.java b/LoadBalancerWeb/src/main/java/ru/dragonestia/loadbalancer/web/component/BucketList.java index 2491205..43ea4a1 100644 --- a/LoadBalancerWeb/src/main/java/ru/dragonestia/loadbalancer/web/component/BucketList.java +++ b/LoadBalancerWeb/src/main/java/ru/dragonestia/loadbalancer/web/component/BucketList.java @@ -16,7 +16,7 @@ import com.vaadin.flow.component.orderedlayout.HorizontalLayout; import com.vaadin.flow.component.orderedlayout.VerticalLayout; import com.vaadin.flow.component.textfield.TextField; import lombok.Setter; -import ru.dragonestia.loadbalancer.web.model.Bucket; +import ru.dragonestia.loadbalancer.web.model.dto.BucketDTO; import java.util.List; import java.util.function.Consumer; @@ -24,12 +24,12 @@ import java.util.function.Consumer; public class BucketList extends VerticalLayout { private final String nodeIdentifier; - private final Grid bucketsGrid; + private final Grid bucketsGrid; private final TextField searchField; - private List cachedBuckets; - @Setter private Consumer removeMethod; + private List cachedBuckets; + @Setter private Consumer removeMethod; - public BucketList(String nodeIdentifier, List buckets) { + public BucketList(String nodeIdentifier, List buckets) { this.nodeIdentifier = nodeIdentifier; cachedBuckets = buckets; @@ -53,26 +53,26 @@ public class BucketList extends VerticalLayout { var temp = input.trim(); bucketsGrid.setItems(cachedBuckets.stream() - .filter(bucket -> bucket.getIdentifier().startsWith(temp)) + .filter(bucket -> bucket.identifier().startsWith(temp)) .toList()); } - private Grid createGrid() { - var grid = new Grid<>(Bucket.class, false); - grid.addColumn(Bucket::getIdentifier).setHeader("Identifier"); + private Grid createGrid() { + var grid = new Grid<>(BucketDTO.class, false); + grid.addColumn(BucketDTO::identifier).setHeader("Identifier"); grid.addComponentColumn(bucket -> { var result = new Span(); - if (bucket.getSlots().isUnlimited()) { + if (bucket.slots() == -1) { result.setText("Unlimited"); result.getElement().getThemeList().add("badge contrast"); } else { - result.setText(Integer.toString(bucket.getSlots().slots())); + result.setText(Integer.toString(bucket.slots())); } return result; }).setHeader("Slots").setTextAlign(ColumnTextAlign.CENTER); grid.addComponentColumn(bucket -> { var result = new Span(); - if (bucket.isLocked()) { + if (bucket.locked()) { result.setText("Yes"); result.getElement().getThemeList().add("badge error"); } else { @@ -84,7 +84,7 @@ public class BucketList extends VerticalLayout { return grid; } - private HorizontalLayout createManageButtons(Bucket bucket) { + private HorizontalLayout createManageButtons(BucketDTO bucket) { var layout = new HorizontalLayout(); { @@ -104,16 +104,16 @@ public class BucketList extends VerticalLayout { return layout; } - private void clickDetailsButton(Bucket bucket) { + private void clickDetailsButton(BucketDTO bucket) { getUI().ifPresent(ui -> { ui.navigate("/nodes/" + nodeIdentifier + - "/buckets/" + bucket.getIdentifier()); + "/buckets/" + bucket.identifier()); }); } - private void clickRemoveButton(Bucket bucket) { + private void clickRemoveButton(BucketDTO bucket) { var dialog = new Dialog("Confirm bucket deletion"); - dialog.add(new Paragraph("Confirm that you want to delete bucket. Enter '" + bucket.getIdentifier() + "' to field below and confirm.")); + dialog.add(new Paragraph("Confirm that you want to delete bucket. Enter '" + bucket.identifier() + "' to field below and confirm.")); var inputField = new TextField(); dialog.add(inputField); @@ -122,14 +122,14 @@ public class BucketList extends VerticalLayout { var button = new Button("Confirm"); button.addThemeVariants(ButtonVariant.LUMO_PRIMARY, ButtonVariant.LUMO_ERROR); button.addClickListener(event -> { - if (!bucket.getIdentifier().equals(inputField.getValue())) { + if (!bucket.identifier().equals(inputField.getValue())) { Notification.show("Invalid input", 3000, Notification.Position.TOP_END) .addThemeVariants(NotificationVariant.LUMO_ERROR); return; } removeBucket(bucket); - Notification.show("Bucket '" + bucket.getIdentifier() + "' was successfully removed!", 3000, Notification.Position.TOP_END) + Notification.show("Bucket '" + bucket.identifier() + "' was successfully removed!", 3000, Notification.Position.TOP_END) .addThemeVariants(NotificationVariant.LUMO_SUCCESS); dialog.close(); }); @@ -146,12 +146,12 @@ public class BucketList extends VerticalLayout { dialog.open(); } - public void update(List buckets) { + public void update(List buckets) { cachedBuckets = buckets; applySearch(searchField.getValue()); } - private void removeBucket(Bucket bucket) { + private void removeBucket(BucketDTO bucket) { if (removeMethod != null) { removeMethod.accept(bucket); } diff --git a/LoadBalancerWeb/src/main/java/ru/dragonestia/loadbalancer/web/model/dto/BucketDTO.java b/LoadBalancerWeb/src/main/java/ru/dragonestia/loadbalancer/web/model/dto/BucketDTO.java new file mode 100644 index 0000000..05032e9 --- /dev/null +++ b/LoadBalancerWeb/src/main/java/ru/dragonestia/loadbalancer/web/model/dto/BucketDTO.java @@ -0,0 +1,16 @@ +package ru.dragonestia.loadbalancer.web.model.dto; + +import ru.dragonestia.loadbalancer.web.model.Node; + +import java.net.URI; + +public record BucketDTO(String identifier, int slots, boolean locked) { + + public URI uriAPI(Node node) { + return uriAPI(node.identifier()); + } + + public URI uriAPI(String nodeId) { + return URI.create("/nodes/" + nodeId + "/buckets/" + identifier); + } +} diff --git a/LoadBalancerWeb/src/main/java/ru/dragonestia/loadbalancer/web/page/BucketDetailsPage.java b/LoadBalancerWeb/src/main/java/ru/dragonestia/loadbalancer/web/page/BucketDetailsPage.java index 4c7fc8d..2ab5e1e 100644 --- a/LoadBalancerWeb/src/main/java/ru/dragonestia/loadbalancer/web/page/BucketDetailsPage.java +++ b/LoadBalancerWeb/src/main/java/ru/dragonestia/loadbalancer/web/page/BucketDetailsPage.java @@ -3,7 +3,6 @@ package ru.dragonestia.loadbalancer.web.page; import com.vaadin.flow.component.Html; import com.vaadin.flow.component.Unit; import com.vaadin.flow.component.button.Button; -import com.vaadin.flow.component.html.Div; import com.vaadin.flow.component.html.H2; import com.vaadin.flow.component.html.Hr; import com.vaadin.flow.component.html.Paragraph; diff --git a/LoadBalancerWeb/src/main/java/ru/dragonestia/loadbalancer/web/page/NodeDetailsPage.java b/LoadBalancerWeb/src/main/java/ru/dragonestia/loadbalancer/web/page/NodeDetailsPage.java index 3120e7e..342ac85 100644 --- a/LoadBalancerWeb/src/main/java/ru/dragonestia/loadbalancer/web/page/NodeDetailsPage.java +++ b/LoadBalancerWeb/src/main/java/ru/dragonestia/loadbalancer/web/page/NodeDetailsPage.java @@ -16,10 +16,8 @@ import org.springframework.beans.factory.annotation.Autowired; import ru.dragonestia.loadbalancer.web.component.BucketList; import ru.dragonestia.loadbalancer.web.component.NavPath; import ru.dragonestia.loadbalancer.web.component.RegisterBucket; -import ru.dragonestia.loadbalancer.web.model.Bucket; import ru.dragonestia.loadbalancer.web.model.Node; -import ru.dragonestia.loadbalancer.web.model.type.LoadBalancingMethod; -import ru.dragonestia.loadbalancer.web.model.type.SlotLimit; +import ru.dragonestia.loadbalancer.web.model.dto.BucketDTO; import ru.dragonestia.loadbalancer.web.repository.BucketRepository; import ru.dragonestia.loadbalancer.web.repository.NodeRepository; @@ -66,7 +64,7 @@ public class NodeDetailsPage extends VerticalLayout implements BeforeEnterObserv initComponents(node, bucketRepository.all(node)); } - private void initComponents(Node node, List buckets) { + private void initComponents(Node node, List buckets) { printNodeDetails(node); add(new Hr()); add(registerBucket = new RegisterBucket(node, (bucket) -> { @@ -82,7 +80,7 @@ public class NodeDetailsPage extends VerticalLayout implements BeforeEnterObserv add(new Hr()); add(bucketList = new BucketList(node.identifier(), buckets)); bucketList.setRemoveMethod(bucket -> { - bucketRepository.remove(bucket); + bucketRepository.remove(node, bucket); bucketList.update(bucketRepository.all(node)); }); } diff --git a/LoadBalancerWeb/src/main/java/ru/dragonestia/loadbalancer/web/page/NodesPage.java b/LoadBalancerWeb/src/main/java/ru/dragonestia/loadbalancer/web/page/NodesPage.java index fd3a64e..e3b5c0e 100644 --- a/LoadBalancerWeb/src/main/java/ru/dragonestia/loadbalancer/web/page/NodesPage.java +++ b/LoadBalancerWeb/src/main/java/ru/dragonestia/loadbalancer/web/page/NodesPage.java @@ -7,7 +7,6 @@ import com.vaadin.flow.router.Route; import lombok.Getter; import lombok.extern.log4j.Log4j2; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.client.RestTemplate; import ru.dragonestia.loadbalancer.web.component.NavPath; import ru.dragonestia.loadbalancer.web.component.NodeList; import ru.dragonestia.loadbalancer.web.component.RegisterNode; diff --git a/LoadBalancerWeb/src/main/java/ru/dragonestia/loadbalancer/web/repository/BucketRepository.java b/LoadBalancerWeb/src/main/java/ru/dragonestia/loadbalancer/web/repository/BucketRepository.java index b75430d..63a50a7 100644 --- a/LoadBalancerWeb/src/main/java/ru/dragonestia/loadbalancer/web/repository/BucketRepository.java +++ b/LoadBalancerWeb/src/main/java/ru/dragonestia/loadbalancer/web/repository/BucketRepository.java @@ -2,18 +2,21 @@ package ru.dragonestia.loadbalancer.web.repository; import ru.dragonestia.loadbalancer.web.model.Bucket; import ru.dragonestia.loadbalancer.web.model.Node; +import ru.dragonestia.loadbalancer.web.model.dto.BucketDTO; import java.util.List; import java.util.Optional; public interface BucketRepository { - List all(Node node); + List all(Node node); void register(Bucket bucket); void remove(Bucket bucket); + void remove(Node node, BucketDTO bucket); + Optional find(Node node, String identifier); void lock(Bucket bucket, boolean value); diff --git a/LoadBalancerWeb/src/main/java/ru/dragonestia/loadbalancer/web/repository/impl/BucketRepositoryImpl.java b/LoadBalancerWeb/src/main/java/ru/dragonestia/loadbalancer/web/repository/impl/BucketRepositoryImpl.java index e9894c0..d451983 100644 --- a/LoadBalancerWeb/src/main/java/ru/dragonestia/loadbalancer/web/repository/impl/BucketRepositoryImpl.java +++ b/LoadBalancerWeb/src/main/java/ru/dragonestia/loadbalancer/web/repository/impl/BucketRepositoryImpl.java @@ -6,6 +6,7 @@ import lombok.extern.log4j.Log4j2; import org.springframework.web.client.HttpClientErrorException; import ru.dragonestia.loadbalancer.web.model.Bucket; import ru.dragonestia.loadbalancer.web.model.Node; +import ru.dragonestia.loadbalancer.web.model.dto.BucketDTO; import ru.dragonestia.loadbalancer.web.repository.BucketRepository; import ru.dragonestia.loadbalancer.web.repository.impl.response.BucketInfoResponse; import ru.dragonestia.loadbalancer.web.repository.impl.response.BucketListResponse; @@ -24,7 +25,7 @@ public class BucketRepositoryImpl implements BucketRepository { private final RestUtil rest; @Override - public List all(Node node) { + public List all(Node node) { var entity = rest.getEntity(URI.create("/nodes/" + node.identifier() + "/buckets"), BucketListResponse.class); @@ -70,6 +71,11 @@ public class BucketRepositoryImpl implements BucketRepository { rest.delete(URI.create("/nodes/" + bucket.getNodeIdentifier() + "/buckets/" + bucket.getIdentifier()), params -> {}); } + @Override + public void remove(Node node, BucketDTO bucket) { + rest.delete(URI.create("/nodes/" + node.identifier() + "/buckets/" + bucket.identifier()), params -> {}); + } + @Override public Optional find(Node node, String identifier) { try { diff --git a/LoadBalancerWeb/src/main/java/ru/dragonestia/loadbalancer/web/repository/impl/response/BucketListResponse.java b/LoadBalancerWeb/src/main/java/ru/dragonestia/loadbalancer/web/repository/impl/response/BucketListResponse.java index c8df29f..2cd2e09 100644 --- a/LoadBalancerWeb/src/main/java/ru/dragonestia/loadbalancer/web/repository/impl/response/BucketListResponse.java +++ b/LoadBalancerWeb/src/main/java/ru/dragonestia/loadbalancer/web/repository/impl/response/BucketListResponse.java @@ -1,7 +1,7 @@ package ru.dragonestia.loadbalancer.web.repository.impl.response; -import ru.dragonestia.loadbalancer.web.model.Bucket; +import ru.dragonestia.loadbalancer.web.model.dto.BucketDTO; import java.util.List; -public record BucketListResponse(String node, List buckets) {} +public record BucketListResponse(String node, List buckets) {} diff --git a/src/main/java/ru/dragonestia/loadbalancer/controller/BucketController.java b/src/main/java/ru/dragonestia/loadbalancer/controller/BucketController.java index 8fb405c..e4f6f3f 100644 --- a/src/main/java/ru/dragonestia/loadbalancer/controller/BucketController.java +++ b/src/main/java/ru/dragonestia/loadbalancer/controller/BucketController.java @@ -28,7 +28,9 @@ public class BucketController { ResponseEntity allBuckets(@PathVariable(name = "nodeIdentifier") String nodeId) { var nodeOpt = nodeService.findNode(nodeId); return nodeOpt.map(node -> ResponseEntity.ok(new BucketListResponse(nodeId, - bucketService.allBuckets(node).stream().toList() + bucketService.allBuckets(node).stream() + .map(bucket -> new BucketListResponse.BucketDTO(bucket.getIdentifier(), bucket.getSlots().getSlots(), bucket.isLocked())) + .toList() ))).orElseGet(() -> ResponseEntity.notFound().build()); } diff --git a/src/main/java/ru/dragonestia/loadbalancer/controller/response/BucketListResponse.java b/src/main/java/ru/dragonestia/loadbalancer/controller/response/BucketListResponse.java index 9b91917..60c3728 100644 --- a/src/main/java/ru/dragonestia/loadbalancer/controller/response/BucketListResponse.java +++ b/src/main/java/ru/dragonestia/loadbalancer/controller/response/BucketListResponse.java @@ -1,7 +1,8 @@ package ru.dragonestia.loadbalancer.controller.response; -import ru.dragonestia.loadbalancer.model.Bucket; - import java.util.List; -public record BucketListResponse(String node, List buckets) {} +public record BucketListResponse(String node, List buckets) { + + public record BucketDTO(String identifier, int slots, boolean locked) {} +}