diff --git a/server/skillhub-app/src/main/java/com/iflytek/skillhub/controller/portal/NamespaceController.java b/server/skillhub-app/src/main/java/com/iflytek/skillhub/controller/portal/NamespaceController.java index b8593149..8b352054 100644 --- a/server/skillhub-app/src/main/java/com/iflytek/skillhub/controller/portal/NamespaceController.java +++ b/server/skillhub-app/src/main/java/com/iflytek/skillhub/controller/portal/NamespaceController.java @@ -3,6 +3,7 @@ package com.iflytek.skillhub.controller.portal; import com.iflytek.skillhub.controller.BaseApiController; import com.iflytek.skillhub.auth.rbac.PlatformPrincipal; import com.iflytek.skillhub.domain.namespace.NamespaceRole; +import com.iflytek.skillhub.domain.namespace.NamespaceStatus; import com.iflytek.skillhub.dto.ApiResponse; import com.iflytek.skillhub.dto.ApiResponseFactory; import com.iflytek.skillhub.dto.BatchMemberRequest; @@ -79,11 +80,22 @@ public class NamespaceController extends BaseApiController { @GetMapping("/me/namespaces/page") public ApiResponse> listMyNamespacesPage( Pageable pageable, + @RequestParam(required = false) NamespaceStatus status, + @RequestParam(required = false) String q, + @RequestParam(required = false) String slug, + @RequestParam(required = false) Set roles, @RequestAttribute("userId") String userId, @RequestAttribute(value = "userNsRoles", required = false) Map userNsRoles, @RequestAttribute(value = "platformRoles", required = false) Set platformRoles) { return ok("response.success.read", - namespacePortalQueryAppService.listMyNamespaces(pageable, userNsRoles, normalizePlatformRoles(platformRoles))); + namespacePortalQueryAppService.listMyNamespaces( + pageable, + userNsRoles, + normalizePlatformRoles(platformRoles), + status, + q, + slug, + roles)); } @GetMapping("/namespaces/{slug}") diff --git a/server/skillhub-app/src/test/java/com/iflytek/skillhub/controller/NamespacePortalControllerTest.java b/server/skillhub-app/src/test/java/com/iflytek/skillhub/controller/NamespacePortalControllerTest.java index aa61ef26..a8dc2b4b 100644 --- a/server/skillhub-app/src/test/java/com/iflytek/skillhub/controller/NamespacePortalControllerTest.java +++ b/server/skillhub-app/src/test/java/com/iflytek/skillhub/controller/NamespacePortalControllerTest.java @@ -129,7 +129,7 @@ class NamespacePortalControllerTest { Namespace active = namespace(1L, "active", NamespaceStatus.ACTIVE, NamespaceType.TEAM); Namespace archived = namespace(3L, "archived", NamespaceStatus.ARCHIVED, NamespaceType.TEAM); given(namespaceMemberRepository.findByUserId("super-1")).willReturn(List.of()); - given(namespaceRepository.findAll(any())) + given(namespaceRepository.search(eq(null), eq(null), eq(null), any())) .willReturn(new org.springframework.data.domain.PageImpl<>( List.of(active, archived), org.springframework.data.domain.PageRequest.of(0, 2), @@ -151,6 +151,38 @@ class NamespacePortalControllerTest { .andExpect(jsonPath("$.data.size").value(2)); } + @Test + void listMyNamespacesPage_bindsAndAppliesOptionalFilters() throws Exception { + Namespace active = namespace(1L, "team-ai", NamespaceStatus.ACTIVE, NamespaceType.TEAM); + given(namespaceMemberRepository.findByUserId("owner-1")) + .willReturn(List.of(new NamespaceMember(1L, "owner-1", NamespaceRole.OWNER))); + given(namespaceRepository.searchByIdIn( + eq(List.of(1L)), + eq(NamespaceStatus.ACTIVE), + eq("team"), + eq("team-ai"), + any() + )).willReturn(new org.springframework.data.domain.PageImpl<>( + List.of(active), + org.springframework.data.domain.PageRequest.of(0, 20), + 1 + )); + + mockMvc.perform(get("/api/v1/me/namespaces/page") + .param("page", "0") + .param("size", "20") + .param("status", "ACTIVE") + .param("q", "team") + .param("slug", "team-ai") + .param("roles", "OWNER", "ADMIN") + .with(auth("owner-1")) + .requestAttr("userId", "owner-1")) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.data.items[0].slug").value("team-ai")) + .andExpect(jsonPath("$.data.items[0].currentUserRole").value("OWNER")) + .andExpect(jsonPath("$.data.total").value(1)); + } + @Test void listMyNamespaces_returnsFrozenAndArchivedNamespacesWithCurrentRole() throws Exception { Namespace namespace = namespace(1L, "team-a", NamespaceStatus.ARCHIVED, NamespaceType.TEAM); diff --git a/web/src/api/generated/schema.d.ts b/web/src/api/generated/schema.d.ts index 4d9642a5..019f13b1 100644 --- a/web/src/api/generated/schema.d.ts +++ b/web/src/api/generated/schema.d.ts @@ -10053,6 +10053,10 @@ export interface operations { parameters: { query: { pageable: components["schemas"]["Pageable"]; + status?: "ACTIVE" | "FROZEN" | "ARCHIVED"; + q?: string; + slug?: string; + roles?: ("OWNER" | "ADMIN" | "MEMBER")[]; }; header?: never; path?: never; @@ -10075,6 +10079,10 @@ export interface operations { parameters: { query: { pageable: components["schemas"]["Pageable"]; + status?: "ACTIVE" | "FROZEN" | "ARCHIVED"; + q?: string; + slug?: string; + roles?: ("OWNER" | "ADMIN" | "MEMBER")[]; }; header?: never; path?: never;