Skip to content

Commit

Permalink
pref:研发商店通用化接口封装优化 TencentBlueKing#11049
Browse files Browse the repository at this point in the history
  • Loading branch information
carlyin0801 committed Nov 28, 2024
1 parent 5ba4785 commit 2c43abe
Show file tree
Hide file tree
Showing 6 changed files with 180 additions and 44 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -169,4 +169,5 @@ object StoreMessageCode {
// 当 queryProjectComponentFlag、installed 或 updateFlag 参数不为空时, projectCode 参数必须非空
const val STORE_QUERY_PARAM_CHECK_FAIL = "2120935"
const val STORE_COMPONENT_IS_NOT_ALLOW_OFFLINE = "2120936" // 研发商店:非发布状态的版本不允许下架
const val STORE_COMPONENT_CODE_REPOSITORY_DELETE_FAIL = "2120937" // 研发商店:代码库删除失败,失败原因:{0}
}
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,26 @@ interface StoreManagementExtraService {
tokenType: TokenTypeEnum
): Result<Boolean>

/**
* 添加组件代码库成员
*/
fun addComponentRepositoryUser(
members: List<String>,
repositoryId: String,
token: String,
tokenType: TokenTypeEnum
): Result<Boolean>

/**
* 删除组件代码库成员
*/
fun deleteComponentRepositoryUser(
member: String,
repositoryId: String,
token: String,
tokenType: TokenTypeEnum
): Result<Boolean>

