Implemented node service and controller

This commit is contained in:
Andrey Terentev 2023-11-26 20:52:08 +07:00
parent a6d1c0ef3b
commit ea5253c810
6 changed files with 132 additions and 0 deletions

View File

@ -0,0 +1,64 @@
package ru.dragonestia.loadbalancer.controller;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatusCode;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import ru.dragonestia.loadbalancer.controller.response.NodeDetailsResponse;
import ru.dragonestia.loadbalancer.controller.response.NodeListResponse;
import ru.dragonestia.loadbalancer.controller.response.NodeRegisterResponse;
import ru.dragonestia.loadbalancer.model.Node;
import ru.dragonestia.loadbalancer.model.type.LoadBalancingMethod;
import ru.dragonestia.loadbalancer.service.NodeService;
import ru.dragonestia.loadbalancer.util.NamingValidator;
@RestController
@RequestMapping("/nodes")
@RequiredArgsConstructor
public class NodeController {
private final NodeService nodeService;
@GetMapping
NodeListResponse allNodes() {
return new NodeListResponse(nodeService.allNodes());
}
@PostMapping
NodeRegisterResponse registerNode(@RequestParam(name = "identifier") String identifier,
@RequestParam(name = "method") LoadBalancingMethod method) {
try {
nodeService.createNode(new Node(identifier, method));
} catch (IllegalArgumentException ex) {
return new NodeRegisterResponse(false, ex.getMessage());
} catch (Error error) {
new NodeRegisterResponse(false, error.getMessage());
}
return new NodeRegisterResponse(true, "");
}
@GetMapping("/{identifier}")
ResponseEntity<NodeDetailsResponse> nodeDetails(@PathVariable("identifier") String identifier) {
if (!NamingValidator.validateNodeIdentifier(identifier)) {
return new ResponseEntity<>(HttpStatusCode.valueOf(404));
}
var nodeOpt = nodeService.findNode(identifier);
return nodeOpt.map(node -> ResponseEntity.ok(new NodeDetailsResponse(node)))
.orElseGet(() -> new ResponseEntity<>(HttpStatusCode.valueOf(404)));
}
@DeleteMapping("/{identifier}")
ResponseEntity<?> removeNode(@PathVariable("identifier") String identifier) {
if (!NamingValidator.validateNodeIdentifier(identifier)) {
return ResponseEntity.ok().build();
}
var nodeOpt = nodeService.findNode(identifier);
nodeOpt.ifPresent(nodeService::removeNode);
return ResponseEntity.ok().build();
}
}

View File

@ -0,0 +1,5 @@
package ru.dragonestia.loadbalancer.controller.response;
import ru.dragonestia.loadbalancer.model.Node;
public record NodeDetailsResponse(Node node) {}

View File

@ -0,0 +1,7 @@
package ru.dragonestia.loadbalancer.controller.response;
import ru.dragonestia.loadbalancer.model.Node;
import java.util.List;
public record NodeListResponse(List<Node> nodes) {}

View File

@ -0,0 +1,3 @@
package ru.dragonestia.loadbalancer.controller.response;
public record NodeRegisterResponse(boolean success, String message) {}

View File

@ -0,0 +1,42 @@
package ru.dragonestia.loadbalancer.service.impl;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import ru.dragonestia.loadbalancer.model.Node;
import ru.dragonestia.loadbalancer.repository.NodeRepository;
import ru.dragonestia.loadbalancer.service.NodeService;
import ru.dragonestia.loadbalancer.util.NamingValidator;
import java.util.List;
import java.util.Optional;
@Service
@RequiredArgsConstructor
public class NodeServiceImpl implements NodeService {
private final NodeRepository nodeRepository;
@Override
public void createNode(Node node) {
if (!NamingValidator.validateNodeIdentifier(node.identifier())) {
throw new Error("Invalid node identifier format");
}
nodeRepository.createNode(node);
}
@Override
public void removeNode(Node node) {
nodeRepository.deleteNode(node);
}
@Override
public List<Node> allNodes() {
return nodeRepository.all();
}
@Override
public Optional<Node> findNode(String identifier) {
return nodeRepository.findNode(identifier);
}
}

View File

@ -0,0 +1,11 @@
package ru.dragonestia.loadbalancer.util;
import lombok.experimental.UtilityClass;
@UtilityClass
public class NamingValidator {
public boolean validateNodeIdentifier(String input) {
return input.matches("^[a-z\\d-]+$");
}
}