From 5d56da03e6d306e28c0c3758de474d9cee36396e Mon Sep 17 00:00:00 2001 From: kaede10 Date: Wed, 14 Aug 2024 17:46:13 +0800 Subject: [PATCH] process apply and update package status --- .../easysoftware/EasysoftwareApplication.java | 2 + .../adapter/query/CoAdminAdapter.java | 30 +++++++- .../applyform/ApplyFormService.java | 9 +++ .../applyform/ApplyFormServiceImpl.java | 24 ++++++- .../applyform/dto/ProcessApply.java | 27 +++++++ .../common/account/UserPermission.java | 4 +- .../common/constant/MapConstant.java | 44 ++++++++++++ .../common/constant/PackageConstant.java | 72 ++++++++++++++++++- .../exception/GlobalExceptionHandler.java | 13 ++++ .../common/exception/UpdateException.java | 38 ++++++++++ .../common/utils/EsAsyncHttpUtil.java | 38 +++++++++- .../applyform/gateway/ApplyFormGateway.java | 9 +++ .../gateway/PackageStatusGateway.java | 9 +++ .../gatewayimpl/ApplyFormGatewayImpl.java | 40 +++++++++++ .../converter/ApplyFormConvertor.java | 13 ++++ .../gatewayimpl/PackageStatusGatewayImpl.java | 68 +++++++++++++++++- .../converter/PackageStatusConverter.java | 16 +++-- 17 files changed, 439 insertions(+), 17 deletions(-) create mode 100644 src/main/java/com/easysoftware/application/applyform/dto/ProcessApply.java create mode 100644 src/main/java/com/easysoftware/common/constant/MapConstant.java create mode 100644 src/main/java/com/easysoftware/common/exception/UpdateException.java diff --git a/src/main/java/com/easysoftware/EasysoftwareApplication.java b/src/main/java/com/easysoftware/EasysoftwareApplication.java index 628d797..6fbfc28 100644 --- a/src/main/java/com/easysoftware/EasysoftwareApplication.java +++ b/src/main/java/com/easysoftware/EasysoftwareApplication.java @@ -19,11 +19,13 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; import java.util.List; @SpringBootApplication @EnableScheduling +@EnableTransactionManagement @ComponentScan(basePackages = { "com.easysoftware.*" }) @MapperScan("com.easysoftware.infrastructure.mapper") public class EasysoftwareApplication { diff --git a/src/main/java/com/easysoftware/adapter/query/CoAdminAdapter.java b/src/main/java/com/easysoftware/adapter/query/CoAdminAdapter.java index b381582..156b6d0 100644 --- a/src/main/java/com/easysoftware/adapter/query/CoAdminAdapter.java +++ b/src/main/java/com/easysoftware/adapter/query/CoAdminAdapter.java @@ -14,6 +14,8 @@ package com.easysoftware.adapter.query; import java.util.HashMap; import com.easysoftware.application.apply.ApplyService; +import com.easysoftware.application.applyform.ApplyFormService; +import com.easysoftware.application.applyform.dto.ProcessApply; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -21,6 +23,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @@ -32,6 +36,8 @@ import com.easysoftware.common.aop.RequestLimitRedis; import com.easysoftware.common.entity.MessageCode; import com.easysoftware.common.utils.ResultUtil; +import jakarta.validation.Valid; + @RestController @RequestMapping("/collaboration/admin") public class CoAdminAdapter { @@ -43,7 +49,7 @@ public class CoAdminAdapter { /** * Define current functional permissions. */ - private static final String[] REQUIRE_PERMISSIONS = {UerPermissionDef.COLLABORATION_PERMISSION_ADMIN}; + private static final String[] REQUIRE_PERMISSIONS = {UerPermissionDef.COLLABORATION_PERMISSION_ADMIN }; /** * Autowired UserPermission for check user permission. @@ -57,6 +63,12 @@ public class CoAdminAdapter { @Autowired private ApplyService applyService; + /** + * Autowired service for search applyForm. + */ + @Autowired + private ApplyFormService applyFormService; + /** * Endpoint to search for repos based on the provided search * condition. @@ -95,9 +107,9 @@ public class CoAdminAdapter { } } - /** * get apply handle records by appid. + * * @param applyId The handle form content id. * @return ResponseEntity. */ @@ -107,4 +119,18 @@ public class CoAdminAdapter { public ResponseEntity getApply(@RequestParam(value = "applyId") Long applyId) { return applyService.queryApplyHandleRecords(applyId); } + + /** + * process apply by applyid. + * + * @param processApply process apply. + * @return ResponseEntity. + */ + @PostMapping("/process") + @RequestLimitRedis() + @PreUserPermission(UerPermissionDef.COLLABORATION_PERMISSION_ADMIN) + public ResponseEntity processApply(@Valid @RequestBody ProcessApply processApply) { + return applyFormService.processApply(processApply); + } + } diff --git a/src/main/java/com/easysoftware/application/applyform/ApplyFormService.java b/src/main/java/com/easysoftware/application/applyform/ApplyFormService.java index 77a6bd6..dbec56c 100644 --- a/src/main/java/com/easysoftware/application/applyform/ApplyFormService.java +++ b/src/main/java/com/easysoftware/application/applyform/ApplyFormService.java @@ -14,6 +14,7 @@ package com.easysoftware.application.applyform; import org.springframework.http.ResponseEntity; import com.easysoftware.application.applyform.dto.ApplyFormSearchMaintainerCondition; +import com.easysoftware.application.applyform.dto.ProcessApply; public interface ApplyFormService { @@ -32,4 +33,12 @@ public interface ApplyFormService { * @return ResponseEntity. */ ResponseEntity searchApplyFromByApplyId(Long applyId); + + /** + * process apply by applyid. + * + * @param processApply process apply. + * @return ResponseEntity. + */ + ResponseEntity processApply(ProcessApply processApply); } diff --git a/src/main/java/com/easysoftware/application/applyform/ApplyFormServiceImpl.java b/src/main/java/com/easysoftware/application/applyform/ApplyFormServiceImpl.java index 9cf9890..6abbff7 100644 --- a/src/main/java/com/easysoftware/application/applyform/ApplyFormServiceImpl.java +++ b/src/main/java/com/easysoftware/application/applyform/ApplyFormServiceImpl.java @@ -19,13 +19,15 @@ import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; import com.easysoftware.application.applyform.dto.ApplyFormSearchMaintainerCondition; +import com.easysoftware.application.applyform.dto.ProcessApply; import com.easysoftware.application.applyform.vo.ApplyFormContentVO; import com.easysoftware.application.applyform.vo.ApplyFormSearchMaintainerVO; import com.easysoftware.common.exception.NoneResException; import com.easysoftware.common.exception.ParamErrorException; +import com.easysoftware.common.exception.UpdateException; import com.easysoftware.common.utils.ResultUtil; import com.easysoftware.domain.applyform.gateway.ApplyFormGateway; - +import com.easysoftware.domain.collaboration.gateway.PackageStatusGateway; import jakarta.annotation.Resource; @Service @@ -37,6 +39,12 @@ public class ApplyFormServiceImpl implements ApplyFormService { @Resource private ApplyFormGateway applyFormGateway; + /** + * Resource for interacting with Package Status Gateway. + */ + @Resource + private PackageStatusGateway pkgageStatusGateway; + /** * Search for apply form based on the provided search condition. * @@ -85,4 +93,18 @@ public class ApplyFormServiceImpl implements ApplyFormService { } + /** + * Process apply based on the provided condition. + * + * @param processApply The process condition for querying apply form by applyId. + * @return ResponseEntity. + */ + public ResponseEntity processApply(ProcessApply processApply) { + boolean flag = applyFormGateway.processApply(processApply); + if (!flag) { + throw new UpdateException("process apply failed"); + } + return ResultUtil.success(HttpStatus.OK); + } + } diff --git a/src/main/java/com/easysoftware/application/applyform/dto/ProcessApply.java b/src/main/java/com/easysoftware/application/applyform/dto/ProcessApply.java new file mode 100644 index 0000000..107b7bc --- /dev/null +++ b/src/main/java/com/easysoftware/application/applyform/dto/ProcessApply.java @@ -0,0 +1,27 @@ +package com.easysoftware.application.applyform.dto; + +import com.easysoftware.common.constant.PackageConstant; + +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Pattern; +import jakarta.validation.constraints.Size; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class ProcessApply { + /** + * Field name with a maximum length of PackageConstant.MAX_FIELD_LENGTH. + */ + @Size(max = PackageConstant.MAX_FIELD_LENGTH) + @Pattern(regexp = PackageConstant.VALID_STR_REG, message = PackageConstant.VALID_MESSAGE) + @NotNull + private String applyStatus; + + /** + * apply ID. + */ + @NotNull + private long applyId; +} diff --git a/src/main/java/com/easysoftware/common/account/UserPermission.java b/src/main/java/com/easysoftware/common/account/UserPermission.java index d41afd4..2e5c1f1 100644 --- a/src/main/java/com/easysoftware/common/account/UserPermission.java +++ b/src/main/java/com/easysoftware/common/account/UserPermission.java @@ -125,13 +125,13 @@ public class UserPermission { String response = HttpClientUtil.getHttpClient(userInfoApi, manageToken, userToken, cookie.getValue()); JsonNode resJson = ObjectMapperUtil.toJsonNode(response); - String resCode = resJson.get("code").asText(); + String resCode = resJson.path("code").asText(); if (!"200".equals(resCode)) { LOGGER.error("query user login name failed"); throw new HttpRequestException("query user login name failed"); } String loginName = null; - JsonNode identities = resJson.get("data").get("identities"); + JsonNode identities = resJson.path("data").path("identities"); for (JsonNode identity : identities) { if (identity.has("identity") && identity.get("identity").asText().equalsIgnoreCase("gitee")) { loginName = identity.get("login_name").asText(); diff --git a/src/main/java/com/easysoftware/common/constant/MapConstant.java b/src/main/java/com/easysoftware/common/constant/MapConstant.java new file mode 100644 index 0000000..3178fbe --- /dev/null +++ b/src/main/java/com/easysoftware/common/constant/MapConstant.java @@ -0,0 +1,44 @@ + +/* Copyright (c) 2024 openEuler Community + EasySoftwareInput is licensed under the Mulan PSL v2. + You can use this software according to the terms and conditions of the Mulan PSL v2. + You may obtain a copy of Mulan PSL v2 at: + http://license.coscl.org.cn/MulanPSL2 + THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + See the Mulan PSL v2 for more details. +*/ + +package com.easysoftware.common.constant; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +public final class MapConstant { + // Private constructor to prevent instantiation of the utility class + private MapConstant() { + // private constructor to hide the implicit public one + throw new AssertionError("ClientUtil class cannot be instantiated."); + } + + /** + * package status metirc map. + */ + public static final Map METRIC_MAP; + + static { + Map item = new HashMap<>(); + item.put("cveStatus", "cve"); + item.put("prStatus", "package_update"); + item.put("issueStatus", "issue"); + item.put("versionStatus", "package_version"); + item.put("orgStatus", "company"); + item.put("contributorStatus", "participant"); + item.put("sigName", "sig_names"); + item.put("finalStatus", "final_status"); + METRIC_MAP = Collections.unmodifiableMap(item); + } + +} diff --git a/src/main/java/com/easysoftware/common/constant/PackageConstant.java b/src/main/java/com/easysoftware/common/constant/PackageConstant.java index 73942b0..371890b 100644 --- a/src/main/java/com/easysoftware/common/constant/PackageConstant.java +++ b/src/main/java/com/easysoftware/common/constant/PackageConstant.java @@ -172,7 +172,7 @@ public final class PackageConstant { /** * index name of package status. */ - public static final String PACKAGE_STATUS_INDEX = "package_status_20240525_test"; + public static final String PACKAGE_STATUS_INDEX = "package_status_20240813_test"; /** * package status keyword format. @@ -183,4 +183,74 @@ public final class PackageConstant { * table name of ApplyForm. */ public static final String APPLY_FORM_TABLE = "apply_form"; + + /** + * cve status. + */ + public static final String CVE_ALL_FIXED = "有CVE且全部修复"; + + /** + * cve status. + */ + public static final String CVE_ALL_NO_FIXED = "有CVE全部未修复"; + + /** + * cve status. + */ + public static final String CVE_SOME_FIXED = "有CVE部分修复"; + + /** + * cve status. + */ + public static final String NO_CVE = "没有CVE问题"; + + /** + * issue status. + */ + public static final String ISSUE_ALL_NO_FIXED = "没有Issue修复"; + + /** + * package version status. + */ + public static final String LATEST_VERSION = "最新版本"; + + /** + * package version status. + */ + public static final String OUTDATED_VERSION = "落后版本"; + + /** + * package update status. + */ + public static final String PR_NO_UPDATED = "没有PR提交"; + + /** + * package maintainenance status. + */ + public static final String NO_MAINTAINENANCE = "没有人维护"; + + /** + * package maintainenance status. + */ + public static final String LACK_OF_MAINTAINENANCE = "缺人维护"; + + /** + * package maintainenance status. + */ + public static final String HEALTH = "健康"; + + /** + * package maintainenance status. + */ + public static final String ACTIVE = "活跃"; + + /** + * package maintainenance status. + */ + public static final String INACTIVE = "静止"; + + /** + * apply status. + */ + public static final String APPLY_APPROVED = "approved"; } diff --git a/src/main/java/com/easysoftware/common/exception/GlobalExceptionHandler.java b/src/main/java/com/easysoftware/common/exception/GlobalExceptionHandler.java index 0bb490d..3230693 100644 --- a/src/main/java/com/easysoftware/common/exception/GlobalExceptionHandler.java +++ b/src/main/java/com/easysoftware/common/exception/GlobalExceptionHandler.java @@ -137,6 +137,19 @@ public class GlobalExceptionHandler { return ResultUtil.fail(HttpStatus.BAD_REQUEST, MessageCode.EC0009); } + /** + * Handles exceptions of type UpdateException. + * + * @param e The UpdateException to handle + * @return ResponseEntity containing details about the exception + */ + @ExceptionHandler(UpdateException.class) + @ResponseStatus(HttpStatus.BAD_REQUEST) + public ResponseEntity exception(final UpdateException e) { + LOGGER.error(MessageCode.EC0004.getMsgEn()); + return ResultUtil.fail(HttpStatus.BAD_REQUEST, MessageCode.EC0004); + } + /** * Handles general exceptions. * diff --git a/src/main/java/com/easysoftware/common/exception/UpdateException.java b/src/main/java/com/easysoftware/common/exception/UpdateException.java new file mode 100644 index 0000000..d979a6d --- /dev/null +++ b/src/main/java/com/easysoftware/common/exception/UpdateException.java @@ -0,0 +1,38 @@ +/* Copyright (c) 2024 openEuler Community + EasySoftware is licensed under the Mulan PSL v2. + You can use this software according to the terms and conditions of the Mulan PSL v2. + You may obtain a copy of Mulan PSL v2 at: + http://license.coscl.org.cn/MulanPSL2 + THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + See the Mulan PSL v2 for more details. +*/ + +package com.easysoftware.common.exception; + +import java.io.Serial; + +public class UpdateException extends RuntimeException { + /** + * Serial version UID for serialization. + */ + @Serial + private static final long serialVersionUID = 1L; + + /** + * Constructor for UpdateException with a message. + * + * @param message The exception message + */ + public UpdateException(final String message) { + super(message); + } + + /** + * Default constructor for UpdateException. + */ + public UpdateException() { + } + +} diff --git a/src/main/java/com/easysoftware/common/utils/EsAsyncHttpUtil.java b/src/main/java/com/easysoftware/common/utils/EsAsyncHttpUtil.java index ccb132b..93694d3 100644 --- a/src/main/java/com/easysoftware/common/utils/EsAsyncHttpUtil.java +++ b/src/main/java/com/easysoftware/common/utils/EsAsyncHttpUtil.java @@ -41,7 +41,9 @@ import org.springframework.http.HttpHeaders; import org.springframework.stereotype.Component; import com.easysoftware.common.constant.HttpConstant; +import com.easysoftware.common.constant.MapConstant; import com.easysoftware.common.constant.PackageConstant; +import com.easysoftware.infrastructure.applyform.gatewayimpl.dataobject.ApplyFormDO; @Component public final class EsAsyncHttpUtil { @@ -69,6 +71,12 @@ public final class EsAsyncHttpUtil { @Value("${es.searchFormat}") private String searchFormat; + /** + * Value injected for the es updateFormat. + */ + @Value("${es.updateFormat}") + private String updateFormat; + /** * AsyncHttpClient. */ @@ -123,6 +131,29 @@ public final class EsAsyncHttpUtil { return client.executeRequest(builder.build()); } + /** + * execute es update by query. + * + * @param index es index name + * @param applyFormDO apply content + * @param status package status + * @return ListenableFuture the result of es update. + */ + public ListenableFuture executeUpdate(String index, ApplyFormDO applyFormDO, String status) + throws NoSuchAlgorithmException, KeyManagementException { + AsyncHttpClient client = getClient(); + RequestBuilder builder = getBuilder(); + String metric = MapConstant.METRIC_MAP.get(applyFormDO.getMetric()); + + String query = String.format(updateFormat, metric, metric, applyFormDO.getMetricStatus(), status, + applyFormDO.getMaintainer(), applyFormDO.getRepo()); + + builder.setUrl(esUrl + index + "/_update_by_query"); + builder.setBody(query); + + return client.executeRequest(builder.build()); + } + /** * convert condition to query string. * @param obj search condition @@ -139,9 +170,10 @@ public final class EsAsyncHttpUtil { String value = entry.getValue().toString(); queryString += String.format(PackageConstant.KEY_WORD_FORMAT, field, value); } - - int pageSize = Integer.parseInt(obj.get("pageSize").toString()); - int from = (Integer.parseInt(obj.get("pageNum").toString()) - 1) * pageSize; + String pageStr = obj.get("pageSize") == null ? "1" : obj.get("pageSize").toString(); + String fromStr = obj.get("pageNum") == null ? "10" : obj.get("pageNum").toString(); + int pageSize = Integer.parseInt(pageStr); + int from = (Integer.parseInt(fromStr) - 1) * pageSize; String query = String.format(searchFormat, from, pageSize, login, queryString); return query; } diff --git a/src/main/java/com/easysoftware/domain/applyform/gateway/ApplyFormGateway.java b/src/main/java/com/easysoftware/domain/applyform/gateway/ApplyFormGateway.java index 31eebac..a692adb 100644 --- a/src/main/java/com/easysoftware/domain/applyform/gateway/ApplyFormGateway.java +++ b/src/main/java/com/easysoftware/domain/applyform/gateway/ApplyFormGateway.java @@ -15,6 +15,7 @@ import java.util.Map; import org.springframework.stereotype.Component; import com.easysoftware.application.applyform.dto.ApplyFormSearchMaintainerCondition; +import com.easysoftware.application.applyform.dto.ProcessApply; @Component @@ -35,4 +36,12 @@ public interface ApplyFormGateway { * @return A map containing relevant information */ Map queryApplyFormByApplyId(Long applyId); + + /** + * Process apply based on the provided condition.. + * + * @param processApply The process result for apply. + * @return A map containing relevant information + */ + boolean processApply(ProcessApply processApply); } diff --git a/src/main/java/com/easysoftware/domain/collaboration/gateway/PackageStatusGateway.java b/src/main/java/com/easysoftware/domain/collaboration/gateway/PackageStatusGateway.java index 18af2f0..06b6b8b 100644 --- a/src/main/java/com/easysoftware/domain/collaboration/gateway/PackageStatusGateway.java +++ b/src/main/java/com/easysoftware/domain/collaboration/gateway/PackageStatusGateway.java @@ -14,6 +14,7 @@ package com.easysoftware.domain.collaboration.gateway; import java.util.Map; import com.easysoftware.application.collaboration.dto.PackageSearchCondition; +import com.easysoftware.infrastructure.applyform.gatewayimpl.dataobject.ApplyFormDO; public interface PackageStatusGateway { /** @@ -23,4 +24,12 @@ public interface PackageStatusGateway { * @return A map containing detailed information */ Map queryByCondition(PackageSearchCondition condition); + + /** + * update package status based on the provided condition. + * + * @param applyFormDO apply content + * @return A map containing relevant information + */ + boolean updateByMetric(ApplyFormDO applyFormDO); } diff --git a/src/main/java/com/easysoftware/infrastructure/applyform/gatewayimpl/ApplyFormGatewayImpl.java b/src/main/java/com/easysoftware/infrastructure/applyform/gatewayimpl/ApplyFormGatewayImpl.java index b8be46a..5c009d6 100644 --- a/src/main/java/com/easysoftware/infrastructure/applyform/gatewayimpl/ApplyFormGatewayImpl.java +++ b/src/main/java/com/easysoftware/infrastructure/applyform/gatewayimpl/ApplyFormGatewayImpl.java @@ -18,22 +18,35 @@ import java.util.Map; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.easysoftware.application.applyform.dto.ApplyFormSearchMaintainerCondition; +import com.easysoftware.application.applyform.dto.ProcessApply; import com.easysoftware.application.applyform.vo.ApplyFormContentVO; import com.easysoftware.application.applyform.vo.ApplyFormSearchMaintainerVO; +import com.easysoftware.common.constant.PackageConstant; +import com.easysoftware.common.exception.UpdateException; import com.easysoftware.domain.applyform.gateway.ApplyFormGateway; +import com.easysoftware.domain.collaboration.gateway.PackageStatusGateway; import com.easysoftware.infrastructure.apply.gatewayimpl.dataobject.ApplyhandleRecordsDO; import com.easysoftware.infrastructure.applyform.gatewayimpl.converter.ApplyFormConvertor; import com.easysoftware.infrastructure.applyform.gatewayimpl.dataobject.ApplyFormDO; import com.easysoftware.infrastructure.mapper.ApplyFormDOMapper; import com.easysoftware.infrastructure.mapper.ApplyHandleRecordsDOMapper; +import jakarta.annotation.Resource; + @Component public class ApplyFormGatewayImpl implements ApplyFormGateway { + /** + * Resource for interacting with package status Gateway. + */ + @Resource + private PackageStatusGateway pkgStatusGateway; /** * Autowired field for the ApplicationVersionDOMapper. @@ -105,4 +118,31 @@ public class ApplyFormGatewayImpl implements ApplyFormGateway { return res; } + /** + * process apply based on the provided condition. + * + * @param processApply The update info for querying apply. + * @return A map containing relevant information + */ + @Override + @Transactional(rollbackFor = UpdateException.class) + public boolean processApply(ProcessApply processApply) { + ApplyFormDO applyFormDO = ApplyFormConvertor.toApplyFormDO(processApply); + UpdateWrapper wrapper = new UpdateWrapper<>(); + wrapper.eq("apply_id", processApply.getApplyId()); + + int mark = applyFormDOMapper.update(applyFormDO, wrapper); + boolean result = mark == 1; + + if (result && PackageConstant.APPLY_APPROVED.equalsIgnoreCase(processApply.getApplyStatus())) { + applyFormDO = applyFormDOMapper.selectOne(wrapper); + result = pkgStatusGateway.updateByMetric(applyFormDO); + if (!result) { + throw new UpdateException("update failed"); + } + } + return result; + + } + } diff --git a/src/main/java/com/easysoftware/infrastructure/applyform/gatewayimpl/converter/ApplyFormConvertor.java b/src/main/java/com/easysoftware/infrastructure/applyform/gatewayimpl/converter/ApplyFormConvertor.java index 66dd65a..08ce509 100644 --- a/src/main/java/com/easysoftware/infrastructure/applyform/gatewayimpl/converter/ApplyFormConvertor.java +++ b/src/main/java/com/easysoftware/infrastructure/applyform/gatewayimpl/converter/ApplyFormConvertor.java @@ -15,6 +15,7 @@ import java.util.List; import org.springframework.beans.BeanUtils; +import com.easysoftware.application.applyform.dto.ProcessApply; import com.easysoftware.application.applyform.vo.ApplyFormSearchMaintainerVO; import com.easysoftware.domain.applyform.ApplyForm; import com.easysoftware.infrastructure.applyform.gatewayimpl.dataobject.ApplyFormDO; @@ -40,6 +41,18 @@ public final class ApplyFormConvertor { return applyForm; } + /** + * Convert an ProcessApply object to an ApplyFormDO entity. + * + * @param processApply The ProcessApply object to convert + * @return An ApplyForm entity + */ + public static ApplyFormDO toApplyFormDO(final ProcessApply processApply) { + ApplyFormDO applyForm = new ApplyFormDO(); + BeanUtils.copyProperties(processApply, applyForm); + return applyForm; + } + /** * Convert a list of ApplicationVersionDO objects to a list of * ApplyForm entities. diff --git a/src/main/java/com/easysoftware/infrastructure/collaboration/gatewayimpl/PackageStatusGatewayImpl.java b/src/main/java/com/easysoftware/infrastructure/collaboration/gatewayimpl/PackageStatusGatewayImpl.java index 4c9688b..2f5739d 100644 --- a/src/main/java/com/easysoftware/infrastructure/collaboration/gatewayimpl/PackageStatusGatewayImpl.java +++ b/src/main/java/com/easysoftware/infrastructure/collaboration/gatewayimpl/PackageStatusGatewayImpl.java @@ -29,6 +29,7 @@ import com.easysoftware.common.constant.PackageConstant; import com.easysoftware.common.utils.EsAsyncHttpUtil; import com.easysoftware.common.utils.ObjectMapperUtil; import com.easysoftware.domain.collaboration.gateway.PackageStatusGateway; +import com.easysoftware.infrastructure.applyform.gatewayimpl.dataobject.ApplyFormDO; import com.easysoftware.infrastructure.collaboration.gatewayimpl.converter.PackageStatusConverter; import com.fasterxml.jackson.databind.JsonNode; @@ -65,8 +66,9 @@ public class PackageStatusGatewayImpl implements PackageStatusGateway { int total = 0; try { Map query = ObjectMapperUtil.jsonToMap(condition); + String login = userPermission.getUserLogin(); ListenableFuture future = esAsyncHttpUtil.executeSearch(PackageConstant.PACKAGE_STATUS_INDEX, - query, userPermission.getUserLogin()); + query, login); String responseBody = future.get().getResponseBody(UTF_8); JsonNode dataNode = ObjectMapperUtil.toJsonNode(responseBody); JsonNode hits = dataNode.path("hits").path("hits"); @@ -77,4 +79,68 @@ public class PackageStatusGatewayImpl implements PackageStatusGateway { } return Map.ofEntries(Map.entry("total", total), Map.entry("list", pkgs)); } + + /** + * update package status based on the provided condition. + * + * @param applyFormDO apply content + * @return A map containing relevant information + */ + @Override + public boolean updateByMetric(final ApplyFormDO applyFormDO) { + boolean flag = false; + try { + PackageSearchCondition condition = new PackageSearchCondition(); + condition.setRepo(applyFormDO.getRepo()); + String jsonStr = ObjectMapperUtil.writeValueAsString(queryByCondition(condition).get("list")); + List pkgs = ObjectMapperUtil.toObjectList(PackageStatusVO.class, jsonStr); + if (pkgs.size() != 1) { + LOGGER.error("Duplicate src repo or no repo"); + return flag; + } + String status = computeMetric(pkgs.get(0)); + ListenableFuture future = esAsyncHttpUtil.executeUpdate(PackageConstant.PACKAGE_STATUS_INDEX, + applyFormDO, status); + + String responseBody = future.get().getResponseBody(UTF_8); + int total = ObjectMapperUtil.toJsonNode(responseBody).path("total").asInt(); + if (total == 0) { + LOGGER.error("No update permission"); + } + int code = future.get().getStatusCode(); + flag = code == 200 && total == 1; + } catch (Exception e) { + LOGGER.error("update package error - {}", e.getMessage()); + } + return flag; + } + + /** + * compute package status. + * + * @param pkgStatus package status + * @return A map containing relevant information + */ + public String computeMetric(PackageStatusVO pkgStatus) { + String status = "Other"; + if (PackageConstant.CVE_ALL_NO_FIXED.equals(pkgStatus.getCveStatus()) + && PackageConstant.ISSUE_ALL_NO_FIXED.equals(pkgStatus.getIssueStatus())) { + status = PackageConstant.NO_MAINTAINENANCE; + } else if (PackageConstant.CVE_ALL_NO_FIXED.equals(pkgStatus.getCveStatus())) { + status = PackageConstant.LACK_OF_MAINTAINENANCE; + } else if (PackageConstant.CVE_ALL_FIXED.equals(pkgStatus.getCveStatus())) { + status = PackageConstant.HEALTH; + } else if (PackageConstant.NO_CVE.equals(pkgStatus.getCveStatus()) + && PackageConstant.PR_NO_UPDATED.equals(pkgStatus.getPrStatus()) + && PackageConstant.LATEST_VERSION.equals(pkgStatus.getVersionStatus())) { + status = PackageConstant.HEALTH; + } else if (PackageConstant.NO_CVE.equals(pkgStatus.getCveStatus()) + && PackageConstant.PR_NO_UPDATED.equals(pkgStatus.getPrStatus()) + && PackageConstant.OUTDATED_VERSION.equals(pkgStatus.getVersionStatus())) { + status = PackageConstant.INACTIVE; + } else if (PackageConstant.NO_CVE.equals(pkgStatus.getCveStatus())) { + status = PackageConstant.ACTIVE; + } + return status; + } } diff --git a/src/main/java/com/easysoftware/infrastructure/collaboration/gatewayimpl/converter/PackageStatusConverter.java b/src/main/java/com/easysoftware/infrastructure/collaboration/gatewayimpl/converter/PackageStatusConverter.java index 0a21a6e..3e455a9 100644 --- a/src/main/java/com/easysoftware/infrastructure/collaboration/gatewayimpl/converter/PackageStatusConverter.java +++ b/src/main/java/com/easysoftware/infrastructure/collaboration/gatewayimpl/converter/PackageStatusConverter.java @@ -44,16 +44,18 @@ public final class PackageStatusConverter { for (JsonNode hit : hits) { PackageStatusVO pkg = new PackageStatusVO(); JsonNode source = hit.path("_source"); - pkg.setIssueStatus(source.path("issue").path("status").asText()); - pkg.setPrStatus(source.path("package_update").path("status").asText()); - pkg.setCveStatus(source.path("cve").path("status").asText()); - pkg.setVersionStatus(source.path("package_version").path("status").asText()); - pkg.setOrgStatus(source.path("company").path("status").asText()); - pkg.setContributorStatus(source.path("participant").path("status").asText()); pkg.setRepo(source.path("repo").asText()); pkg.setKind(source.path("kind").asText()); pkg.setSigName(source.path("sig_names").asText()); - pkg.setStatus(source.path("status").asText()); + + JsonNode collaboration = source.path("collaboration"); + pkg.setIssueStatus(collaboration.path("issue").path("status").asText()); + pkg.setPrStatus(collaboration.path("package_update").path("status").asText()); + pkg.setCveStatus(collaboration.path("cve").path("status").asText()); + pkg.setVersionStatus(collaboration.path("package_version").path("status").asText()); + pkg.setOrgStatus(collaboration.path("company").path("status").asText()); + pkg.setContributorStatus(collaboration.path("participant").path("status").asText()); + pkg.setStatus(collaboration.path("status").asText()); pkgs.add(pkg); } return pkgs; -- Gitee