refactor: 重构数据额外配置.

This commit is contained in:
lijiahangmax
2023-12-21 01:20:57 +08:00
parent a365b8a955
commit 4bae5a35d6
28 changed files with 757 additions and 137 deletions

View File

@@ -0,0 +1,56 @@
package com.orion.ops.framework.common.handler.data;
import com.alibaba.fastjson.JSON;
import com.orion.ops.framework.common.handler.data.model.GenericsDataModel;
import com.orion.ops.framework.common.handler.data.strategy.MapDataStrategy;
import com.orion.spring.SpringHolder;
/**
* 标准数据定义
*
* @author Jiahang Li
* @version 1.0.0
* @since 2023/12/21 0:07
*/
public interface GenericsDataDefinition {
/**
* 获取数据模型类型
*
* @return class
*/
Class<? extends GenericsDataModel> getType();
/**
* 获取数据处理策略
*
* @return class
*/
Class<? extends MapDataStrategy<? extends GenericsDataModel>> getStrategy();
/**
* 获取数据模型策略处理器
*
* @param <Model> Model
* @param <Strategy> Strategy
* @return StrategyBean
*/
@SuppressWarnings("unchecked")
default <Model extends GenericsDataModel, Strategy extends MapDataStrategy<Model>> Strategy getStrategyBean() {
return (Strategy) SpringHolder.getBean(this.getStrategy());
}
/**
* 反序列化对象
*
* @param json json
* @param <Model> Model
* @return object
*/
@SuppressWarnings("unchecked")
default <Model extends GenericsDataModel> Model parse(String json) {
return (Model) JSON.parseObject(json, this.getType());
}
}

View File

@@ -9,43 +9,60 @@ import com.orion.ops.framework.common.handler.data.model.GenericsDataModel;
* @version 1.0.0 * @version 1.0.0
* @since 2023/12/20 22:09 * @since 2023/12/20 22:09
*/ */
public interface GenericsDataStrategy<Config extends GenericsDataModel, View> { public interface GenericsDataStrategy<Model extends GenericsDataModel, View> {
/** /**
* 获取默认值 * 获取默认值
* *
* @return 默认值 * @return 默认值
*/ */
Config getDefault(); Model getDefault();
/** /**
* 更新填充 * 更新填充
* *
* @param before 修改前配置 * @param beforeModel 修改前配置
* @param after 修改后配置 * @param afterModel 修改后配置
*/ */
void updateFill(Config before, Config after); void updateFill(Model beforeModel, Model afterModel);
/** /**
* 预校验参数 * 预校验参数
* *
* @param config config * @param model model
*/ */
void preValidConfig(Config config); void preValid(Model model);
/** /**
* 校验参数 * 校验参数
* *
* @param config config * @param model model
*/ */
void validConfig(Config config); void valid(Model model);
/**
* 执行完整验证链
* <p>
* preValid > updateFill > preValid
*
* @param beforeModel beforeModel
* @param afterModel afterModel
*/
default void doValidChain(Model beforeModel, Model afterModel) {
// 预校验参数
this.preValid(afterModel);
// 更新填充
this.updateFill(beforeModel, afterModel);
// 校验参数
this.valid(afterModel);
}
/** /**
* 转为视图配置 * 转为视图配置
* *
* @param config config * @param model model
* @return 视图配置 * @return 视图配置
*/ */
View toView(String config); View toView(String model);
} }

View File

@@ -1,5 +1,6 @@
package com.orion.ops.framework.common.handler.data.strategy; package com.orion.ops.framework.common.handler.data.strategy;
import com.alibaba.fastjson.JSONObject;
import com.orion.ops.framework.common.handler.data.model.GenericsDataModel; import com.orion.ops.framework.common.handler.data.model.GenericsDataModel;
import java.util.Map; import java.util.Map;
@@ -11,6 +12,11 @@ import java.util.Map;
* @version 1.0.0 * @version 1.0.0
* @since 2023/12/20 22:11 * @since 2023/12/20 22:11
*/ */
public interface MapDataStrategy<Config extends GenericsDataModel> extends GenericsDataStrategy<Config, Map<String, Object>> { public interface MapDataStrategy<Model extends GenericsDataModel> extends GenericsDataStrategy<Model, Map<String, Object>> {
@Override
default Map<String, Object> toView(String model) {
return JSONObject.parseObject(model);
}
} }

View File

@@ -8,4 +8,31 @@ Authorization: {{token}}
"name": "alias" "name": "alias"
} }
### 获取主机拓展信息
GET {{baseUrl}}/asset/host-extra/get?hostId=1&item=ssh
Authorization: {{token}}
### 获取多个主机拓展信息
POST {{baseUrl}}/asset/host-extra/list
Content-Type: application/json
Authorization: {{token}}
{
"hostId": 1,
"items": [
"ssh"
]
}
### 修改主机拓展信息
PUT {{baseUrl}}/asset/host-extra/update
Content-Type: application/json
Authorization: {{token}}
{
"hostId": 1,
"item": "ssh",
"extra": "{\"authType\":\"DEFAULT\"}"
}
### ###

View File

