blob: 17d1d04712c4a98ac23098d397a00a7a8318a18d [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.dolphinscheduler.api.service.impl;
import static org.apache.dolphinscheduler.api.constants.ApiFuncIdentificationConstant.PROJECT;
import org.apache.dolphinscheduler.api.enums.Status;
import org.apache.dolphinscheduler.api.exceptions.ServiceException;
import org.apache.dolphinscheduler.api.service.ProjectParameterService;
import org.apache.dolphinscheduler.api.service.ProjectService;
import org.apache.dolphinscheduler.api.utils.PageInfo;
import org.apache.dolphinscheduler.api.utils.Result;
import org.apache.dolphinscheduler.common.constants.Constants;
import org.apache.dolphinscheduler.common.utils.CodeGenerateUtils;
import org.apache.dolphinscheduler.dao.entity.Project;
import org.apache.dolphinscheduler.dao.entity.ProjectParameter;
import org.apache.dolphinscheduler.dao.entity.User;
import org.apache.dolphinscheduler.dao.mapper.ProjectMapper;
import org.apache.dolphinscheduler.dao.mapper.ProjectParameterMapper;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import java.util.Date;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.google.common.collect.Lists;
@Service
@Slf4j
public class ProjectParameterServiceImpl extends BaseServiceImpl implements ProjectParameterService {
@Autowired
private ProjectParameterMapper projectParameterMapper;
@Autowired
private ProjectService projectService;
@Autowired
private ProjectMapper projectMapper;
@Override
@Transactional
public Result createProjectParameter(User loginUser, long projectCode, String projectParameterName,
String projectParameterValue) {
Result result = new Result();
// check if user have write perm for project
Project project = projectMapper.queryByCode(projectCode);
boolean hasProjectAndWritePerm = projectService.hasProjectAndWritePerm(loginUser, project, result);
if (!hasProjectAndWritePerm) {
return result;
}
// check if project parameter name exists
ProjectParameter projectParameter = projectParameterMapper.selectOne(new QueryWrapper<ProjectParameter>()
.lambda()
.eq(ProjectParameter::getProjectCode, projectCode)
.eq(ProjectParameter::getParamName, projectParameterName));
if (projectParameter != null) {
log.warn("ProjectParameter {} already exists.", projectParameter.getParamName());
putMsg(result, Status.PROJECT_PARAMETER_ALREADY_EXISTS, projectParameter.getParamName());
return result;
}
Date now = new Date();
try {
projectParameter = ProjectParameter
.builder()
.paramName(projectParameterName)
.paramValue(projectParameterValue)
.code(CodeGenerateUtils.genCode())
.projectCode(projectCode)
.userId(loginUser.getId())
.createTime(now)
.updateTime(now)
.build();
} catch (CodeGenerateUtils.CodeGenerateException e) {
log.error("Generate project parameter code error.", e);
putMsg(result, Status.CREATE_PROJECT_PARAMETER_ERROR);
return result;
}
if (projectParameterMapper.insert(projectParameter) > 0) {
log.info("Project parameter is created and id is :{}", projectParameter.getId());
result.setData(projectParameter);
putMsg(result, Status.SUCCESS);
} else {
log.error("Project parameter create error, projectName:{}.", projectParameter.getParamName());
putMsg(result, Status.CREATE_PROJECT_PARAMETER_ERROR);
}
return result;
}
@Override
public Result updateProjectParameter(User loginUser, long projectCode, long code, String projectParameterName,
String projectParameterValue) {
Result result = new Result();
// check if user have write perm for project
Project project = projectMapper.queryByCode(projectCode);
boolean hasProjectAndWritePerm = projectService.hasProjectAndWritePerm(loginUser, project, result);
if (!hasProjectAndWritePerm) {
return result;
}
ProjectParameter projectParameter = projectParameterMapper.queryByCode(code);
// check project parameter exists
if (projectParameter == null || projectCode != projectParameter.getProjectCode()) {
log.error("Project parameter does not exist, code:{}.", code);
putMsg(result, Status.PROJECT_PARAMETER_NOT_EXISTS, String.valueOf(code));
return result;
}
// check if project parameter name exists
ProjectParameter tempProjectParameter = projectParameterMapper.selectOne(new QueryWrapper<ProjectParameter>()
.lambda()
.eq(ProjectParameter::getProjectCode, projectCode)
.eq(ProjectParameter::getParamName, projectParameterName)
.ne(ProjectParameter::getCode, code));
if (tempProjectParameter != null) {
log.error("Project parameter name {} already exists", projectParameterName);
putMsg(result, Status.PROJECT_PARAMETER_ALREADY_EXISTS, projectParameterName);
return result;
}
projectParameter.setParamName(projectParameterName);
projectParameter.setParamValue(projectParameterValue);
projectParameter.setUpdateTime(new Date());
projectParameter.setOperator(loginUser.getId());
if (projectParameterMapper.updateById(projectParameter) > 0) {
log.info("Project parameter is updated and id is :{}", projectParameter.getId());
result.setData(projectParameter);
putMsg(result, Status.SUCCESS);
} else {
log.error("Project parameter update error, {}.", projectParameterName);
putMsg(result, Status.UPDATE_PROJECT_PARAMETER_ERROR);
}
return result;
}
@Override
public Result deleteProjectParametersByCode(User loginUser, long projectCode, long code) {
Result result = new Result();
// check if user have write perm for project
Project project = projectMapper.queryByCode(projectCode);
boolean hasProjectAndWritePerm = projectService.hasProjectAndWritePerm(loginUser, project, result);
if (!hasProjectAndWritePerm) {
return result;
}
ProjectParameter projectParameter = projectParameterMapper.queryByCode(code);
// check project parameter exists
if (projectParameter == null || projectCode != projectParameter.getProjectCode()) {
log.error("Project parameter does not exist, code:{}.", code);
putMsg(result, Status.PROJECT_PARAMETER_NOT_EXISTS, String.valueOf(code));
return result;
}
// TODO: check project parameter is used by workflow
if (projectParameterMapper.deleteById(projectParameter.getId()) > 0) {
log.info("Project parameter is deleted and id is :{}.", projectParameter.getId());
result.setData(Boolean.TRUE);
putMsg(result, Status.SUCCESS);
} else {
log.error("Project parameter delete error, {}.", projectParameter.getParamName());
putMsg(result, Status.DELETE_PROJECT_PARAMETER_ERROR);
}
return result;
}
@Override
public Result batchDeleteProjectParametersByCodes(User loginUser, long projectCode, String codes) {
Result result = new Result();
if (StringUtils.isEmpty(codes)) {
log.error("Project parameter codes is empty, projectCode is {}.", projectCode);
putMsg(result, Status.PROJECT_PARAMETER_CODE_EMPTY);
return result;
}
Set<Long> requestCodeSet = Lists.newArrayList(codes.split(Constants.COMMA)).stream().map(Long::parseLong)
.collect(Collectors.toSet());
List<ProjectParameter> projectParameterList = projectParameterMapper.queryByCodes(requestCodeSet);
Set<Long> actualCodeSet =
projectParameterList.stream().map(ProjectParameter::getCode).collect(Collectors.toSet());
// requestCodeSet - actualCodeSet
Set<Long> diffCode =
requestCodeSet.stream().filter(code -> !actualCodeSet.contains(code)).collect(Collectors.toSet());
String diffCodeString = diffCode.stream().map(String::valueOf).collect(Collectors.joining(Constants.COMMA));
if (CollectionUtils.isNotEmpty(diffCode)) {
log.error("Project parameter does not exist, codes:{}.", diffCodeString);
throw new ServiceException(Status.PROJECT_PARAMETER_NOT_EXISTS, diffCodeString);
}
for (ProjectParameter projectParameter : projectParameterList) {
this.deleteProjectParametersByCode(loginUser, projectCode, projectParameter.getCode());
}
putMsg(result, Status.SUCCESS);
return result;
}
@Override
public Result queryProjectParameterListPaging(User loginUser, long projectCode, Integer pageSize, Integer pageNo,
String searchVal) {
Result result = new Result();
Project project = projectMapper.queryByCode(projectCode);
boolean hasProjectAndPerm = projectService.hasProjectAndPerm(loginUser, project, result, PROJECT);
if (!hasProjectAndPerm) {
return result;
}
PageInfo<ProjectParameter> pageInfo = new PageInfo<>(pageNo, pageSize);
Page<ProjectParameter> page = new Page<>(pageNo, pageSize);
IPage<ProjectParameter> iPage =
projectParameterMapper.queryProjectParameterListPaging(page, projectCode, null, searchVal);
List<ProjectParameter> projectParameterList = iPage.getRecords();
pageInfo.setTotal((int) iPage.getTotal());
pageInfo.setTotalList(projectParameterList);
result.setData(pageInfo);
putMsg(result, Status.SUCCESS);
return result;
}
@Override
public Result queryProjectParameterByCode(User loginUser, long projectCode, long code) {
Result result = new Result();
Project project = projectMapper.queryByCode(projectCode);
boolean hasProjectAndPerm = projectService.hasProjectAndPerm(loginUser, project, result, PROJECT);
if (!hasProjectAndPerm) {
return result;
}
ProjectParameter projectParameter = projectParameterMapper.queryByCode(code);
if (projectParameter == null || projectCode != projectParameter.getProjectCode()) {
log.error("Project parameter does not exist, code:{}.", code);
putMsg(result, Status.PROJECT_PARAMETER_NOT_EXISTS, String.valueOf(code));
return result;
}
result.setData(projectParameter);
putMsg(result, Status.SUCCESS);
return result;
}
}