Implemented node service and controller
This commit is contained in:
parent
a6d1c0ef3b
commit
ea5253c810
@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,5 @@
|
|||||||
|
package ru.dragonestia.loadbalancer.controller.response;
|
||||||
|
|
||||||
|
import ru.dragonestia.loadbalancer.model.Node;
|
||||||
|
|
||||||
|
public record NodeDetailsResponse(Node node) {}
|
||||||
@ -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) {}
|
||||||
@ -0,0 +1,3 @@
|
|||||||
|
package ru.dragonestia.loadbalancer.controller.response;
|
||||||
|
|
||||||
|
public record NodeRegisterResponse(boolean success, String message) {}
|
||||||
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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-]+$");
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user