From dd45d4f16ccba12f465f5e1a0504e7ca5013c29c Mon Sep 17 00:00:00 2001 From: zacyanliu Date: Fri, 20 Sep 2024 11:03:49 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20search=E9=80=BB=E8=BE=91=E8=B0=83?= =?UTF-8?q?=E6=95=B4#2316?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../conan/controller/ConanSearchController.kt | 3 +- .../conan/pojo/artifact/ConanArtifactInfo.kt | 2 + .../conan/service/impl/CommonService.kt | 44 +++++-------------- .../service/impl/ConanSearchServiceImpl.kt | 25 +++++------ 4 files changed, 25 insertions(+), 49 deletions(-) diff --git a/src/backend/conan/biz-conan/src/main/kotlin/com/tencent/bkrepo/conan/controller/ConanSearchController.kt b/src/backend/conan/biz-conan/src/main/kotlin/com/tencent/bkrepo/conan/controller/ConanSearchController.kt index 4291af101f..bc9d44ea3b 100644 --- a/src/backend/conan/biz-conan/src/main/kotlin/com/tencent/bkrepo/conan/controller/ConanSearchController.kt +++ b/src/backend/conan/biz-conan/src/main/kotlin/com/tencent/bkrepo/conan/controller/ConanSearchController.kt @@ -34,6 +34,7 @@ import com.tencent.bkrepo.common.security.permission.Permission import com.tencent.bkrepo.conan.pojo.artifact.ConanArtifactInfo import com.tencent.bkrepo.conan.pojo.artifact.ConanArtifactInfo.Companion.PACKAGE_SEARCH_V1 import com.tencent.bkrepo.conan.pojo.artifact.ConanArtifactInfo.Companion.PACKAGE_SEARCH_V2 +import com.tencent.bkrepo.conan.pojo.artifact.ConanArtifactInfo.Companion.REVISION_SEARCH_V2 import com.tencent.bkrepo.conan.pojo.artifact.ConanArtifactInfo.Companion.SEARCH_V1 import com.tencent.bkrepo.conan.pojo.artifact.ConanArtifactInfo.Companion.SEARCH_V2 import com.tencent.bkrepo.conan.service.ConanSearchService @@ -62,7 +63,7 @@ class ConanSearchController( return ConanCommonController.buildResponse(conanSearchService.search(projectId, repoName, q, ignoreCase)) } - @GetMapping(PACKAGE_SEARCH_V1, PACKAGE_SEARCH_V2) + @GetMapping(PACKAGE_SEARCH_V1, PACKAGE_SEARCH_V2, REVISION_SEARCH_V2) @Permission(type = ResourceType.REPO, action = PermissionAction.READ) fun searchPackages( @ArtifactPathVariable conanArtifactInfo: ConanArtifactInfo, diff --git a/src/backend/conan/biz-conan/src/main/kotlin/com/tencent/bkrepo/conan/pojo/artifact/ConanArtifactInfo.kt b/src/backend/conan/biz-conan/src/main/kotlin/com/tencent/bkrepo/conan/pojo/artifact/ConanArtifactInfo.kt index ff1ba37df7..7880617b9e 100644 --- a/src/backend/conan/biz-conan/src/main/kotlin/com/tencent/bkrepo/conan/pojo/artifact/ConanArtifactInfo.kt +++ b/src/backend/conan/biz-conan/src/main/kotlin/com/tencent/bkrepo/conan/pojo/artifact/ConanArtifactInfo.kt @@ -157,6 +157,8 @@ class ConanArtifactInfo( // search const val SEARCH_V2 = "/{projectId}/{repoName}/v2/conans/search" + const val REVISION_SEARCH_V2 = "/{projectId}/{repoName}/v2/conans/" + + "{name}/{version}/{username}/{channel}/revisions/{revision}/search" // package search const val PACKAGE_SEARCH_V2 = "/{projectId}/{repoName}/v2/conans/" + "{name}/{version}/{username}/{channel}/search" diff --git a/src/backend/conan/biz-conan/src/main/kotlin/com/tencent/bkrepo/conan/service/impl/CommonService.kt b/src/backend/conan/biz-conan/src/main/kotlin/com/tencent/bkrepo/conan/service/impl/CommonService.kt index 565cac09b8..1c822c8e7d 100644 --- a/src/backend/conan/biz-conan/src/main/kotlin/com/tencent/bkrepo/conan/service/impl/CommonService.kt +++ b/src/backend/conan/biz-conan/src/main/kotlin/com/tencent/bkrepo/conan/service/impl/CommonService.kt @@ -410,8 +410,7 @@ class CommonService( repoName: String, revPath: String, ): List { - nodeClient.getNodeDetail(projectId, repoName, revPath).data - ?: throw NodeNotFoundException(revPath) + nodeClient.getNodeDetail(projectId, repoName, revPath).data ?: return emptyList() return nodeClient.listNode(projectId, repoName, revPath, includeFolder = true, deep = false).data!!.map { it.name } @@ -541,37 +540,16 @@ class CommonService( conanFileReference: ConanFileReference ): Map { val result = mutableMapOf() - val revPath = getRecipeRevisionsFile(conanFileReference) - val refStr = buildReference(conanFileReference) - val indexJson = getRevisionsList( - projectId = projectId, - repoName = repoName, - revPath = revPath, - refStr = refStr - ) - val revisions = indexJson.revisions.ifEmpty { -// val revisionV1Path = joinString("/$revPath", DEFAULT_REVISION_V1) -// nodeClient.getNodeDetail(projectId, repoName, revisionV1Path).data ?: return emptyMap() -// listOf(RevisionInfo(DEFAULT_REVISION_V1, convertToUtcTime(LocalDateTime.now()))) - emptyList() - } - - revisions.forEach { - val conf = conanFileReference.copy(revision = it.revision) - val tempRevPath = getPackageRevisionsFile(conf) - val packageIds = getPackageIdList(projectId, repoName, tempRevPath) - packageIds.forEach { packageId -> - val packageReference = PackageReference(conf, packageId) - val prevPath = getPackageRevisionsFile(packageReference) - val prefStr = buildPackageReference(packageReference) - val packageIndexJson = getRevisionsList( - projectId = projectId, - repoName = repoName, - revPath = prevPath, - refStr = prefStr - ) - val lastRevision = packageIndexJson.revisions.first() - val path = getPackageConanInfoFile(packageReference.copy(revision = lastRevision.revision)) + val tempRevPath = getPackageRevisionsFile(conanFileReference) + val packageIds = getPackageIdList(projectId, repoName, tempRevPath) + packageIds.forEach { packageId -> + val packageReference = PackageReference(conanFileReference, packageId) + getLastPackageRevision( + projectId = projectId, + repoName = repoName, + packageReference = packageReference, + )?.let { + val path = getPackageConanInfoFile(packageReference.copy(revision = it.revision)) result[packageId] = getContentOfConanInfoFile(projectId, repoName, path) } } diff --git a/src/backend/conan/biz-conan/src/main/kotlin/com/tencent/bkrepo/conan/service/impl/ConanSearchServiceImpl.kt b/src/backend/conan/biz-conan/src/main/kotlin/com/tencent/bkrepo/conan/service/impl/ConanSearchServiceImpl.kt index 6b0c4289bf..f042b720aa 100644 --- a/src/backend/conan/biz-conan/src/main/kotlin/com/tencent/bkrepo/conan/service/impl/ConanSearchServiceImpl.kt +++ b/src/backend/conan/biz-conan/src/main/kotlin/com/tencent/bkrepo/conan/service/impl/ConanSearchServiceImpl.kt @@ -29,10 +29,7 @@ package com.tencent.bkrepo.conan.service.impl import com.tencent.bkrepo.common.api.util.readJsonString import com.tencent.bkrepo.common.api.util.toJsonString -import com.tencent.bkrepo.common.artifact.exception.NodeNotFoundException import com.tencent.bkrepo.conan.constant.CONAN_INFOS -import com.tencent.bkrepo.conan.constant.ConanMessageCode -import com.tencent.bkrepo.conan.exception.ConanSearchNotFoundException import com.tencent.bkrepo.conan.pojo.ConanFileReference import com.tencent.bkrepo.conan.pojo.ConanInfo import com.tencent.bkrepo.conan.pojo.ConanSearchResult @@ -40,7 +37,7 @@ import com.tencent.bkrepo.conan.pojo.artifact.ConanArtifactInfo import com.tencent.bkrepo.conan.service.ConanSearchService import com.tencent.bkrepo.conan.utils.ConanArtifactInfoUtil.convertToConanFileReference import com.tencent.bkrepo.conan.utils.PathUtils.buildConanFileName -import com.tencent.bkrepo.conan.utils.PathUtils.buildReference +import com.tencent.bkrepo.conan.utils.PathUtils.buildPackagePath import com.tencent.bkrepo.repository.api.PackageClient import org.springframework.beans.factory.annotation.Autowired import org.springframework.stereotype.Service @@ -50,6 +47,7 @@ class ConanSearchServiceImpl : ConanSearchService { @Autowired lateinit var packageClient: PackageClient + @Autowired lateinit var commonService: CommonService @@ -76,18 +74,15 @@ class ConanSearchServiceImpl : ConanSearchService { override fun searchPackages(pattern: String?, conanArtifactInfo: ConanArtifactInfo): Map { with(conanArtifactInfo) { - val conanFileReference = convertToConanFileReference(conanArtifactInfo) - val result = try { - commonService.getPackageConanInfo(projectId, repoName, conanFileReference) - } catch (ignore: NodeNotFoundException) { - emptyMap() - } - if (result.isEmpty()) { - throw ConanSearchNotFoundException( - ConanMessageCode.CONAN_SEARCH_NOT_FOUND, buildReference(conanFileReference), getRepoIdentify() - ) + val realRevision = if (revision.isNullOrEmpty()) { + val conanFileReference = convertToConanFileReference(conanArtifactInfo) + commonService.getNodeDetail(projectId, repoName, buildPackagePath(conanFileReference)) + commonService.getLastRevision(projectId, repoName, conanFileReference)?.revision ?: return emptyMap() + } else { + revision } - return result + val conanFileReference = convertToConanFileReference(conanArtifactInfo, realRevision) + return commonService.getPackageConanInfo(projectId, repoName, conanFileReference) } }