feat(基础模块): 增加命令模式支持 (#607)
可使用 CommandSupportManagerProviders相关方法来执行服务命令进行解耦.
This commit is contained in:
parent
694595d446
commit
2e487a42e2
|
|
@ -0,0 +1,64 @@
|
|||
package org.jetlinks.community.annotation.command;
|
||||
|
||||
|
||||
import org.jetlinks.core.annotation.command.CommandHandler;
|
||||
import org.springframework.stereotype.Indexed;
|
||||
|
||||
import java.lang.annotation.*;
|
||||
|
||||
/**
|
||||
* 标记一个类为命令服务支持端点,用于对外提供命令支持
|
||||
* <pre>{@code
|
||||
*
|
||||
* @CommandService("myService")
|
||||
* public class MyCommandService{
|
||||
*
|
||||
* }
|
||||
*
|
||||
* }</pre>
|
||||
*
|
||||
* @author zhouhao
|
||||
* @since 1.2.3
|
||||
*/
|
||||
@Target({ElementType.TYPE})
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Inherited
|
||||
@Indexed
|
||||
public @interface CommandService {
|
||||
|
||||
/**
|
||||
* 服务标识
|
||||
*
|
||||
* @return 服务标识
|
||||
*/
|
||||
String id();
|
||||
|
||||
/**
|
||||
* 服务名称
|
||||
*
|
||||
* @return 服务名称
|
||||
*/
|
||||
String name();
|
||||
|
||||
/**
|
||||
* 服务描述
|
||||
*
|
||||
* @return 服务描述
|
||||
*/
|
||||
String[] description() default {};
|
||||
|
||||
|
||||
/**
|
||||
* 是否根据注解扫描注册服务
|
||||
*
|
||||
* @return 是否注册服务
|
||||
*/
|
||||
boolean autoRegistered() default true;
|
||||
|
||||
/**
|
||||
* 命令定义,用于声明支持的命令
|
||||
*
|
||||
* @return 命令定义
|
||||
*/
|
||||
CommandHandler[] commands() default {};
|
||||
}
|
||||
|
|
@ -0,0 +1,102 @@
|
|||
package org.jetlinks.community.command;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.Setter;
|
||||
import org.hswebframework.web.bean.FastBeanCopier;
|
||||
import org.jetlinks.core.command.CommandSupport;
|
||||
import org.jetlinks.core.utils.SerializeUtils;
|
||||
import org.jetlinks.community.spi.Provider;
|
||||
import reactor.core.publisher.Flux;
|
||||
import reactor.core.publisher.Mono;
|
||||
|
||||
import java.io.Externalizable;
|
||||
import java.io.IOException;
|
||||
import java.io.ObjectInput;
|
||||
import java.io.ObjectOutput;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* 命令支持提供者,用于针对多个基于命令模式的可选模块依赖时的解耦.
|
||||
* <p>
|
||||
*
|
||||
* @author zhouhao
|
||||
* @see org.jetlinks.sdk.server.SdkServices
|
||||
* @see InternalSdkServices
|
||||
* @since 2.1
|
||||
*/
|
||||
public interface CommandSupportManagerProvider {
|
||||
/**
|
||||
* 所有支持的提供商
|
||||
*/
|
||||
Provider<CommandSupportManagerProvider> supports = Provider.create(CommandSupportManagerProvider.class);
|
||||
|
||||
/**
|
||||
* 命令服务提供商标识
|
||||
*
|
||||
* @return 唯一标识
|
||||
*/
|
||||
String getProvider();
|
||||
|
||||
/**
|
||||
* 获取命令支持,不同的命令管理支持多种命令支持,可能通过id进行区分,具体规则由对应服务实 现
|
||||
*
|
||||
* @param id 命令ID标识
|
||||
* @param options 拓展配置
|
||||
* @return CommandSupport
|
||||
* @see CommandSupportManagerProviders#getCommandSupport(String, Map)
|
||||
*/
|
||||
Mono<? extends CommandSupport> getCommandSupport(String id, Map<String, Object> options);
|
||||
|
||||
/**
|
||||
* 获取所有支持的信息
|
||||
*
|
||||
* @return id
|
||||
*/
|
||||
default Flux<CommandSupportInfo> getSupportInfo() {
|
||||
return Flux.empty();
|
||||
}
|
||||
|
||||
@Getter
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor(staticName = "of")
|
||||
@Setter
|
||||
class CommandSupportInfo implements Externalizable {
|
||||
private String id;
|
||||
private String name;
|
||||
private String description;
|
||||
|
||||
public CommandSupportInfo copy() {
|
||||
return FastBeanCopier.copy(this, new CommandSupportInfo());
|
||||
}
|
||||
|
||||
/**
|
||||
* @param serviceId serviceId
|
||||
* @return this
|
||||
* @see CommandSupportManagerProviders#getCommandSupport(String)
|
||||
*/
|
||||
public CommandSupportInfo appendService(String serviceId) {
|
||||
if (this.id == null) {
|
||||
this.id = serviceId;
|
||||
} else {
|
||||
this.id = serviceId + ":" + id;
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeExternal(ObjectOutput out) throws IOException {
|
||||
SerializeUtils.writeNullableUTF(id, out);
|
||||
SerializeUtils.writeNullableUTF(name, out);
|
||||
SerializeUtils.writeNullableUTF(description, out);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
|
||||
id = SerializeUtils.readNullableUTF(in);
|
||||
name = SerializeUtils.readNullableUTF(in);
|
||||
description = SerializeUtils.readNullableUTF(in);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,121 @@
|
|||
package org.jetlinks.community.command;
|
||||
|
||||
import org.jetlinks.core.command.CommandSupport;
|
||||
import reactor.core.publisher.Mono;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
|
||||
/**
|
||||
* 命令支持管理提供商工具类,用于提供对{@link CommandSupportManagerProvider}相关通用操作.
|
||||
*
|
||||
* @author zhouhao
|
||||
* @see CommandSupportManagerProvider
|
||||
* @see CommandSupportManagerProviders#getCommandSupport(String, Map)
|
||||
* @since 2.2
|
||||
*/
|
||||
public class CommandSupportManagerProviders {
|
||||
|
||||
|
||||
/**
|
||||
* 根据服务ID获取CommandSupport.
|
||||
* <pre>{@code
|
||||
*
|
||||
* CommandSupportManagerProviders
|
||||
* .getCommandSupport("deviceService:device",Collections.emptyMap())
|
||||
*
|
||||
* }</pre>
|
||||
*
|
||||
* @param serviceId serviceId 服务名
|
||||
* @return CommandSupport
|
||||
* @see InternalSdkServices
|
||||
* @see org.jetlinks.sdk.server.SdkServices
|
||||
*/
|
||||
public static Mono<CommandSupport> getCommandSupport(String serviceId) {
|
||||
return getCommandSupport(serviceId, Collections.emptyMap());
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据服务ID和支持ID获取CommandSupport.
|
||||
*
|
||||
* @param serviceId 服务ID
|
||||
* @param supportId 支持ID
|
||||
* @return CommandSupport
|
||||
*/
|
||||
public static Mono<CommandSupport> getCommandSupport(String serviceId, String supportId) {
|
||||
return getProviderNow(serviceId)
|
||||
.getCommandSupport(supportId, Collections.emptyMap())
|
||||
.cast(CommandSupport.class);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据服务ID获取CommandSupport.
|
||||
* <pre>{@code
|
||||
*
|
||||
* CommandSupportManagerProviders
|
||||
* .getCommandSupport("deviceService:device",Collections.emptyMap())
|
||||
*
|
||||
* }</pre>
|
||||
*
|
||||
* @param serviceId serviceId 服务名
|
||||
* @param options options
|
||||
* @return CommandSupport
|
||||
* @see InternalSdkServices
|
||||
* @see org.jetlinks.sdk.server.SdkServices
|
||||
*/
|
||||
public static Mono<CommandSupport> getCommandSupport(String serviceId,
|
||||
Map<String, Object> options) {
|
||||
//fast path
|
||||
CommandSupportManagerProvider provider = CommandSupportManagerProvider
|
||||
.supports
|
||||
.get(serviceId)
|
||||
.orElse(null);
|
||||
if (provider != null) {
|
||||
return provider
|
||||
.getCommandSupport(serviceId, options)
|
||||
.cast(CommandSupport.class);
|
||||
}
|
||||
String supportId = serviceId;
|
||||
// deviceService:product
|
||||
if (serviceId.contains(":")) {
|
||||
String[] arr = serviceId.split(":", 2);
|
||||
serviceId = arr[0];
|
||||
supportId = arr[1];
|
||||
}
|
||||
String finalServiceId = serviceId;
|
||||
String finalSupportId = supportId;
|
||||
return Mono.defer(() -> getProviderNow(finalServiceId).getCommandSupport(finalSupportId, options));
|
||||
}
|
||||
|
||||
/**
|
||||
* 注册命令支持
|
||||
*
|
||||
* @param provider {@link CommandSupportManagerProvider#getProvider()}
|
||||
*/
|
||||
public static void register(CommandSupportManagerProvider provider) {
|
||||
CommandSupportManagerProvider.supports.register(provider.getProvider(), provider);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取命令支持
|
||||
*
|
||||
* @param provider {@link CommandSupportManagerProvider#getProvider()}
|
||||
* @return Optional
|
||||
*/
|
||||
public static Optional<CommandSupportManagerProvider> getProvider(String provider) {
|
||||
return CommandSupportManagerProvider.supports.get(provider);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取命令支持,如果不存在则抛出异常{@link UnsupportedOperationException}
|
||||
*
|
||||
* @param provider provider {@link CommandSupportManagerProvider#getProvider()}
|
||||
* @return CommandSupportManagerProvider
|
||||
*/
|
||||
public static CommandSupportManagerProvider getProviderNow(String provider) {
|
||||
return CommandSupportManagerProvider.supports.getNow(provider);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,37 @@
|
|||
package org.jetlinks.community.command;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import org.jetlinks.core.command.CommandSupport;
|
||||
import reactor.core.publisher.Flux;
|
||||
import reactor.core.publisher.Mono;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@AllArgsConstructor
|
||||
public class CompositeCommandSupportManagerProvider implements CommandSupportManagerProvider {
|
||||
private final List<CommandSupportManagerProvider> providers;
|
||||
|
||||
@Override
|
||||
public String getProvider() {
|
||||
return providers.get(0).getProvider();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Mono<? extends CommandSupport> getCommandSupport(String id, Map<String, Object> options) {
|
||||
|
||||
return Flux
|
||||
.fromIterable(providers)
|
||||
.flatMap(provider -> provider.getCommandSupport(id, options))
|
||||
.take(1)
|
||||
.singleOrEmpty();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Flux<CommandSupportInfo> getSupportInfo() {
|
||||
return Flux
|
||||
.fromIterable(providers)
|
||||
.flatMap(CommandSupportManagerProvider::getSupportInfo)
|
||||
.distinct(CommandSupportInfo::getId);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,43 @@
|
|||
package org.jetlinks.community.command;
|
||||
|
||||
/**
|
||||
* 平台内部的一些服务定义
|
||||
*
|
||||
* @author zhouhao
|
||||
* @see org.jetlinks.sdk.server.SdkServices
|
||||
* @since 2.2
|
||||
*/
|
||||
public interface InternalSdkServices {
|
||||
|
||||
/**
|
||||
* 网络组件服务
|
||||
*/
|
||||
String networkService = "networkService";
|
||||
|
||||
/**
|
||||
* 设备接入网关服务
|
||||
*/
|
||||
String deviceGatewayService = "deviceGatewayService";
|
||||
|
||||
|
||||
/**
|
||||
* 采集器服务
|
||||
*/
|
||||
String collectorService = "collectorService";
|
||||
|
||||
/**
|
||||
* 规则服务
|
||||
*/
|
||||
String ruleService = "ruleService";
|
||||
|
||||
|
||||
/**
|
||||
* 插件服务
|
||||
*/
|
||||
String pluginService = "pluginService";
|
||||
|
||||
/**
|
||||
* 基础服务
|
||||
*/
|
||||
String commonService = "commonService";
|
||||
}
|
||||
|
|
@ -0,0 +1,83 @@
|
|||
package org.jetlinks.community.command.register;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.jetlinks.community.annotation.command.CommandService;
|
||||
import org.jetlinks.community.command.CommandSupportManagerProvider;
|
||||
import org.jetlinks.community.command.CommandSupportManagerProviders;
|
||||
import org.jetlinks.community.command.CompositeCommandSupportManagerProvider;
|
||||
import org.springframework.beans.BeansException;
|
||||
import org.springframework.beans.factory.SmartInitializingSingleton;
|
||||
import org.springframework.context.ApplicationContext;
|
||||
import org.springframework.context.ApplicationContextAware;
|
||||
import org.springframework.core.annotation.AnnotatedElementUtils;
|
||||
import org.springframework.util.ClassUtils;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Slf4j
|
||||
public class CommandServiceEndpointRegister implements ApplicationContextAware, SmartInitializingSingleton {
|
||||
|
||||
private ApplicationContext context;
|
||||
|
||||
@Override
|
||||
public void setApplicationContext(@Nonnull ApplicationContext applicationContext) throws BeansException {
|
||||
this.context = applicationContext;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void afterSingletonsInstantiated() {
|
||||
Map<String, Object> beans = context.getBeansWithAnnotation(CommandService.class);
|
||||
|
||||
//静态Provider
|
||||
Map<String, List<CommandSupportManagerProvider>> statics = context
|
||||
.getBeanProvider(CommandSupportManagerProvider.class)
|
||||
.stream()
|
||||
.collect(Collectors.groupingBy(CommandSupportManagerProvider::getProvider));
|
||||
|
||||
Map<String, SpringBeanCommandSupportProvider> providers = new HashMap<>();
|
||||
|
||||
for (Object value : beans.values()) {
|
||||
CommandService endpoint =
|
||||
AnnotatedElementUtils.findMergedAnnotation(ClassUtils.getUserClass(value), CommandService.class);
|
||||
if (endpoint == null || !endpoint.autoRegistered()) {
|
||||
continue;
|
||||
}
|
||||
String id = endpoint.id();
|
||||
String support = id;
|
||||
if (id.contains(":")) {
|
||||
support = id.substring(id.indexOf(":") + 1);
|
||||
id = id.substring(0, id.indexOf(":"));
|
||||
}
|
||||
|
||||
SpringBeanCommandSupportProvider provider = providers
|
||||
.computeIfAbsent(id, SpringBeanCommandSupportProvider::new);
|
||||
log.debug("register command support:{} -> {}", endpoint.id(), value);
|
||||
provider.register(support, endpoint, value);
|
||||
}
|
||||
|
||||
for (SpringBeanCommandSupportProvider value : providers.values()) {
|
||||
if (value.isEmpty()) {
|
||||
continue;
|
||||
}
|
||||
//合并静态Provider
|
||||
List<CommandSupportManagerProvider> provider = statics.remove(value.getProvider());
|
||||
if (provider != null) {
|
||||
provider.forEach(value::register);
|
||||
}
|
||||
|
||||
CommandSupportManagerProviders.register(value);
|
||||
}
|
||||
for (List<CommandSupportManagerProvider> value : statics.values()) {
|
||||
if (value.size() == 1) {
|
||||
CommandSupportManagerProviders.register(value.get(0));
|
||||
} else {
|
||||
CommandSupportManagerProviders.register(new CompositeCommandSupportManagerProvider(value));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,138 @@
|
|||
package org.jetlinks.community.command.register;
|
||||
|
||||
import com.google.common.collect.Lists;
|
||||
import lombok.Getter;
|
||||
import org.hswebframework.web.i18n.LocaleUtils;
|
||||
import org.jetlinks.core.command.CommandSupport;
|
||||
import org.jetlinks.core.command.CompositeCommandSupport;
|
||||
import org.jetlinks.community.annotation.command.CommandService;
|
||||
import org.jetlinks.community.command.CommandSupportManagerProvider;
|
||||
import org.jetlinks.supports.command.JavaBeanCommandSupport;
|
||||
import org.springframework.util.StringUtils;
|
||||
import reactor.core.publisher.Flux;
|
||||
import reactor.core.publisher.Mono;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
class SpringBeanCommandSupportProvider implements CommandSupportManagerProvider {
|
||||
|
||||
private final String provider;
|
||||
private final Map<String, CompositeSpringBeanCommandSupport> commandSupports = new HashMap<>();
|
||||
|
||||
private final List<CommandSupportManagerProvider> statics = new ArrayList<>();
|
||||
|
||||
public SpringBeanCommandSupportProvider(String provider) {
|
||||
this.provider = provider;
|
||||
}
|
||||
|
||||
void register(CommandSupportManagerProvider provider) {
|
||||
statics.add(provider);
|
||||
}
|
||||
|
||||
void register(String support, CommandService annotation, Object bean) {
|
||||
Objects.requireNonNull(annotation, "endpoint");
|
||||
Objects.requireNonNull(bean, "bean");
|
||||
|
||||
SpringBeanCommandSupport commandSupport = new SpringBeanCommandSupport(annotation, bean);
|
||||
if (commandSupport.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
//相同support合并成一个
|
||||
commandSupports
|
||||
.computeIfAbsent(support, id -> new CompositeSpringBeanCommandSupport(id,provider))
|
||||
.register(commandSupport);
|
||||
}
|
||||
|
||||
boolean isEmpty() {
|
||||
return commandSupports.isEmpty();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getProvider() {
|
||||
return provider;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Mono<? extends CommandSupport> getCommandSupport(String id, Map<String, Object> options) {
|
||||
CommandSupport support = commandSupports.get(StringUtils.hasText(id) ? id : provider);
|
||||
if (support != null) {
|
||||
return Mono.just(support);
|
||||
}
|
||||
if (statics.isEmpty()) {
|
||||
return Mono.empty();
|
||||
}
|
||||
return Flux
|
||||
.fromIterable(statics)
|
||||
.flatMap(provider -> provider.getCommandSupport(id, options))
|
||||
.take(1)
|
||||
.singleOrEmpty();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Flux<CommandSupportInfo> getSupportInfo() {
|
||||
if (statics.isEmpty()) {
|
||||
return Flux
|
||||
.fromIterable(commandSupports.values())
|
||||
.flatMapIterable(CompositeSpringBeanCommandSupport::getInfo);
|
||||
}
|
||||
return Flux
|
||||
.concat(
|
||||
Flux
|
||||
.fromIterable(commandSupports.values())
|
||||
.flatMapIterable(CompositeSpringBeanCommandSupport::getInfo),
|
||||
Flux.fromIterable(statics)
|
||||
.flatMap(CommandSupportManagerProvider::getSupportInfo)
|
||||
)
|
||||
.distinct(info -> {
|
||||
String id = info.getId();
|
||||
return String.valueOf(id);
|
||||
});
|
||||
}
|
||||
|
||||
static class CompositeSpringBeanCommandSupport extends CompositeCommandSupport {
|
||||
private final String id;
|
||||
private final String provider;
|
||||
|
||||
public CompositeSpringBeanCommandSupport(String id,String provider) {
|
||||
super();
|
||||
this.id = id;
|
||||
this.provider = provider;
|
||||
}
|
||||
|
||||
public List<CommandSupportInfo> getInfo() {
|
||||
return Lists
|
||||
.transform(
|
||||
getSupports(),
|
||||
support -> {
|
||||
SpringBeanCommandSupport commandSupport = support.unwrap(SpringBeanCommandSupport.class);
|
||||
//兼容为null
|
||||
String _id = id.equals(provider) ? null : id;
|
||||
return CommandSupportInfo.of(
|
||||
_id,
|
||||
LocaleUtils.resolveMessage(commandSupport.annotation.name(), commandSupport.annotation.name()),
|
||||
String.join("", commandSupport.annotation.description())
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return getSupports().toString();
|
||||
}
|
||||
}
|
||||
|
||||
@Getter
|
||||
static class SpringBeanCommandSupport extends JavaBeanCommandSupport {
|
||||
private final CommandService annotation;
|
||||
|
||||
boolean isEmpty() {
|
||||
return handlers.isEmpty();
|
||||
}
|
||||
|
||||
public SpringBeanCommandSupport(CommandService annotation, Object target) {
|
||||
super(target);
|
||||
this.annotation = annotation;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -14,6 +14,7 @@ import org.hswebframework.web.dict.EnumDict;
|
|||
import org.hswebframework.web.dict.defaults.DefaultItemDefine;
|
||||
import org.jetlinks.community.Interval;
|
||||
import org.jetlinks.community.JvmErrorException;
|
||||
import org.jetlinks.community.command.register.CommandServiceEndpointRegister;
|
||||
import org.jetlinks.community.config.ConfigManager;
|
||||
import org.jetlinks.community.config.ConfigScopeCustomizer;
|
||||
import org.jetlinks.community.config.ConfigScopeProperties;
|
||||
|
|
@ -250,6 +251,12 @@ public class CommonConfiguration {
|
|||
return referenceManager;
|
||||
}
|
||||
|
||||
@Bean
|
||||
public CommandServiceEndpointRegister commandServiceEndpointRegister() {
|
||||
return new CommandServiceEndpointRegister();
|
||||
}
|
||||
|
||||
|
||||
@Configuration
|
||||
@ConditionalOnClass(ReactiveRedisOperations.class)
|
||||
static class DefaultUserBindServiceConfiguration {
|
||||
|
|
|
|||
|
|
@ -0,0 +1,63 @@
|
|||
package org.jetlinks.community.web;
|
||||
|
||||
import io.swagger.v3.oas.annotations.Hidden;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.SneakyThrows;
|
||||
import org.hswebframework.web.authorization.annotation.Authorize;
|
||||
import org.jetlinks.core.command.CommandSupport;
|
||||
import org.jetlinks.core.metadata.FunctionMetadata;
|
||||
import org.jetlinks.community.command.CommandSupportManagerProvider;
|
||||
import org.jetlinks.community.command.CommandSupportManagerProviders;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
import reactor.core.publisher.Flux;
|
||||
import reactor.core.publisher.Mono;
|
||||
|
||||
/**
|
||||
* 获取平台内部命令信息接口
|
||||
*
|
||||
* @author zhouhao
|
||||
* @since 2.2
|
||||
*/
|
||||
@RestController
|
||||
@RequestMapping("/command-supports")
|
||||
@Hidden
|
||||
@AllArgsConstructor
|
||||
public class CommandInfoController {
|
||||
|
||||
@GetMapping("/services")
|
||||
@SneakyThrows
|
||||
@Authorize
|
||||
public Flux<CommandSupportManagerProvider.CommandSupportInfo> getServices() {
|
||||
return Flux
|
||||
.fromIterable(CommandSupportManagerProvider.supports.getAll())
|
||||
.flatMap(provider -> provider
|
||||
.getSupportInfo()
|
||||
.map(s -> s.copy().appendService(provider.getProvider()))
|
||||
.defaultIfEmpty(
|
||||
CommandSupportManagerProvider
|
||||
.CommandSupportInfo
|
||||
.of(provider.getProvider(), null, null)));
|
||||
}
|
||||
|
||||
@GetMapping("/service/{serviceId}/commands")
|
||||
@SneakyThrows
|
||||
@Authorize
|
||||
public Flux<FunctionMetadata> getServiceCommands(@PathVariable String serviceId) {
|
||||
return CommandSupportManagerProviders
|
||||
.getCommandSupport(serviceId)
|
||||
.flatMapMany(CommandSupport::getCommandMetadata);
|
||||
}
|
||||
|
||||
@GetMapping("/service/{serviceId}/exists")
|
||||
@SneakyThrows
|
||||
@Authorize
|
||||
public Mono<Boolean> getServiceCommandSupport(@PathVariable String serviceId) {
|
||||
return CommandSupportManagerProviders
|
||||
.getCommandSupport(serviceId)
|
||||
.hasElement()
|
||||
.onErrorResume(err -> Mono.just(false));
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue