added the concept of feature modes, these are the modes in which a feature can operate, its basically a separate way how the feature does it jobs, for example mod mail might log or it might not. bot of these are different modes

refactored services for feature flag and feature config
This commit is contained in:
Sheldan
2020-05-16 20:55:13 +02:00
parent cd80d27795
commit d2264937b2
35 changed files with 656 additions and 138 deletions

View File

@@ -4,6 +4,7 @@ import dev.sheldan.abstracto.core.command.Command;
import dev.sheldan.abstracto.core.command.execution.CommandContext;
import dev.sheldan.abstracto.core.command.models.FeatureDisabledMessage;
import dev.sheldan.abstracto.core.config.FeatureEnum;
import dev.sheldan.abstracto.core.service.FeatureConfigService;
import dev.sheldan.abstracto.core.service.FeatureFlagService;
import dev.sheldan.abstracto.templating.service.TemplateService;
import org.springframework.beans.factory.annotation.Autowired;
@@ -15,6 +16,9 @@ public class FeatureEnabledCondition implements CommandCondition {
@Autowired
private TemplateService templateService;
@Autowired
private FeatureConfigService featureConfigService;
@Autowired
private FeatureFlagService featureFlagService;
@@ -28,7 +32,7 @@ public class FeatureEnabledCondition implements CommandCondition {
if(!featureFlagValue) {
FeatureDisabledMessage featureDisabledMessage = FeatureDisabledMessage
.builder()
.featureConfig(featureFlagService.getFeatureDisplayForFeature(feature))
.featureConfig(featureConfigService.getFeatureDisplayForFeature(feature))
.build();
reason = templateService.renderTemplate("feature_disabled_message", featureDisabledMessage);
}

View File

@@ -17,4 +17,5 @@ public interface FeatureConfig {
default List<String> getRequiredSystemConfigKeys() { return Collections.emptyList();}
default List<FeatureValidator> getAdditionalFeatureValidators() { return Collections.emptyList(); }
default List<String> getRequiredEmotes() { return Collections.emptyList(); }
default List<FeatureMode> getAvailableModes() { return Collections.emptyList(); };
}

View File

@@ -0,0 +1,5 @@
package dev.sheldan.abstracto.core.config;
public interface FeatureMode {
String getKey();
}

View File

@@ -0,0 +1,13 @@
package dev.sheldan.abstracto.core.models.config;
import lombok.*;
@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class FeaturePropertiesConfig {
private Boolean enabled;
private String defaultMode;
}

View File

@@ -0,0 +1,49 @@
package dev.sheldan.abstracto.core.models.database;
import lombok.*;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import javax.persistence.*;
import java.time.Instant;
@Entity
@Table(name="feature_modes")
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Cacheable
@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class AFeatureMode {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Getter
@Column(name = "id")
public Long id;
@Getter
@Setter
@OneToOne
@JoinColumn(name = "feature_flag_id", nullable = false)
private AFeatureFlag featureFlag;
@Column
@Setter
private String mode;
@Column(name = "created")
private Instant created;
@PrePersist
private void onInsert() {
this.created = Instant.now();
}
@Column(name = "updated")
private Instant updateTimestamp;
@PreUpdate
private void onUpdate() {
this.updateTimestamp = Instant.now();
}
}

View File

@@ -0,0 +1,25 @@
package dev.sheldan.abstracto.core.service;
import dev.sheldan.abstracto.core.config.FeatureConfig;
import dev.sheldan.abstracto.core.config.FeatureEnum;
import dev.sheldan.abstracto.core.config.FeatureMode;
import dev.sheldan.abstracto.core.config.PostTargetEnum;
import dev.sheldan.abstracto.core.models.FeatureValidationResult;
import dev.sheldan.abstracto.core.models.database.AServer;
import java.util.List;
public interface FeatureConfigService {
List<String> getAllFeatures();
List<FeatureConfig> getAllFeatureConfigs();
FeatureConfig getFeatureDisplayForFeature(FeatureEnum featureEnum);
FeatureConfig getFeatureDisplayForFeature(String key);
boolean doesFeatureExist(FeatureConfig name);
boolean doesFeatureExist(String name);
List<String> getFeaturesAsList();
FeatureEnum getFeatureEnum(String key);
PostTargetEnum getPostTargetEnumByKey(String key);
FeatureValidationResult validateFeatureSetup(FeatureConfig featureConfig, AServer server);
FeatureMode getFeatureModeByKey(String key);
boolean isModeValid(String featureName, String modeName);
}

View File

@@ -2,13 +2,9 @@ package dev.sheldan.abstracto.core.service;
import dev.sheldan.abstracto.core.config.FeatureConfig;
import dev.sheldan.abstracto.core.config.FeatureEnum;
import dev.sheldan.abstracto.core.config.PostTargetEnum;
import dev.sheldan.abstracto.core.models.FeatureValidationResult;
import dev.sheldan.abstracto.core.models.database.AFeatureFlag;
import dev.sheldan.abstracto.core.models.database.AServer;
import java.util.List;
public interface FeatureFlagService {
boolean isFeatureEnabled(FeatureConfig name, Long serverId);
boolean isFeatureEnabled(FeatureConfig name, AServer server);
@@ -16,17 +12,8 @@ public interface FeatureFlagService {
void enableFeature(FeatureConfig name, AServer server);
void disableFeature(FeatureConfig name, Long serverId);
void disableFeature(FeatureConfig name, AServer server);
List<String> getAllFeatures();
List<FeatureConfig> getAllFeatureConfigs();
FeatureConfig getFeatureDisplayForFeature(FeatureEnum featureEnum);
FeatureConfig getFeatureDisplayForFeature(String key);
boolean doesFeatureExist(FeatureConfig name);
List<String> getFeaturesAsList();
FeatureEnum getFeatureEnum(String key);
PostTargetEnum getPostTargetEnumByKey(String key);
boolean getFeatureFlagValue(FeatureEnum key, Long serverId);
boolean getFeatureFlagValue(FeatureEnum key, AServer server);
AFeatureFlag updateFeatureFlag(FeatureEnum key, Long serverId, Boolean newValue);
AFeatureFlag updateFeatureFlag(FeatureEnum key, AServer server, Boolean newValue);
FeatureValidationResult validateFeatureSetup(FeatureConfig featureConfig, AServer server);
}

View File

@@ -0,0 +1,26 @@
package dev.sheldan.abstracto.core.service;
import dev.sheldan.abstracto.core.config.FeatureEnum;
import dev.sheldan.abstracto.core.config.FeatureMode;
import dev.sheldan.abstracto.core.models.database.AFeature;
import dev.sheldan.abstracto.core.models.database.AFeatureFlag;
import dev.sheldan.abstracto.core.models.database.AFeatureMode;
import dev.sheldan.abstracto.core.models.database.AServer;
public interface FeatureModeService {
AFeatureMode setModeForFeatureTo(String key, AServer server, String newMode);
AFeatureMode setModeForFeatureTo(AFeatureFlag flag, String newMode);
AFeatureMode setModeForFeatureTo(FeatureEnum featureEnum, AServer server, String newMode);
AFeatureMode setModeForFeatureTo(AFeature featureEnum, AServer server, String newMode);
AFeatureMode setModeForFeatureTo(FeatureEnum featureEnum, AServer server, FeatureMode mode);
AFeatureMode setModeForFeatureTo(AFeature feature, AServer server, FeatureMode mode);
AFeatureMode setModeForFeatureTo(AFeatureFlag featureFlag, FeatureMode mode);
AFeatureMode createMode(String key, AServer server, String newMode);
AFeatureMode createMode(AFeatureFlag flag, String newMode);
AFeatureMode createMode(FeatureEnum featureEnum, AServer server, String newMode);
AFeatureMode createMode(AFeature featureEnum, AServer server, String newMode);
AFeatureMode createMode(FeatureEnum featureEnum, AServer server, FeatureMode mode);
AFeatureMode createMode(AFeature feature, AServer server, FeatureMode mode);
AFeatureMode createMode(AFeatureFlag featureFlag, FeatureMode mode);
}

View File

@@ -0,0 +1,14 @@
package dev.sheldan.abstracto.core.service.management;
import dev.sheldan.abstracto.core.config.FeatureMode;
import dev.sheldan.abstracto.core.models.database.AFeature;
import dev.sheldan.abstracto.core.models.database.AFeatureFlag;
import dev.sheldan.abstracto.core.models.database.AFeatureMode;
import dev.sheldan.abstracto.core.models.database.AServer;
public interface FeatureModeManagementService {
AFeatureMode createMode(AFeatureFlag featureFlag, FeatureMode mode);
AFeatureMode getModeForFeature(AFeatureFlag featureFlag);
boolean featureModeSet(AFeature aFeature, AServer server);
AFeatureMode setModeForFeature(AFeatureFlag featureFlag, FeatureMode featureMode);
}