From 423fd3971cd15a3124a804164f96b3ab5fc33caa Mon Sep 17 00:00:00 2001 From: litoral05 Date: Tue, 5 May 2026 10:34:26 +0100 Subject: [PATCH] Refactor router status transitions and remove READY state --- .../litoralregas/openvpn/router/Router.java | 7 +++--- .../openvpn/router/RouterService.java | 22 +++++++++++++++++-- .../openvpn/router/RouterStatus.java | 9 ++++++++ .../router/UpdateRouterStatusRequest.java | 6 ++--- 4 files changed, 36 insertions(+), 8 deletions(-) create mode 100644 src/main/java/com/litoralregas/openvpn/router/RouterStatus.java diff --git a/src/main/java/com/litoralregas/openvpn/router/Router.java b/src/main/java/com/litoralregas/openvpn/router/Router.java index e62ff01..1bb2f07 100644 --- a/src/main/java/com/litoralregas/openvpn/router/Router.java +++ b/src/main/java/com/litoralregas/openvpn/router/Router.java @@ -15,7 +15,8 @@ public class Router { private String serialNumber; private String lanIp; private String lanSubnet; - private String status; + @Enumerated(EnumType.STRING) + private RouterStatus status; private LocalDateTime createdAt; private LocalDateTime updatedAt; @@ -63,11 +64,11 @@ public class Router { this.lanSubnet = lanSubnet; } - public String getStatus() { + public RouterStatus getStatus() { return status; } - public void setStatus(String status) { + public void setStatus(RouterStatus status) { this.status = status; } diff --git a/src/main/java/com/litoralregas/openvpn/router/RouterService.java b/src/main/java/com/litoralregas/openvpn/router/RouterService.java index b27c386..9c18944 100644 --- a/src/main/java/com/litoralregas/openvpn/router/RouterService.java +++ b/src/main/java/com/litoralregas/openvpn/router/RouterService.java @@ -32,7 +32,7 @@ public class RouterService { router.setSerialNumber(request.getSerialNumber()); router.setLanIp(request.getLanIp()); router.setLanSubnet(request.getLanSubnet()); - router.setStatus("PENDING"); + router.setStatus(RouterStatus.PENDING); router.setCreatedAt(now); router.setUpdatedAt(now); @@ -47,7 +47,16 @@ public class RouterService { public Router updateStatus(UUID id, UpdateRouterStatusRequest request) { Router router = findById(id); - router.setStatus(request.getStatus()); + RouterStatus current = router.getStatus(); + RouterStatus next = request.getStatus(); + + if (!isValidTransition(current, next)) { + throw new IllegalArgumentException( + "Invalid status transition: " + current + " → " + next + ); + } + + router.setStatus(next); router.setUpdatedAt(LocalDateTime.now()); return repository.save(router); @@ -57,4 +66,13 @@ public class RouterService { Router router = findById(id); repository.delete(router); } + + private boolean isValidTransition(RouterStatus current, RouterStatus next) { + return switch (current) { + case PENDING, FAILED -> next == RouterStatus.PROVISIONING; + case PROVISIONING -> next == RouterStatus.PROVISIONED || next == RouterStatus.FAILED; + case PROVISIONED -> next == RouterStatus.REMOVED; + case REMOVED -> false; + }; + } } \ No newline at end of file diff --git a/src/main/java/com/litoralregas/openvpn/router/RouterStatus.java b/src/main/java/com/litoralregas/openvpn/router/RouterStatus.java new file mode 100644 index 0000000..8e465e9 --- /dev/null +++ b/src/main/java/com/litoralregas/openvpn/router/RouterStatus.java @@ -0,0 +1,9 @@ +package com.litoralregas.openvpn.router; + +public enum RouterStatus { + PENDING, + PROVISIONING, + PROVISIONED, + FAILED, + REMOVED +} \ No newline at end of file diff --git a/src/main/java/com/litoralregas/openvpn/router/UpdateRouterStatusRequest.java b/src/main/java/com/litoralregas/openvpn/router/UpdateRouterStatusRequest.java index 92fb0c9..17c2b1b 100644 --- a/src/main/java/com/litoralregas/openvpn/router/UpdateRouterStatusRequest.java +++ b/src/main/java/com/litoralregas/openvpn/router/UpdateRouterStatusRequest.java @@ -5,13 +5,13 @@ import jakarta.validation.constraints.NotBlank; public class UpdateRouterStatusRequest { @NotBlank - private String status; + private RouterStatus status; - public String getStatus() { + public RouterStatus getStatus() { return status; } - public void setStatus(String status) { + public void setStatus(RouterStatus status) { this.status = status; } } \ No newline at end of file