This is an automated email from the ASF dual-hosted git repository.
leonbao pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/dolphinscheduler.git
The following commit(s) were added to refs/heads/dev by this push:
new 5769760 [Feature-7110][dolphinscheduler-api] support grant project by
code (#7390)
5769760 is described below
commit 57697602c53d4db54f70abad1d37d41926f87bb7
Author: ouyangyewei <[email protected]>
AuthorDate: Tue Dec 14 12:39:08 2021 +0800
[Feature-7110][dolphinscheduler-api] support grant project by code (#7390)
Co-authored-by: ouyangyewei <[email protected]>
---
.../api/controller/UsersController.java | 10 ++--
.../dolphinscheduler/api/service/UsersService.java | 4 +-
.../api/service/impl/UsersServiceImpl.java | 51 ++++++++----------
.../src/main/resources/i18n/messages.properties | 1 -
.../main/resources/i18n/messages_en_US.properties | 1 -
.../main/resources/i18n/messages_zh_CN.properties | 1 -
.../api/controller/UsersControllerTest.java | 9 ++--
.../api/service/UsersServiceTest.java | 61 +++++++++++++++++-----
8 files changed, 81 insertions(+), 57 deletions(-)
diff --git
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/UsersController.java
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/UsersController.java
index 502023a..a79e5f7 100644
---
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/UsersController.java
+++
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/UsersController.java
@@ -240,13 +240,13 @@ public class UsersController extends BaseController {
*
* @param loginUser login user
* @param userId user id
- * @param projectCodes project code array
+ * @param projectCode project code
* @return grant result code
*/
@ApiOperation(value = "grantProjectByCode", notes =
"GRANT_PROJECT_BY_CODE_NOTES")
@ApiImplicitParams({
@ApiImplicitParam(name = "userId", value = "USER_ID", required = true,
dataType = "Int", example = "100"),
- @ApiImplicitParam(name = "projectCodes", value = "PROJECT_CODES",
required = true, type = "String")
+ @ApiImplicitParam(name = "projectCode", value = "PROJECT_CODE",
required = true, type = "Long")
})
@PostMapping(value = "/grant-project-by-code")
@ResponseStatus(HttpStatus.OK)
@@ -254,9 +254,9 @@ public class UsersController extends BaseController {
@AccessLogAnnotation
public Result grantProjectByCode(@ApiIgnore @RequestAttribute(value =
Constants.SESSION_USER) User loginUser,
@RequestParam(value = "userId") int userId,
- @RequestParam(value = "projectCodes") String projectCodes) {
- Map<String, Object> result =
this.usersService.grantProjectByCode(loginUser, userId, projectCodes);
- return returnDataList(result);
+ @RequestParam(value = "projectCode") long projectCode) {
+ Map<String, Object> result =
this.usersService.grantProjectByCode(loginUser, userId, projectCode);
+ return this.returnDataList(result);
}
/**
diff --git
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/UsersService.java
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/UsersService.java
index 6e701a0..485702a 100644
---
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/UsersService.java
+++
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/UsersService.java
@@ -158,10 +158,10 @@ public interface UsersService {
*
* @param loginUser login user
* @param userId user id
- * @param projectCodes project code array
+ * @param projectCode project code
* @return grant result code
*/
- Map<String, Object> grantProjectByCode(User loginUser, int userId, String
projectCodes);
+ Map<String, Object> grantProjectByCode(User loginUser, int userId, long
projectCode);
/**
* revoke the project permission for specified user.
diff --git
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/UsersServiceImpl.java
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/UsersServiceImpl.java
index 4caf22c..2c65c40 100644
---
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/UsersServiceImpl.java
+++
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/UsersServiceImpl.java
@@ -584,54 +584,45 @@ public class UsersServiceImpl extends BaseServiceImpl
implements UsersService {
*
* @param loginUser login user
* @param userId user id
- * @param projectCodes project code array
+ * @param projectCode project code
* @return grant result code
*/
@Override
- public Map<String, Object> grantProjectByCode(final User loginUser, final
int userId, final String projectCodes) {
+ public Map<String, Object> grantProjectByCode(final User loginUser, final
int userId, final long projectCode) {
Map<String, Object> result = new HashMap<>();
result.put(Constants.STATUS, false);
- // 1. only admin can operate
- if (this.check(result, !this.isAdmin(loginUser),
Status.USER_NO_OPERATION_PERM)) {
- return result;
- }
-
- // 2. check if user is existed
+ // 1. check if user is existed
User tempUser = this.userMapper.selectById(userId);
if (tempUser == null) {
- putMsg(result, Status.USER_NOT_EXIST, userId);
+ this.putMsg(result, Status.USER_NOT_EXIST, userId);
return result;
}
- // 3. if the selected projectCodes are empty, delete all items
associated with the user
- if (this.check(result, StringUtils.isEmpty(projectCodes),
Status.SUCCESS)) {
- this.projectUserMapper.deleteProjectRelation(0, userId);
+ // 2. check if project is existed
+ Project project = this.projectMapper.queryByCode(projectCode);
+ if (project == null) {
+ this.putMsg(result, Status.PROJECT_NOT_FOUNT, projectCode);
return result;
}
- // 4. maintain the relationship between project and user
- Set<Long> projectCodeSet =
Arrays.stream(projectCodes.split(Constants.COMMA)).map(Long::parseLong).collect(Collectors.toSet());
- final List<Project> projectList =
this.projectMapper.queryByCodes(projectCodeSet);
- if (CollectionUtils.isEmpty(projectList)) {
- logger.info("project not exists");
- putMsg(result, Status.PROJECT_NOT_FOUNT, projectCodes);
+ // 3. only project owner can operate
+ if (!this.hasPerm(loginUser, project.getUserId())) {
+ this.putMsg(result, Status.USER_NO_OPERATION_PERM);
return result;
}
- for (final Project project : projectList) {
- final Date today = new Date();
-
- ProjectUser projectUser = new ProjectUser();
- projectUser.setUserId(userId);
- projectUser.setProjectId(project.getId());
- projectUser.setPerm(7);
- projectUser.setCreateTime(today);
- projectUser.setUpdateTime(today);
- this.projectUserMapper.insert(projectUser);
- }
- putMsg(result, Status.SUCCESS);
+ // 4. maintain the relationship between project and user
+ final Date today = new Date();
+ ProjectUser projectUser = new ProjectUser();
+ projectUser.setUserId(userId);
+ projectUser.setProjectId(project.getId());
+ projectUser.setPerm(7);
+ projectUser.setCreateTime(today);
+ projectUser.setUpdateTime(today);
+ this.projectUserMapper.insert(projectUser);
+ this.putMsg(result, Status.SUCCESS);
return result;
}
diff --git a/dolphinscheduler-api/src/main/resources/i18n/messages.properties
b/dolphinscheduler-api/src/main/resources/i18n/messages.properties
index 282dcf4..b5b127b 100644
--- a/dolphinscheduler-api/src/main/resources/i18n/messages.properties
+++ b/dolphinscheduler-api/src/main/resources/i18n/messages.properties
@@ -224,7 +224,6 @@ DELETE_USER_BY_ID_NOTES=delete user by id
GRANT_PROJECT_NOTES=GRANT PROJECT
PROJECT_IDS=project ids(string format, multiple projects separated by ",")
GRANT_PROJECT_BY_CODE_NOTES=GRANT PROJECT BY CODE
-PROJECT_CODES=project codes(string format, multiple project codes separated by
",")
REVOKE_PROJECT_NOTES=REVOKE PROJECT FOR USER
PROJECT_CODE=project codes
GRANT_RESOURCE_NOTES=grant resource file
diff --git
a/dolphinscheduler-api/src/main/resources/i18n/messages_en_US.properties
b/dolphinscheduler-api/src/main/resources/i18n/messages_en_US.properties
index 4b48d4a..3fa384e 100644
--- a/dolphinscheduler-api/src/main/resources/i18n/messages_en_US.properties
+++ b/dolphinscheduler-api/src/main/resources/i18n/messages_en_US.properties
@@ -271,7 +271,6 @@ DELETE_USER_BY_ID_NOTES=delete user by id
GRANT_PROJECT_NOTES=GRANT PROJECT
PROJECT_IDS=project ids(string format, multiple projects separated by ",")
GRANT_PROJECT_BY_CODE_NOTES=GRANT PROJECT BY CODE
-PROJECT_CODES=project codes(string format, multiple project codes separated by
",")
REVOKE_PROJECT_NOTES=REVOKE PROJECT FOR USER
PROJECT_CODE=project codes
GRANT_RESOURCE_NOTES=grant resource file
diff --git
a/dolphinscheduler-api/src/main/resources/i18n/messages_zh_CN.properties
b/dolphinscheduler-api/src/main/resources/i18n/messages_zh_CN.properties
index e6ede24..e18cdf3 100644
--- a/dolphinscheduler-api/src/main/resources/i18n/messages_zh_CN.properties
+++ b/dolphinscheduler-api/src/main/resources/i18n/messages_zh_CN.properties
@@ -259,7 +259,6 @@ DELETE_USER_BY_ID_NOTES=删除用户通过ID
GRANT_PROJECT_NOTES=授权项目
PROJECT_IDS=项目IDS(字符串格式,多个项目以","分割)
GRANT_PROJECT_BY_CODE_NOTES=授权项目
-PROJECT_CODES=项目Codes(字符串格式,多个项目Code以","分割)
REVOKE_PROJECT_NOTES=撤销用户的项目权限
PROJECT_CODE=项目Code
GRANT_RESOURCE_NOTES=授权资源文件
diff --git
a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/UsersControllerTest.java
b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/UsersControllerTest.java
index 5b69614..2794bae 100644
---
a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/UsersControllerTest.java
+++
b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/UsersControllerTest.java
@@ -111,11 +111,12 @@ public class UsersControllerTest extends
AbstractControllerTest {
public void testGrantProjectByCode() throws Exception {
MultiValueMap<String, String> paramsMap = new LinkedMultiValueMap<>();
paramsMap.add("userId", "32");
- paramsMap.add("projectCodes", "3682329499136,3643998558592");
+ paramsMap.add("projectCode", "3682329499136");
- MvcResult mvcResult =
mockMvc.perform(post("/users/grant-project-by-code")
- .header(SESSION_ID,
sessionId)
- .params(paramsMap))
+ MvcResult mvcResult = this.mockMvc
+ .perform(post("/users/grant-project-by-code")
+ .header(SESSION_ID, this.sessionId)
+ .params(paramsMap))
.andExpect(status().isOk())
.andExpect(content().contentType(MediaType.APPLICATION_JSON))
.andReturn();
diff --git
a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/UsersServiceTest.java
b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/UsersServiceTest.java
index acfe220..5e0eb6b 100644
---
a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/UsersServiceTest.java
+++
b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/UsersServiceTest.java
@@ -70,7 +70,7 @@ import com.google.common.collect.Lists;
/**
* users service test
*/
-@RunWith(MockitoJUnitRunner.class)
+@RunWith(MockitoJUnitRunner.Silent.class)
public class UsersServiceTest {
private static final Logger logger =
LoggerFactory.getLogger(UsersServiceTest.class);
@@ -340,24 +340,43 @@ public class UsersServiceTest {
@Test
public void testGrantProjectByCode() {
- when(userMapper.selectById(1)).thenReturn(getUser());
-
- // user no permission
+ // Mock Project, User
+ final long projectCode = 1L;
+ final int projectCreator = 1;
+ final int authorizer = 100;
+
Mockito.when(this.userMapper.selectById(authorizer)).thenReturn(this.getUser());
+
Mockito.when(this.userMapper.selectById(projectCreator)).thenReturn(this.getUser());
+
Mockito.when(this.projectMapper.queryByCode(projectCode)).thenReturn(this.getProject());
+
+ // ERROR: USER_NOT_EXIST
User loginUser = new User();
- String projectCodes = "3682329499136,3643998558592";
- Map<String, Object> result =
this.usersService.grantProjectByCode(loginUser, 1, projectCodes);
+ Map<String, Object> result =
this.usersService.grantProjectByCode(loginUser, 999, projectCode);
+ logger.info(result.toString());
+ Assert.assertEquals(Status.USER_NOT_EXIST,
result.get(Constants.STATUS));
+
+ // ERROR: PROJECT_NOT_FOUNT
+ result = this.usersService.grantProjectByCode(loginUser, authorizer,
999);
+ logger.info(result.toString());
+ Assert.assertEquals(Status.PROJECT_NOT_FOUNT,
result.get(Constants.STATUS));
+
+ // ERROR: USER_NO_OPERATION_PERM
+ loginUser.setId(999);
+ loginUser.setUserType(UserType.GENERAL_USER);
+ result = this.usersService.grantProjectByCode(loginUser, authorizer,
projectCode);
logger.info(result.toString());
Assert.assertEquals(Status.USER_NO_OPERATION_PERM,
result.get(Constants.STATUS));
- // user not exist
- loginUser.setUserType(UserType.ADMIN_USER);
- result = this.usersService.grantProjectByCode(loginUser, 2,
projectCodes);
+ // SUCCESS: USER IS PROJECT OWNER
+ loginUser.setId(projectCreator);
+ loginUser.setUserType(UserType.GENERAL_USER);
+ result = this.usersService.grantProjectByCode(loginUser, authorizer,
projectCode);
logger.info(result.toString());
- Assert.assertEquals(Status.USER_NOT_EXIST,
result.get(Constants.STATUS));
+ Assert.assertEquals(Status.SUCCESS, result.get(Constants.STATUS));
- // success
-
Mockito.when(this.projectMapper.queryByCodes(Mockito.anyCollection())).thenReturn(Lists.newArrayList(new
Project()));
- result = this.usersService.grantProjectByCode(loginUser, 1,
projectCodes);
+ // SUCCESS: USER IS ADMINISTRATOR
+ loginUser.setId(999);
+ loginUser.setUserType(UserType.ADMIN_USER);
+ result = this.usersService.grantProjectByCode(loginUser, authorizer,
projectCode);
logger.info(result.toString());
Assert.assertEquals(Status.SUCCESS, result.get(Constants.STATUS));
}
@@ -668,6 +687,22 @@ public class UsersServiceTest {
}
/**
+ * Get project
+ * @return
+ */
+ private Project getProject() {
+ Project project = new Project();
+ project.setId(1);
+ project.setCode(1L);
+ project.setUserId(1);
+ project.setName("PJ-001");
+ project.setPerm(7);
+ project.setDefCount(0);
+ project.setInstRunningCount(0);
+ return project;
+ }
+
+ /**
* get user
*/
private User getGeneralUser() {