Skip to content

Commit

Permalink
feat: fs-server支持客户端会话管理 #1275
Browse files Browse the repository at this point in the history
  • Loading branch information
yaoxuwan committed Oct 19, 2023
1 parent f3a1742 commit ca9167b
Show file tree
Hide file tree
Showing 11 changed files with 226 additions and 210 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
/*
* Tencent is pleased to support the open source community by making BK-CI 蓝鲸持续集成平台 available.
*
* Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.
*
* BK-CI 蓝鲸持续集成平台 is licensed under the MIT license.
*
* A copy of the MIT License is included in this file.
*
*
* Terms of the MIT License:
* ---------------------------------------------------
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
* documentation files (the "Software"), to deal in the Software without restriction, including without limitation the
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or substantial portions of
* the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
* LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
* NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/

package com.tencent.bkrepo.common.mongo.util

import com.tencent.bkrepo.common.api.constant.DEFAULT_PAGE_NUMBER
import com.tencent.bkrepo.common.api.constant.DEFAULT_PAGE_SIZE
import com.tencent.bkrepo.common.api.pojo.Page
import org.springframework.data.domain.PageRequest

/**
* 分页工具类
*/
object Pages {

/**
* 根据页码[page]和分页大小[size]构造[PageRequest]
*
* [page]从1开始,如果传入值小于1则置为1
* [size]如果小于0则置为默认分页大小20
*
* [PageRequest]要求页码从0开始
*/
fun ofRequest(page: Int, size: Int): PageRequest {
val pageNumber = if (page <= 0) DEFAULT_PAGE_NUMBER else page
val pageSize = if (page < 0) DEFAULT_PAGE_SIZE else size
return PageRequest.of(pageNumber - 1, pageSize)
}

/**
* 将查询到的所有数据通过内存分页构造结果
*
* @param total 所有数据
* @param page 页码,从1开始,如果传入值小于1则置为1
* @param size 分页大小,如果小于0则置为默认分页大小20
*/
inline fun <reified T> buildPage(total: List<T>, page: Int, size: Int): Page<T> {
val pageNumber = if (page <= 0) DEFAULT_PAGE_NUMBER else page
val pageSize = if (page < 0) DEFAULT_PAGE_SIZE else size
val totalRecords = total.size
val offset = (pageNumber - 1) * pageSize
val records = if (offset > totalRecords) {
emptyList()
} else if (offset + pageSize > totalRecords) {
total.subList(offset, totalRecords)
} else {
total.subList(offset, offset + pageSize)
}
return Page(
pageNumber = pageNumber,
pageSize = pageSize,
totalRecords = totalRecords.toLong(),
records = records
)
}

/**
* 创建分页响应结果
*
* @param pageRequest 分页请求
* @param totalRecords 数据总数
* @param records 数据列表
*/
inline fun <reified T> ofResponse(pageRequest: PageRequest, totalRecords: Long, records: List<T>): Page<T> {
return Page(
pageNumber = pageRequest.pageNumber + 1,
pageSize = pageRequest.pageSize,
totalRecords = totalRecords,
records = records
)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
/*
* Tencent is pleased to support the open source community by making BK-CI 蓝鲸持续集成平台 available.
*
* Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
*
* BK-CI 蓝鲸持续集成平台 is licensed under the MIT license.
*
* A copy of the MIT License is included in this file.
*
*
* Terms of the MIT License:
* ---------------------------------------------------
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
* documentation files (the "Software"), to deal in the Software without restriction, including without limitation the
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or substantial portions of
* the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
* LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
* NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/

package com.tencent.bkrepo.fs.server.api

import com.tencent.bkrepo.common.api.constant.FS_SERVER_SERVICE_NAME
import com.tencent.bkrepo.common.api.pojo.Page
import com.tencent.bkrepo.common.api.pojo.Response
import com.tencent.bkrepo.fs.server.pojo.ClientDetail
import org.springframework.cloud.openfeign.FeignClient
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.PathVariable
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RequestParam

@FeignClient(FS_SERVER_SERVICE_NAME, contextId = "ClientClient", primary = false)
@RequestMapping("/service/client")
interface FsClientClient {

@GetMapping("/list/{projectId}/{repoName}")
fun listClients(
@PathVariable projectId: String,
@PathVariable repoName: String,
@RequestParam pageNumber: Int,
@RequestParam pageSize: Int
): Response<Page<ClientDetail>>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
/*
* Tencent is pleased to support the open source community by making BK-CI 蓝鲸持续集成平台 available.
*
* Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
*
* BK-CI 蓝鲸持续集成平台 is licensed under the MIT license.
*
* A copy of the MIT License is included in this file.
*
*
* Terms of the MIT License:
* ---------------------------------------------------
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
* documentation files (the "Software"), to deal in the Software without restriction, including without limitation the
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or substantial portions of
* the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
* LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
* NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/

package com.tencent.bkrepo.fs.server.pojo

/**
* 客户端列表请求
*/
data class ClientListRequest(
val projectId: String,
val repoName: String,
val pageNumber: Int,
val pageSize: Int
)
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,10 @@ class RouteConfiguration(
POST("/heartbeat/{projectId}/{repoName}/{clientId}", clientHandler::heartbeat)
}

"/service/client".nest {
GET("/list/{projectId}/{repoName}", clientHandler::listClients)
}

accept(APPLICATION_OCTET_STREAM).nest {
GET(DEFAULT_MAPPING_URI, fileOperationsHandler::read)
addMetrics(serverMetrics.downloadingCount)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,12 +27,16 @@

package com.tencent.bkrepo.fs.server.handler

import com.tencent.bkrepo.common.api.constant.DEFAULT_PAGE_NUMBER
import com.tencent.bkrepo.common.api.constant.DEFAULT_PAGE_SIZE
import com.tencent.bkrepo.fs.server.request.ClientCreateRequest
import com.tencent.bkrepo.fs.server.pojo.ClientListRequest
import com.tencent.bkrepo.fs.server.service.ClientService
import com.tencent.bkrepo.fs.server.utils.ReactiveResponseBuilder
import kotlinx.coroutines.reactor.awaitSingle
import org.springframework.web.reactive.function.server.ServerRequest
import org.springframework.web.reactive.function.server.ServerResponse
import org.springframework.web.reactive.function.server.queryParamOrNull

class ClientHandler(
private val clientService: ClientService
Expand All @@ -58,4 +62,14 @@ class ClientHandler(
clientService.heartbeat(projectId, repoName, clientId)
return ReactiveResponseBuilder.success()
}

suspend fun listClients(request: ServerRequest): ServerResponse {
val listRequest = ClientListRequest(
projectId = request.pathVariable(ClientListRequest::projectId.name),
repoName = request.pathVariable(ClientListRequest::repoName.name),
pageNumber = request.queryParamOrNull(ClientListRequest::pageNumber.name)?.toInt() ?: DEFAULT_PAGE_NUMBER,
pageSize = request.queryParamOrNull(ClientListRequest::pageSize.name)?.toInt() ?: DEFAULT_PAGE_SIZE
)
return ReactiveResponseBuilder.success(clientService.listClients(listRequest))
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -33,11 +33,14 @@ package com.tencent.bkrepo.fs.server.service

import com.tencent.bkrepo.common.api.exception.ErrorCodeException
import com.tencent.bkrepo.common.api.message.CommonMessageCode
import com.tencent.bkrepo.common.api.pojo.Page
import com.tencent.bkrepo.common.mongo.util.Pages
import com.tencent.bkrepo.fs.server.context.ReactiveRequestContextHolder
import com.tencent.bkrepo.fs.server.model.TClient
import com.tencent.bkrepo.fs.server.pojo.ClientDetail
import com.tencent.bkrepo.fs.server.repository.ClientRepository
import com.tencent.bkrepo.fs.server.request.ClientCreateRequest
import com.tencent.bkrepo.fs.server.pojo.ClientListRequest
import com.tencent.bkrepo.fs.server.utils.ReactiveSecurityUtils
import org.springframework.data.mongodb.core.query.Criteria
import org.springframework.data.mongodb.core.query.Query
Expand Down Expand Up @@ -91,6 +94,17 @@ class ClientService(
clientRepository.save(client)
}

suspend fun listClients(request: ClientListRequest): Page<ClientDetail> {
val pageRequest = Pages.ofRequest(request.pageNumber, request.pageSize)
val query = Query(
Criteria.where(TClient::projectId.name).isEqualTo(request.projectId)
.and(TClient::repoName.name).isEqualTo(request.repoName)
)
val count = clientRepository.count(query)
val data = clientRepository.find(query.with(pageRequest))
return Pages.ofResponse(pageRequest, count, data.map { it.convert() })
}

private suspend fun insertClient(request: ClientCreateRequest): TClient {
val client = TClient(
projectId = request.projectId,
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -35,24 +35,28 @@ import com.tencent.bkrepo.auth.pojo.enums.PermissionAction
import com.tencent.bkrepo.common.api.pojo.Page
import com.tencent.bkrepo.common.api.pojo.Response
import com.tencent.bkrepo.common.security.manager.PermissionManager
import com.tencent.bkrepo.common.service.util.ResponseBuilder
import com.tencent.bkrepo.fs.server.api.FsClientClient
import com.tencent.bkrepo.fs.server.pojo.ClientDetail
import com.tencent.bkrepo.opdata.pojo.ClientListRequest
import com.tencent.bkrepo.opdata.service.FsClientService
import com.tencent.bkrepo.fs.server.pojo.ClientListRequest
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController

@RestController
@RequestMapping("/api/fs-client")
class FsClientController(
private val fsClientService: FsClientService,
private val fsClientClient: FsClientClient,
private val permissionManager: PermissionManager
) {

@GetMapping("/list")
fun getClients(request: ClientListRequest): Response<Page<ClientDetail>> {
permissionManager.checkProjectPermission(PermissionAction.READ, request.projectId)
return ResponseBuilder.success(fsClientService.listClients(request))
return fsClientClient.listClients(
request.projectId,
request.repoName,
request.pageNumber,
request.pageSize
)
}
}

This file was deleted.

Loading

0 comments on commit ca9167b

Please sign in to comment.