[AB-190] migrating default config (featureMode, system config, post targets, feature flags) from tables to property files

not longer immediately instantiating the feature flag instance when a new server is found, but only when its config is changed or when a feature mod has its config changed
This commit is contained in:
Sheldan
2021-02-11 00:09:58 +01:00
parent ea12d67e5f
commit 047c574319
98 changed files with 654 additions and 1356 deletions

View File

@@ -1,55 +0,0 @@
package dev.sheldan.abstracto.core.models.database;
import lombok.*;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import javax.persistence.*;
import java.io.Serializable;
import java.time.Instant;
@Entity
@Table(name="default_config")
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Getter
@EqualsAndHashCode
@Cacheable
@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class ADefaultConfig implements Serializable {
@javax.persistence.Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column
private String name;
@Column(name = "string_value")
@Setter
private String stringValue;
@Column(name = "double_value")
@Setter
private Double doubleValue;
@Column(name = "long_value")
@Setter
private Long longValue;
@Column(name = "created")
private Instant created;
@Column(name = "updated")
private Instant updated;
public String getValueAsString() {
if(getLongValue() != null) {
return getLongValue().toString();
} else if(getDoubleValue() != null) {
return getDoubleValue().toString();
} else if(getStringValue() != null) {
return getStringValue();
}
return null;
}
}

View File

@@ -27,9 +27,8 @@ public class AFeatureMode implements Serializable {
@JoinColumn(name = "feature_flag_id", nullable = false)
private AFeatureFlag featureFlag;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "feature_mode_id", nullable = false)
private DefaultFeatureMode featureMode;
@Column(name = "feature_mode")
private String featureMode;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "server_id", nullable = false)

View File

@@ -1,44 +0,0 @@
package dev.sheldan.abstracto.core.models.database;
import lombok.*;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import javax.persistence.*;
import java.io.Serializable;
import java.time.Instant;
@Entity
@Table(name="default_feature_flag")
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode
@Cacheable
@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class DefaultFeatureFlag implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Getter
@Column(name = "id")
public Long id;
@Getter
@Setter
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "feature_id", nullable = false)
private AFeature feature;
@Getter
@Setter
@Column(name = "enabled")
private boolean enabled;
@Column(name = "created")
private Instant created;
@Column(name = "updated")
private Instant updated;
}

View File

@@ -1,55 +0,0 @@
package dev.sheldan.abstracto.core.models.database;
import lombok.*;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import javax.persistence.*;
import java.io.Serializable;
import java.time.Instant;
import java.util.List;
@Entity
@Table(name="default_feature_mode")
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode
@Cacheable
@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class DefaultFeatureMode implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Getter
@Column(name = "id")
public Long id;
@Getter
@Setter
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "feature_id", nullable = false)
private AFeature feature;
@Getter
@Setter
@OneToMany(fetch = FetchType.LAZY, mappedBy = "featureMode")
@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
private List<AFeatureMode> modes;
@Getter
@Setter
@Column(name = "enabled")
private boolean enabled;
@Getter
@Setter
@Column(name = "mode")
private String mode;
@Column(name = "created")
private Instant created;
@Column(name = "updated")
private Instant updated;
}

View File

@@ -1,36 +0,0 @@
package dev.sheldan.abstracto.core.models.database;
import lombok.*;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import javax.persistence.*;
import java.io.Serializable;
import java.time.Instant;
@Entity
@Table(name="default_posttarget")
@Builder
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode
@Cacheable
@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class DefaultPostTarget implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Getter
@Column(name = "id")
private Long id;
@Getter
@Column(name = "name")
private String name;
@Column(name = "created")
private Instant created;
@Column(name = "updated")
private Instant updated;
}

View File

@@ -0,0 +1,15 @@
package dev.sheldan.abstracto.core.models.property;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class FeatureFlagProperty {
private String featureName;
private Boolean enabled;
}

View File

@@ -0,0 +1,16 @@
package dev.sheldan.abstracto.core.models.property;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class FeatureModeProperty {
private String featureName;
private String mode;
private Boolean enabled;
}

View File

@@ -0,0 +1,14 @@
package dev.sheldan.abstracto.core.models.property;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class PostTargetProperty {
private String name;
}

View File

@@ -0,0 +1,17 @@
package dev.sheldan.abstracto.core.models.property;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class SystemConfigProperty {
private String name;
private Long longValue;
private String stringValue;
private Double doubleValue;
}

View File

@@ -0,0 +1,15 @@
package dev.sheldan.abstracto.core.models.template.commands;
import dev.sheldan.abstracto.core.config.FeatureConfig;
import dev.sheldan.abstracto.core.models.property.FeatureFlagProperty;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@Builder
public class DefaultFeatureFlagDisplay {
private FeatureFlagProperty featureFlagProperty;
private FeatureConfig featureConfig;
}

View File

@@ -12,4 +12,5 @@ import java.util.List;
@Setter
public class FeaturesModel extends UserInitiatedServerContext {
private List<FeatureFlagDisplay> features;
private List<DefaultFeatureFlagDisplay> defaultFeatures;
}

View File

