From 9355f282a3c37471a8e4d1977d6b2a14b1fe9d6f Mon Sep 17 00:00:00 2001 From: "Charles Graham, SWT" Date: Wed, 2 Sep 2026 14:27:15 -0500 Subject: [PATCH 1/2] Group user lists under user management --- cda-gui/src/links/header-links.js | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/cda-gui/src/links/header-links.js b/cda-gui/src/links/header-links.js index 9e6e03515..cd03c086f 100644 --- a/cda-gui/src/links/header-links.js +++ b/cda-gui/src/links/header-links.js @@ -39,9 +39,16 @@ export default [ ], }, { - id: "user-lists", - text: "User Lists", + id: "user-management", + text: "User Management", href: "/user-lists", + children: [ + { + id: "user-lists", + text: "User Lists", + href: "/user-lists", + }, + ], }, { id: "help", From a3e28a39671e43d1b8ec1a140b548eed3aa7b955 Mon Sep 17 00:00:00 2001 From: "Charles Graham, SWT" Date: Wed, 2 Sep 2026 15:38:47 -0500 Subject: [PATCH 2/2] Group user list endpoints in Swagger --- cda-gui/src/links/header-links.js | 11 ++------ .../src/main/java/cwms/cda/ApiServlet.java | 9 +++++++ .../test/java/cwms/cda/ApiServletTest.java | 27 ++++++++++++++++++- 3 files changed, 37 insertions(+), 10 deletions(-) diff --git a/cda-gui/src/links/header-links.js b/cda-gui/src/links/header-links.js index cd03c086f..9e6e03515 100644 --- a/cda-gui/src/links/header-links.js +++ b/cda-gui/src/links/header-links.js @@ -39,16 +39,9 @@ export default [ ], }, { - id: "user-management", - text: "User Management", + id: "user-lists", + text: "User Lists", href: "/user-lists", - children: [ - { - id: "user-lists", - text: "User Lists", - href: "/user-lists", - }, - ], }, { id: "help", diff --git a/cwms-data-api/src/main/java/cwms/cda/ApiServlet.java b/cwms-data-api/src/main/java/cwms/cda/ApiServlet.java index 8409df4a8..aaf5771ed 100644 --- a/cwms-data-api/src/main/java/cwms/cda/ApiServlet.java +++ b/cwms-data-api/src/main/java/cwms/cda/ApiServlet.java @@ -34,6 +34,7 @@ import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import com.google.common.flogger.FluentLogger; import cwms.cda.api.Controllers; +import cwms.cda.api.auth.userlists.UserListController; import cwms.cda.api.enums.UnitSystem; import cwms.cda.api.errors.ApplicationException; import cwms.cda.api.errors.CdaError; @@ -341,6 +342,7 @@ private void getOpenApiOptions(JavalinConfig config) { schemeProcessor.apply(ctx, api); api.getPaths().forEach((key,path) -> { setSecurityRequirements(key,path, schemeProcessor.getSecurityRequirements()); + setUserListTags(key, path); // yeah, we really need to figure out how to update everything, // this is supported as an annotation in newer versions. if (key.startsWith("/rss")) { @@ -425,6 +427,13 @@ private static void setSecurityRequirements(String key, PathItem path,List + operation.setTags(List.of(UserListController.TAG))); + } + } + private static void setSecurity(Operation op,List reqs) { if (op != null) { op.setSecurity(reqs); diff --git a/cwms-data-api/src/test/java/cwms/cda/ApiServletTest.java b/cwms-data-api/src/test/java/cwms/cda/ApiServletTest.java index 523e3b168..97fda6a3b 100644 --- a/cwms-data-api/src/test/java/cwms/cda/ApiServletTest.java +++ b/cwms-data-api/src/test/java/cwms/cda/ApiServletTest.java @@ -5,10 +5,13 @@ import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; +import cwms.cda.api.auth.userlists.UserListController; import io.javalin.http.Handler; import io.javalin.http.HandlerEntry; import io.javalin.http.HandlerType; import io.javalin.http.PathMatcher; +import io.swagger.v3.oas.models.Operation; +import io.swagger.v3.oas.models.PathItem; import java.util.List; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; @@ -17,6 +20,29 @@ public class ApiServletTest { + @Test + void test_user_list_operations_are_grouped_under_user_management() { + PathItem path = new PathItem() + .get(new Operation()) + .post(new Operation()) + .delete(new Operation()); + + ApiServlet.setUserListTags("/user/list/{user-list-id}/members", path); + + path.readOperations().forEach(operation -> + assertEquals(List.of(UserListController.TAG), operation.getTags())); + } + + @Test + void test_other_operations_are_not_retagged_as_user_management() { + Operation operation = new Operation().addTagsItem("Other"); + PathItem path = new PathItem().get(operation); + + ApiServlet.setUserListTags("/users/{user-name}", path); + + assertEquals(List.of("Other"), operation.getTags()); + } + @Test public void test_office_from_context_hq(){ String office; @@ -117,4 +143,3 @@ public void test_match_with_internal_star() { } -