@@ -1,18 +1,21 @@
package com.orion.ops.module.asset.controller; package com.orion.ops.module.asset.controller;
import com.orion.ops.framework.log.core.annotation.IgnoreLog;
import com.orion.ops.framework.log.core.enums.IgnoreLogMode;
import com.orion.ops.framework.web.core.annotation.RestWrapper; import com.orion.ops.framework.web.core.annotation.RestWrapper;
import com.orion.ops.module.asset.entity.request.host.HostAliasUpdateRequest; import com.orion.ops.module.asset.entity.request.host.HostAliasUpdateRequest;
import com.orion.ops.module.asset.entity.request.host.HostExtraQueryRequest;
import com.orion.ops.module.asset.entity.request.host.HostExtraUpdateRequest;
import com.orion.ops.module.asset.service.HostExtraService; import com.orion.ops.module.asset.service.HostExtraService;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.Map;
/** /**
* 主机拓展信息 api * 主机拓展信息 api
@@ -39,5 +42,27 @@ public class HostExtraController {
return hostExtraService.updateHostAlias(request); return hostExtraService.updateHostAlias(request);
} }
@IgnoreLog(IgnoreLogMode.RET)
@GetMapping("/get")
@Operation(summary = "获取主机拓展信息")
@Parameter(name = "hostId", description = "hostId", required = true)
@Parameter(name = "item", description = "item", required = true)
public Map<String, Object> getHostExtra(@RequestParam("hostId") Long hostId, @RequestParam("item") String item) {
return hostExtraService.getHostExtra(hostId, item);
}
@IgnoreLog(IgnoreLogMode.RET)
@PostMapping("/list")
@Operation(summary = "获取多个主机拓展信息")
public Map<String, Map<String, Object>> getHostExtraList(@Validated @RequestBody HostExtraQueryRequest request) {
return hostExtraService.getHostExtraList(request);
}
@GetMapping("/update")
@Operation(summary = "修改主机拓展信息")
public Integer updateHostExtra(@Validated @RequestBody HostExtraUpdateRequest request) {
return hostExtraService.updateHostExtra(request);
}
} }

View File

@@ -0,0 +1,35 @@
package com.orion.ops.module.asset.entity.request.host;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.List;
/**
* 主机拓展信息查询请求
*
* @author Jiahang Li
* @version 1.0.0
* @since 2023/12/20 21:36
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Schema(name = "HostExtraQueryRequest", description = "主机拓展信息查询请求")
public class HostExtraQueryRequest {
@NotNull
@Schema(description = "主机id")
private Long hostId;
@NotEmpty
@Schema(description = "配置项")
private List<String> items;
}

View File

@@ -0,0 +1,38 @@
package com.orion.ops.module.asset.entity.request.host;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
/**
* 主机拓展信息更新请求
*
* @author Jiahang Li
* @version 1.0.0
* @since 2023/12/20 21:36
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Schema(name = "HostExtraUpdateRequest", description = "主机拓展信息更新请求")
public class HostExtraUpdateRequest {
@NotNull
@Schema(description = "主机id")
private Long hostId;
@NotNull
@Schema(description = "配置项")
private String item;
@NotBlank
@Schema(description = "拓展信息")
private String extra;
}

View File

@@ -1,13 +1,13 @@
package com.orion.ops.module.asset.enums; package com.orion.ops.module.asset.enums;
/** /**
* 主机验证类型 * 主机验证类型 - ssh
* *
* @author Jiahang Li * @author Jiahang Li
* @version 1.0.0 * @version 1.0.0
* @since 2023/9/21 19:01 * @since 2023/9/21 19:01
*/ */
public enum HostAuthTypeEnum { public enum HostConfigSshAuthTypeEnum {
/** /**
* 密码验证 * 密码验证
@@ -26,11 +26,11 @@ public enum HostAuthTypeEnum {
; ;
public static HostAuthTypeEnum of(String type) { public static HostConfigSshAuthTypeEnum of(String type) {
if (type == null) { if (type == null) {
return null; return null;
} }
for (HostAuthTypeEnum value : values()) { for (HostConfigSshAuthTypeEnum value : values()) {
if (value.name().equals(type)) { if (value.name().equals(type)) {
return value; return value;
} }

View File

@@ -1,11 +1,11 @@
package com.orion.ops.module.asset.enums; package com.orion.ops.module.asset.enums;
import com.orion.ops.framework.common.enums.EnableStatus; import com.orion.ops.framework.common.enums.EnableStatus;
import com.orion.ops.framework.common.handler.data.GenericsDataDefinition;
import com.orion.ops.framework.common.handler.data.model.GenericsDataModel; import com.orion.ops.framework.common.handler.data.model.GenericsDataModel;
import com.orion.ops.framework.common.handler.data.strategy.MapDataStrategy; import com.orion.ops.framework.common.handler.data.strategy.MapDataStrategy;
import com.orion.ops.module.asset.handler.host.config.model.HostSshConfigModel; import com.orion.ops.module.asset.handler.host.config.model.HostSshConfigModel;
import com.orion.ops.module.asset.handler.host.config.strategy.HostSshConfigStrategy; import com.orion.ops.module.asset.handler.host.config.strategy.HostSshConfigStrategy;
import com.orion.spring.SpringHolder;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;
@@ -16,8 +16,9 @@ import lombok.Getter;
* @version 1.0.0 * @version 1.0.0
* @since 2023/9/11 14:37 * @since 2023/9/11 14:37
*/ */
@Getter
@AllArgsConstructor @AllArgsConstructor
public enum HostConfigTypeEnum { public enum HostConfigTypeEnum implements GenericsDataDefinition {
/** /**
* SSH 配置 * SSH 配置
@@ -26,12 +27,10 @@ public enum HostConfigTypeEnum {
; ;
@Getter
private final Class<? extends GenericsDataModel> type; private final Class<? extends GenericsDataModel> type;
private final Class<? extends MapDataStrategy<? extends GenericsDataModel>> strategy; private final Class<? extends MapDataStrategy<? extends GenericsDataModel>> strategy;
@Getter
private final Integer defaultStatus; private final Integer defaultStatus;
public static HostConfigTypeEnum of(String type) { public static HostConfigTypeEnum of(String type) {
@@ -46,9 +45,4 @@ public enum HostConfigTypeEnum {
return null; return null;
} }
@SuppressWarnings("unchecked")
public <Config extends GenericsDataModel, T extends MapDataStrategy<Config>> T getStrategy() {
return (T) SpringHolder.getBean(strategy);
}
} }

View File

@@ -0,0 +1,47 @@
package com.orion.ops.module.asset.enums;
import com.orion.ops.framework.common.handler.data.GenericsDataDefinition;
import com.orion.ops.framework.common.handler.data.model.GenericsDataModel;
import com.orion.ops.framework.common.handler.data.strategy.MapDataStrategy;
import com.orion.ops.module.asset.handler.host.extra.model.HostSshExtraModel;
import com.orion.ops.module.asset.handler.host.extra.strategy.HostSshExtraStrategy;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 主机额外配置项枚举
*
* @author Jiahang Li
* @version 1.0.0
* @since 2023/12/20 22:48
*/
@Getter
@AllArgsConstructor
public enum HostExtraItemEnum implements GenericsDataDefinition {
/**
* SSH 额外配置
*/
SSH("ssh", HostSshExtraModel.class, HostSshExtraStrategy.class),
;
private final String item;
private final Class<? extends GenericsDataModel> type;
private final Class<? extends MapDataStrategy<? extends GenericsDataModel>> strategy;
public static HostExtraItemEnum of(String type) {
if (type == null) {
return null;
}
for (HostExtraItemEnum value : values()) {
if (value.item.equals(type)) {
return value;
}
}
return null;
}
}

View File

@@ -0,0 +1,41 @@
package com.orion.ops.module.asset.enums;
/**
* 主机认证类型
*
* @author Jiahang Li
* @version 1.0.0
* @since 2023/12/20 21:41
*/
public enum HostExtraSshAuthTypeEnum {
/**
* 默认验证方式
*/
DEFAULT,
/**
* 秘钥验证
*/
KEY,
/**
* 身份验证
*/
IDENTITY,
;
public static HostExtraSshAuthTypeEnum of(String type) {
if (type == null) {
return DEFAULT;
}
for (HostExtraSshAuthTypeEnum value : values()) {
if (value.name().equals(type)) {
return value;
}
}
return DEFAULT;
}
}

View File

@@ -12,7 +12,7 @@ import com.orion.ops.framework.common.security.PasswordModifier;
import com.orion.ops.framework.common.utils.Valid; import com.orion.ops.framework.common.utils.Valid;
import com.orion.ops.module.asset.dao.HostIdentityDAO; import com.orion.ops.module.asset.dao.HostIdentityDAO;
import com.orion.ops.module.asset.dao.HostKeyDAO; import com.orion.ops.module.asset.dao.HostKeyDAO;
import com.orion.ops.module.asset.enums.HostAuthTypeEnum; import com.orion.ops.module.asset.enums.HostConfigSshAuthTypeEnum;
import com.orion.ops.module.asset.handler.host.config.model.HostSshConfigModel; import com.orion.ops.module.asset.handler.host.config.model.HostSshConfigModel;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@@ -44,6 +44,7 @@ public class HostSshConfigStrategy implements MapDataStrategy<HostSshConfigModel
return HostSshConfigModel.builder() return HostSshConfigModel.builder()
.port(SSH_PORT) .port(SSH_PORT)
.username(USERNAME) .username(USERNAME)
.authType(HostConfigSshAuthTypeEnum.PASSWORD.name())
.charset(Const.UTF_8) .charset(Const.UTF_8)
.connectTimeout(Const.MS_S_10) .connectTimeout(Const.MS_S_10)
.fileNameCharset(Const.UTF_8) .fileNameCharset(Const.UTF_8)
@@ -52,37 +53,37 @@ public class HostSshConfigStrategy implements MapDataStrategy<HostSshConfigModel
} }
@Override @Override
public void preValidConfig(HostSshConfigModel config) { public void preValid(HostSshConfigModel model) {
// 验证认证类型 // 验证认证类型
Valid.valid(HostAuthTypeEnum::of, config.getAuthType()); Valid.valid(HostConfigSshAuthTypeEnum::of, model.getAuthType());
// 验证编码格式 // 验证编码格式
this.validCharset(config.getCharset()); this.validCharset(model.getCharset());
this.validCharset(config.getFileNameCharset()); this.validCharset(model.getFileNameCharset());
this.validCharset(config.getFileContentCharset()); this.validCharset(model.getFileContentCharset());
// 检查主机秘钥是否存在 // 检查主机秘钥是否存在
Long keyId = config.getKeyId(); Long keyId = model.getKeyId();
if (keyId != null) { if (keyId != null) {
Valid.notNull(hostKeyDAO.selectById(keyId), ErrorMessage.KEY_ABSENT); Valid.notNull(hostKeyDAO.selectById(keyId), ErrorMessage.KEY_ABSENT);
} }
// 检查主机身份是否存在 // 检查主机身份是否存在
Long identityId = config.getIdentityId(); Long identityId = model.getIdentityId();
if (identityId != null) { if (identityId != null) {
Valid.notNull(hostIdentityDAO.selectById(identityId), ErrorMessage.IDENTITY_ABSENT); Valid.notNull(hostIdentityDAO.selectById(identityId), ErrorMessage.IDENTITY_ABSENT);
} }
} }
@Override @Override
public void validConfig(HostSshConfigModel config) { public void valid(HostSshConfigModel model) {
// 验证填充后的参数 // 验证填充后的参数
Valid.valid(config); Valid.valid(model);
} }
@Override @Override
public void updateFill(HostSshConfigModel before, HostSshConfigModel after) { public void updateFill(HostSshConfigModel beforeModel, HostSshConfigModel afterModel) {
// 加密密码 // 加密密码
this.checkEncryptPassword(before, after); this.checkEncryptPassword(beforeModel, afterModel);
after.setHasPassword(null); afterModel.setHasPassword(null);
after.setUseNewPassword(null); afterModel.setUseNewPassword(null);
} }
@Override @Override
@@ -104,7 +105,7 @@ public class HostSshConfigStrategy implements MapDataStrategy<HostSshConfigModel
*/ */
private void checkEncryptPassword(HostSshConfigModel before, HostSshConfigModel after) { private void checkEncryptPassword(HostSshConfigModel before, HostSshConfigModel after) {
// 非密码认证则直接赋值 // 非密码认证则直接赋值
if (!HostAuthTypeEnum.PASSWORD.name().equals(after.getAuthType())) { if (!HostConfigSshAuthTypeEnum.PASSWORD.name().equals(after.getAuthType())) {
after.setPassword(before.getPassword()); after.setPassword(before.getPassword());
return; return;
} }

View File

@@ -0,0 +1,36 @@
package com.orion.ops.module.asset.handler.host.extra.model;
import com.orion.ops.framework.common.handler.data.model.GenericsDataModel;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 主机拓展信息 - ssh 模型
*
* @author Jiahang Li
* @version 1.0.0
* @since 2023/12/20 21:36
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Schema(name = "HostExtraSshModel", description = "主机拓展信息 - ssh 模型")
public class HostSshExtraModel implements GenericsDataModel {
@Schema(description = "认证方式")
private String authType;
@Schema(description = "认证方式")
private String username;
@Schema(description = "主机秘钥")
private Long keyId;
@Schema(description = "主机身份")
private Long identityId;
}

View File

@@ -0,0 +1,40 @@
package com.orion.ops.module.asset.handler.host.extra.strategy;
import com.orion.ops.framework.common.handler.data.strategy.MapDataStrategy;
import com.orion.ops.module.asset.enums.HostExtraSshAuthTypeEnum;
import com.orion.ops.module.asset.handler.host.extra.model.HostSshExtraModel;
import org.springframework.stereotype.Component;
/**
* 主机拓展信息 - ssh 模型处理策略
*
* @author Jiahang Li
* @version 1.0.0
* @since 2023/12/20 22:17
*/
@Component
public class HostSshExtraStrategy implements MapDataStrategy<HostSshExtraModel> {
@Override
public HostSshExtraModel getDefault() {
return HostSshExtraModel.builder()
.authType(HostExtraSshAuthTypeEnum.DEFAULT.name())
.build();
}
@Override
public void updateFill(HostSshExtraModel beforeModel, HostSshExtraModel afterModel) {
}
@Override
public void preValid(HostSshExtraModel model) {
}
@Override
public void valid(HostSshExtraModel model) {
}
}

View File

@@ -1,8 +1,10 @@
package com.orion.ops.module.asset.service; package com.orion.ops.module.asset.service;
import com.orion.ops.module.asset.entity.request.host.HostAliasUpdateRequest; import com.orion.ops.module.asset.entity.request.host.HostAliasUpdateRequest;
import org.springframework.validation.annotation.Validated; import com.orion.ops.module.asset.entity.request.host.HostExtraQueryRequest;
import org.springframework.web.bind.annotation.RequestBody; import com.orion.ops.module.asset.entity.request.host.HostExtraUpdateRequest;
import java.util.Map;
/** /**
* 主机拓展信息 服务 * 主机拓展信息 服务
@@ -19,6 +21,45 @@ public interface HostExtraService {
* @param request request * @param request request
* @return effect * @return effect
*/ */
Integer updateHostAlias(@Validated @RequestBody HostAliasUpdateRequest request); Integer updateHostAlias(HostAliasUpdateRequest request);
/**
* 获取主机额外配置
*
* @param hostId hostId
* @param item item
* @return extra
*/
Map<String, Object> getHostExtra(Long hostId, String item);
/**
* 获取多个主机拓展信息
*
* @param request request
* @return type:extra
*/
Map<String, Map<String, Object>> getHostExtraList(HostExtraQueryRequest request);
/**
* 修改主机拓展信息
*
* @param request request
* @return effect
*/
Integer updateHostExtra(HostExtraUpdateRequest request);
/**
* 删除主机秘钥回调
*
* @param id id
*/
void deleteHostKeyCallback(Long id);
/**
* 删除主机身份回调
*
* @param id id
*/
void deleteHostIdentityCallback(Long id);
} }

View File

@@ -44,6 +44,8 @@ public class HostConfigServiceImpl implements HostConfigService {
@Resource @Resource
private HostConfigDAO hostConfigDAO; private HostConfigDAO hostConfigDAO;
// FIXME 动态初始化
@Override @Override
public HostConfigVO getHostConfig(Long hostId, String type) { public HostConfigVO getHostConfig(Long hostId, String type) {
HostConfigTypeEnum configType = Valid.valid(HostConfigTypeEnum::of, type); HostConfigTypeEnum configType = Valid.valid(HostConfigTypeEnum::of, type);
@@ -53,7 +55,7 @@ public class HostConfigServiceImpl implements HostConfigService {
// 转换 // 转换
HostConfigVO vo = HostConfigConvert.MAPPER.to(config); HostConfigVO vo = HostConfigConvert.MAPPER.to(config);
// 获取配置 // 获取配置
Map<String, Object> configMap = configType.getStrategy().toView(config.getConfig()); Map<String, Object> configMap = configType.getStrategyBean().toView(config.getConfig());
vo.setConfig(configMap); vo.setConfig(configMap);
return vo; return vo;
} }
@@ -82,7 +84,7 @@ public class HostConfigServiceImpl implements HostConfigService {
HostConfigVO vo = HostConfigConvert.MAPPER.to(s); HostConfigVO vo = HostConfigConvert.MAPPER.to(s);
// 获取配置 // 获取配置
Map<String, Object> config = HostConfigTypeEnum.of(s.getType()) Map<String, Object> config = HostConfigTypeEnum.of(s.getType())
.getStrategy() .getStrategyBean()
.toView(s.getConfig()); .toView(s.getConfig());
vo.setConfig(config); vo.setConfig(config);
return vo; return vo;
@@ -96,7 +98,7 @@ public class HostConfigServiceImpl implements HostConfigService {
HostConfigDO record = hostConfigDAO.selectById(id); HostConfigDO record = hostConfigDAO.selectById(id);
Valid.notNull(record, ErrorMessage.CONFIG_ABSENT); Valid.notNull(record, ErrorMessage.CONFIG_ABSENT);
HostConfigTypeEnum type = Valid.valid(HostConfigTypeEnum::of, record.getType()); HostConfigTypeEnum type = Valid.valid(HostConfigTypeEnum::of, record.getType());
GenericsDataModel config = JSON.parseObject(request.getConfig(), type.getType()); GenericsDataModel newConfig = type.parse(request.getConfig());
// 查询主机 // 查询主机
HostDO host = hostDAO.selectById(record.getHostId()); HostDO host = hostDAO.selectById(record.getHostId());
Valid.notNull(host, ErrorMessage.HOST_ABSENT); Valid.notNull(host, ErrorMessage.HOST_ABSENT);
@@ -106,19 +108,15 @@ public class HostConfigServiceImpl implements HostConfigService {
OperatorLogs.add(OperatorLogs.TYPE, type.name()); OperatorLogs.add(OperatorLogs.TYPE, type.name());
// 检查版本 // 检查版本
Valid.eq(record.getVersion(), request.getVersion(), ErrorMessage.DATA_MODIFIED); Valid.eq(record.getVersion(), request.getVersion(), ErrorMessage.DATA_MODIFIED);
MapDataStrategy<GenericsDataModel> strategy = type.getStrategy(); MapDataStrategy<GenericsDataModel> strategy = type.getStrategyBean();
// 预校验参数 GenericsDataModel beforeConfig = type.parse(record.getConfig());
strategy.preValidConfig(config); // 更新前校验
// 更新填充 strategy.doValidChain(beforeConfig, newConfig);
GenericsDataModel beforeConfig = JSON.parseObject(record.getConfig(), type.getType());
strategy.updateFill(beforeConfig, config);
// 检查参数
strategy.validConfig(config);
// 修改配置 // 修改配置
HostConfigDO update = new HostConfigDO(); HostConfigDO update = new HostConfigDO();
update.setId(id); update.setId(id);
update.setVersion(request.getVersion()); update.setVersion(request.getVersion());
update.setConfig(config.serial()); update.setConfig(newConfig.serial());
int effect = hostConfigDAO.updateById(update); int effect = hostConfigDAO.updateById(update);
Valid.version(effect); Valid.version(effect);
return update.getVersion(); return update.getVersion();
@@ -158,7 +156,7 @@ public class HostConfigServiceImpl implements HostConfigService {
insert.setHostId(hostId); insert.setHostId(hostId);
insert.setType(s.name()); insert.setType(s.name());
insert.setStatus(s.getDefaultStatus()); insert.setStatus(s.getDefaultStatus());
insert.setConfig(s.getStrategy().getDefault().serial()); insert.setConfig(s.getStrategyBean().getDefault().serial());
insert.setVersion(Const.DEFAULT_VERSION); insert.setVersion(Const.DEFAULT_VERSION);
return insert; return insert;
}).collect(Collectors.toList()); }).collect(Collectors.toList());

View File

@@ -1,14 +1,30 @@
package com.orion.ops.module.asset.service.impl; package com.orion.ops.module.asset.service.impl;
import com.orion.lang.function.Functions;
import com.orion.lang.utils.collect.Maps;
import com.orion.ops.framework.common.constant.ErrorMessage;
import com.orion.ops.framework.common.handler.data.model.GenericsDataModel;
import com.orion.ops.framework.common.handler.data.strategy.MapDataStrategy;
import com.orion.ops.framework.common.utils.Valid;
import com.orion.ops.framework.security.core.utils.SecurityUtils; import com.orion.ops.framework.security.core.utils.SecurityUtils;
import com.orion.ops.module.asset.entity.request.host.HostAliasUpdateRequest; import com.orion.ops.module.asset.entity.request.host.HostAliasUpdateRequest;
import com.orion.ops.module.asset.entity.request.host.HostExtraQueryRequest;
import com.orion.ops.module.asset.entity.request.host.HostExtraUpdateRequest;
import com.orion.ops.module.asset.enums.HostExtraItemEnum;
import com.orion.ops.module.asset.service.HostExtraService; import com.orion.ops.module.asset.service.HostExtraService;
import com.orion.ops.module.infra.api.DataAliasApi; import com.orion.ops.module.infra.api.DataAliasApi;
import com.orion.ops.module.infra.api.DataExtraApi;
import com.orion.ops.module.infra.entity.dto.data.DataAliasUpdateDTO; import com.orion.ops.module.infra.entity.dto.data.DataAliasUpdateDTO;
import com.orion.ops.module.infra.entity.dto.data.DataExtraDTO;
import com.orion.ops.module.infra.entity.dto.data.DataExtraQueryDTO;
import com.orion.ops.module.infra.entity.dto.data.DataExtraSetDTO;
import com.orion.ops.module.infra.enums.DataExtraTypeEnum; import com.orion.ops.module.infra.enums.DataExtraTypeEnum;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/** /**
* 主机拓展信息 服务实现类 * 主机拓展信息 服务实现类
@@ -23,6 +39,9 @@ public class HostExtraServiceImpl implements HostExtraService {
@Resource @Resource
private DataAliasApi dataAliasApi; private DataAliasApi dataAliasApi;
@Resource
private DataExtraApi dataExtraApi;
@Override @Override
public Integer updateHostAlias(HostAliasUpdateRequest request) { public Integer updateHostAlias(HostAliasUpdateRequest request) {
DataAliasUpdateDTO update = DataAliasUpdateDTO.builder() DataAliasUpdateDTO update = DataAliasUpdateDTO.builder()
@@ -33,4 +52,112 @@ public class HostExtraServiceImpl implements HostExtraService {
return dataAliasApi.updateDataAlias(update, DataExtraTypeEnum.HOST); return dataAliasApi.updateDataAlias(update, DataExtraTypeEnum.HOST);
} }
@Override
public Map<String, Object> getHostExtra(Long hostId, String item) {
HostExtraItemEnum extraItem = Valid.valid(HostExtraItemEnum::of, item);
// 查询配置项
Long userId = SecurityUtils.getLoginUserId();
DataExtraQueryDTO query = DataExtraQueryDTO.builder()
.userId(userId)
.relId(hostId)
.item(item)
.build();
String extraValue = dataExtraApi.getExtraValue(query, DataExtraTypeEnum.HOST);
// 检查初始化并转为视图
return this.checkItemAndToView(extraItem, extraValue, userId, hostId);
}
@Override
public Map<String, Map<String, Object>> getHostExtraList(HostExtraQueryRequest request) {
Long hostId = request.getHostId();
List<String> items = request.getItems();
List<HostExtraItemEnum> extraItems = items.stream()
.map(s -> Valid.valid(HostExtraItemEnum::of, s))
.collect(Collectors.toList());
// 查询配置项
Long userId = SecurityUtils.getLoginUserId();
DataExtraQueryDTO query = DataExtraQueryDTO.builder()
.userId(userId)
.relId(hostId)
.items(items)
.build();
Map<String, String> extraValues = dataExtraApi.getExtraItems(query, DataExtraTypeEnum.HOST)
.stream()
.collect(Collectors.toMap(
DataExtraDTO::getItem,
DataExtraDTO::getValue,
Functions.right())
);
// 检查初始化
Map<String, Map<String, Object>> result = Maps.newMap();
for (HostExtraItemEnum extraItem : extraItems) {
String item = extraItem.getItem();
// 检查初始化并转为视图
Map<String, Object> extraValue = this.checkItemAndToView(extraItem, extraValues.get(item), userId, hostId);
result.put(item, extraValue);
}
return result;
}
@Override
public Integer updateHostExtra(HostExtraUpdateRequest request) {
String item = request.getItem();
Long hostId = request.getHostId();
Long userId = SecurityUtils.getLoginUserId();
HostExtraItemEnum extraItem = Valid.valid(HostExtraItemEnum::of, item);
MapDataStrategy<GenericsDataModel> strategy = extraItem.getStrategyBean();
// 查询原始配置
DataExtraQueryDTO query = DataExtraQueryDTO.builder()
.userId(userId)
.relId(hostId)
.item(item)
.build();
DataExtraDTO beforeExtraItem = dataExtraApi.getExtraItem(query, DataExtraTypeEnum.HOST);
Valid.notNull(beforeExtraItem, ErrorMessage.CONFIG_ABSENT);
GenericsDataModel newExtra = extraItem.parse(request.getExtra());
GenericsDataModel beforeExtra = extraItem.parse(beforeExtraItem.getValue());
// 更新验证
strategy.doValidChain(beforeExtra, newExtra);
// 更新配置
return dataExtraApi.updateExtraValue(beforeExtraItem.getId(), newExtra.serial());
}
@Override
public void deleteHostKeyCallback(Long id) {
}
@Override
public void deleteHostIdentityCallback(Long id) {
}
/**
* 检查配置项并且转为视图 (不存在则初始化默认值)
*
* @param extraItem extraItem
* @param extraValue extraValue
* @param userId userId
* @param hostId hostId
* @return viewMap
*/
private Map<String, Object> checkItemAndToView(HostExtraItemEnum extraItem, String extraValue, Long userId, Long hostId) {
String item = extraItem.getItem();
MapDataStrategy<GenericsDataModel> strategy = extraItem.getStrategyBean();
if (extraValue == null) {
// 初始化默认数据
extraValue = strategy.getDefault().serial();
// 插入默认值
DataExtraSetDTO set = DataExtraSetDTO.builder()
.userId(userId)
.relId(hostId)
.item(item)
.value(extraValue)
.build();
dataExtraApi.addExtraItem(set, DataExtraTypeEnum.HOST);
}
return strategy.toView(extraValue);
}
} }

View File

@@ -2,7 +2,7 @@ package com.orion.ops.module.infra.api;
import com.orion.ops.module.infra.entity.dto.data.DataExtraDTO; import com.orion.ops.module.infra.entity.dto.data.DataExtraDTO;
import com.orion.ops.module.infra.entity.dto.data.DataExtraQueryDTO; import com.orion.ops.module.infra.entity.dto.data.DataExtraQueryDTO;
import com.orion.ops.module.infra.entity.dto.data.DataExtraUpdateDTO; import com.orion.ops.module.infra.entity.dto.data.DataExtraSetDTO;
import com.orion.ops.module.infra.enums.DataExtraTypeEnum; import com.orion.ops.module.infra.enums.DataExtraTypeEnum;
import java.util.List; import java.util.List;
@@ -18,20 +18,38 @@ import java.util.Map;
public interface DataExtraApi { public interface DataExtraApi {
/** /**
* 更新数据拓展信息 * 更新数据拓展信息 不存在则新增
* *
* @param type type * @param type type
* @param dto dto * @param dto dto
* @return effect * @return effect
*/ */
Integer updateExtraItem(DataExtraUpdateDTO dto, DataExtraTypeEnum type); Integer setExtraItem(DataExtraSetDTO dto, DataExtraTypeEnum type);
/**
* 新增数据拓展信息
*
* @param dto dto
* @param type type
* @return id
*/
Long addExtraItem(DataExtraSetDTO dto, DataExtraTypeEnum type);
/**
* 更新数据拓展信息
*
* @param id id
* @param value value
* @return effect
*/
Integer updateExtraValue(Long id, String value);
/** /**
* 批量更新数据拓展信息 * 批量更新数据拓展信息
* *
* @param map map * @param map map
*/ */
void batchUpdate(Map<Long, Object> map); void batchUpdateExtraValue(Map<Long, String> map);
/** /**
* 查询额外配置项 * 查询额外配置项
@@ -40,7 +58,7 @@ public interface DataExtraApi {
* @param dto dto * @param dto dto
* @return item * @return item
*/ */
String getExtraItem(DataExtraQueryDTO dto, DataExtraTypeEnum type); String getExtraValue(DataExtraQueryDTO dto, DataExtraTypeEnum type);
/** /**
* 查询额外配置项 * 查询额外配置项
@@ -49,7 +67,7 @@ public interface DataExtraApi {
* @param type type * @param type type
* @return item * @return item
*/ */
Map<Long, String> getExtraItemList(DataExtraQueryDTO dto, DataExtraTypeEnum type); Map<Long, String> getExtraItemValues(DataExtraQueryDTO dto, DataExtraTypeEnum type);
/** /**
* 查询额外配置 * 查询额外配置
@@ -58,7 +76,16 @@ public interface DataExtraApi {
* @param type type * @param type type
* @return effect * @return effect
*/ */
List<DataExtraDTO> getExtraList(DataExtraQueryDTO dto, DataExtraTypeEnum type); DataExtraDTO getExtraItem(DataExtraQueryDTO dto, DataExtraTypeEnum type);
/**
* 查询额外配置
*
* @param dto dto
* @param type type
* @return effect
*/
List<DataExtraDTO> getExtraItems(DataExtraQueryDTO dto, DataExtraTypeEnum type);
/** /**
* 通过 relId 删除 * 通过 relId 删除

View File

@@ -36,10 +36,10 @@ public class DataExtraDTO implements Serializable {
@Schema(description = "数据类型") @Schema(description = "数据类型")
private String type; private String type;
@Schema(description = "拓展") @Schema(description = "配置")
private String item; private String item;
@Schema(description = "拓展") @Schema(description = "配置")
private String value; private String value;
} }

View File

@@ -22,8 +22,8 @@ import java.io.Serializable;
@Builder @Builder
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
@Schema(name = "DataExtraUpdateDTO", description = "数据拓展信息 更新请求业务对象") @Schema(name = "DataExtraSetDTO", description = "数据拓展信息 更新请求业务对象")
public class DataExtraUpdateDTO implements Serializable { public class DataExtraSetDTO implements Serializable {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
@@ -37,11 +37,11 @@ public class DataExtraUpdateDTO implements Serializable {
@NotBlank @NotBlank
@Size(max = 32) @Size(max = 32)
@Schema(description = "拓展") @Schema(description = "配置")
private String item; private String item;
@NotBlank @NotBlank
@Schema(description = "拓展") @Schema(description = "配置")
private String value; private String value;
} }

View File

@@ -3,11 +3,12 @@ package com.orion.ops.module.infra.api.impl;
import com.orion.ops.framework.common.utils.Valid; import com.orion.ops.framework.common.utils.Valid;
import com.orion.ops.module.infra.api.DataExtraApi; import com.orion.ops.module.infra.api.DataExtraApi;
import com.orion.ops.module.infra.convert.DataExtraProviderConvert; import com.orion.ops.module.infra.convert.DataExtraProviderConvert;
import com.orion.ops.module.infra.entity.domain.DataExtraDO;
import com.orion.ops.module.infra.entity.dto.data.DataExtraDTO; import com.orion.ops.module.infra.entity.dto.data.DataExtraDTO;
import com.orion.ops.module.infra.entity.dto.data.DataExtraQueryDTO; import com.orion.ops.module.infra.entity.dto.data.DataExtraQueryDTO;
import com.orion.ops.module.infra.entity.dto.data.DataExtraUpdateDTO; import com.orion.ops.module.infra.entity.dto.data.DataExtraSetDTO;
import com.orion.ops.module.infra.entity.request.data.DataExtraQueryRequest; import com.orion.ops.module.infra.entity.request.data.DataExtraQueryRequest;
import com.orion.ops.module.infra.entity.request.data.DataExtraUpdateRequest; import com.orion.ops.module.infra.entity.request.data.DataExtraSetRequest;
import com.orion.ops.module.infra.enums.DataExtraTypeEnum; import com.orion.ops.module.infra.enums.DataExtraTypeEnum;
import com.orion.ops.module.infra.service.DataExtraService; import com.orion.ops.module.infra.service.DataExtraService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@@ -33,42 +34,65 @@ public class DataExtraApiImpl implements DataExtraApi {
private DataExtraService dataExtraService; private DataExtraService dataExtraService;
@Override @Override
public Integer updateExtraItem(DataExtraUpdateDTO dto, DataExtraTypeEnum type) { public Integer setExtraItem(DataExtraSetDTO dto, DataExtraTypeEnum type) {
Valid.valid(dto); Valid.valid(dto);
// 更新 // 更新
DataExtraUpdateRequest request = DataExtraProviderConvert.MAPPER.to(dto); DataExtraSetRequest request = DataExtraProviderConvert.MAPPER.to(dto);
request.setType(type.name()); request.setType(type.name());
return dataExtraService.updateExtraItem(request); return dataExtraService.setExtraItem(request);
} }
@Override @Override
public void batchUpdate(Map<Long, Object> map) { public Long addExtraItem(DataExtraSetDTO dto, DataExtraTypeEnum type) {
dataExtraService.batchUpdate(map); Valid.valid(dto);
// 更新
DataExtraSetRequest request = DataExtraProviderConvert.MAPPER.to(dto);
request.setType(type.name());
return dataExtraService.addExtraItem(request);
} }
@Override @Override
public String getExtraItem(DataExtraQueryDTO dto, DataExtraTypeEnum type) { public Integer updateExtraValue(Long id, String value) {
return dataExtraService.updateExtraValue(id, value);
}
@Override
public void batchUpdateExtraValue(Map<Long, String> map) {
dataExtraService.batchUpdateExtraValue(map);
}
@Override
public String getExtraValue(DataExtraQueryDTO dto, DataExtraTypeEnum type) {
Valid.allNotNull(dto.getUserId(), dto.getRelId(), dto.getItem()); Valid.allNotNull(dto.getUserId(), dto.getRelId(), dto.getItem());
// 查询 // 查询
DataExtraQueryRequest request = DataExtraProviderConvert.MAPPER.to(dto); DataExtraQueryRequest request = DataExtraProviderConvert.MAPPER.to(dto);
request.setType(type.name()); request.setType(type.name());
return dataExtraService.getExtraItem(request); return dataExtraService.getExtraItemValue(request);
} }
@Override @Override
public Map<Long, String> getExtraItemList(DataExtraQueryDTO dto, DataExtraTypeEnum type) { public Map<Long, String> getExtraItemValues(DataExtraQueryDTO dto, DataExtraTypeEnum type) {
Valid.allNotNull(dto.getUserId(), dto.getRelIdList(), dto.getItem()); Valid.allNotNull(dto.getUserId(), dto.getRelIdList(), dto.getItem());
// 查询 // 查询
DataExtraQueryRequest request = DataExtraProviderConvert.MAPPER.to(dto); DataExtraQueryRequest request = DataExtraProviderConvert.MAPPER.to(dto);
request.setType(type.name()); request.setType(type.name());
return dataExtraService.getExtraItemList(request); return dataExtraService.getExtraItemValues(request);
} }
@Override @Override
public List<DataExtraDTO> getExtraList(DataExtraQueryDTO dto, DataExtraTypeEnum type) { public DataExtraDTO getExtraItem(DataExtraQueryDTO dto, DataExtraTypeEnum type) {
Valid.allNotNull(dto.getUserId(), dto.getRelId(), dto.getItem());
DataExtraQueryRequest request = DataExtraProviderConvert.MAPPER.to(dto); DataExtraQueryRequest request = DataExtraProviderConvert.MAPPER.to(dto);
request.setType(type.name()); request.setType(type.name());
return dataExtraService.getExtraList(request) DataExtraDO extraItem = dataExtraService.getExtraItem(request);
return DataExtraProviderConvert.MAPPER.to(extraItem);
}
@Override
public List<DataExtraDTO> getExtraItems(DataExtraQueryDTO dto, DataExtraTypeEnum type) {
DataExtraQueryRequest request = DataExtraProviderConvert.MAPPER.to(dto);
request.setType(type.name());
return dataExtraService.getExtraItems(request)
.stream() .stream()
.map(DataExtraProviderConvert.MAPPER::to) .map(DataExtraProviderConvert.MAPPER::to)
.collect(Collectors.toList()); .collect(Collectors.toList());

View File

@@ -3,9 +3,9 @@ package com.orion.ops.module.infra.convert;
import com.orion.ops.module.infra.entity.domain.DataExtraDO; import com.orion.ops.module.infra.entity.domain.DataExtraDO;
import com.orion.ops.module.infra.entity.dto.data.DataExtraDTO; import com.orion.ops.module.infra.entity.dto.data.DataExtraDTO;
import com.orion.ops.module.infra.entity.dto.data.DataExtraQueryDTO; import com.orion.ops.module.infra.entity.dto.data.DataExtraQueryDTO;
import com.orion.ops.module.infra.entity.dto.data.DataExtraUpdateDTO; import com.orion.ops.module.infra.entity.dto.data.DataExtraSetDTO;
import com.orion.ops.module.infra.entity.request.data.DataExtraQueryRequest; import com.orion.ops.module.infra.entity.request.data.DataExtraQueryRequest;
import com.orion.ops.module.infra.entity.request.data.DataExtraUpdateRequest; import com.orion.ops.module.infra.entity.request.data.DataExtraSetRequest;
import org.mapstruct.Mapper; import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers; import org.mapstruct.factory.Mappers;
@@ -23,7 +23,7 @@ public interface DataExtraProviderConvert {
DataExtraQueryRequest to(DataExtraQueryDTO query); DataExtraQueryRequest to(DataExtraQueryDTO query);
DataExtraUpdateRequest to(DataExtraUpdateDTO update); DataExtraSetRequest to(DataExtraSetDTO update);
DataExtraDTO to(DataExtraDO domain); DataExtraDTO to(DataExtraDO domain);

View File

@@ -42,11 +42,11 @@ public class DataExtraDO extends BaseDO {
@TableField("type") @TableField("type")
private String type; private String type;
@Schema(description = "拓展") @Schema(description = "配置")
@TableField("item") @TableField("item")
private String item; private String item;
@Schema(description = "拓展") @Schema(description = "配置")
@TableField("value") @TableField("value")
private String value; private String value;

View File

@@ -22,8 +22,8 @@ import java.io.Serializable;
@Builder @Builder
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
@Schema(name = "DataExtraUpdateRequest", description = "数据拓展信息 更新请求对象") @Schema(name = "DataExtraSetRequest", description = "数据拓展信息 更新请求对象")
public class DataExtraUpdateRequest implements Serializable { public class DataExtraSetRequest implements Serializable {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
@@ -42,11 +42,11 @@ public class DataExtraUpdateRequest implements Serializable {
@NotBlank @NotBlank
@Size(max = 32) @Size(max = 32)
@Schema(description = "拓展") @Schema(description = "配置")
private String item; private String item;
@NotBlank @NotBlank
@Schema(description = "拓展") @Schema(description = "配置")
private Object value; private String value;
} }

View File

@@ -2,7 +2,7 @@ package com.orion.ops.module.infra.service;
import com.orion.ops.module.infra.entity.domain.DataExtraDO; import com.orion.ops.module.infra.entity.domain.DataExtraDO;
import com.orion.ops.module.infra.entity.request.data.DataExtraQueryRequest; import com.orion.ops.module.infra.entity.request.data.DataExtraQueryRequest;
import com.orion.ops.module.infra.entity.request.data.DataExtraUpdateRequest; import com.orion.ops.module.infra.entity.request.data.DataExtraSetRequest;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@@ -17,19 +17,36 @@ import java.util.Map;
public interface DataExtraService { public interface DataExtraService {
/** /**
* 更新数据拓展信息 * 更新数据拓展信息 不存在则新增
* *
* @param request request * @param request request
* @return effect * @return effect
*/ */
Integer updateExtraItem(DataExtraUpdateRequest request); Integer setExtraItem(DataExtraSetRequest request);
/**
* 新增数据拓展信息
*
* @param request request
* @return id
*/
Long addExtraItem(DataExtraSetRequest request);
/**
* 更新数据拓展信息
*
* @param id id
* @param value value
* @return effect
*/
Integer updateExtraValue(Long id, String value);
/** /**
* 批量更新数据拓展信息 * 批量更新数据拓展信息
* *
* @param map map * @param map map
*/ */
void batchUpdate(Map<Long, Object> map); void batchUpdateExtraValue(Map<Long, String> map);
/** /**
* 查询额外配置项 * 查询额外配置项
@@ -37,7 +54,7 @@ public interface DataExtraService {
* @param request request * @param request request
* @return item * @return item
*/ */
String getExtraItem(DataExtraQueryRequest request); String getExtraItemValue(DataExtraQueryRequest request);
/** /**
* 查询额外配置项 * 查询额外配置项
@@ -45,7 +62,7 @@ public interface DataExtraService {
* @param request request * @param request request
* @return item * @return item
*/ */
Map<Long, String> getExtraItemList(DataExtraQueryRequest request); Map<Long, String> getExtraItemValues(DataExtraQueryRequest request);
/** /**
* 查询额外配置 * 查询额外配置
@@ -53,7 +70,15 @@ public interface DataExtraService {
* @param request request * @param request request
* @return rows * @return rows
*/ */
List<DataExtraDO> getExtraList(DataExtraQueryRequest request); DataExtraDO getExtraItem(DataExtraQueryRequest request);
/**
* 查询额外配置
*
* @param request request
* @return rows
*/
List<DataExtraDO> getExtraItems(DataExtraQueryRequest request);
/** /**
* 通过 userId 删除 * 通过 userId 删除

View File

@@ -8,7 +8,7 @@ import com.orion.ops.module.infra.constant.DataExtraItems;
import com.orion.ops.module.infra.define.cache.DataExtraCacheKeyDefine; import com.orion.ops.module.infra.define.cache.DataExtraCacheKeyDefine;
import com.orion.ops.module.infra.entity.request.data.DataAliasUpdateRequest; import com.orion.ops.module.infra.entity.request.data.DataAliasUpdateRequest;
import com.orion.ops.module.infra.entity.request.data.DataExtraQueryRequest; import com.orion.ops.module.infra.entity.request.data.DataExtraQueryRequest;
import com.orion.ops.module.infra.entity.request.data.DataExtraUpdateRequest; import com.orion.ops.module.infra.entity.request.data.DataExtraSetRequest;
import com.orion.ops.module.infra.service.DataAliasService; import com.orion.ops.module.infra.service.DataAliasService;
import com.orion.ops.module.infra.service.DataExtraService; import com.orion.ops.module.infra.service.DataExtraService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@@ -37,13 +37,13 @@ public class DataAliasServiceImpl implements DataAliasService {
Long userId = request.getUserId(); Long userId = request.getUserId();
String type = request.getType(); String type = request.getType();
// 更新 // 更新
DataExtraUpdateRequest update = new DataExtraUpdateRequest(); DataExtraSetRequest update = new DataExtraSetRequest();
update.setUserId(userId); update.setUserId(userId);
update.setRelId(request.getRelId()); update.setRelId(request.getRelId());
update.setType(type); update.setType(type);
update.setItem(DataExtraItems.ALIAS); update.setItem(DataExtraItems.ALIAS);
update.setValue(Refs.json(request.getAlias())); update.setValue(Refs.json(request.getAlias()));
Integer effect = dataExtraService.updateExtraItem(update); Integer effect = dataExtraService.setExtraItem(update);
// 删除缓存 // 删除缓存
RedisMaps.delete(DataExtraCacheKeyDefine.DATA_ALIAS.format(userId, type)); RedisMaps.delete(DataExtraCacheKeyDefine.DATA_ALIAS.format(userId, type));
return effect; return effect;
@@ -66,7 +66,7 @@ public class DataAliasServiceImpl implements DataAliasService {
.type(type) .type(type)
.item(DataExtraItems.ALIAS) .item(DataExtraItems.ALIAS)
.build(); .build();
Map<Long, String> extras = dataExtraService.getExtraItemList(request); Map<Long, String> extras = dataExtraService.getExtraItemValues(request);
entities = Maps.map(extras, String::valueOf, Refs::unrefToString); entities = Maps.map(extras, String::valueOf, Refs::unrefToString);
// 设置屏障 防止穿透 // 设置屏障 防止穿透
CacheBarriers.MAP.check(entities); CacheBarriers.MAP.check(entities);

View File

@@ -1,13 +1,13 @@
package com.orion.ops.module.infra.service.impl; package com.orion.ops.module.infra.service.impl;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.orion.lang.function.Functions; import com.orion.lang.function.Functions;
import com.orion.lang.utils.collect.Maps; import com.orion.lang.utils.collect.Maps;
import com.orion.ops.framework.common.constant.Const;
import com.orion.ops.module.infra.dao.DataExtraDAO; import com.orion.ops.module.infra.dao.DataExtraDAO;
import com.orion.ops.module.infra.entity.domain.DataExtraDO; import com.orion.ops.module.infra.entity.domain.DataExtraDO;
import com.orion.ops.module.infra.entity.request.data.DataExtraQueryRequest; import com.orion.ops.module.infra.entity.request.data.DataExtraQueryRequest;
import com.orion.ops.module.infra.entity.request.data.DataExtraUpdateRequest; import com.orion.ops.module.infra.entity.request.data.DataExtraSetRequest;
import com.orion.ops.module.infra.service.DataExtraService; import com.orion.ops.module.infra.service.DataExtraService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@@ -32,41 +32,49 @@ public class DataExtraServiceImpl implements DataExtraService {
private DataExtraDAO dataExtraDAO; private DataExtraDAO dataExtraDAO;
@Override @Override
public Integer updateExtraItem(DataExtraUpdateRequest request) { public Integer setExtraItem(DataExtraSetRequest request) {
Long userId = request.getUserId();
Long relId = request.getRelId();
String type = request.getType();
String item = request.getItem();
Object value = request.getValue();
// 查询配置是否存在 // 查询配置是否存在
DataExtraDO extraItem = dataExtraDAO.of() DataExtraDO extraItem = dataExtraDAO.of()
.createWrapper() .createWrapper()
.eq(DataExtraDO::getUserId, userId) .eq(DataExtraDO::getUserId, request.getUserId())
.eq(DataExtraDO::getRelId, relId) .eq(DataExtraDO::getRelId, request.getRelId())
.eq(DataExtraDO::getType, type) .eq(DataExtraDO::getType, request.getType())
.eq(DataExtraDO::getItem, item) .eq(DataExtraDO::getItem, request.getItem())
.then() .then()
.getOne(); .getOne();
if (extraItem == null) { if (extraItem == null) {
// 插入 // 插入
DataExtraDO insert = new DataExtraDO(); this.addExtraItem(request);
insert.setUserId(userId); return Const.N_1;
insert.setRelId(relId);
insert.setType(type);
insert.setItem(item);
insert.setValue(JSON.toJSONString(value));
return dataExtraDAO.insert(insert);
} else { } else {
// 修改 // 修改
DataExtraDO update = new DataExtraDO(); return this.updateExtraValue(extraItem.getId(), request.getValue());
update.setId(extraItem.getId());
update.setValue(JSON.toJSONString(value));
return dataExtraDAO.updateById(update);
} }
} }
@Override @Override
public void batchUpdate(Map<Long, Object> map) { public Long addExtraItem(DataExtraSetRequest request) {
// 插入
DataExtraDO insert = new DataExtraDO();
insert.setUserId(request.getUserId());
insert.setRelId(request.getRelId());
insert.setType(request.getType());
insert.setItem(request.getItem());
insert.setValue(request.getValue());
dataExtraDAO.insert(insert);
return insert.getId();
}
@Override
public Integer updateExtraValue(Long id, String value) {
DataExtraDO update = new DataExtraDO();
update.setId(id);
update.setValue(value);
return dataExtraDAO.updateById(update);
}
@Override
public void batchUpdateExtraValue(Map<Long, String> map) {
if (Maps.isEmpty(map)) { if (Maps.isEmpty(map)) {
return; return;
} }
@@ -76,14 +84,14 @@ public class DataExtraServiceImpl implements DataExtraService {
.map(s -> { .map(s -> {
DataExtraDO extra = new DataExtraDO(); DataExtraDO extra = new DataExtraDO();
extra.setId(s.getKey()); extra.setId(s.getKey());
extra.setValue(JSON.toJSONString(s.getValue())); extra.setValue(s.getValue());
return extra; return extra;
}).collect(Collectors.toList()); }).collect(Collectors.toList());
dataExtraDAO.updateBatch(list); dataExtraDAO.updateBatch(list);
} }
@Override @Override
public String getExtraItem(DataExtraQueryRequest request) { public String getExtraItemValue(DataExtraQueryRequest request) {
return dataExtraDAO.of() return dataExtraDAO.of()
.wrapper(this.buildWrapper(request)) .wrapper(this.buildWrapper(request))
.optionalOne() .optionalOne()
@@ -92,7 +100,7 @@ public class DataExtraServiceImpl implements DataExtraService {
} }
@Override @Override
public Map<Long, String> getExtraItemList(DataExtraQueryRequest request) { public Map<Long, String> getExtraItemValues(DataExtraQueryRequest request) {
return dataExtraDAO.of() return dataExtraDAO.of()
.wrapper(this.buildWrapper(request)) .wrapper(this.buildWrapper(request))
.stream() .stream()
@@ -103,7 +111,14 @@ public class DataExtraServiceImpl implements DataExtraService {
} }
@Override @Override
public List<DataExtraDO> getExtraList(DataExtraQueryRequest request) { public DataExtraDO getExtraItem(DataExtraQueryRequest request) {
return dataExtraDAO.of()
.wrapper(this.buildWrapper(request))
.getOne();
}
@Override
public List<DataExtraDO> getExtraItems(DataExtraQueryRequest request) {
return dataExtraDAO.of() return dataExtraDAO.of()
.wrapper(this.buildWrapper(request)) .wrapper(this.buildWrapper(request))
.list(); .list();

View File

@@ -78,8 +78,8 @@ CREATE TABLE `data_extra`
`user_id` bigint(0) NULL DEFAULT NULL COMMENT '用户id', `user_id` bigint(0) NULL DEFAULT NULL COMMENT '用户id',
`rel_id` bigint(0) NULL DEFAULT NULL COMMENT '数据id', `rel_id` bigint(0) NULL DEFAULT NULL COMMENT '数据id',
`type` char(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '数据类型', `type` char(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '数据类型',
`item` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '拓展', `item` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '配置',
`value` json NULL COMMENT '拓展', `value` json NULL COMMENT '配置',
`create_time` datetime(0) NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `create_time` datetime(0) NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime(0) NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '修改时间', `update_time` datetime(0) NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '修改时间',
`creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '创建人', `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '创建人',