support query rule management (#853)

This commit is contained in:
daikon
2024-03-21 18:16:26 +08:00
committed by GitHub
parent 30db8b70b7
commit da3623c0fa
19 changed files with 783 additions and 3 deletions

View File

@@ -0,0 +1,88 @@
package com.tencent.supersonic.headless.server.persistence.dataobject;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.util.Date;
@Data
@TableName("s2_query_rule")
public class QueryRuleDO {
@TableId(type = IdType.AUTO)
private Long id;
/**
* dataSetID
*/
private Long dataSetId;
/**
* 规则的优先级, 0-系统默认规则
*/
private Integer priority;
/**
* 规则类型
*/
private String ruleType;
/**
* 规则名称
*/
private String name;
/**
* 规则业务名称
*/
private String bizName;
/**
* 描述
*/
private String description;
/**
* 具体规则信息
*/
private String rule;
/**
* 规则输出信息
*/
private String action;
/**
* 状态,0-正常,1-下线,2-删除
*/
private Integer status;
/**
* 创建时间
*/
private Date createdAt;
/**
* 创建人
*/
private String createdBy;
/**
* 更新时间
*/
private Date updatedAt;
/**
* 更新人
*/
private String updatedBy;
/**
* 扩展信息
*/
private String ext;
}

View File

@@ -0,0 +1,9 @@
package com.tencent.supersonic.headless.server.persistence.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.tencent.supersonic.headless.server.persistence.dataobject.QueryRuleDO;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface QueryRuleMapper extends BaseMapper<QueryRuleDO> {
}

View File

@@ -0,0 +1,18 @@
package com.tencent.supersonic.headless.server.persistence.repository;
import com.tencent.supersonic.headless.api.pojo.request.QueryRuleFilter;
import com.tencent.supersonic.headless.server.persistence.dataobject.QueryRuleDO;
import java.util.List;
public interface QueryRuleRepository {
Integer create(QueryRuleDO queryRuleDO);
Integer update(QueryRuleDO queryRuleDO);
QueryRuleDO getQueryRuleById(Long id);
List<QueryRuleDO> getQueryRules(QueryRuleFilter filter);
}

View File

@@ -0,0 +1,60 @@
package com.tencent.supersonic.headless.server.persistence.repository.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.tencent.supersonic.headless.api.pojo.request.QueryRuleFilter;
import com.tencent.supersonic.headless.server.persistence.dataobject.QueryRuleDO;
import com.tencent.supersonic.headless.server.persistence.mapper.QueryRuleMapper;
import com.tencent.supersonic.headless.server.persistence.repository.QueryRuleRepository;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public class QueryRuleRepositoryImpl implements QueryRuleRepository {
private final QueryRuleMapper mapper;
public QueryRuleRepositoryImpl(QueryRuleMapper mapper) {
this.mapper = mapper;
}
@Override
public Integer create(QueryRuleDO queryRuleDO) {
return mapper.insert(queryRuleDO);
}
@Override
public Integer update(QueryRuleDO queryRuleDO) {
return mapper.updateById(queryRuleDO);
}
@Override
public QueryRuleDO getQueryRuleById(Long id) {
return mapper.selectById(id);
}
@Override
public List<QueryRuleDO> getQueryRules(QueryRuleFilter filter) {
QueryWrapper<QueryRuleDO> wrapper = new QueryWrapper<>();
if (CollectionUtils.isNotEmpty(filter.getRuleIds())) {
wrapper.lambda().in(QueryRuleDO::getId, filter.getRuleIds());
}
if (CollectionUtils.isNotEmpty(filter.getDataSetIds())) {
wrapper.lambda().in(QueryRuleDO::getDataSetId, filter.getDataSetIds());
}
if (CollectionUtils.isNotEmpty(filter.getStatusList())) {
wrapper.lambda().in(QueryRuleDO::getStatus, filter.getStatusList());
}
wrapper.lambda().gt(QueryRuleDO::getPriority, 0);
List<QueryRuleDO> queryRuleDOList = mapper.selectList(wrapper);
QueryWrapper<QueryRuleDO> wrapperSys = new QueryWrapper<>();
// 返回系统设置的规则
wrapperSys.or().eq("priority", 0L);
List<QueryRuleDO> queryRuleDOListSys = mapper.selectList(wrapperSys);
queryRuleDOList.addAll(queryRuleDOListSys);
return queryRuleDOList;
}
}

View File

@@ -0,0 +1,94 @@
package com.tencent.supersonic.headless.server.rest;
import com.tencent.supersonic.auth.api.authentication.pojo.User;
import com.tencent.supersonic.auth.api.authentication.utils.UserHolder;
import com.tencent.supersonic.headless.api.pojo.request.QueryRuleFilter;
import com.tencent.supersonic.headless.api.pojo.request.QueryRuleReq;
import com.tencent.supersonic.headless.api.pojo.response.QueryRuleResp;
import com.tencent.supersonic.headless.server.service.QueryRuleService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
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.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
@RestController
@RequestMapping("/api/semantic/query/rule")
public class QueryRuleController {
private final QueryRuleService queryRuleService;
public QueryRuleController(QueryRuleService queryRuleService) {
this.queryRuleService = queryRuleService;
}
/**
* 新建查询规则
*
* @param queryRuleReq
* @param request
* @param response
* @return
* @throws Exception
*/
@PostMapping("/create")
public QueryRuleResp create(@RequestBody @Validated QueryRuleReq queryRuleReq,
HttpServletRequest request,
HttpServletResponse response) {
User user = UserHolder.findUser(request, response);
return queryRuleService.addQueryRule(queryRuleReq, user);
}
/**
* 编辑查询规则
*
* @param queryRuleReq
* @param request
* @param response
* @return
* @throws Exception
*/
@PostMapping("/update")
public QueryRuleResp update(@RequestBody @Validated QueryRuleReq queryRuleReq,
HttpServletRequest request,
HttpServletResponse response) {
User user = UserHolder.findUser(request, response);
return queryRuleService.updateQueryRule(queryRuleReq, user);
}
/**
* 删除查询规则
* @param id
* @param request
* @param response
* @return
*/
@DeleteMapping("delete/{id}")
public Boolean delete(@PathVariable("id") Long id,
HttpServletRequest request,
HttpServletResponse response) {
User user = UserHolder.findUser(request, response);
return queryRuleService.dropQueryRule(id, user);
}
/**
* 查询规则列表
* @param request
* @param response
* @return
*/
@PostMapping("query")
public List<QueryRuleResp> query(@RequestBody @Validated QueryRuleFilter queryRuleFilter,
HttpServletRequest request,
HttpServletResponse response) {
User user = UserHolder.findUser(request, response);
return queryRuleService.getQueryRuleList(queryRuleFilter, user);
}
}

View File

@@ -0,0 +1,22 @@
package com.tencent.supersonic.headless.server.service;
import com.tencent.supersonic.auth.api.authentication.pojo.User;
import com.tencent.supersonic.headless.api.pojo.request.QueryRuleFilter;
import com.tencent.supersonic.headless.api.pojo.request.QueryRuleReq;
import com.tencent.supersonic.headless.api.pojo.response.QueryRuleResp;
import java.util.List;
public interface QueryRuleService {
QueryRuleResp addQueryRule(QueryRuleReq queryRuleReq, User user);
QueryRuleResp updateQueryRule(QueryRuleReq queryRuleReq, User user);
Boolean dropQueryRule(Long id, User user);
QueryRuleResp getQueryRuleById(Long id, User user);
List<QueryRuleResp> getQueryRuleList(QueryRuleFilter queryRuleFilter, User user);
}

View File

@@ -0,0 +1,110 @@
package com.tencent.supersonic.headless.server.service.impl;
import com.tencent.supersonic.auth.api.authentication.pojo.User;
import com.tencent.supersonic.common.pojo.enums.StatusEnum;
import com.tencent.supersonic.common.util.BeanMapper;
import com.tencent.supersonic.headless.api.pojo.request.QueryRuleFilter;
import com.tencent.supersonic.headless.api.pojo.request.QueryRuleReq;
import com.tencent.supersonic.headless.api.pojo.response.DataSetResp;
import com.tencent.supersonic.headless.api.pojo.response.QueryRuleResp;
import com.tencent.supersonic.headless.server.persistence.dataobject.QueryRuleDO;
import com.tencent.supersonic.headless.server.persistence.repository.QueryRuleRepository;
import com.tencent.supersonic.headless.server.service.DataSetService;
import com.tencent.supersonic.headless.server.service.QueryRuleService;
import com.tencent.supersonic.headless.server.utils.QueryRuleConverter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
import java.util.Objects;
@Service
@Slf4j
public class QueryRuleServiceImpl implements QueryRuleService {
private final QueryRuleRepository queryRuleRepository;
private final DataSetService dataSetService;
public QueryRuleServiceImpl(QueryRuleRepository queryRuleRepository, DataSetService dataSetService) {
this.queryRuleRepository = queryRuleRepository;
this.dataSetService = dataSetService;
}
@Override
public QueryRuleResp addQueryRule(QueryRuleReq queryRuleReq, User user) {
checkPermission(queryRuleReq, user);
QueryRuleDO queryRuleDO = QueryRuleConverter.convert2DO(queryRuleReq);
Date date = new Date();
queryRuleDO.setCreatedBy(user.getName());
queryRuleDO.setCreatedAt(date);
queryRuleDO.setUpdatedBy(user.getName());
queryRuleDO.setUpdatedAt(date);
queryRuleDO.setStatus(StatusEnum.ONLINE.getCode());
queryRuleDO.setId(null);
queryRuleRepository.create(queryRuleDO);
return getQueryRuleById(queryRuleDO.getId(), user);
}
@Override
public QueryRuleResp updateQueryRule(QueryRuleReq queryRuleReq, User user) {
checkPermission(queryRuleReq, user);
QueryRuleDO queryRuleDO = queryRuleRepository.getQueryRuleById(queryRuleReq.getId());
QueryRuleDO queryRuleNew = QueryRuleConverter.convert2DO(queryRuleReq);
BeanMapper.mapper(queryRuleNew, queryRuleDO);
queryRuleDO.setUpdatedAt(new Date());
queryRuleDO.setUpdatedBy(user.getName());
queryRuleRepository.update(queryRuleDO);
return getQueryRuleById(queryRuleDO.getId(), user);
}
@Override
public Boolean dropQueryRule(Long id, User user) {
QueryRuleDO queryRuleDO = queryRuleRepository.getQueryRuleById(id);
checkPermission(queryRuleDO, user);
queryRuleDO.setStatus(StatusEnum.DELETED.getCode());
queryRuleRepository.update(queryRuleDO);
return true;
}
@Override
public QueryRuleResp getQueryRuleById(Long id, User user) {
QueryRuleDO queryRuleDO = queryRuleRepository.getQueryRuleById(id);
QueryRuleResp queryRuleResp = QueryRuleConverter.convert2Resp(queryRuleDO);
return queryRuleResp;
}
@Override
public List<QueryRuleResp> getQueryRuleList(QueryRuleFilter queryRuleFilter, User user) {
List<QueryRuleDO> queryRules = queryRuleRepository.getQueryRules(queryRuleFilter);
List<QueryRuleResp> queryRuleRespList = QueryRuleConverter.convert2RespList(queryRules);
return queryRuleRespList;
}
private void checkPermission(QueryRuleReq queryRuleReq, User user) {
String userName = user.getName();
if (Objects.nonNull(queryRuleReq.getDataSetId())) {
DataSetResp dataSet = dataSetService.getDataSet(queryRuleReq.getDataSetId());
if (dataSet.getAdmins().contains(userName) || dataSet.getCreatedBy().equalsIgnoreCase(userName)) {
log.debug(String.format("user:%s, queryRuleReq:%s", userName, queryRuleReq));
return;
}
throw new RuntimeException("用户暂无权限变更数据集的规则, 请确认");
}
}
private void checkPermission(QueryRuleDO queryRuleDO, User user) {
String userName = user.getName();
if (Objects.nonNull(queryRuleDO.getDataSetId())) {
DataSetResp dataSet = dataSetService.getDataSet(queryRuleDO.getDataSetId());
if (dataSet.getAdmins().contains(userName) || dataSet.getCreatedBy().equalsIgnoreCase(userName)) {
log.debug(String.format("user:%s, queryRuleDO:%s", userName, queryRuleDO));
return;
}
throw new RuntimeException("用户暂无权限变更数据集的规则, 请确认");
}
}
}

View File

@@ -0,0 +1,48 @@
package com.tencent.supersonic.headless.server.utils;
import com.tencent.supersonic.common.util.JsonUtil;
import com.tencent.supersonic.headless.api.pojo.ActionInfo;
import com.tencent.supersonic.headless.api.pojo.RuleInfo;
import com.tencent.supersonic.headless.api.pojo.enums.QueryRuleType;
import com.tencent.supersonic.headless.api.pojo.request.QueryRuleReq;
import com.tencent.supersonic.headless.api.pojo.response.QueryRuleResp;
import com.tencent.supersonic.headless.server.persistence.dataobject.QueryRuleDO;
import org.apache.directory.api.util.Strings;
import org.springframework.beans.BeanUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
public class QueryRuleConverter {
public static QueryRuleDO convert2DO(QueryRuleReq queryRuleReq) {
QueryRuleDO queryRuleDO = new QueryRuleDO();
BeanUtils.copyProperties(queryRuleReq, queryRuleDO);
queryRuleDO.setRuleType(queryRuleReq.getRuleType().name());
queryRuleDO.setRule(JsonUtil.toString(queryRuleReq.getRule()));
queryRuleDO.setAction(Objects.isNull(queryRuleReq.getAction()) ? "" :
JsonUtil.toString(queryRuleReq.getAction()));
queryRuleDO.setExt(JsonUtil.toString(queryRuleReq.getExt()));
return queryRuleDO;
}
public static QueryRuleResp convert2Resp(QueryRuleDO queryRuleDO) {
QueryRuleResp queryRuleResp = new QueryRuleResp();
BeanUtils.copyProperties(queryRuleDO, queryRuleResp);
queryRuleResp.setRuleType(QueryRuleType.valueOf(queryRuleDO.getRuleType()));
queryRuleResp.setRule(JsonUtil.toObject(queryRuleDO.getRule(), RuleInfo.class));
queryRuleResp.setAction(Strings.isEmpty(queryRuleDO.getAction()) ? new ActionInfo() :
JsonUtil.toObject(queryRuleDO.getAction(), ActionInfo.class));
queryRuleResp.setExt(JsonUtil.toMap(queryRuleDO.getExt(), String.class, String.class));
return queryRuleResp;
}
public static List<QueryRuleResp> convert2RespList(List<QueryRuleDO> queryRules) {
List<QueryRuleResp> queryRuleRespList = new ArrayList<>();
queryRules.stream().forEach(queryRuleDO -> queryRuleRespList.add(convert2Resp(queryRuleDO)));
return queryRuleRespList;
}
}