From 87c97d5069f156c2d05bb049c4edaefc3de3b92f Mon Sep 17 00:00:00 2001 From: Sheldan <5037282+Sheldan@users.noreply.github.com> Date: Fri, 10 Apr 2020 12:06:46 +0200 Subject: [PATCH] added exception in case the feature is not known to the system --- .../abstracto/core/commands/Disable.java | 8 ++--- .../abstracto/core/commands/Enable.java | 7 +++-- .../core/config/FeatureFlagConfig.java | 10 ++++++ .../core/service/FeatureFlagServiceBean.java | 22 +++++++++++++ .../FeatureFlagManagementServiceBean.java | 4 +-- .../exceptions/feature_not_found_en_US.ftl | 1 + .../exception/FeatureNotFoundException.java | 31 +++++++++++++++++++ .../core/service/FeatureFlagService.java | 2 ++ .../FeatureFlagManagementService.java | 2 +- 9 files changed, 76 insertions(+), 11 deletions(-) create mode 100644 abstracto-application/core/core-impl/src/main/resources/seedData/templates/exceptions/feature_not_found_en_US.ftl create mode 100644 abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/exception/FeatureNotFoundException.java diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/Disable.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/Disable.java index 19b192bcc..89540290f 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/Disable.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/Disable.java @@ -7,7 +7,7 @@ import dev.sheldan.abstracto.core.command.execution.CommandResult; import dev.sheldan.abstracto.core.command.config.Parameter; import dev.sheldan.abstracto.core.config.AbstractoFeatures; import dev.sheldan.abstracto.core.commands.utility.UtilityModuleInterface; -import dev.sheldan.abstracto.core.service.management.FeatureFlagManagementService; +import dev.sheldan.abstracto.core.service.FeatureFlagService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -17,13 +17,13 @@ import java.util.List; @Component public class Disable implements Command { - @Autowired - private FeatureFlagManagementService featureFlagManagementService; + private FeatureFlagService featureFlagManagementService; + @Override public CommandResult execute(CommandContext commandContext) { String flagKey = (String) commandContext.getParameters().getParameters().get(0); - featureFlagManagementService.updateOrCreateFeatureFlag(flagKey, commandContext.getGuild().getIdLong(), false); + featureFlagManagementService.disableFeature(flagKey, commandContext.getGuild().getIdLong()); return CommandResult.fromSuccess(); } diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/Enable.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/Enable.java index c11a6ed00..c186c049a 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/Enable.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/commands/Enable.java @@ -7,7 +7,7 @@ import dev.sheldan.abstracto.core.command.execution.CommandResult; import dev.sheldan.abstracto.core.command.config.Parameter; import dev.sheldan.abstracto.core.config.AbstractoFeatures; import dev.sheldan.abstracto.core.commands.utility.UtilityModuleInterface; -import dev.sheldan.abstracto.core.service.management.FeatureFlagManagementService; +import dev.sheldan.abstracto.core.service.FeatureFlagService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -19,11 +19,12 @@ public class Enable implements Command { @Autowired - private FeatureFlagManagementService featureFlagManagementService; + private FeatureFlagService featureFlagManagementService; + @Override public CommandResult execute(CommandContext commandContext) { String flagKey = (String) commandContext.getParameters().getParameters().get(0); - featureFlagManagementService.updateOrCreateFeatureFlag(flagKey, commandContext.getGuild().getIdLong(), true); + featureFlagManagementService.enableFeature(flagKey, commandContext.getGuild().getIdLong()); return CommandResult.fromSuccess(); } diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/config/FeatureFlagConfig.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/config/FeatureFlagConfig.java index 83bdba80d..357e1b29f 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/config/FeatureFlagConfig.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/config/FeatureFlagConfig.java @@ -5,7 +5,9 @@ import lombok.Setter; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; @Component @Getter @@ -13,4 +15,12 @@ import java.util.HashMap; @ConfigurationProperties(prefix = "abstracto") public class FeatureFlagConfig { private HashMap features = new HashMap<>(); + + public boolean doesFeatureExist(String name) { + return features.containsKey(name); + } + + public List getFeaturesAsList() { + return new ArrayList<>(features.keySet()); + } } diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/FeatureFlagServiceBean.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/FeatureFlagServiceBean.java index d4e75564a..6ad5239d5 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/FeatureFlagServiceBean.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/FeatureFlagServiceBean.java @@ -1,5 +1,7 @@ package dev.sheldan.abstracto.core.service; +import dev.sheldan.abstracto.core.config.FeatureFlagConfig; +import dev.sheldan.abstracto.core.exception.FeatureNotFoundException; import dev.sheldan.abstracto.core.service.management.FeatureFlagManagementService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -10,8 +12,28 @@ public class FeatureFlagServiceBean implements FeatureFlagService { @Autowired private FeatureFlagManagementService managementService; + @Autowired + private FeatureFlagConfig featureFlagConfig; + + @Override public boolean isFeatureEnabled(String name, Long serverId) { return managementService.getFeatureFlagValue(name, serverId); } + + @Override + public void enableFeature(String name, Long serverId) { + if(!featureFlagConfig.doesFeatureExist(name)) { + throw new FeatureNotFoundException("Feature not found.", name, featureFlagConfig.getFeaturesAsList()); + } + managementService.updateFeatureFlag(name, serverId, true); + } + + @Override + public void disableFeature(String name, Long serverId) { + if(!featureFlagConfig.doesFeatureExist(name)) { + throw new FeatureNotFoundException("Feature not found.", name, featureFlagConfig.getFeaturesAsList()); + } + managementService.updateFeatureFlag(name, serverId, false); + } } diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/management/FeatureFlagManagementServiceBean.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/management/FeatureFlagManagementServiceBean.java index fcf592f38..4df194c05 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/management/FeatureFlagManagementServiceBean.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/management/FeatureFlagManagementServiceBean.java @@ -41,14 +41,12 @@ public class FeatureFlagManagementServiceBean implements FeatureFlagManagementSe } @Override - public void updateOrCreateFeatureFlag(String key, Long serverId, Boolean newValue) { + public void updateFeatureFlag(String key, Long serverId, Boolean newValue) { Optional existing = getFeatureFlag(key, serverId); if(existing.isPresent()) { AFeatureFlag flag = existing.get(); flag.setEnabled(newValue); repository.save(flag); - } else { - createFeatureFlag(key, serverId, newValue); } } diff --git a/abstracto-application/core/core-impl/src/main/resources/seedData/templates/exceptions/feature_not_found_en_US.ftl b/abstracto-application/core/core-impl/src/main/resources/seedData/templates/exceptions/feature_not_found_en_US.ftl new file mode 100644 index 000000000..1453fdd0d --- /dev/null +++ b/abstracto-application/core/core-impl/src/main/resources/seedData/templates/exceptions/feature_not_found_en_US.ftl @@ -0,0 +1 @@ +Feature ${featureName} not available. The available features are: ${availableFeatures?join(", ")} \ No newline at end of file diff --git a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/exception/FeatureNotFoundException.java b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/exception/FeatureNotFoundException.java new file mode 100644 index 000000000..abbd525d8 --- /dev/null +++ b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/exception/FeatureNotFoundException.java @@ -0,0 +1,31 @@ +package dev.sheldan.abstracto.core.exception; + +import dev.sheldan.abstracto.templating.Templatable; + +import java.util.HashMap; +import java.util.List; + +public class FeatureNotFoundException extends AbstractoRunTimeException implements Templatable { + + private String feature; + private List availableFeatures; + + public FeatureNotFoundException(String message, String feature, List availableFeatures) { + super(message); + this.feature = feature; + this.availableFeatures = availableFeatures; + } + + @Override + public String getTemplateName() { + return "feature_not_found"; + } + + @Override + public Object getTemplateModel() { + HashMap parameters = new HashMap<>(); + parameters.put("featureName", this.feature); + parameters.put("availableFeatures", this.availableFeatures); + return parameters; + } +} diff --git a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/service/FeatureFlagService.java b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/service/FeatureFlagService.java index d35197665..5f5afe8c3 100644 --- a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/service/FeatureFlagService.java +++ b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/service/FeatureFlagService.java @@ -2,4 +2,6 @@ package dev.sheldan.abstracto.core.service; public interface FeatureFlagService { boolean isFeatureEnabled(String name, Long serverId); + void enableFeature(String name, Long serverId); + void disableFeature(String name, Long serverId); } diff --git a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/service/management/FeatureFlagManagementService.java b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/service/management/FeatureFlagManagementService.java index 5e8cdfdb4..06f7414b0 100644 --- a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/service/management/FeatureFlagManagementService.java +++ b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/service/management/FeatureFlagManagementService.java @@ -9,6 +9,6 @@ public interface FeatureFlagManagementService { void createFeatureFlag(String key, Long serverId, Boolean newValue); void createFeatureFlag(String key, AServer server, Boolean newValue); boolean getFeatureFlagValue(String key, Long serverId); - void updateOrCreateFeatureFlag(String key, Long serverId, Boolean newValue); + void updateFeatureFlag(String key, Long serverId, Boolean newValue); Optional getFeatureFlag(String key, Long serverId); }