From 0f8cad80cbad98a0751b1e3fb548e30a5a4fbacd Mon Sep 17 00:00:00 2001 From: liuhy Date: Fri, 24 Jul 2026 08:01:41 -0700 Subject: [PATCH] fix: validate data source requests --- .../studio/settings/DataSourceTestDTO.java | 3 ++ .../studio/settings/DataSourceVO.java | 4 ++ .../studio/settings/SettingsController.java | 6 +-- .../settings/SettingsControllerTest.java | 51 +++++++++++++++++++ 4 files changed, 61 insertions(+), 3 deletions(-) diff --git a/server/src/main/java/com/rocketmq/studio/settings/DataSourceTestDTO.java b/server/src/main/java/com/rocketmq/studio/settings/DataSourceTestDTO.java index b17b8dce..dced0eb7 100644 --- a/server/src/main/java/com/rocketmq/studio/settings/DataSourceTestDTO.java +++ b/server/src/main/java/com/rocketmq/studio/settings/DataSourceTestDTO.java @@ -16,6 +16,7 @@ */ package com.rocketmq.studio.settings; +import jakarta.validation.constraints.NotBlank; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -26,7 +27,9 @@ @NoArgsConstructor @AllArgsConstructor public class DataSourceTestDTO { + @NotBlank(message = "url is required") private String url; + @NotBlank(message = "type is required") private String type; private String auth; } diff --git a/server/src/main/java/com/rocketmq/studio/settings/DataSourceVO.java b/server/src/main/java/com/rocketmq/studio/settings/DataSourceVO.java index c2d1164a..45a14d0c 100644 --- a/server/src/main/java/com/rocketmq/studio/settings/DataSourceVO.java +++ b/server/src/main/java/com/rocketmq/studio/settings/DataSourceVO.java @@ -16,6 +16,7 @@ */ package com.rocketmq.studio.settings; +import jakarta.validation.constraints.NotBlank; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -27,8 +28,11 @@ @AllArgsConstructor public class DataSourceVO { private String key; + @NotBlank(message = "name is required") private String name; + @NotBlank(message = "type is required") private String type; + @NotBlank(message = "url is required") private String url; private String auth; private String status; diff --git a/server/src/main/java/com/rocketmq/studio/settings/SettingsController.java b/server/src/main/java/com/rocketmq/studio/settings/SettingsController.java index a84923de..594487ed 100644 --- a/server/src/main/java/com/rocketmq/studio/settings/SettingsController.java +++ b/server/src/main/java/com/rocketmq/studio/settings/SettingsController.java @@ -52,12 +52,12 @@ public Result> listDataSources() { } @PostMapping("/datasources/create") - public Result createDataSource(@RequestBody DataSourceVO dataSource) { + public Result createDataSource(@Valid @RequestBody DataSourceVO dataSource) { return Result.ok(settingsService.createDataSource(dataSource)); } @PostMapping("/datasources/update") - public Result updateDataSource(@RequestBody DataSourceVO dataSource) { + public Result updateDataSource(@Valid @RequestBody DataSourceVO dataSource) { return Result.ok(settingsService.updateDataSource(dataSource)); } @@ -68,7 +68,7 @@ public Result deleteDataSource(@RequestParam String key) { } @PostMapping("/datasources/test") - public Result testDataSource(@RequestBody DataSourceTestDTO request) { + public Result testDataSource(@Valid @RequestBody DataSourceTestDTO request) { return Result.ok(settingsService.testDataSource(request)); } } diff --git a/server/src/test/java/com/rocketmq/studio/settings/SettingsControllerTest.java b/server/src/test/java/com/rocketmq/studio/settings/SettingsControllerTest.java index f82bb1ad..1a90e821 100644 --- a/server/src/test/java/com/rocketmq/studio/settings/SettingsControllerTest.java +++ b/server/src/test/java/com/rocketmq/studio/settings/SettingsControllerTest.java @@ -203,6 +203,23 @@ void createDataSourceShouldReturnCreatedSource() throws Exception { .andExpect(jsonPath("$.data.status", is("connected"))); } + @Test + void createDataSourceShouldRejectMissingUrl() throws Exception { + mockMvc.perform(post("/api/settings/datasources/create") + .contentType(MediaType.APPLICATION_JSON) + .content(""" + { + "name": "New DS", + "type": "prometheus" + } + """)) + .andExpect(status().isBadRequest()) + .andExpect(jsonPath("$.code", is(400))) + .andExpect(jsonPath("$.message", is("url is required"))); + + verifyNoInteractions(settingsService); + } + @Test void updateDataSourceShouldReturnUpdatedSource() throws Exception { DataSourceVO input = DataSourceVO.builder().key("ds-1").name("Updated DS").type("rocketmq") @@ -218,6 +235,24 @@ void updateDataSourceShouldReturnUpdatedSource() throws Exception { .andExpect(jsonPath("$.data.name", is("Updated DS"))); } + @Test + void updateDataSourceShouldRejectMissingName() throws Exception { + mockMvc.perform(post("/api/settings/datasources/update") + .contentType(MediaType.APPLICATION_JSON) + .content(""" + { + "key": "ds-1", + "type": "rocketmq", + "url": "updated:9876" + } + """)) + .andExpect(status().isBadRequest()) + .andExpect(jsonPath("$.code", is(400))) + .andExpect(jsonPath("$.message", is("name is required"))); + + verifyNoInteractions(settingsService); + } + @Test void deleteDataSourceShouldReturnSuccess() throws Exception { doNothing().when(settingsService).deleteDataSource("ds-1"); @@ -250,4 +285,20 @@ void testDataSourceShouldReturnTestResult() throws Exception { .andExpect(jsonPath("$.data.success", is(true))) .andExpect(jsonPath("$.data.message", is("Connection successful"))); } + + @Test + void testDataSourceShouldRejectMissingType() throws Exception { + mockMvc.perform(post("/api/settings/datasources/test") + .contentType(MediaType.APPLICATION_JSON) + .content(""" + { + "url": "localhost:9876" + } + """)) + .andExpect(status().isBadRequest()) + .andExpect(jsonPath("$.code", is(400))) + .andExpect(jsonPath("$.message", is("type is required"))); + + verifyNoInteractions(settingsService); + } }