diff --git a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysClientController.java b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysClientController.java index 686dc1104..f81a5d972 100644 --- a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysClientController.java +++ b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysClientController.java @@ -20,6 +20,7 @@ package com.pig4cloud.pigx.admin.controller; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @@ -36,6 +37,7 @@ import com.pig4cloud.pigx.common.excel.annotation.ResponseExcel; import com.pig4cloud.pigx.common.log.annotation.SysLog; import com.pig4cloud.pigx.common.security.annotation.HasPermission; import com.pig4cloud.pigx.common.security.annotation.Inner; +import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; @@ -65,14 +67,20 @@ public class SysClientController { private final SysOauthClientDetailsService clientDetailsService; /** - * 通过ID查询 - * @param clientId clientId - * @return SysOauthClientDetails + * 根据客户端 ID 查询管理端展示详情。 + * + * @param clientId OAuth2 客户端 ID + * @return 客户端详情查询结果;客户端不存在时响应数据为 {@code null} */ + @Operation(summary = "根据客户端 ID 查询详情") @GetMapping("/{clientId}") - public R getByClientId(@PathVariable String clientId) { + public R getByClientId(@PathVariable String clientId) { SysOauthClientDetails details = clientDetailsService - .getOne(Wrappers.lambdaQuery().eq(SysOauthClientDetails::getClientId, clientId)); + .getOne(Wrappers.lambdaQuery().eq(SysOauthClientDetails::getClientId, clientId), false); + if (ObjUtil.isNull(details)) { + return R.ok(); + } + String information = details.getAdditionalInformation(); String captchaFlag = JSONUtil.parseObj(information).getStr(CommonConstants.CAPTCHA_FLAG); String encFlag = JSONUtil.parseObj(information).getStr(CommonConstants.ENC_FLAG); @@ -142,11 +150,15 @@ public class SysClientController { } /** - * Feign 查询客户端信息的接口 - * @param clientId 客户端 ID - * @return 基本信息 + * 根据客户端 ID 查询 OAuth2 客户端详情。 + *

+ * 仅供认证中心通过 Feign 发起内部调用;{@link Inner} 校验内部调用标识,不对外提供公开访问。 + *

+ * @param clientId OAuth2 客户端 ID + * @return 客户端详情查询结果;客户端不存在时响应数据为 {@code null} */ @Inner + @Operation(summary = "查询 OAuth2 客户端详情(内部调用)", hidden = true) @GetMapping("/getClientDetailsById/{clientId}") public R getClientDetailsById(@PathVariable String clientId) { return R.ok(clientDetailsService.getOne( diff --git a/pigx-upms/pigx-upms-biz/src/test/java/com/pig4cloud/pigx/admin/controller/SysClientControllerTests.java b/pigx-upms/pigx-upms-biz/src/test/java/com/pig4cloud/pigx/admin/controller/SysClientControllerTests.java new file mode 100644 index 000000000..69c979213 --- /dev/null +++ b/pigx-upms/pigx-upms-biz/src/test/java/com/pig4cloud/pigx/admin/controller/SysClientControllerTests.java @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2018-2026, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of pig4cloud.com nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.admin.controller; + +import com.pig4cloud.pigx.admin.api.dto.SysOauthClientDetailsDTO; +import com.pig4cloud.pigx.admin.api.entity.SysOauthClientDetails; +import com.pig4cloud.pigx.admin.service.SysOauthClientDetailsService; +import com.pig4cloud.pigx.common.core.util.R; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +class SysClientControllerTests { + + @Test + void getByClientIdReturnsNullDataWhenClientDoesNotExist() { + SysOauthClientDetailsService clientDetailsService = mock(SysOauthClientDetailsService.class); + SysClientController controller = new SysClientController(clientDetailsService); + when(clientDetailsService.getOne(any(), eq(false))).thenReturn(null); + + R result = controller.getByClientId("missing-client"); + + assertThat(result.isOk()).isTrue(); + assertThat(result.getData()).isNull(); + } + + @Test + void getByClientIdHandlesNullAdditionalInformation() { + SysOauthClientDetailsService clientDetailsService = mock(SysOauthClientDetailsService.class); + SysClientController controller = new SysClientController(clientDetailsService); + SysOauthClientDetails details = new SysOauthClientDetails(); + details.setClientId("client-without-additional-information"); + when(clientDetailsService.getOne(any(), eq(false))).thenReturn(details); + + R result = controller.getByClientId(details.getClientId()); + + assertThat(result.isOk()).isTrue(); + assertThat(result.getData()).isNotNull(); + assertThat(result.getData().getClientId()).isEqualTo(details.getClientId()); + } + +}