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