/**
* 检查卸载组件请求合法性
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,11 @@ package com.tencent.devops.store.common.service.impl

import com.tencent.devops.common.api.auth.AUTH_HEADER_USER_ID
import com.tencent.devops.common.api.auth.AUTH_HEADER_USER_ID_DEFAULT_VALUE
import com.tencent.devops.common.api.constant.MESSAGE
import com.tencent.devops.common.api.exception.ErrorCodeException
import com.tencent.devops.common.client.Client
import com.tencent.devops.common.service.utils.SpringContextUtil
import com.tencent.devops.common.web.utils.I18nUtil
import com.tencent.devops.repository.api.ServiceOauthResource
import com.tencent.devops.repository.constant.RepositoryConstants.KEY_REPOSITORY_ID
import com.tencent.devops.repository.pojo.enums.TokenTypeEnum
Expand Down Expand Up @@ -127,20 +129,25 @@ class StoreBaseDeleteServiceImpl @Autowired constructor(
val userId = bkStoreContext[AUTH_HEADER_USER_ID]?.toString() ?: AUTH_HEADER_USER_ID_DEFAULT_VALUE
val gitToken = client.get(ServiceOauthResource::class).gitGet(userId).data
?: throw NotFoundException("cannot found access token for user($userId)")
val deleteRepositoryResult = getStoreManagementExtraService(storeType).deleteComponentCodeRepository(
userId = userId,
repositoryId = repositoryId,
token = gitToken.accessToken,
tokenType = TokenTypeEnum.OAUTH
)
if (deleteRepositoryResult.isNotOk()) {
logger.info(
"deleteComponentCodeRepository storeType:$storeType|storeCode:$storeCode|" +
"result:$deleteRepositoryResult"
try {
val deleteRepositoryResult = getStoreManagementExtraService(storeType).deleteComponentCodeRepository(
userId = userId,
repositoryId = repositoryId,
token = gitToken.accessToken,
tokenType = TokenTypeEnum.OAUTH
)
throw ErrorCodeException(
errorCode = deleteRepositoryResult.status.toString(),
defaultMessage = deleteRepositoryResult.message
if (deleteRepositoryResult.isNotOk()) {
bkStoreContext[MESSAGE] = I18nUtil.getCodeLanMessage(
messageCode = StoreMessageCode.STORE_COMPONENT_CODE_REPOSITORY_DELETE_FAIL,
params = arrayOf(deleteRepositoryResult.message ?: "")
)
}
} catch (ignored: Throwable) {
// 组件删除代码库失败不终止删除流程,在接口返回报文给出提示信息
logger.warn("deleteAtomRepository deleteComponentCodeRepository!", ignored)
bkStoreContext[MESSAGE] = I18nUtil.getCodeLanMessage(
messageCode = StoreMessageCode.STORE_COMPONENT_CODE_REPOSITORY_DELETE_FAIL,
params = arrayOf(ignored.message ?: "")
)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ package com.tencent.devops.store.common.service.impl
import com.tencent.devops.common.api.auth.AUTH_HEADER_USER_ID
import com.tencent.devops.common.api.constant.CommonMessageCode
import com.tencent.devops.common.api.constant.KEY_FILE_SHA_CONTENT
import com.tencent.devops.common.api.constant.MESSAGE
import com.tencent.devops.common.api.exception.ErrorCodeException
import com.tencent.devops.common.api.pojo.Result
import com.tencent.devops.common.api.util.UUIDUtil
Expand Down Expand Up @@ -370,7 +371,7 @@ class StoreComponentManageServiceImpl : StoreComponentManageService {
val bkStoreContext = handlerRequest.bkStoreContext
bkStoreContext[AUTH_HEADER_USER_ID] = userId
StoreDeleteHandlerChain(handlerList).handleRequest(handlerRequest)
return Result(true)
return Result(data = true, message = bkStoreContext[MESSAGE]?.toString())
}

override fun validateComponentDownloadPermission(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,16 +27,28 @@

package com.tencent.devops.store.common.service.impl

import com.tencent.devops.common.api.constant.CommonMessageCode
import com.tencent.devops.common.api.exception.ErrorCodeException
import com.tencent.devops.common.api.pojo.Result
import com.tencent.devops.common.service.utils.SpringContextUtil
import com.tencent.devops.repository.api.ServiceOauthResource
import com.tencent.devops.repository.constant.RepositoryConstants.KEY_REPOSITORY_ID
import com.tencent.devops.repository.pojo.enums.TokenTypeEnum
import com.tencent.devops.store.common.dao.StoreBaseFeatureExtQueryDao
import com.tencent.devops.store.common.dao.StoreBaseQueryDao
import com.tencent.devops.store.common.service.StoreManagementExtraService
import com.tencent.devops.store.pojo.common.enums.StoreTypeEnum
import com.tencent.devops.store.pojo.common.member.StoreMemberReq
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.context.annotation.Primary
import org.springframework.stereotype.Service
import javax.ws.rs.NotFoundException

@Primary
@Service
class StoreComponentMemberServiceImpl @Autowired constructor(
private val storeBaseQueryDao: StoreBaseQueryDao
private val storeBaseQueryDao: StoreBaseQueryDao,
private val storeBaseFeatureExtQueryDao: StoreBaseFeatureExtQueryDao
) : StoreMemberServiceImpl() {

override fun getStoreName(storeCode: String, storeType: StoreTypeEnum): String {
Expand All @@ -46,4 +58,98 @@ class StoreComponentMemberServiceImpl @Autowired constructor(
storeType = storeType
)?.name ?: ""
}

override fun add(
userId: String,
storeMemberReq: StoreMemberReq,
storeType: StoreTypeEnum,
collaborationFlag: Boolean?,
sendNotify: Boolean,
checkPermissionFlag: Boolean,
testProjectCode: String?
): Result<Boolean> {
val storeCode = storeMemberReq.storeCode
// 检查用户是否有权限操作
super.checkUserPermission(
checkPermissionFlag = checkPermissionFlag,
userId = userId,
storeCode = storeCode,
storeType = storeType
)
val repositoryId = storeBaseFeatureExtQueryDao.getStoreBaseFeatureExt(
dslContext = dslContext, storeCode = storeCode, storeType = storeType, fieldName = KEY_REPOSITORY_ID
)?.fieldValue
if (!repositoryId.isNullOrBlank()) {
val gitToken = client.get(ServiceOauthResource::class).gitGet(userId).data
?: throw NotFoundException("cannot found access token for user($userId)")
getStoreManagementExtraService(storeType).addComponentRepositoryUser(
members = storeMemberReq.member,
repositoryId = repositoryId,
token = gitToken.accessToken,
tokenType = TokenTypeEnum.OAUTH
)
}
return super.add(
userId = userId,
storeMemberReq = storeMemberReq,
storeType = storeType,
collaborationFlag = collaborationFlag,
sendNotify = sendNotify,
checkPermissionFlag = false,
testProjectCode = testProjectCode
)
}

override fun delete(
userId: String,
id: String,
storeCode: String,
storeType: StoreTypeEnum,
checkPermissionFlag: Boolean
): Result<Boolean> {
// 检查用户是否有权限操作
super.checkUserPermission(
checkPermissionFlag = checkPermissionFlag,
userId = userId,
storeCode = storeCode,
storeType = storeType
)
val memberRecord = storeMemberDao.getById(dslContext, id) ?: throw ErrorCodeException(
errorCode = CommonMessageCode.PARAMETER_IS_INVALID, params = arrayOf(id)
)
// 如果删除的是管理员,只剩一个管理员则不允许删除
if ((memberRecord.type).toInt() == 0) {
val validateAdminResult = isStoreHasAdmins(storeCode, storeType)
if (validateAdminResult.isNotOk()) {
return Result(status = validateAdminResult.status, message = validateAdminResult.message, data = false)
}
}
val repositoryId = storeBaseFeatureExtQueryDao.getStoreBaseFeatureExt(
dslContext = dslContext, storeCode = storeCode, storeType = storeType, fieldName = KEY_REPOSITORY_ID
)?.fieldValue
if (!repositoryId.isNullOrBlank()) {
val gitToken = client.get(ServiceOauthResource::class).gitGet(userId).data
?: throw NotFoundException("cannot found access token for user($userId)")
getStoreManagementExtraService(storeType).deleteComponentRepositoryUser(
member = memberRecord.username,
repositoryId = repositoryId,
token = gitToken.accessToken,
tokenType = TokenTypeEnum.OAUTH
)
}
return super.delete(
userId = userId,
id = id,
storeCode = storeCode,
storeType = storeType,
checkPermissionFlag = false
)
}

private fun getStoreManagementExtraService(storeType: StoreTypeEnum): StoreManagementExtraService {
return SpringContextUtil.getBean(
StoreManagementExtraService::class.java,
"${storeType}_MANAGEMENT_EXTRA_SERVICE"
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -196,18 +196,12 @@ abstract class StoreMemberServiceImpl : StoreMemberService {
): Result<Boolean> {
val storeCode = storeMemberReq.storeCode
val type = storeMemberReq.type.type.toByte()
if (checkPermissionFlag && !storeMemberDao.isStoreAdmin(
dslContext = dslContext,
userId = userId,
storeCode = storeCode,
storeType = storeType.type.toByte()
)) {
return I18nUtil.generateResponseDataObject(
messageCode = NO_COMPONENT_ADMIN_PERMISSION,
language = I18nUtil.getLanguage(userId),
params = arrayOf(storeCode)
)
}
checkUserPermission(
checkPermissionFlag = checkPermissionFlag,
userId = userId,
storeCode = storeCode,
storeType = storeType
)
val receivers = mutableSetOf<String>()
for (item in storeMemberReq.member) {
if (storeMemberDao.isStoreMember(dslContext, item, storeCode, storeType.type.toByte())) {
Expand Down Expand Up @@ -258,6 +252,23 @@ abstract class StoreMemberServiceImpl : StoreMemberService {
return Result(true)
}

protected fun checkUserPermission(
checkPermissionFlag: Boolean,
userId: String,
storeCode: String,
storeType: StoreTypeEnum
) {
if (checkPermissionFlag && !storeMemberDao.isStoreAdmin(
dslContext = dslContext,
userId = userId,
storeCode = storeCode,
storeType = storeType.type.toByte()
)
) {
throw ErrorCodeException(errorCode = NO_COMPONENT_ADMIN_PERMISSION, params = arrayOf(storeCode))
}
}

/**
* 删除store组件成员
*/
Expand All @@ -269,19 +280,12 @@ abstract class StoreMemberServiceImpl : StoreMemberService {
checkPermissionFlag: Boolean
): Result<Boolean> {
logger.info("deleteMember params:[$userId|$id|$storeCode|$storeType|$checkPermissionFlag")
if (checkPermissionFlag && !storeMemberDao.isStoreAdmin(
dslContext = dslContext,
userId = userId,
storeCode = storeCode,
storeType = storeType.type.toByte()
)
) {
return I18nUtil.generateResponseDataObject(
messageCode = NO_COMPONENT_ADMIN_PERMISSION,
language = I18nUtil.getLanguage(userId),
params = arrayOf(storeCode)
)
}
checkUserPermission(
checkPermissionFlag = checkPermissionFlag,
userId = userId,
storeCode = storeCode,
storeType = storeType
)
val record = storeMemberDao.getById(dslContext, id)
if (record != null) {
if ((record.type).toInt() == 0) {
Expand Down Expand Up @@ -392,10 +396,7 @@ abstract class StoreMemberServiceImpl : StoreMemberService {
override fun isStoreHasAdmins(storeCode: String, storeType: StoreTypeEnum): Result<Boolean> {
val adminCount = storeMemberDao.countAdmin(dslContext, storeCode, storeType.type.toByte())
if (adminCount <= 1) {
return I18nUtil.generateResponseDataObject(
messageCode = StoreMessageCode.USER_COMPONENT_ADMIN_COUNT_ERROR,
language = I18nUtil.getLanguage(I18nUtil.getRequestUserId())
)
throw ErrorCodeException(errorCode = StoreMessageCode.USER_COMPONENT_ADMIN_COUNT_ERROR)
}
return Result(true)
}
Expand Down

0 comments on commit 2c43abe

Please sign in to comment.