Add router CRUD API

This commit is contained in:
litoral05
2026-05-07 13:34:32 +01:00
parent 45e8658de7
commit 8d065e4112
8 changed files with 261 additions and 0 deletions
@@ -0,0 +1,53 @@
package com.litoralregas.vpnprovisioner.router.controller;
import com.litoralregas.vpnprovisioner.router.dto.CreateRouterRequest;
import com.litoralregas.vpnprovisioner.router.dto.RouterResponse;
import com.litoralregas.vpnprovisioner.router.dto.UpdateRouterRequest;
import com.litoralregas.vpnprovisioner.router.service.RouterService;
import jakarta.validation.Valid;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.UUID;
@RestController
@RequestMapping("/api/routers")
public class RouterController {
private final RouterService routerService;
public RouterController(RouterService routerService) {
this.routerService = routerService;
}
@PostMapping
@ResponseStatus(HttpStatus.CREATED)
public RouterResponse create(@Valid @RequestBody CreateRouterRequest request) {
return routerService.create(request);
}
@GetMapping
public List<RouterResponse> findAll() {
return routerService.findAll();
}
@GetMapping("/{id}")
public RouterResponse findById(@PathVariable UUID id) {
return routerService.findById(id);
}
@PutMapping("/{id}")
public RouterResponse update(
@PathVariable UUID id,
@Valid @RequestBody UpdateRouterRequest request
) {
return routerService.update(id, request);
}
@DeleteMapping("/{id}")
@ResponseStatus(HttpStatus.NO_CONTENT)
public void delete(@PathVariable UUID id) {
routerService.delete(id);
}
}
@@ -0,0 +1,10 @@
package com.litoralregas.vpnprovisioner.router.dto;
import jakarta.validation.constraints.NotBlank;
public record CreateRouterRequest(
@NotBlank String name,
String hardwareModel,
String firmwareVersion
) {
}
@@ -0,0 +1,18 @@
package com.litoralregas.vpnprovisioner.router.dto;
import com.litoralregas.vpnprovisioner.router.entity.RouterStatus;
import java.time.Instant;
import java.util.UUID;
public record RouterResponse(
UUID id,
String name,
String hardwareModel,
String firmwareVersion,
RouterStatus status,
String vpnIp,
Instant createdAt,
Instant updatedAt
) {
}
@@ -0,0 +1,10 @@
package com.litoralregas.vpnprovisioner.router.dto;
import jakarta.validation.constraints.NotBlank;
public record UpdateRouterRequest(
@NotBlank String name,
String hardwareModel,
String firmwareVersion
) {
}
@@ -0,0 +1,66 @@
package com.litoralregas.vpnprovisioner.router.entity;
import jakarta.persistence.*;
import java.time.Instant;
import java.util.UUID;
@Entity
@Table(name = "routers")
public class Router {
@Id
private UUID id;
@Column(nullable = false)
private String name;
private String hardwareModel;
private String firmwareVersion;
@Enumerated(EnumType.STRING)
@Column(nullable = false)
private RouterStatus status;
private String vpnIp;
@Column(nullable = false)
private Instant createdAt;
@Column(nullable = false)
private Instant updatedAt;
protected Router() {
}
public Router(String name, String hardwareModel, String firmwareVersion) {
this.id = UUID.randomUUID();
this.name = name;
this.hardwareModel = hardwareModel;
this.firmwareVersion = firmwareVersion;
this.status = RouterStatus.PENDING;
this.createdAt = Instant.now();
this.updatedAt = Instant.now();
}
@PreUpdate
public void preUpdate() {
this.updatedAt = Instant.now();
}
public UUID getId() { return id; }
public String getName() { return name; }
public String getHardwareModel() { return hardwareModel; }
public String getFirmwareVersion() { return firmwareVersion; }
public RouterStatus getStatus() { return status; }
public String getVpnIp() { return vpnIp; }
public Instant getCreatedAt() { return createdAt; }
public Instant getUpdatedAt() { return updatedAt; }
public void updateDetails(String name, String hardwareModel, String firmwareVersion) {
this.name = name;
this.hardwareModel = hardwareModel;
this.firmwareVersion = firmwareVersion;
}
}
@@ -0,0 +1,10 @@
package com.litoralregas.vpnprovisioner.router.entity;
public enum RouterStatus {
PENDING,
CONFIGURED,
PROVISIONING,
PROVISIONED,
FAILED,
REMOVED
}
@@ -0,0 +1,9 @@
package com.litoralregas.vpnprovisioner.router.repository;
import com.litoralregas.vpnprovisioner.router.entity.Router;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.UUID;
public interface RouterRepository extends JpaRepository<Router, UUID> {
}
@@ -0,0 +1,85 @@
package com.litoralregas.vpnprovisioner.router.service;
import com.litoralregas.vpnprovisioner.router.dto.CreateRouterRequest;
import com.litoralregas.vpnprovisioner.router.dto.RouterResponse;
import com.litoralregas.vpnprovisioner.router.dto.UpdateRouterRequest;
import com.litoralregas.vpnprovisioner.router.entity.Router;
import com.litoralregas.vpnprovisioner.router.repository.RouterRepository;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.UUID;
@Service
public class RouterService {
private final RouterRepository routerRepository;
public RouterService(RouterRepository routerRepository) {
this.routerRepository = routerRepository;
}
@Transactional
public RouterResponse create(CreateRouterRequest request) {
Router router = new Router(
request.name(),
request.hardwareModel(),
request.firmwareVersion()
);
Router saved = routerRepository.save(router);
return toResponse(saved);
}
@Transactional(readOnly = true)
public List<RouterResponse> findAll() {
return routerRepository.findAll()
.stream()
.map(this::toResponse)
.toList();
}
@Transactional(readOnly = true)
public RouterResponse findById(UUID id) {
Router router = routerRepository.findById(id)
.orElseThrow(() -> new IllegalArgumentException("Router not found: " + id));
return toResponse(router);
}
@Transactional
public RouterResponse update(UUID id, UpdateRouterRequest request) {
Router router = routerRepository.findById(id)
.orElseThrow(() -> new IllegalArgumentException("Router not found: " + id));
router.updateDetails(
request.name(),
request.hardwareModel(),
request.firmwareVersion()
);
return toResponse(router);
}
@Transactional
public void delete(UUID id) {
Router router = routerRepository.findById(id)
.orElseThrow(() -> new IllegalArgumentException("Router not found: " + id));
routerRepository.delete(router);
}
private RouterResponse toResponse(Router router) {
return new RouterResponse(
router.getId(),
router.getName(),
router.getHardwareModel(),
router.getFirmwareVersion(),
router.getStatus(),
router.getVpnIp(),
router.getCreatedAt(),
router.getUpdatedAt()
);
}
}