diff --git a/src/main/java/net/geedge/asw/common/util/RCode.java b/src/main/java/net/geedge/asw/common/util/RCode.java index 8563a2d..f2aed72 100644 --- a/src/main/java/net/geedge/asw/common/util/RCode.java +++ b/src/main/java/net/geedge/asw/common/util/RCode.java @@ -64,6 +64,7 @@ public enum RCode { GIT_MERGE_FAILED(203002, "Merge failed"), GIT_PARENT_COMMITID_NOT_FOUND(203003, "Parent commitId not found"), GIT_BINARY_CONFLICT_ERROR(203004, "Binary file conflict found; resolve conflicts in binary files manually"), + GIT_MERGE_NOT_SUPPORTED(203005, "Cannot merge in the {0} state"), // Runner diff --git a/src/main/java/net/geedge/asw/module/app/controller/GitController.java b/src/main/java/net/geedge/asw/module/app/controller/GitController.java index 55e6be5..58dfce8 100644 --- a/src/main/java/net/geedge/asw/module/app/controller/GitController.java +++ b/src/main/java/net/geedge/asw/module/app/controller/GitController.java @@ -8,6 +8,7 @@ import net.geedge.asw.common.util.T; import net.geedge.asw.module.app.entity.ApplicationMergeEntity; import net.geedge.asw.module.app.service.IApplicationMergeService; import net.geedge.asw.module.app.service.IGitService; +import net.geedge.asw.module.app.service.impl.ApplicationMergeServiceImpl.MergeRequestStatus; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -259,12 +260,18 @@ public class GitController { } @PutMapping("/{workspaceId}/mr/{mrId}") - public synchronized R mergeMr(@PathVariable("mrId") String mrId) { - ApplicationMergeEntity record = applicationMergeService.mergeMr(mrId); - if (T.StrUtil.equals("success", record.getStatus())) { - return R.ok().putData("record", record); + public synchronized R mergeMr(@PathVariable("mrId") String mrId, @RequestBody(required = false) Map body) { + String action = T.MapUtil.getStr(body, "action"); + T.VerifyUtil.is(action).notEmpty(RCode.PARAM_CANNOT_EMPTY); + + ApplicationMergeEntity record = applicationMergeService.mergeMr(mrId, action); + if(T.BooleanUtil.and( + T.ObjectUtil.equals("merge", action), + T.ObjectUtil.notEqual(MergeRequestStatus.MERGED.toString(), record.getStatus()) + )){ + return R.error(RCode.GIT_MERGE_FAILED).putData("record", record); } - return R.error(RCode.GIT_MERGE_FAILED).putData("record", record); + return R.ok().putData("record", record); } } \ No newline at end of file diff --git a/src/main/java/net/geedge/asw/module/app/service/IApplicationMergeService.java b/src/main/java/net/geedge/asw/module/app/service/IApplicationMergeService.java index 74e4af9..13e515f 100644 --- a/src/main/java/net/geedge/asw/module/app/service/IApplicationMergeService.java +++ b/src/main/java/net/geedge/asw/module/app/service/IApplicationMergeService.java @@ -23,6 +23,6 @@ public interface IApplicationMergeService extends IService body); - ApplicationMergeEntity mergeMr(String mrId); + ApplicationMergeEntity mergeMr(String mrId, String action); } diff --git a/src/main/java/net/geedge/asw/module/app/service/impl/ApplicationMergeServiceImpl.java b/src/main/java/net/geedge/asw/module/app/service/impl/ApplicationMergeServiceImpl.java index f622a56..0dd18b2 100644 --- a/src/main/java/net/geedge/asw/module/app/service/impl/ApplicationMergeServiceImpl.java +++ b/src/main/java/net/geedge/asw/module/app/service/impl/ApplicationMergeServiceImpl.java @@ -1,11 +1,13 @@ package net.geedge.asw.module.app.service.impl; import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.util.StrUtil; import cn.hutool.log.Log; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import net.geedge.asw.common.config.Query; +import net.geedge.asw.common.util.ASWException; import net.geedge.asw.common.util.RCode; import net.geedge.asw.common.util.T; import net.geedge.asw.module.app.dao.ApplicationMergeDao; @@ -76,6 +78,9 @@ public class ApplicationMergeServiceImpl extends ServiceImpl() + .eq(ApplicationMergeEntity::getId, mrId) + .set(ApplicationMergeEntity::getCommitId, entity.getCommitId()) + .set(ApplicationMergeEntity::getStatus, entity.getStatus()) + .set(ApplicationMergeEntity::getMessage, entity.getMessage()) + ); + return entity; } - } + case "close": { + String updateStatus = StrUtil.equals(MergeRequestStatus.OPEN.toString(), entity.getStatus()) ? MergeRequestStatus.CLOSED.toString() : entity.getStatus(); + entity.setStatus(updateStatus); - // update - this.update(new LambdaUpdateWrapper() - .eq(ApplicationMergeEntity::getId, mrId) - .set(ApplicationMergeEntity::getCommitId, entity.getCommitId()) - .set(ApplicationMergeEntity::getStatus, entity.getStatus()) - .set(ApplicationMergeEntity::getMessage, entity.getMessage()) - ); + this.update(new LambdaUpdateWrapper() + .eq(ApplicationMergeEntity::getId, mrId) + .set(ApplicationMergeEntity::getStatus, updateStatus) + ); + return entity; + } + default: + break; + } return entity; } + + public static enum MergeRequestStatus { + OPEN { + // 默认状态 + public String toString() { + return "open"; + } + public boolean canMerge() { + return true; + } + }, + MERGED { + // 合并成功 + public String toString() { + return "merged"; + } + public boolean canMerge() { + return false; + } + }, + FAILED { + // 合并失败 + public String toString() { + return "failed"; + } + + public boolean canMerge() { + return false; + } + }, + CLOSED { + // 合并关闭 + public String toString() { + return "closed"; + } + public boolean canMerge() { + return false; + } + }; + + private MergeRequestStatus() { + } + + public static MergeRequestStatus getInstance(String name) { + for (MergeRequestStatus v : values()) { + if (StrUtil.equalsIgnoreCase(v.name(), name)) { + return v; + } + } + return null; + } + + public abstract boolean canMerge(); + } + } \ No newline at end of file diff --git a/src/main/resources/db/migration/R__AZ_sys_i18n.sql b/src/main/resources/db/migration/R__AZ_sys_i18n.sql index 75359b8..890005a 100644 --- a/src/main/resources/db/migration/R__AZ_sys_i18n.sql +++ b/src/main/resources/db/migration/R__AZ_sys_i18n.sql @@ -153,5 +153,7 @@ INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_ INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (245, '203003', 'GIT_PARENT_COMMITID_NOT_FOUND', '未找到 parent commitId', 'zh', '', 'admin', 1724030366000); INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (246, '203004', 'GIT_BINARY_CONFLICT_ERROR', 'Binary file conflict found; resolve conflicts in binary files manually', 'en', '', 'admin', 1724030366000); INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (247, '203004', 'GIT_BINARY_CONFLICT_ERROR', '发现二进制文件冲突;手动解决二进制文件中的冲突', 'zh', '', 'admin', 1724030366000); +INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (248, '203005', 'GIT_MERGE_NOT_SUPPORTED', 'Cannot merge in the {0} state', 'en', '', 'admin', 1724030366000); +INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (249, '203005', 'GIT_MERGE_NOT_SUPPORTED', '无法在{0}状态下合并', 'zh', '', 'admin', 1724030366000); SET FOREIGN_KEY_CHECKS = 1; diff --git a/src/main/resources/db/migration/R__AZ_sys_menu.sql b/src/main/resources/db/migration/R__AZ_sys_menu.sql index d6b8dff..32ce01a 100644 --- a/src/main/resources/db/migration/R__AZ_sys_menu.sql +++ b/src/main/resources/db/migration/R__AZ_sys_menu.sql @@ -21,6 +21,9 @@ INSERT INTO `sys_menu` (`id`, `name`, `i18n`, `pid`, `type`, `perms`, `route`, ` INSERT INTO `sys_menu` (`id`, `name`, `i18n`, `pid`, `type`, `perms`, `route`, `icon`, `order`, `create_timestamp`, `state`) VALUES ('2011', 'branch_delete', 'buttons.delete', '2000', 'button', '', '', '', 11, 1722478572000, 1); INSERT INTO `sys_menu` (`id`, `name`, `i18n`, `pid`, `type`, `perms`, `route`, `icon`, `order`, `create_timestamp`, `state`) VALUES ('2012', 'mr_view', 'buttons.view', '2000', 'button', '', '', '', 12, 1722478572000, 1); INSERT INTO `sys_menu` (`id`, `name`, `i18n`, `pid`, `type`, `perms`, `route`, `icon`, `order`, `create_timestamp`, `state`) VALUES ('2013', 'mr_add', 'buttons.add', '2000', 'button', '', '', '', 13, 1722478572000, 1); +INSERT INTO `sys_menu` (`id`, `name`, `i18n`, `pid`, `type`, `perms`, `route`, `icon`, `order`, `create_timestamp`, `state`) VALUES ('2014', 'mr_resolve_conflict', 'buttons.mr.resolve.conflict', '2000', 'button', '', '', '', 14, 1722478572000, 1); +INSERT INTO `sys_menu` (`id`, `name`, `i18n`, `pid`, `type`, `perms`, `route`, `icon`, `order`, `create_timestamp`, `state`) VALUES ('2015', 'mr_merge', 'buttons.mr.merge', '2000', 'button', '', '', '', 15, 1722478572000, 1); +INSERT INTO `sys_menu` (`id`, `name`, `i18n`, `pid`, `type`, `perms`, `route`, `icon`, `order`, `create_timestamp`, `state`) VALUES ('2016', 'mr_close_merge_request', 'buttons.mr.close.merge.request', '2000', 'button', '', '', '', 16, 1722478572000, 1); INSERT INTO `sys_menu` (`id`, `name`, `i18n`, `pid`, `type`, `perms`, `route`, `icon`, `order`, `create_timestamp`, `state`) VALUES ('3000', 'pcaps', 'overall.pcaps', '0', 'menu', '', '/pcaps', 'asw-icon icon-Pcaps', 2, 1722478572000, 1); INSERT INTO `sys_menu` (`id`, `name`, `i18n`, `pid`, `type`, `perms`, `route`, `icon`, `order`, `create_timestamp`, `state`) VALUES ('3001', 'pacp_view', 'buttons.view', '3000', 'button', '', '', '', 1, 1722478572000, 1); diff --git a/src/main/resources/db/migration/R__AZ_sys_role_menu.sql b/src/main/resources/db/migration/R__AZ_sys_role_menu.sql index 0124bef..129a6f3 100644 --- a/src/main/resources/db/migration/R__AZ_sys_role_menu.sql +++ b/src/main/resources/db/migration/R__AZ_sys_role_menu.sql @@ -24,6 +24,9 @@ INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('owner', '2010'); INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('owner', '2011'); INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('owner', '2012'); INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('owner', '2013'); +INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('owner', '2014'); +INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('owner', '2015'); +INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('owner', '2016'); INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('owner', '3000'); INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('owner', '3001'); @@ -89,6 +92,9 @@ INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('maintainer', '2010'); INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('maintainer', '2011'); INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('maintainer', '2012'); INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('maintainer', '2013'); +INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('maintainer', '2014'); +INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('maintainer', '2015'); +INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('maintainer', '2016'); INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('maintainer', '3000'); INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('maintainer', '3001'); @@ -147,6 +153,9 @@ INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('developer', '2008'); INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('developer', '2010'); INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('developer', '2012'); INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('developer', '2013'); +INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('developer', '2014'); +INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('developer', '2015'); +INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('developer', '2016'); INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('developer', '3000'); INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('developer', '3001');