From 1d6ccff5298cf20699d6b4939f0c545db0c97b8d Mon Sep 17 00:00:00 2001 From: Johannes Date: Mon, 15 Jun 2026 16:42:16 -0400 Subject: [PATCH] fix(aria): add BIGSERIAL PK to device_security_posture, fix JPA persist error V4 migration drops the device_id primary key and adds an auto-generated id BIGSERIAL as the PK. device_id becomes a unique nullable column. Agents that don't send a numeric deviceId can now save posture reports. Controller GET /{deviceId} now uses findByDeviceId instead of findById. Co-Authored-By: Claude Sonnet 4.6 --- .../aria/controller/DevicePostureController.java | 2 +- .../hiveops/aria/entity/DeviceSecurityPosture.java | 4 ++++ .../repository/DeviceSecurityPostureRepository.java | 2 ++ .../db/migration/V4__add_posture_id_pk.sql | 13 +++++++++++++ 4 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 src/main/resources/db/migration/V4__add_posture_id_pk.sql diff --git a/src/main/java/com/hiveops/aria/controller/DevicePostureController.java b/src/main/java/com/hiveops/aria/controller/DevicePostureController.java index 9b9e57d..30c2811 100644 --- a/src/main/java/com/hiveops/aria/controller/DevicePostureController.java +++ b/src/main/java/com/hiveops/aria/controller/DevicePostureController.java @@ -66,7 +66,7 @@ public class DevicePostureController { @GetMapping("/{deviceId}") @PreAuthorize("hasAnyRole('MSP_ADMIN','BCOS_ADMIN')") public ResponseEntity getPosture(@PathVariable Long deviceId) { - return postureRepository.findById(deviceId) + return postureRepository.findByDeviceId(deviceId) .map(ResponseEntity::ok) .orElse(ResponseEntity.notFound().build()); } diff --git a/src/main/java/com/hiveops/aria/entity/DeviceSecurityPosture.java b/src/main/java/com/hiveops/aria/entity/DeviceSecurityPosture.java index dc3cf3a..3742cc8 100644 --- a/src/main/java/com/hiveops/aria/entity/DeviceSecurityPosture.java +++ b/src/main/java/com/hiveops/aria/entity/DeviceSecurityPosture.java @@ -15,6 +15,10 @@ import java.time.Instant; public class DeviceSecurityPosture { @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id") + private Long id; + @Column(name = "device_id") private Long deviceId; diff --git a/src/main/java/com/hiveops/aria/repository/DeviceSecurityPostureRepository.java b/src/main/java/com/hiveops/aria/repository/DeviceSecurityPostureRepository.java index cc04887..10b17e0 100644 --- a/src/main/java/com/hiveops/aria/repository/DeviceSecurityPostureRepository.java +++ b/src/main/java/com/hiveops/aria/repository/DeviceSecurityPostureRepository.java @@ -13,6 +13,8 @@ public interface DeviceSecurityPostureRepository extends JpaRepository findByDeviceAgentId(String deviceAgentId); + Optional findByDeviceId(Long deviceId); + Page findAllByOrderByPostureScoreAsc(Pageable pageable); Page findByPostureScoreLessThanOrderByPostureScoreAsc( diff --git a/src/main/resources/db/migration/V4__add_posture_id_pk.sql b/src/main/resources/db/migration/V4__add_posture_id_pk.sql new file mode 100644 index 0000000..2940332 --- /dev/null +++ b/src/main/resources/db/migration/V4__add_posture_id_pk.sql @@ -0,0 +1,13 @@ +-- device_security_posture used device_id BIGINT as its primary key, +-- requiring callers to supply the numeric device ID. Agents only know +-- their string deviceAgentId, so inserts without a deviceId failed. +-- Add a proper auto-generated id column as the PK; make device_id a +-- nullable unique column (FK concept, populated when known). + +ALTER TABLE device_security_posture DROP CONSTRAINT device_security_posture_pkey; + +ALTER TABLE device_security_posture + ADD COLUMN id BIGSERIAL PRIMARY KEY; + +ALTER TABLE device_security_posture + ADD CONSTRAINT uq_posture_device_id UNIQUE (device_id);