diff --git a/src/main/java/com/eactive/eai/rms/ext/djb/apistatus/ApiStatusDetectionService.java b/src/main/java/com/eactive/eai/rms/ext/djb/apistatus/ApiStatusDetectionService.java index 4233c68..bac9dd9 100644 --- a/src/main/java/com/eactive/eai/rms/ext/djb/apistatus/ApiStatusDetectionService.java +++ b/src/main/java/com/eactive/eai/rms/ext/djb/apistatus/ApiStatusDetectionService.java @@ -22,6 +22,7 @@ import org.springframework.dao.DataIntegrityViolationException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import com.eactive.apim.portal.apispec.repository.ApiSpecInfoRepository; import com.eactive.apim.portal.common.entity.Auditable; import com.eactive.apim.portal.djb.apistatus.incident.entity.DjbApistatusIncident; import com.eactive.apim.portal.djb.apistatus.incident.entity.DjbApistatusIncidentApi; @@ -110,6 +111,10 @@ public class ApiStatusDetectionService { @Autowired private ApiStatusRepository apiStatusRepository; + /** EMSAPP(PTL_API_SPEC_INFO) 조회용. AGWAPP 커넥션으로 도는 apiStatusRepository 로는 못 읽는다 */ + @Autowired + private ApiSpecInfoRepository apiSpecInfoRepository; + @Autowired private PortalPropertyService portalPropertyService; @@ -534,14 +539,23 @@ public class ApiStatusDetectionService { } } - /** 게시 인터페이스 판정. 조회에 실패하면 전부 비게시로 보아 ID·명칭 노출을 막는다. */ + /** + * 게시 인터페이스 판정. 조회에 실패하면 전부 비게시로 보아 ID·명칭 노출을 막는다. + * + *

판정 조건 두 개가 서로 다른 스키마에 있어 조회를 나눈다 - API 그룹 편성은 AGWAPP, + * 스펙 존재는 EMSAPP(PTL_API_SPEC_INFO). 한 쿼리로 조인하면 tenant=APIGW 커넥션이 + * EMSAPP 를 못 봐서 ORA-00942 가 난다.

+ */ private ApiSplit splitPublished(List apiIds) { if (apiIds == null || apiIds.isEmpty()) { return new ApiSplit(Collections.emptyList(), 0); } Set publishedIds; try { - publishedIds = new HashSet<>(apiStatusRepository.findPublishedApiIds(apiIds)); + List groupedIds = apiStatusRepository.findDisplayedGroupApiIds(apiIds); + publishedIds = groupedIds.isEmpty() + ? Collections.emptySet() + : new HashSet<>(apiSpecInfoRepository.findApiIdsIn(groupedIds)); } catch (Exception e) { // 실패 시 노출하는 쪽으로 기울면 내부 인터페이스가 고객 화면에 새어 나간다 log.warn("게시 API 판정 실패 - 전부 GW 인터페이스로 묶어 표기", e); diff --git a/src/main/java/com/eactive/eai/rms/ext/djb/apistatus/ApiStatusRepository.java b/src/main/java/com/eactive/eai/rms/ext/djb/apistatus/ApiStatusRepository.java index f02b77b..fd9b611 100644 --- a/src/main/java/com/eactive/eai/rms/ext/djb/apistatus/ApiStatusRepository.java +++ b/src/main/java/com/eactive/eai/rms/ext/djb/apistatus/ApiStatusRepository.java @@ -147,22 +147,25 @@ public interface ApiStatusRepository extends BaseRepository { List findApiNames(@Param("apiIds") Collection apiIds); /** - * 개발자포탈에 게시되는 인터페이스(= API) 만 추린다. + * 노출 중인 API 그룹에 편성된 인터페이스 ID. * *

GW 인터페이스는 전부 탐지 대상이지만 개발자포탈에 노출되는 것은 그 일부다. * 자동 초안(제목·공지 본문·타임라인)에 게시되지 않은 인터페이스 ID 가 그대로 박히면 * 고객 화면에 내부 인터페이스가 드러나므로, 여기서 걸러 나머지는 건수로만 표기한다.

* - *

판정 기준은 포털 "오픈 API" 목록과 같은 두 조건이다 - 노출 중인 API 그룹에 편성돼 있고 - * PTL_API_SPEC_INFO 에 스펙이 있을 것. 역할·소속에 따른 사용자별 공개 범위는 admin 에 - * 사용자 컨텍스트가 없어 적용하지 않는다(= 포털 화면이 한 번 더 좁힌다).

+ *

게시 판정은 포털 "오픈 API" 목록과 같은 두 조건이다 - 노출 중인 API 그룹에 편성돼 있고 + * PTL_API_SPEC_INFO 에 스펙이 있을 것. 이 쿼리는 앞 조건(AGWAPP)만 본다. 뒤 조건은 + * EMSAPP 스키마라 {@code ApiSpecInfoRepository.findApiIdsIn} 으로 따로 조회해 교집합을 잡는다 + * - 이 리포지토리는 tenant=APIGW(AGWAPP) 커넥션으로 도는 탓에 한 쿼리로 조인하면 ORA-00942 다.

+ * + *

역할·소속에 따른 사용자별 공개 범위는 admin 에 사용자 컨텍스트가 없어 적용하지 않는다 + * (= 포털 화면이 한 번 더 좁힌다).

*/ @Query(nativeQuery = true, value = " SELECT DISTINCT GA.API_ID" + " FROM API_GROUP_API GA" + " JOIN API_GROUP G ON G.ID = GA.API_GROUP_ID" + " WHERE GA.API_ID IN (:apiIds)" - + " AND G.DISPLAY_YN = '1'" - + " AND EXISTS (SELECT 1 FROM EMSAPP.PTL_API_SPEC_INFO S WHERE S.API_ID = GA.API_ID)") - List findPublishedApiIds(@Param("apiIds") Collection apiIds); + + " AND G.DISPLAY_YN = '1'") + List findDisplayedGroupApiIds(@Param("apiIds") Collection apiIds); } \ No newline at end of file