@@ -1,6 +1,6 @@
package dev.sheldan.abstracto.core.models.template.commands;
import dev.sheldan.abstracto.core.models.database.ADefaultConfig;
import dev.sheldan.abstracto.core.models.property.SystemConfigProperty;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
@@ -10,5 +10,5 @@ import lombok.Setter;
@Builder
public class SetupSystemConfigMessageModel {
private String configKey;
private ADefaultConfig defaultConfig;
private SystemConfigProperty defaultConfig;
}

View File

@@ -12,6 +12,8 @@ public interface FeatureFlagService {
void enableFeature(FeatureConfig name, AServer server);
void disableFeature(FeatureConfig name, Long serverId);
void disableFeature(FeatureConfig name, AServer server);
AFeatureFlag createInstanceFromDefaultConfig(FeatureEnum name, Long serverId);
AFeatureFlag createInstanceFromDefaultConfig(FeatureEnum name, AServer server);
boolean getFeatureFlagValue(FeatureEnum key, Long serverId);
boolean getFeatureFlagValue(FeatureEnum key, AServer server);
AFeatureFlag updateFeatureFlag(FeatureEnum key, Long serverId, Boolean newValue);

View File

@@ -1,10 +1,7 @@
package dev.sheldan.abstracto.core.service.management;
import dev.sheldan.abstracto.core.models.database.ADefaultConfig;
import dev.sheldan.abstracto.core.models.property.SystemConfigProperty;
public interface DefaultConfigManagementService {
void createDefaultConfig(String key, String value);
void createDefaultConfig(String key, Long value);
void createDefaultConfig(String key, Double value);
ADefaultConfig getDefaultConfig(String key);
SystemConfigProperty getDefaultConfig(String key);
}

View File

@@ -1,10 +1,14 @@
package dev.sheldan.abstracto.core.service.management;
import dev.sheldan.abstracto.core.models.database.DefaultFeatureFlag;
import dev.sheldan.abstracto.core.config.FeatureEnum;
import dev.sheldan.abstracto.core.models.database.AFeature;
import dev.sheldan.abstracto.core.models.property.FeatureFlagProperty;
import java.util.List;
public interface DefaultFeatureFlagManagementService {
List<String> getDefaultFeatureKeys();
List<DefaultFeatureFlag> getAllDefaultFeatureFlags();
FeatureFlagProperty getDefaultFeatureFlagProperty(AFeature feature);
FeatureFlagProperty getDefaultFeatureFlagProperty(FeatureEnum feature);
List<FeatureFlagProperty> getAllDefaultFeatureFlags();
}

View File

@@ -1,14 +1,14 @@
package dev.sheldan.abstracto.core.service.management;
import dev.sheldan.abstracto.core.models.database.AFeature;
import dev.sheldan.abstracto.core.models.database.DefaultFeatureMode;
import dev.sheldan.abstracto.core.models.property.FeatureModeProperty;
import java.util.List;
import java.util.Optional;
public interface DefaultFeatureModeManagement {
List<DefaultFeatureMode> getFeatureModesForFeature(AFeature feature);
List<DefaultFeatureMode> getAll();
Optional<DefaultFeatureMode> getFeatureModeOptional(AFeature feature, String mode);
DefaultFeatureMode getFeatureMode(AFeature feature, String mode);
List<FeatureModeProperty> getFeatureModesForFeature(AFeature feature);
List<FeatureModeProperty> getAll();
Optional<FeatureModeProperty> getFeatureModeOptional(AFeature feature, String mode);
FeatureModeProperty getFeatureMode(AFeature feature, String mode);
}

View File

@@ -1,10 +1,10 @@
package dev.sheldan.abstracto.core.service.management;
import dev.sheldan.abstracto.core.models.database.DefaultPostTarget;
import dev.sheldan.abstracto.core.models.property.PostTargetProperty;
import java.util.List;
public interface DefaultPostTargetManagementService {
List<DefaultPostTarget> getAllDefaultPostTargets();
List<PostTargetProperty> getAllDefaultPostTargets();
List<String> getDefaultPostTargetKeys();
}

View File

@@ -5,13 +5,16 @@ import dev.sheldan.abstracto.core.models.database.AFeatureFlag;
import dev.sheldan.abstracto.core.models.database.AServer;
import java.util.List;
import java.util.Optional;
public interface FeatureFlagManagementService {
AFeatureFlag createFeatureFlag(AFeature feature, Long serverId, Boolean newValue);
AFeatureFlag createFeatureFlag(AFeature feature, AServer server, Boolean newValue);
AFeatureFlag getFeatureFlag(AFeature key, Long serverId);
Optional<AFeatureFlag> getFeatureFlag(AFeature feature, Long serverId);
Optional<AFeatureFlag> getFeatureFlag(String featureKey, Long serverId);
Optional<AFeatureFlag> getFeatureFlag(String featureKey, AServer server);
boolean featureFlagExists(AFeature feature, AServer server);
AFeatureFlag getFeatureFlag(AFeature key, AServer server);
Optional<AFeatureFlag> getFeatureFlag(AFeature feature, AServer server);
List<AFeatureFlag> getFeatureFlagsOfServer(AServer server);
AFeatureFlag setFeatureFlagValue(AFeature feature, Long serverId, Boolean newValue);
AFeatureFlag setFeatureFlagValue(AFeature feature, AServer server, Boolean newValue);