diff options
| author | zhangshuai <[email protected]> | 2024-08-05 15:01:35 +0800 |
|---|---|---|
| committer | zhangshuai <[email protected]> | 2024-08-05 15:01:35 +0800 |
| commit | ba87a497bbfe991f292740229f361c10e85e9741 (patch) | |
| tree | 8d5daf6f494a127c4fd805993481b0c156101a8c | |
| parent | aaff0714205fe398c05f91f29f7e8925f3958b80 (diff) | |
feat: ASW-22 workspace 接口开发
1.workspace 接口开发
2.新增 application delete, edit, add 按钮
16 files changed, 506 insertions, 1 deletions
diff --git a/src/main/java/net/geedge/asw/common/util/Constants.java b/src/main/java/net/geedge/asw/common/util/Constants.java index b2f6fd6..40cace2 100644 --- a/src/main/java/net/geedge/asw/common/util/Constants.java +++ b/src/main/java/net/geedge/asw/common/util/Constants.java @@ -20,4 +20,10 @@ public class Constants { */ public static final List<String> LANG_LIST = T.ListUtil.of("en", "zh"); + + /** + * 工作空间可见性列表 + */ + public static final List<String> VISIBILITY_LIST = T.ListUtil.of("public", "private"); + } 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 0233989..26d7dba 100644 --- a/src/main/java/net/geedge/asw/common/util/RCode.java +++ b/src/main/java/net/geedge/asw/common/util/RCode.java @@ -18,6 +18,10 @@ public enum RCode { PARAM_CANNOT_EMPTY(100006, "parameter cannot be empty"), // parameter 不能为空 USER_NO_LOGIN(100007, "user not login"), // 用户未登录 SYS_RECORD_NOT_FOUND(100008, "record not found"),// 未找到记录 + USER_ID_CANNOT_EMPTY(100009, "user id cannot be empty"),// 用户 ID 不能为空 + ROLE_ID_CANNOT_EMPTY(100010, "role id cannot be empty"),// 权限 ID 不能为空 + USER_NOT_EXIST(100011, "user does not exist"), + ROLE_NOT_EXIST(100012, "role does not exist"), // Application @@ -26,7 +30,7 @@ public enum RCode { APP_LONGNAME_CANNOT_EMPTY(201003, "application longName cannot be empty"), APP_PROPERTIES_CANNOT_EMPTY(201004, "application properties cannot be empty"), APP_SURROGATES_CANNOT_EMPTY(201005, "application surrogates cannot be empty"), - APP_DESCRIPTION_CANNOT_EMPTY(201006, "application surrogates cannot be empty"), + APP_DESCRIPTION_CANNOT_EMPTY(201006, "application description cannot be empty"), APP_DUPLICATE_RECORD(201007, "application duplicate record"), APP_NOT_EXIST(201008, "application does not exist"), @@ -46,6 +50,15 @@ public enum RCode { // Workspace WORKSPACE_ID_CANNOT_EMPTY(401001, "workspace id cannot be empty"), + WORKSPACE_NAME_CANNOT_EMPTY(401002, "workspace name cannot be empty"), + WORKSPACE_VISIBILITY_CANNOT_EMPTY(401003, "workspace visibility cannot be empty"), + WORKSPACE_USER_CANNOT_EMPTY(401004, "workspace user cannot be empty"), + WORKSPACE_ALREADY_EXISTS(401005, "workspace already exists"), + WORKSPACE_MEMBER_CANNOT_EMPTY(401006, "workspace member cannot be empty"), + WORKSPACE_CANNOT_DELETE(401007, "Built-in workspace cannot be deleted"), + WORKSPACE_VISIBILITY_ERROR(401008, "workspace visibility error"), + WORKSPACE_BUILT_IN(401009, "Built-in workspace cannot be update"), + SUCCESS(200, "success"); // 成功 diff --git a/src/main/java/net/geedge/asw/module/workspace/controller/WorkspaceController.java b/src/main/java/net/geedge/asw/module/workspace/controller/WorkspaceController.java new file mode 100644 index 0000000..276cd6f --- /dev/null +++ b/src/main/java/net/geedge/asw/module/workspace/controller/WorkspaceController.java @@ -0,0 +1,121 @@ +package net.geedge.asw.module.workspace.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import net.geedge.asw.common.util.R; +import net.geedge.asw.common.util.RCode; +import net.geedge.asw.common.util.T; +import net.geedge.asw.common.util.VerifyUtil; +import net.geedge.asw.module.sys.entity.SysUserEntity; +import net.geedge.asw.module.sys.service.ISysUserService; +import net.geedge.asw.module.workspace.entity.WorkspaceEntity; +import net.geedge.asw.module.workspace.entity.WorkspaceMemberEntity; +import net.geedge.asw.module.workspace.service.IWorkspaceMemberService; +import net.geedge.asw.module.workspace.service.IWorkspaceService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +@RestController +@RequestMapping("/api/v1/workspace") +public class WorkspaceController { + + @Autowired + private IWorkspaceService workspaceService; + + @Autowired + private IWorkspaceMemberService workspaceMemberService; + + @Autowired + private ISysUserService userService; + + @GetMapping("/{id}") + public R detail(@PathVariable("id") String id) { + WorkspaceEntity workspace = workspaceService.getById(id); + String createUserId = workspace.getCreateUserId(); + String updateUserId = workspace.getUpdateUserId(); + if (T.StrUtil.isNotEmpty(createUserId)) { + SysUserEntity createUser = userService.getById(createUserId); + workspace.setCreateUser(createUser); + } + if (T.StrUtil.isNotEmpty(updateUserId)) { + SysUserEntity updateUser = userService.getById(updateUserId); + workspace.setUpdateUser(updateUser); + } + return R.ok().putData("record", workspace); + } + + @GetMapping + public R list(@RequestParam Map<String, Object> params) { + Page page = workspaceService.queryList(params); + return R.ok(page); + } + + @PostMapping + public R save(@RequestBody WorkspaceEntity workspace) { + VerifyUtil.is(workspace).notNull() + .and(workspace.getName()).notEmpty(RCode.WORKSPACE_NAME_CANNOT_EMPTY) + .and(workspace.getVisibility()).notEmpty(RCode.WORKSPACE_VISIBILITY_CANNOT_EMPTY); + + WorkspaceEntity workspaceEntity = workspaceService.saveWorkspace(workspace); + return R.ok().putData("record", workspaceEntity.getId()); + } + + + @PutMapping + public R update(@RequestBody WorkspaceEntity workspace) { + VerifyUtil.is(workspace).notNull() + .and(workspace.getId()).notEmpty(RCode.WORKSPACE_ID_CANNOT_EMPTY) + .and(workspace.getName()).notEmpty(RCode.WORKSPACE_NAME_CANNOT_EMPTY) + .and(workspace.getVisibility()).notEmpty(RCode.WORKSPACE_VISIBILITY_CANNOT_EMPTY); + + WorkspaceEntity workspaceEntity = workspaceService.updateWorkspace(workspace); + return R.ok().putData("record", workspaceEntity.getId()); + } + + @DeleteMapping + public R delete(@RequestParam String ids) { + VerifyUtil.is(ids).notEmpty(RCode.WORKSPACE_ID_CANNOT_EMPTY); + workspaceService.deleteWorkspace(ids); + return R.ok(); + + } + + @GetMapping("/{workspaceId}/member") + public R getMember(@PathVariable String workspaceId) { + List<WorkspaceMemberEntity> memberEntityList = workspaceMemberService.queryList(workspaceId); + return R.ok().putData("record", memberEntityList); + } + + + @PostMapping("/{workspaceId}/member") + public R saveMember(@PathVariable String workspaceId, @RequestBody List<WorkspaceMemberEntity> workspaceMembers) { + VerifyUtil.is(workspaceMembers).notEmpty(RCode.WORKSPACE_MEMBER_CANNOT_EMPTY) + .and(workspaceId).notEmpty(RCode.WORKSPACE_ID_CANNOT_EMPTY); + List<WorkspaceMemberEntity> workspaceMemberEntityList = workspaceMemberService.saveMember(workspaceId, workspaceMembers); + return R.ok().putData("record", workspaceMemberEntityList); + } + + + @PutMapping("/{workspaceId}/member") + public R updateMember(@PathVariable String workspaceId, @RequestBody List<WorkspaceMemberEntity> workspaceMembers) { + VerifyUtil.is(workspaceMembers).notEmpty(RCode.WORKSPACE_MEMBER_CANNOT_EMPTY) + .and(workspaceId).notEmpty(RCode.WORKSPACE_ID_CANNOT_EMPTY); + List<WorkspaceMemberEntity> workspaceMemberEntityList = workspaceMemberService.updateMember(workspaceId, workspaceMembers); + return R.ok().putData("record", workspaceMemberEntityList); + } + + @DeleteMapping("/{workspaceId}/member") + public R deleteMember(@PathVariable String workspaceId, @RequestParam String userIds) { + VerifyUtil.is(userIds).notEmpty(RCode.USER_ID_CANNOT_EMPTY); + List<String> list = Arrays.asList(userIds.split(",")); + workspaceMemberService.remove(new LambdaQueryWrapper<WorkspaceMemberEntity>() + .eq(WorkspaceMemberEntity::getWorkspaceId, workspaceId) + .in(WorkspaceMemberEntity::getUserId, list)); + return R.ok(); + } + +} diff --git a/src/main/java/net/geedge/asw/module/workspace/dao/WorkspaceDao.java b/src/main/java/net/geedge/asw/module/workspace/dao/WorkspaceDao.java index d75872d..76cc466 100644 --- a/src/main/java/net/geedge/asw/module/workspace/dao/WorkspaceDao.java +++ b/src/main/java/net/geedge/asw/module/workspace/dao/WorkspaceDao.java @@ -1,10 +1,15 @@ package net.geedge.asw.module.workspace.dao; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import net.geedge.asw.module.workspace.entity.WorkspaceEntity; import org.apache.ibatis.annotations.Mapper; +import java.util.List; +import java.util.Map; + @Mapper public interface WorkspaceDao extends BaseMapper<WorkspaceEntity> { + List<WorkspaceEntity> queryList(Page page, Map<String, Object> params); }
\ No newline at end of file diff --git a/src/main/java/net/geedge/asw/module/workspace/dao/WorkspaceMemberDao.java b/src/main/java/net/geedge/asw/module/workspace/dao/WorkspaceMemberDao.java index 2f7bfcd..69dec56 100644 --- a/src/main/java/net/geedge/asw/module/workspace/dao/WorkspaceMemberDao.java +++ b/src/main/java/net/geedge/asw/module/workspace/dao/WorkspaceMemberDao.java @@ -4,7 +4,10 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import net.geedge.asw.module.workspace.entity.WorkspaceMemberEntity; import org.apache.ibatis.annotations.Mapper; +import java.util.List; + @Mapper public interface WorkspaceMemberDao extends BaseMapper<WorkspaceMemberEntity> { + List<WorkspaceMemberEntity> queryList(String workspaceId); }
\ No newline at end of file diff --git a/src/main/java/net/geedge/asw/module/workspace/entity/WorkspaceEntity.java b/src/main/java/net/geedge/asw/module/workspace/entity/WorkspaceEntity.java index c659b73..cc09a7e 100644 --- a/src/main/java/net/geedge/asw/module/workspace/entity/WorkspaceEntity.java +++ b/src/main/java/net/geedge/asw/module/workspace/entity/WorkspaceEntity.java @@ -1,9 +1,14 @@ package net.geedge.asw.module.workspace.entity; import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; +import net.geedge.asw.module.sys.entity.SysRoleEntity; +import net.geedge.asw.module.sys.entity.SysUserEntity; + +import java.util.List; @Data @TableName("workspace") @@ -21,5 +26,13 @@ public class WorkspaceEntity { private String createUserId; private String updateUserId; + @TableField(exist = false) + private SysUserEntity createUser; + + @TableField(exist = false) + private SysUserEntity updateUser; + + @TableField(exist = false) + private List<WorkspaceMemberEntity> members; }
\ No newline at end of file diff --git a/src/main/java/net/geedge/asw/module/workspace/entity/WorkspaceMemberEntity.java b/src/main/java/net/geedge/asw/module/workspace/entity/WorkspaceMemberEntity.java index e82ef79..72baae1 100644 --- a/src/main/java/net/geedge/asw/module/workspace/entity/WorkspaceMemberEntity.java +++ b/src/main/java/net/geedge/asw/module/workspace/entity/WorkspaceMemberEntity.java @@ -1,7 +1,12 @@ package net.geedge.asw.module.workspace.entity; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; +import net.geedge.asw.module.sys.entity.SysRoleEntity; +import net.geedge.asw.module.sys.entity.SysUserEntity; + +import java.util.List; @Data @TableName("workspace_member") @@ -14,4 +19,13 @@ public class WorkspaceMemberEntity { private Long createTimestamp; private String createUserId; + @TableField(exist = false) + private SysUserEntity user; + + @TableField(exist = false) + private SysRoleEntity role; + + @TableField(exist = false) + private SysUserEntity createUser; + }
\ No newline at end of file diff --git a/src/main/java/net/geedge/asw/module/workspace/service/IWorkspaceMemberService.java b/src/main/java/net/geedge/asw/module/workspace/service/IWorkspaceMemberService.java index 4a6b78e..d5dd209 100644 --- a/src/main/java/net/geedge/asw/module/workspace/service/IWorkspaceMemberService.java +++ b/src/main/java/net/geedge/asw/module/workspace/service/IWorkspaceMemberService.java @@ -3,6 +3,13 @@ package net.geedge.asw.module.workspace.service; import com.baomidou.mybatisplus.extension.service.IService; import net.geedge.asw.module.workspace.entity.WorkspaceMemberEntity; +import java.util.List; + public interface IWorkspaceMemberService extends IService<WorkspaceMemberEntity>{ + List<WorkspaceMemberEntity> queryList(String workspaceId); + + List<WorkspaceMemberEntity> saveMember(String workspaceId ,List<WorkspaceMemberEntity> workspaces); + + List<WorkspaceMemberEntity> updateMember(String workspaceId, List<WorkspaceMemberEntity> workspaces); }
\ No newline at end of file diff --git a/src/main/java/net/geedge/asw/module/workspace/service/IWorkspaceService.java b/src/main/java/net/geedge/asw/module/workspace/service/IWorkspaceService.java index 0c62760..b1a3ec0 100644 --- a/src/main/java/net/geedge/asw/module/workspace/service/IWorkspaceService.java +++ b/src/main/java/net/geedge/asw/module/workspace/service/IWorkspaceService.java @@ -1,8 +1,18 @@ package net.geedge.asw.module.workspace.service; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import net.geedge.asw.module.workspace.entity.WorkspaceEntity; +import java.util.Map; + public interface IWorkspaceService extends IService<WorkspaceEntity>{ + Page queryList(Map<String, Object> params); + + WorkspaceEntity saveWorkspace(WorkspaceEntity workspace); + + WorkspaceEntity updateWorkspace(WorkspaceEntity workspace); + + void deleteWorkspace(String ids); }
\ No newline at end of file diff --git a/src/main/java/net/geedge/asw/module/workspace/service/impl/WorkspaceMemberServiceImpl.java b/src/main/java/net/geedge/asw/module/workspace/service/impl/WorkspaceMemberServiceImpl.java index 97409d7..68b5e5e 100644 --- a/src/main/java/net/geedge/asw/module/workspace/service/impl/WorkspaceMemberServiceImpl.java +++ b/src/main/java/net/geedge/asw/module/workspace/service/impl/WorkspaceMemberServiceImpl.java @@ -1,13 +1,78 @@ package net.geedge.asw.module.workspace.service.impl; +import cn.dev33.satoken.stp.StpUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +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.common.util.VerifyUtil; +import net.geedge.asw.module.sys.service.ISysRoleService; +import net.geedge.asw.module.sys.service.ISysUserService; import net.geedge.asw.module.workspace.dao.WorkspaceMemberDao; import net.geedge.asw.module.workspace.entity.WorkspaceMemberEntity; import net.geedge.asw.module.workspace.service.IWorkspaceMemberService; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.List; + @Service public class WorkspaceMemberServiceImpl extends ServiceImpl<WorkspaceMemberDao, WorkspaceMemberEntity> implements IWorkspaceMemberService { + @Autowired + private IWorkspaceMemberService workspaceMemberService; + + @Autowired + private ISysUserService userService; + + @Autowired + private ISysRoleService roleService; + + @Override + public List<WorkspaceMemberEntity> queryList(String workspaceId) { + List<WorkspaceMemberEntity> list = this.baseMapper.queryList(workspaceId); + return list; + } + + @Override + public List<WorkspaceMemberEntity> saveMember(String workspaceId, List<WorkspaceMemberEntity> workspaces) { + validateInfo(workspaceId, workspaces); + workspaceMemberService.saveBatch(workspaces); + List<WorkspaceMemberEntity> memberEntityList = workspaceMemberService.queryList(workspaceId); + return memberEntityList; + } + + @Override + public List<WorkspaceMemberEntity> updateMember(String workspaceId, List<WorkspaceMemberEntity> workspaces) { + validateInfo(workspaceId, workspaces); + workspaceMemberService.remove(new LambdaQueryWrapper<WorkspaceMemberEntity>().eq(WorkspaceMemberEntity::getWorkspaceId, workspaceId)); + workspaceMemberService.saveBatch(workspaces); + List<WorkspaceMemberEntity> memberEntityList = workspaceMemberService.queryList(workspaceId); + return memberEntityList; + } + private void validateInfo(String workspaceId, List<WorkspaceMemberEntity> workspaces) { + if (T.StrUtil.equalsIgnoreCase(workspaceId, "1")) { + throw new ASWException(RCode.WORKSPACE_BUILT_IN); + } + List<String> userIds = userService.list().stream().map(x -> x.getId()).toList(); + List<String> roleIds = roleService.list().stream().map(x -> x.getId()).toList(); + for (WorkspaceMemberEntity workspace : workspaces) { + VerifyUtil.is(workspace).notNull() + .and(workspace.getUserId()).notEmpty(RCode.USER_ID_CANNOT_EMPTY) + .and(workspace.getRoleId()).notEmpty(RCode.ROLE_ID_CANNOT_EMPTY); + if (!userIds.contains(workspace.getUserId())) { + throw new ASWException(RCode.USER_NOT_EXIST); + } + if (!roleIds.contains(workspace.getRoleId())) { + throw new ASWException(RCode.ROLE_NOT_EXIST); + } + } + workspaces.stream().forEach(x -> { + x.setWorkspaceId(workspaceId); + x.setCreateUserId(StpUtil.getLoginIdAsString()); + x.setCreateTimestamp(System.currentTimeMillis()); + }); + } }
\ No newline at end of file diff --git a/src/main/java/net/geedge/asw/module/workspace/service/impl/WorkspaceServiceImpl.java b/src/main/java/net/geedge/asw/module/workspace/service/impl/WorkspaceServiceImpl.java index 43b992b..1bc3587 100644 --- a/src/main/java/net/geedge/asw/module/workspace/service/impl/WorkspaceServiceImpl.java +++ b/src/main/java/net/geedge/asw/module/workspace/service/impl/WorkspaceServiceImpl.java @@ -1,13 +1,113 @@ package net.geedge.asw.module.workspace.service.impl; +import cn.dev33.satoken.stp.StpUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import net.geedge.asw.common.util.ASWException; +import net.geedge.asw.common.util.Constants; +import net.geedge.asw.common.util.RCode; +import net.geedge.asw.common.util.T; import net.geedge.asw.module.workspace.dao.WorkspaceDao; import net.geedge.asw.module.workspace.entity.WorkspaceEntity; +import net.geedge.asw.module.workspace.entity.WorkspaceMemberEntity; +import net.geedge.asw.module.workspace.service.IWorkspaceMemberService; import net.geedge.asw.module.workspace.service.IWorkspaceService; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; @Service public class WorkspaceServiceImpl extends ServiceImpl<WorkspaceDao, WorkspaceEntity> implements IWorkspaceService { + @Autowired + private IWorkspaceService workspaceService; + + @Autowired + private IWorkspaceMemberService workspaceMemberService; + + @Override + public Page queryList(Map<String, Object> params) { + Page page = T.PageUtil.getPage(params); + List<WorkspaceEntity> workspaceEntityList = this.getBaseMapper().queryList(page, params); + page.setRecords(workspaceEntityList); + return page; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public WorkspaceEntity saveWorkspace(WorkspaceEntity workspace) { + this.validateWorkspaceInfo(workspace, false); + workspace.setCreateUserId(StpUtil.getLoginIdAsString()); + workspace.setUpdateUserId(StpUtil.getLoginIdAsString()); + workspace.setCreateTimestamp(System.currentTimeMillis()); + workspace.setUpdateTimestamp(System.currentTimeMillis()); + workspaceService.save(workspace); + + if (T.CollectionUtil.isNotEmpty(workspace.getMembers())) { + List<WorkspaceMemberEntity> members = workspace.getMembers(); + members.stream().forEach(x -> { + x.setWorkspaceId(workspace.getId()); + x.setCreateTimestamp(System.currentTimeMillis()); + x.setCreateUserId(StpUtil.getLoginIdAsString()); + }); + workspaceMemberService.saveBatch(members); + } + return workspace; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public WorkspaceEntity updateWorkspace(WorkspaceEntity workspace) { + this.validateWorkspaceInfo(workspace, true); + workspace.setUpdateUserId(StpUtil.getLoginIdAsString()); + workspace.setUpdateTimestamp(System.currentTimeMillis()); + workspaceService.updateById(workspace); + + if (T.CollectionUtil.isNotEmpty(workspace.getMembers())) { + List<WorkspaceMemberEntity> members = workspace.getMembers(); + members.stream().forEach(x -> { + x.setWorkspaceId(workspace.getId()); + x.setCreateTimestamp(System.currentTimeMillis()); + x.setCreateUserId(StpUtil.getLoginIdAsString()); + }); + workspaceMemberService.remove(new LambdaQueryWrapper<WorkspaceMemberEntity>().eq(WorkspaceMemberEntity::getWorkspaceId, workspace.getId())); + workspaceMemberService.saveBatch(members); + } + return workspace; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteWorkspace(String ids) { + List workspaceIds = Arrays.asList(ids.split(",")); + if (workspaceIds.contains("1")) { + throw new ASWException(RCode.WORKSPACE_CANNOT_DELETE); + } + workspaceService.removeBatchByIds(workspaceIds); + workspaceMemberService.remove(new LambdaQueryWrapper<WorkspaceMemberEntity>().in(WorkspaceMemberEntity::getWorkspaceId, workspaceIds)); + } + + private void validateWorkspaceInfo(WorkspaceEntity workspace, boolean isUpdate) { + + if (!Constants.VISIBILITY_LIST.contains(workspace.getVisibility())) { + throw new ASWException(RCode.WORKSPACE_VISIBILITY_ERROR); + } + if (T.StrUtil.equals(workspace.getVisibility(), "private") && T.CollectionUtil.isEmpty(workspace.getMembers())) { + throw new ASWException(RCode.WORKSPACE_USER_CANNOT_EMPTY); + } + + List<WorkspaceEntity> list = workspaceService.list(new LambdaQueryWrapper<WorkspaceEntity>().eq(WorkspaceEntity::getName, workspace.getName())); + if (!isUpdate && T.CollectionUtil.isNotEmpty(list)) { + throw new ASWException(RCode.WORKSPACE_ALREADY_EXISTS); + } + if (isUpdate && T.CollectionUtil.isNotEmpty(list) && T.StrUtil.equals(workspace.getId(), list.getFirst().getId())) { + throw new ASWException(RCode.WORKSPACE_ALREADY_EXISTS); + } + } }
\ No newline at end of file diff --git a/src/main/resources/db/mapper/workspace/WorkspaceMapper.xml b/src/main/resources/db/mapper/workspace/WorkspaceMapper.xml new file mode 100644 index 0000000..9268de5 --- /dev/null +++ b/src/main/resources/db/mapper/workspace/WorkspaceMapper.xml @@ -0,0 +1,55 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> + +<mapper namespace="net.geedge.asw.module.workspace.dao.WorkspaceDao"> + + <resultMap id="workspaceResultMap" type="net.geedge.asw.module.workspace.entity.WorkspaceEntity"> + <id property="id" column="id"/> + <result property="name" column="name"/> + <result property="tags" column="tags"/> + <result property="visibility" column="visibility"/> + <result property="description" column="description"/> + <result property="createTimestamp" column="create_timestamp"/> + <result property="updateTimestamp" column="update_timestamp"/> + <result property="createUserId" column="create_user_id"/> + <result property="updateUserId" column="update_user_id"/> + + <association property="createUser" columnPrefix="cu_" javaType="net.geedge.asw.module.sys.entity.SysUserEntity"> + <id property="id" column="id"/> + <result property="name" column="name"/> + </association> + + <association property="updateUser" columnPrefix="uu_" javaType="net.geedge.asw.module.sys.entity.SysUserEntity"> + <id property="id" column="id"/> + <result property="name" column="name"/> + </association> + </resultMap> + + <select id="queryList" resultMap="workspaceResultMap"> + SELECT + ws.*, + cu.id AS cu_id, + cu.name AS cu_name, + uu.id AS uu_id, + uu.name AS uu_name + FROM + workspace ws + LEFT JOIN sys_user cu ON ws.create_user_id = cu.id + LEFT JOIN sys_user uu ON ws.update_user_id = uu.id + <where> + <if test="params.ids != null and params.ids != ''"> + ws.id in + <foreach item="id" collection="params.ids.split(',')" separator="," open="(" close=")"> + #{id} + </foreach> + </if> + <if test="params.q != null and params.q != ''"> + AND ( locate(#{params.q}, ws.name) OR locate(#{params.q}, ws.description) OR locate(#{params.q}, + ws.tags) ) + </if> + </where> + <if test="params.orderBy == null or params.orderBy == ''"> + ORDER BY ws.id + </if> + </select> +</mapper>
\ No newline at end of file diff --git a/src/main/resources/db/mapper/workspace/WorkspaceMemberMapper.xml b/src/main/resources/db/mapper/workspace/WorkspaceMemberMapper.xml new file mode 100644 index 0000000..bb9cf15 --- /dev/null +++ b/src/main/resources/db/mapper/workspace/WorkspaceMemberMapper.xml @@ -0,0 +1,49 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > +<mapper namespace="net.geedge.asw.module.workspace.dao.WorkspaceMemberDao"> + + <resultMap id="workspaceMemberResultMap" type="net.geedge.asw.module.workspace.entity.WorkspaceMemberEntity"> + + <result property="workspaceId" column="workspace_id"/> + <result property="userId" column="user_id"/> + <result property="roleId" column="role_id"/> + <result property="createTimestamp" column="create_timestamp"/> + <result property="createUserId" column="create_user_id"/> + + <association property="createUser" columnPrefix="cu_" javaType="net.geedge.asw.module.sys.entity.SysUserEntity"> + <id property="id" column="id"/> + <result property="name" column="name"/> + </association> + + <association property="user" columnPrefix="su_" javaType="net.geedge.asw.module.sys.entity.SysUserEntity"> + <id property="id" column="id"/> + <result property="name" column="name"/> + </association> + + <association property="role" columnPrefix="sr_" javaType="net.geedge.asw.module.sys.entity.SysRoleEntity"> + <id property="id" column="id"/> + <result property="name" column="name"/> + </association> + + </resultMap> + <select id="queryList" resultMap="workspaceMemberResultMap"> + SELECT + wm.*, + cu.id AS cu_id, + cu.name AS cu_name, + su.id AS su_id, + su.name AS su_name, + sr.id AS sr_id, + sr.name AS sr_name + FROM + workspace_member wm + LEFT JOIN sys_user cu ON wm.create_user_id = cu.id + LEFT JOIN sys_user su ON wm.user_id = su.id + LEFT JOIN sys_role sr ON wm.role_id = sr.id + <where> + <if test="workspaceId != null and workspaceId != ''"> + wm.workspace_id = #{workspaceId} + </if> + </where> + </select> +</mapper>
\ 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 7d6d1ec..d756856 100644 --- a/src/main/resources/db/migration/R__AZ_sys_i18n.sql +++ b/src/main/resources/db/migration/R__AZ_sys_i18n.sql @@ -51,6 +51,44 @@ 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 (59, '202002', 'PACKAGE_DESCRIPTION_CANNOT_EMPTY', '安装包描述信息不能为空', 'zh', '', 'admin', 1719280800000); INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (61, '401001', 'WORKSPACE_ID_CANNOT_EMPTY', 'workspace id cannot be empty', 'en', '', 'admin', 1719280800000); INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (63, '401001', 'WORKSPACE_ID_CANNOT_EMPTY', '工作空间ID不能为空', 'zh', '', 'admin', 1719280800000); +INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (65, '401002', 'WORKSPACE_NAME_CANNOT_EMPTY', 'workspace name cannot be empty', 'en', '', 'admin', 1719280800000); +INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (67, '401002', 'WORKSPACE_NAME_CANNOT_EMPTY', '工作空间名称不能为空', 'zh', '', 'admin', 1719280800000); +INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (69, '401003', 'WORKSPACE_VISIBILITY_CANNOT_EMPTY', 'workspace visibility cannot be empty', 'en', '', 'admin', 1719280800000); +INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (71, '401003', 'WORKSPACE_VISIBILITY_CANNOT_EMPTY', '工作空间可见性不能为空', 'zh', '', 'admin', 1719280800000); +INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (73, '401004', 'WORKSPACE_USER_CANNOT_EMPTY', 'workspace user cannot be empty', 'en', '', 'admin', 1719280800000); +INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (75, '401004', 'WORKSPACE_USER_CANNOT_EMPTY', '工作空间用户不能为空', 'zh', '', 'admin', 1719280800000); +INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (77, '401005', 'WORKSPACE_ALREADY_EXISTS', 'workspace already exists', 'en', '', 'admin', 1719280800000); +INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (79, '401005', 'WORKSPACE_ALREADY_EXISTS', '工作空间已存在', 'zh', '', 'admin', 1719280800000); +INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (81, '401006', 'WORKSPACE_MEMBER_CANNOT_EMPTY', 'workspace member cannot be empty', 'en', '', 'admin', 1719280800000); +INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (83, '401006', 'WORKSPACE_MEMBER_CANNOT_EMPTY', '工作空间成员不能为空', 'zh', '', 'admin', 1719280800000); +INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (85, '401007', 'WORKSPACE_CANNOT_DELETE', 'Built-in workspace cannot be deleted', 'en', '', 'admin', 1719280800000); +INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (87, '401007', 'WORKSPACE_CANNOT_DELETE', '内置工作空间不能删除', 'zh', '', 'admin', 1719280800000); +INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (89, '100009', 'USER_ID_CANNOT_EMPTY', 'user id cannot be empty ', 'en', '', 'admin', 1719280800000); +INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (91, '100009', 'USER_ID_CANNOT_EMPTY', '用户 ID 不能为空', 'zh', '', 'admin', 1719280800000); +INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (93, '201002', 'APP_NAME_CANNOT_EMPTY', 'application name cannot be empty', 'en', '', 'admin', 1719280800000); +INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (95, '201002', 'APP_NAME_CANNOT_EMPTY', '应用程序名称不能为空', 'zh', '', 'admin', 1719280800000); +INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (97, '201003', 'APP_LONGNAME_CANNOT_EMPTY', 'application longName cannot be empty', 'en', '', 'admin', 1719280800000); +INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (99, '201003', 'APP_LONGNAME_CANNOT_EMPTY', '应用程序全称不能为空', 'zh', '', 'admin', 1719280800000); +INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (101, '201004', 'APP_PROPERTIES_CANNOT_EMPTY', 'application properties cannot be empty', 'en', '', 'admin', 1719280800000); +INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (103, '201004', 'APP_PROPERTIES_CANNOT_EMPTY', '应用程序属性不能为空', 'zh', '', 'admin', 1719280800000); +INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (105, '201005', 'APP_SURROGATES_CANNOT_EMPTY', 'application surrogates cannot be empty', 'en', '', 'admin', 1719280800000); +INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (107, '201005', 'APP_SURROGATES_CANNOT_EMPTY', '应用程序代理不能为空', 'zh', '', 'admin', 1719280800000); +INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (109, '201006', 'APP_DESCRIPTION_CANNOT_EMPTY', 'application descriptioncannot be empty', 'en', '', 'admin', 1719280800000); +INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (111, '201006', 'APP_DESCRIPTION_CANNOT_EMPTY', '应用描述不能为空', 'zh', '', 'admin', 1719280800000); +INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (113, '201007', 'APP_DUPLICATE_RECORD', 'application duplicate record', 'en', '', 'admin', 1719280800000); +INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (115, '201007', 'APP_DUPLICATE_RECORD', '应用程序重复记录', 'zh', '', 'admin', 1719280800000); +INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (117, '201008', 'APP_NOT_EXIST', 'application does not exist', 'en', '', 'admin', 1719280800000); +INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (119, '201008', 'APP_NOT_EXIST', '应用程序不存在', 'zh', '', 'admin', 1719280800000); +INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (121, '401008', 'WORKSPACE_VISIBILITY_ERROR', 'workspace visibility error', 'en', '', 'admin', 1719280800000); +INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (123, '401008', 'WORKSPACE_VISIBILITY_ERROR', '工作空间可见性错误', 'zh', '', 'admin', 1719280800000); +INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (125, '401009', 'WORKSPACE_BUILT_IN', 'Built-in workspace cannot be update', 'en', '', 'admin', 1719280800000); +INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (127, '401009', 'WORKSPACE_BUILT_IN', '内置工作空间不可修改', 'zh', '', 'admin', 1719280800000); +INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (129, '100010', 'ROLE_ID_CANNOT_EMPTY', 'role id cannot be empty ', 'en', '', 'admin', 1719280800000); +INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (131, '100010', 'ROLE_ID_CANNOT_EMPTY', '权限 ID 不能为空', 'zh', '', 'admin', 1719280800000); +INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (133, '100011', 'USER_NOT_EXIST', 'user does not exist', 'en', '', 'admin', 1719280800000); +INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (135, '100011', 'USER_NOT_EXIST', '用户不存在', 'zh', '', 'admin', 1719280800000); +INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (137, '100012', 'ROLE_NOT_EXIST', 'role does not exist', 'en', '', 'admin', 1719280800000); +INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (139, '100012', 'ROLE_NOT_EXIST', '权限不存在', 'zh', '', 'admin', 1719280800000); 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 aaee755..cb2bf97 100644 --- a/src/main/resources/db/migration/R__AZ_sys_menu.sql +++ b/src/main/resources/db/migration/R__AZ_sys_menu.sql @@ -9,6 +9,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 ('2000', 'applications', 'overall.applications', '0', 'menu', '', '/applications', 'asw-icon icon-Applications', 1, 1722478572000, 1); INSERT INTO `sys_menu` (`id`, `name`, `i18n`, `pid`, `type`, `perms`, `route`, `icon`, `order`, `create_timestamp`, `state`) VALUES ('2001', 'application_view', 'buttons.view', '2000', 'button', '', '', '', 1, 1722478572000, 1); +INSERT INTO `sys_menu` (`id`, `name`, `i18n`, `pid`, `type`, `perms`, `route`, `icon`, `order`, `create_timestamp`, `state`) VALUES ('2002', 'application_add', 'buttons.add', '2000', 'button', '', '', '', 1, 1722478572000, 1); +INSERT INTO `sys_menu` (`id`, `name`, `i18n`, `pid`, `type`, `perms`, `route`, `icon`, `order`, `create_timestamp`, `state`) VALUES ('2003', 'application_edit', 'buttons.edit', '2000', 'button', '', '', '', 1, 1722478572000, 1); +INSERT INTO `sys_menu` (`id`, `name`, `i18n`, `pid`, `type`, `perms`, `route`, `icon`, `order`, `create_timestamp`, `state`) VALUES ('2004', 'application_delete', 'buttons.delete', '2000', 'button', '', '', '', 1, 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 d922d00..23f63cc 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 @@ -9,6 +9,9 @@ INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('admin', '1001'); INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('admin', '2000'); INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('admin', '2001'); +INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('admin', '2002'); +INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('admin', '2003'); +INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('admin', '2004'); INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('admin', '3000'); INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('admin', '3001'); |
