mirror of
https://github.com/Sheldan/abstracto.git
synced 2026-06-16 23:33:48 +00:00
[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:
@@ -0,0 +1,10 @@
|
|||||||
|
package dev.sheldan.abstracto.assignableroles.config;
|
||||||
|
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
import org.springframework.context.annotation.PropertySource;
|
||||||
|
|
||||||
|
@Configuration
|
||||||
|
@PropertySource("classpath:assignableRoles-config.properties")
|
||||||
|
public class AssignableRolesConfig {
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
abstracto.featureFlags.emoteTracking.featureName=emoteTracking
|
||||||
|
abstracto.featureFlags.emoteTracking.enabled=false
|
||||||
@@ -9,5 +9,4 @@
|
|||||||
<include file="feature.xml" relativeToChangelogFile="true"/>
|
<include file="feature.xml" relativeToChangelogFile="true"/>
|
||||||
<include file="module.xml" relativeToChangelogFile="true"/>
|
<include file="module.xml" relativeToChangelogFile="true"/>
|
||||||
<include file="command.xml" relativeToChangelogFile="true"/>
|
<include file="command.xml" relativeToChangelogFile="true"/>
|
||||||
<include file="default_feature_flag.xml" relativeToChangelogFile="true"/>
|
|
||||||
</databaseChangeLog>
|
</databaseChangeLog>
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
|
|
||||||
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
|
|
||||||
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
|
|
||||||
xmlns:pro="http://www.liquibase.org/xml/ns/pro"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog ../../dbchangelog-3.8.xsd
|
|
||||||
http://www.liquibase.org/xml/ns/dbchangelog-ext ../../dbchangelog-3.8.xsd
|
|
||||||
http://www.liquibase.org/xml/ns/pro ../../dbchangelog-3.8.xsd" >
|
|
||||||
<property name="assignableFeature" value="(SELECT id FROM feature WHERE key = 'assignableRole')"/>
|
|
||||||
<property name="today" value="(SELECT NOW())"/>
|
|
||||||
<changeSet author="Sheldan" id="assignableRole_default_feature_flag-insertion">
|
|
||||||
<insert tableName="default_feature_flag">
|
|
||||||
<column name="enabled" value="false"/>
|
|
||||||
<column name="feature_id" valueComputed="${assignableFeature}" />
|
|
||||||
<column name="created" valueComputed="${today}"/>
|
|
||||||
</insert>
|
|
||||||
</changeSet>
|
|
||||||
</databaseChangeLog>
|
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
package dev.sheldan.abstracto.experience.config;
|
||||||
|
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
import org.springframework.context.annotation.PropertySource;
|
||||||
|
|
||||||
|
@Configuration
|
||||||
|
@PropertySource("classpath:experience-config.properties")
|
||||||
|
public class ExperienceConfig {
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
abstracto.systemConfigs.minExp.name=minExp
|
||||||
|
abstracto.systemConfigs.minExp.longValue=10
|
||||||
|
abstracto.systemConfigs.maxExp.name=maxExp
|
||||||
|
abstracto.systemConfigs.maxExp.longValue=25
|
||||||
|
abstracto.systemConfigs.expMultiplier.name=expMultiplier
|
||||||
|
abstracto.systemConfigs.expMultiplier.longValue=1
|
||||||
|
|
||||||
|
abstracto.featureFlags.experience.featureName=experience
|
||||||
|
abstracto.featureFlags.experience.enabled=false
|
||||||
@@ -10,7 +10,5 @@
|
|||||||
<include file="feature.xml" relativeToChangelogFile="true"/>
|
<include file="feature.xml" relativeToChangelogFile="true"/>
|
||||||
<include file="module.xml" relativeToChangelogFile="true"/>
|
<include file="module.xml" relativeToChangelogFile="true"/>
|
||||||
<include file="command.xml" relativeToChangelogFile="true"/>
|
<include file="command.xml" relativeToChangelogFile="true"/>
|
||||||
<include file="default_config.xml" relativeToChangelogFile="true"/>
|
|
||||||
<include file="experience_job.xml" relativeToChangelogFile="true"/>
|
<include file="experience_job.xml" relativeToChangelogFile="true"/>
|
||||||
<include file="default_feature_flag.xml" relativeToChangelogFile="true"/>
|
|
||||||
</databaseChangeLog>
|
</databaseChangeLog>
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
|
|
||||||
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
|
|
||||||
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
|
|
||||||
xmlns:pro="http://www.liquibase.org/xml/ns/pro"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog ../../dbchangelog-3.8.xsd
|
|
||||||
http://www.liquibase.org/xml/ns/dbchangelog-ext ../../dbchangelog-3.8.xsd
|
|
||||||
http://www.liquibase.org/xml/ns/pro ../../dbchangelog-3.8.xsd" >
|
|
||||||
<property name="today" value="(SELECT NOW())"/>
|
|
||||||
<changeSet author="Sheldan" id="experience_default_config-insert">
|
|
||||||
<insert tableName="default_config">
|
|
||||||
<column name="name" value="minExp"/>
|
|
||||||
<column name="long_value" value="10"/>
|
|
||||||
<column name="created" valueComputed="${today}"/>
|
|
||||||
</insert>
|
|
||||||
<insert tableName="default_config">
|
|
||||||
<column name="name" value="maxExp"/>
|
|
||||||
<column name="long_value" value="25"/>
|
|
||||||
<column name="created" valueComputed="${today}"/>
|
|
||||||
</insert>
|
|
||||||
<insert tableName="default_config">
|
|
||||||
<column name="name" value="expMultiplier"/>
|
|
||||||
<column name="double_value" value="1"/>
|
|
||||||
<column name="created" valueComputed="${today}"/>
|
|
||||||
</insert>
|
|
||||||
</changeSet>
|
|
||||||
|
|
||||||
</databaseChangeLog>
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
|
|
||||||
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
|
|
||||||
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
|
|
||||||
xmlns:pro="http://www.liquibase.org/xml/ns/pro"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog ../../dbchangelog-3.8.xsd
|
|
||||||
http://www.liquibase.org/xml/ns/dbchangelog-ext ../../dbchangelog-3.8.xsd
|
|
||||||
http://www.liquibase.org/xml/ns/pro ../../dbchangelog-3.8.xsd" >
|
|
||||||
<property name="experienceFeature" value="(SELECT id FROM feature WHERE key = 'experience')"/>
|
|
||||||
<property name="today" value="(SELECT NOW())"/>
|
|
||||||
<changeSet author="Sheldan" id="experience_default_feature_flag-insertion">
|
|
||||||
<insert tableName="default_feature_flag">
|
|
||||||
<column name="enabled" value="false"/>
|
|
||||||
<column name="feature_id" valueComputed="${experienceFeature}" />
|
|
||||||
<column name="created" valueComputed="${today}"/>
|
|
||||||
</insert>
|
|
||||||
</changeSet>
|
|
||||||
</databaseChangeLog>
|
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
package dev.sheldan.abstracto.moderation.config;
|
||||||
|
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
import org.springframework.context.annotation.PropertySource;
|
||||||
|
|
||||||
|
@Configuration
|
||||||
|
@PropertySource("classpath:moderation-config.properties")
|
||||||
|
public class ModerationConfig {
|
||||||
|
}
|
||||||
|
|
||||||
@@ -6,13 +6,9 @@
|
|||||||
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog ../../dbchangelog-3.8.xsd
|
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog ../../dbchangelog-3.8.xsd
|
||||||
http://www.liquibase.org/xml/ns/dbchangelog-ext ../../dbchangelog-3.8.xsd
|
http://www.liquibase.org/xml/ns/dbchangelog-ext ../../dbchangelog-3.8.xsd
|
||||||
http://www.liquibase.org/xml/ns/pro ../../dbchangelog-3.8.xsd" >
|
http://www.liquibase.org/xml/ns/pro ../../dbchangelog-3.8.xsd" >
|
||||||
<include file="default_config.xml" relativeToChangelogFile="true"/>
|
|
||||||
<include file="un_mute_job.xml" relativeToChangelogFile="true"/>
|
<include file="un_mute_job.xml" relativeToChangelogFile="true"/>
|
||||||
<include file="module.xml" relativeToChangelogFile="true"/>
|
<include file="module.xml" relativeToChangelogFile="true"/>
|
||||||
<include file="warn_decay_job.xml" relativeToChangelogFile="true"/>
|
<include file="warn_decay_job.xml" relativeToChangelogFile="true"/>
|
||||||
<include file="feature.xml" relativeToChangelogFile="true"/>
|
<include file="feature.xml" relativeToChangelogFile="true"/>
|
||||||
<include file="default_posttarget.xml" relativeToChangelogFile="true"/>
|
|
||||||
<include file="default_feature_flag.xml" relativeToChangelogFile="true"/>
|
|
||||||
<include file="default_feature_mode.xml" relativeToChangelogFile="true"/>
|
|
||||||
<include file="command.xml" relativeToChangelogFile="true"/>
|
<include file="command.xml" relativeToChangelogFile="true"/>
|
||||||
</databaseChangeLog>
|
</databaseChangeLog>
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
|
|
||||||
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
|
|
||||||
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
|
|
||||||
xmlns:pro="http://www.liquibase.org/xml/ns/pro"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog ../../dbchangelog-3.8.xsd
|
|
||||||
http://www.liquibase.org/xml/ns/dbchangelog-ext ../../dbchangelog-3.8.xsd
|
|
||||||
http://www.liquibase.org/xml/ns/pro ../../dbchangelog-3.8.xsd">
|
|
||||||
<property name="today" value="(SELECT NOW())"/>
|
|
||||||
<changeSet author="Sheldan" id="moderation_default_config-insert">
|
|
||||||
<insert tableName="default_config">
|
|
||||||
<column name="name" value="decayDays"/>
|
|
||||||
<column name="long_value" value="90"/>
|
|
||||||
<column name="created" valueComputed="${today}"/>
|
|
||||||
</insert>
|
|
||||||
</changeSet>
|
|
||||||
|
|
||||||
</databaseChangeLog>
|
|
||||||
@@ -1,54 +0,0 @@
|
|||||||
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
|
|
||||||
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
|
|
||||||
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
|
|
||||||
xmlns:pro="http://www.liquibase.org/xml/ns/pro"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog ../../dbchangelog-3.8.xsd
|
|
||||||
http://www.liquibase.org/xml/ns/dbchangelog-ext ../../dbchangelog-3.8.xsd
|
|
||||||
http://www.liquibase.org/xml/ns/pro ../../dbchangelog-3.8.xsd" >
|
|
||||||
<property name="moderationFeature" value="(SELECT id FROM feature WHERE key = 'moderation')"/>
|
|
||||||
<property name="warningsFeature" value="(SELECT id FROM feature WHERE key = 'warnings')"/>
|
|
||||||
<property name="warnDecayFeature" value="(SELECT id FROM feature WHERE key = 'warnDecay')"/>
|
|
||||||
<property name="loggingFeature" value="(SELECT id FROM feature WHERE key = 'logging')"/>
|
|
||||||
<property name="mutingFeature" value="(SELECT id FROM feature WHERE key = 'muting')"/>
|
|
||||||
<property name="userNotesFeature" value="(SELECT id FROM feature WHERE key = 'userNotes')"/>
|
|
||||||
<property name="inviteLinkFilteringFeature" value="(SELECT id FROM feature WHERE key = 'inviteFilter')"/>
|
|
||||||
<property name="today" value="(SELECT NOW())"/>
|
|
||||||
<changeSet author="Sheldan" id="moderation_default_feature_flag-insertion">
|
|
||||||
<insert tableName="default_feature_flag">
|
|
||||||
<column name="enabled" value="false"/>
|
|
||||||
<column name="feature_id" valueComputed="${moderationFeature}" />
|
|
||||||
<column name="created" valueComputed="${today}"/>
|
|
||||||
</insert>
|
|
||||||
<insert tableName="default_feature_flag">
|
|
||||||
<column name="enabled" value="false"/>
|
|
||||||
<column name="feature_id" valueComputed="${warningsFeature}" />
|
|
||||||
<column name="created" valueComputed="${today}"/>
|
|
||||||
</insert>
|
|
||||||
<insert tableName="default_feature_flag">
|
|
||||||
<column name="enabled" value="false"/>
|
|
||||||
<column name="feature_id" valueComputed="${warnDecayFeature}" />
|
|
||||||
<column name="created" valueComputed="${today}"/>
|
|
||||||
</insert>
|
|
||||||
<insert tableName="default_feature_flag">
|
|
||||||
<column name="enabled" value="false"/>
|
|
||||||
<column name="feature_id" valueComputed="${loggingFeature}" />
|
|
||||||
<column name="created" valueComputed="${today}"/>
|
|
||||||
</insert>
|
|
||||||
<insert tableName="default_feature_flag">
|
|
||||||
<column name="enabled" value="false"/>
|
|
||||||
<column name="feature_id" valueComputed="${mutingFeature}" />
|
|
||||||
<column name="created" valueComputed="${today}"/>
|
|
||||||
</insert>
|
|
||||||
<insert tableName="default_feature_flag">
|
|
||||||
<column name="enabled" value="false"/>
|
|
||||||
<column name="feature_id" valueComputed="${userNotesFeature}" />
|
|
||||||
<column name="created" valueComputed="${today}"/>
|
|
||||||
</insert>
|
|
||||||
<insert tableName="default_feature_flag">
|
|
||||||
<column name="enabled" value="false"/>
|
|
||||||
<column name="feature_id" valueComputed="${inviteLinkFilteringFeature}" />
|
|
||||||
<column name="created" valueComputed="${today}"/>
|
|
||||||
</insert>
|
|
||||||
</changeSet>
|
|
||||||
</databaseChangeLog>
|
|
||||||
@@ -1,77 +0,0 @@
|
|||||||
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
|
|
||||||
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
|
|
||||||
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
|
|
||||||
xmlns:pro="http://www.liquibase.org/xml/ns/pro"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog ../../dbchangelog-3.8.xsd
|
|
||||||
http://www.liquibase.org/xml/ns/dbchangelog-ext ../../dbchangelog-3.8.xsd
|
|
||||||
http://www.liquibase.org/xml/ns/pro ../../dbchangelog-3.8.xsd" >
|
|
||||||
<property name="moderationFeature" value="(SELECT id FROM feature WHERE key = 'moderation')"/>
|
|
||||||
<property name="warningsFeature" value="(SELECT id FROM feature WHERE key = 'warnings')"/>
|
|
||||||
<property name="warnDecayFeature" value="(SELECT id FROM feature WHERE key = 'warnDecay')"/>
|
|
||||||
<property name="mutingFeature" value="(SELECT id FROM feature WHERE key = 'muting')"/>
|
|
||||||
<property name="inviteLinkFilteringFeature" value="(SELECT id FROM feature WHERE key = 'inviteFilter')"/>
|
|
||||||
<property name="today" value="(SELECT NOW())"/>
|
|
||||||
<changeSet author="Sheldan" id="moderation_default_feature_mode-insertion">
|
|
||||||
<insert tableName="default_feature_mode">
|
|
||||||
<column name="enabled" value="true"/>
|
|
||||||
<column name="mode" value="banLogging"/>
|
|
||||||
<column name="feature_id" valueComputed="${moderationFeature}" />
|
|
||||||
<column name="created" valueComputed="${today}"/>
|
|
||||||
</insert>
|
|
||||||
<insert tableName="default_feature_mode">
|
|
||||||
<column name="enabled" value="true"/>
|
|
||||||
<column name="mode" value="kickLogging"/>
|
|
||||||
<column name="feature_id" valueComputed="${moderationFeature}" />
|
|
||||||
<column name="created" valueComputed="${today}"/>
|
|
||||||
</insert>
|
|
||||||
<insert tableName="default_feature_mode">
|
|
||||||
<column name="enabled" value="true"/>
|
|
||||||
<column name="mode" value="warnLogging"/>
|
|
||||||
<column name="feature_id" valueComputed="${warningsFeature}" />
|
|
||||||
<column name="created" valueComputed="${today}"/>
|
|
||||||
</insert>
|
|
||||||
<insert tableName="default_feature_mode">
|
|
||||||
<column name="enabled" value="true"/>
|
|
||||||
<column name="mode" value="warnDecayLogging"/>
|
|
||||||
<column name="feature_id" valueComputed="${warningsFeature}" />
|
|
||||||
<column name="created" valueComputed="${today}"/>
|
|
||||||
</insert>
|
|
||||||
<insert tableName="default_feature_mode">
|
|
||||||
<column name="enabled" value="true"/>
|
|
||||||
<column name="mode" value="automaticWarnDecayLogging"/>
|
|
||||||
<column name="feature_id" valueComputed="${warningsFeature}" />
|
|
||||||
<column name="created" valueComputed="${today}"/>
|
|
||||||
</insert>
|
|
||||||
<insert tableName="default_feature_mode">
|
|
||||||
<column name="enabled" value="true"/>
|
|
||||||
<column name="mode" value="muteLogging"/>
|
|
||||||
<column name="feature_id" valueComputed="${mutingFeature}" />
|
|
||||||
<column name="created" valueComputed="${today}"/>
|
|
||||||
</insert>
|
|
||||||
<insert tableName="default_feature_mode">
|
|
||||||
<column name="enabled" value="true"/>
|
|
||||||
<column name="mode" value="unMuteLogging"/>
|
|
||||||
<column name="feature_id" valueComputed="${mutingFeature}" />
|
|
||||||
<column name="created" valueComputed="${today}"/>
|
|
||||||
</insert>
|
|
||||||
<insert tableName="default_feature_mode">
|
|
||||||
<column name="enabled" value="true"/>
|
|
||||||
<column name="mode" value="manualUnMuteLogging"/>
|
|
||||||
<column name="feature_id" valueComputed="${mutingFeature}" />
|
|
||||||
<column name="created" valueComputed="${today}"/>
|
|
||||||
</insert>
|
|
||||||
<insert tableName="default_feature_mode">
|
|
||||||
<column name="enabled" value="true"/>
|
|
||||||
<column name="mode" value="trackUses"/>
|
|
||||||
<column name="feature_id" valueComputed="${inviteLinkFilteringFeature}" />
|
|
||||||
<column name="created" valueComputed="${today}"/>
|
|
||||||
</insert>
|
|
||||||
<insert tableName="default_feature_mode">
|
|
||||||
<column name="enabled" value="true"/>
|
|
||||||
<column name="mode" value="filterNotifications"/>
|
|
||||||
<column name="feature_id" valueComputed="${inviteLinkFilteringFeature}" />
|
|
||||||
<column name="created" valueComputed="${today}"/>
|
|
||||||
</insert>
|
|
||||||
</changeSet>
|
|
||||||
</databaseChangeLog>
|
|
||||||
@@ -1,52 +0,0 @@
|
|||||||
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
|
|
||||||
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
|
|
||||||
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
|
|
||||||
xmlns:pro="http://www.liquibase.org/xml/ns/pro"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog ../../dbchangelog-3.8.xsd
|
|
||||||
http://www.liquibase.org/xml/ns/dbchangelog-ext ../../dbchangelog-3.8.xsd
|
|
||||||
http://www.liquibase.org/xml/ns/pro ../../dbchangelog-3.8.xsd" >
|
|
||||||
<property name="today" value="(SELECT NOW())"/>
|
|
||||||
<changeSet author="Sheldan" id="moderation_default_posttarget-insertion">
|
|
||||||
<insert tableName="default_posttarget">
|
|
||||||
<column name="name" value="joinLog"/>
|
|
||||||
<column name="created" valueComputed="${today}"/>
|
|
||||||
</insert>
|
|
||||||
<insert tableName="default_posttarget">
|
|
||||||
<column name="name" value="leaveLog"/>
|
|
||||||
<column name="created" valueComputed="${today}"/>
|
|
||||||
</insert>
|
|
||||||
<insert tableName="default_posttarget">
|
|
||||||
<column name="name" value="warnLog"/>
|
|
||||||
<column name="created" valueComputed="${today}"/>
|
|
||||||
</insert>
|
|
||||||
<insert tableName="default_posttarget">
|
|
||||||
<column name="name" value="kickLog"/>
|
|
||||||
<column name="created" valueComputed="${today}"/>
|
|
||||||
</insert>
|
|
||||||
<insert tableName="default_posttarget">
|
|
||||||
<column name="name" value="banLog"/>
|
|
||||||
<column name="created" valueComputed="${today}"/>
|
|
||||||
</insert>
|
|
||||||
<insert tableName="default_posttarget">
|
|
||||||
<column name="name" value="editLog"/>
|
|
||||||
<column name="created" valueComputed="${today}"/>
|
|
||||||
</insert>
|
|
||||||
<insert tableName="default_posttarget">
|
|
||||||
<column name="name" value="deleteLog"/>
|
|
||||||
<column name="created" valueComputed="${today}"/>
|
|
||||||
</insert>
|
|
||||||
<insert tableName="default_posttarget">
|
|
||||||
<column name="name" value="muteLog"/>
|
|
||||||
<column name="created" valueComputed="${today}"/>
|
|
||||||
</insert>
|
|
||||||
<insert tableName="default_posttarget">
|
|
||||||
<column name="name" value="decayLog"/>
|
|
||||||
<column name="created" valueComputed="${today}"/>
|
|
||||||
</insert>
|
|
||||||
<insert tableName="default_posttarget">
|
|
||||||
<column name="name" value="inviteDeleteLog"/>
|
|
||||||
<column name="created" valueComputed="${today}"/>
|
|
||||||
</insert>
|
|
||||||
</changeSet>
|
|
||||||
</databaseChangeLog>
|
|
||||||
@@ -0,0 +1,76 @@
|
|||||||
|
abstracto.systemConfigs.decayDays.name=decayDays
|
||||||
|
abstracto.systemConfigs.decayDays.longValue=90
|
||||||
|
|
||||||
|
abstracto.featureFlags.moderation.featureName=moderation
|
||||||
|
abstracto.featureFlags.moderation.enabled=false
|
||||||
|
|
||||||
|
abstracto.featureFlags.warnings.featureName=warnings
|
||||||
|
abstracto.featureFlags.warnings.enabled=false
|
||||||
|
|
||||||
|
abstracto.featureFlags.warnDecay.featureName=warnDecay
|
||||||
|
abstracto.featureFlags.warnDecay.enabled=false
|
||||||
|
|
||||||
|
abstracto.featureFlags.logging.featureName=logging
|
||||||
|
abstracto.featureFlags.logging.enabled=false
|
||||||
|
|
||||||
|
abstracto.featureFlags.muting.featureName=muting
|
||||||
|
abstracto.featureFlags.muting.enabled=false
|
||||||
|
|
||||||
|
abstracto.featureFlags.userNotes.featureName=userNotes
|
||||||
|
abstracto.featureFlags.userNotes.enabled=false
|
||||||
|
|
||||||
|
abstracto.featureFlags.inviteFilter.featureName=inviteFilter
|
||||||
|
abstracto.featureFlags.inviteFilter.enabled=false
|
||||||
|
|
||||||
|
abstracto.postTargets.joinLog.name=joinLog
|
||||||
|
abstracto.postTargets.leaveLog.name=leaveLog
|
||||||
|
abstracto.postTargets.warnLog.name=warnLog
|
||||||
|
abstracto.postTargets.kickLog.name=kickLog
|
||||||
|
abstracto.postTargets.banLog.name=banLog
|
||||||
|
abstracto.postTargets.editLog.name=editLog
|
||||||
|
abstracto.postTargets.deleteLog.name=deleteLog
|
||||||
|
abstracto.postTargets.muteLog.name=muteLog
|
||||||
|
abstracto.postTargets.decayLog.name=decayLog
|
||||||
|
abstracto.postTargets.inviteDeleteLog.name=inviteDeleteLog
|
||||||
|
|
||||||
|
|
||||||
|
abstracto.featureModes.banLogging.featureName=moderation
|
||||||
|
abstracto.featureModes.banLogging.mode=banLogging
|
||||||
|
abstracto.featureModes.banLogging.enabled=true
|
||||||
|
|
||||||
|
abstracto.featureModes.kickLogging.featureName=moderation
|
||||||
|
abstracto.featureModes.kickLogging.mode=kickLogging
|
||||||
|
abstracto.featureModes.kickLogging.enabled=true
|
||||||
|
|
||||||
|
abstracto.featureModes.warnLogging.featureName=warnings
|
||||||
|
abstracto.featureModes.warnLogging.mode=warnLogging
|
||||||
|
abstracto.featureModes.warnLogging.enabled=true
|
||||||
|
|
||||||
|
abstracto.featureModes.warnDecayLogging.featureName=warnings
|
||||||
|
abstracto.featureModes.warnDecayLogging.mode=warnDecayLogging
|
||||||
|
abstracto.featureModes.warnDecayLogging.enabled=true
|
||||||
|
|
||||||
|
abstracto.featureModes.automaticWarnDecayLogging.featureName=warnDecay
|
||||||
|
abstracto.featureModes.automaticWarnDecayLogging.mode=automaticWarnDecayLogging
|
||||||
|
abstracto.featureModes.automaticWarnDecayLogging.enabled=true
|
||||||
|
|
||||||
|
abstracto.featureModes.muteLogging.featureName=muting
|
||||||
|
abstracto.featureModes.muteLogging.mode=muteLogging
|
||||||
|
abstracto.featureModes.muteLogging.enabled=true
|
||||||
|
|
||||||
|
abstracto.featureModes.unMuteLogging.featureName=muting
|
||||||
|
abstracto.featureModes.unMuteLogging.mode=unMuteLogging
|
||||||
|
abstracto.featureModes.unMuteLogging.enabled=true
|
||||||
|
|
||||||
|
abstracto.featureModes.manualUnMuteLogging.featureName=muting
|
||||||
|
abstracto.featureModes.manualUnMuteLogging.mode=manualUnMuteLogging
|
||||||
|
abstracto.featureModes.manualUnMuteLogging.enabled=true
|
||||||
|
|
||||||
|
abstracto.featureModes.trackUses.featureName=inviteFilter
|
||||||
|
abstracto.featureModes.trackUses.mode=trackUses
|
||||||
|
abstracto.featureModes.trackUses.enabled=true
|
||||||
|
|
||||||
|
abstracto.featureModes.filterNotifications.featureName=inviteFilter
|
||||||
|
abstracto.featureModes.filterNotifications.mode=filterNotifications
|
||||||
|
abstracto.featureModes.filterNotifications.enabled=true
|
||||||
|
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
package dev.sheldan.abstracto.modmail.config;
|
||||||
|
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
import org.springframework.context.annotation.PropertySource;
|
||||||
|
|
||||||
|
@Configuration
|
||||||
|
@PropertySource("classpath:modmail-config.properties")
|
||||||
|
public class ModMailConfig {
|
||||||
|
}
|
||||||
|
|
||||||
@@ -6,12 +6,8 @@
|
|||||||
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog ../../dbchangelog-3.8.xsd
|
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog ../../dbchangelog-3.8.xsd
|
||||||
http://www.liquibase.org/xml/ns/dbchangelog-ext ../../dbchangelog-3.8.xsd
|
http://www.liquibase.org/xml/ns/dbchangelog-ext ../../dbchangelog-3.8.xsd
|
||||||
http://www.liquibase.org/xml/ns/pro ../../dbchangelog-3.8.xsd" >
|
http://www.liquibase.org/xml/ns/pro ../../dbchangelog-3.8.xsd" >
|
||||||
<include file="default_config.xml" relativeToChangelogFile="true"/>
|
|
||||||
<include file="module.xml" relativeToChangelogFile="true"/>
|
<include file="module.xml" relativeToChangelogFile="true"/>
|
||||||
<include file="feature.xml" relativeToChangelogFile="true"/>
|
<include file="feature.xml" relativeToChangelogFile="true"/>
|
||||||
<include file="default_feature_flag.xml" relativeToChangelogFile="true"/>
|
|
||||||
<include file="default_posttarget.xml" relativeToChangelogFile="true"/>
|
|
||||||
<include file="command.xml" relativeToChangelogFile="true"/>
|
<include file="command.xml" relativeToChangelogFile="true"/>
|
||||||
<include file="default_emote.xml" relativeToChangelogFile="true"/>
|
<include file="default_emote.xml" relativeToChangelogFile="true"/>
|
||||||
<include file="default_feature_mode.xml" relativeToChangelogFile="true"/>
|
|
||||||
</databaseChangeLog>
|
</databaseChangeLog>
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
|
|
||||||
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
|
|
||||||
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
|
|
||||||
xmlns:pro="http://www.liquibase.org/xml/ns/pro"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog ../../dbchangelog-3.8.xsd
|
|
||||||
http://www.liquibase.org/xml/ns/dbchangelog-ext ../../dbchangelog-3.8.xsd
|
|
||||||
http://www.liquibase.org/xml/ns/pro ../../dbchangelog-3.8.xsd">
|
|
||||||
<property name="today" value="(SELECT NOW())"/>
|
|
||||||
<changeSet author="Sheldan" id="modMailClosingText-insert">
|
|
||||||
<insert tableName="default_config">
|
|
||||||
<column name="name" value="modMailClosingText"/>
|
|
||||||
<column name="string_value" value="Thread has been closed."/>
|
|
||||||
<column name="created" valueComputed="${today}"/>
|
|
||||||
</insert>
|
|
||||||
</changeSet>
|
|
||||||
|
|
||||||
</databaseChangeLog>
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
|
|
||||||
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
|
|
||||||
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
|
|
||||||
xmlns:pro="http://www.liquibase.org/xml/ns/pro"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog ../../dbchangelog-3.8.xsd
|
|
||||||
http://www.liquibase.org/xml/ns/dbchangelog-ext ../../dbchangelog-3.8.xsd
|
|
||||||
http://www.liquibase.org/xml/ns/pro ../../dbchangelog-3.8.xsd" >
|
|
||||||
<property name="modmailFeature" value="(SELECT id FROM feature WHERE key = 'modmail')"/>
|
|
||||||
<property name="today" value="(SELECT NOW())"/>
|
|
||||||
<changeSet author="Sheldan" id="modmail_default_feature_flag-insertion">
|
|
||||||
<insert tableName="default_feature_flag">
|
|
||||||
<column name="enabled" value="false"/>
|
|
||||||
<column name="feature_id" valueComputed="${modmailFeature}" />
|
|
||||||
<column name="created" valueComputed="${today}"/>
|
|
||||||
</insert>
|
|
||||||
</changeSet>
|
|
||||||
</databaseChangeLog>
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
|
|
||||||
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
|
|
||||||
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
|
|
||||||
xmlns:pro="http://www.liquibase.org/xml/ns/pro"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog ../../dbchangelog-3.8.xsd
|
|
||||||
http://www.liquibase.org/xml/ns/dbchangelog-ext ../../dbchangelog-3.8.xsd
|
|
||||||
http://www.liquibase.org/xml/ns/pro ../../dbchangelog-3.8.xsd" >
|
|
||||||
<property name="modmailFeature" value="(SELECT id FROM feature WHERE key = 'modmail')"/>
|
|
||||||
<property name="today" value="(SELECT NOW())"/>
|
|
||||||
<changeSet author="Sheldan" id="modmail_default_feature_mode-insertion">
|
|
||||||
<insert tableName="default_feature_mode">
|
|
||||||
<column name="enabled" value="true"/>
|
|
||||||
<column name="mode" value="log"/>
|
|
||||||
<column name="feature_id" valueComputed="${modmailFeature}" />
|
|
||||||
<column name="created" valueComputed="${today}"/>
|
|
||||||
</insert>
|
|
||||||
<insert tableName="default_feature_mode">
|
|
||||||
<column name="enabled" value="true"/>
|
|
||||||
<column name="mode" value="threadMessage"/>
|
|
||||||
<column name="feature_id" valueComputed="${modmailFeature}" />
|
|
||||||
<column name="created" valueComputed="${today}"/>
|
|
||||||
</insert>
|
|
||||||
</changeSet>
|
|
||||||
</databaseChangeLog>
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
|
|
||||||
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
|
|
||||||
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
|
|
||||||
xmlns:pro="http://www.liquibase.org/xml/ns/pro"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog ../../dbchangelog-3.8.xsd
|
|
||||||
http://www.liquibase.org/xml/ns/dbchangelog-ext ../../dbchangelog-3.8.xsd
|
|
||||||
http://www.liquibase.org/xml/ns/pro ../../dbchangelog-3.8.xsd" >
|
|
||||||
<changeSet author="Sheldan" id="modmail_default_posttarget-insertion">
|
|
||||||
<insert tableName="default_posttarget">
|
|
||||||
<column name="name" value="modmailLog"/>
|
|
||||||
</insert>
|
|
||||||
<insert tableName="default_posttarget">
|
|
||||||
<column name="name" value="modmailPing"/>
|
|
||||||
</insert>
|
|
||||||
</changeSet>
|
|
||||||
</databaseChangeLog>
|
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
abstracto.systemConfigs.modMailClosingText.name=modMailClosingText
|
||||||
|
abstracto.systemConfigs.modMailClosingText.stringValue=Thread has been closed.
|
||||||
|
|
||||||
|
abstracto.featureFlags.modmail.featureName=modmail
|
||||||
|
abstracto.featureFlags.modmail.enabled=false
|
||||||
|
|
||||||
|
abstracto.postTargets.modmailLog.name=modmailLog
|
||||||
|
abstracto.postTargets.modmailPing.name=modmailPing
|
||||||
|
|
||||||
|
abstracto.featureModes.log.featureName=modmail
|
||||||
|
abstracto.featureModes.log.mode=log
|
||||||
|
abstracto.featureModes.log.enabled=true
|
||||||
|
|
||||||
|
abstracto.featureModes.threadMessage.featureName=modmail
|
||||||
|
abstracto.featureModes.threadMessage.mode=filterNotifications
|
||||||
|
abstracto.featureModes.threadMessage.enabled=true
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
package dev.sheldan.abstracto.statistic.config;
|
||||||
|
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
import org.springframework.context.annotation.PropertySource;
|
||||||
|
|
||||||
|
@Configuration
|
||||||
|
@PropertySource("classpath:statistic-config.properties")
|
||||||
|
public class StatisticConfig {
|
||||||
|
}
|
||||||
|
|
||||||
@@ -7,7 +7,7 @@
|
|||||||
http://www.liquibase.org/xml/ns/dbchangelog-ext ../../dbchangelog-3.8.xsd
|
http://www.liquibase.org/xml/ns/dbchangelog-ext ../../dbchangelog-3.8.xsd
|
||||||
http://www.liquibase.org/xml/ns/pro ../../dbchangelog-3.8.xsd" >
|
http://www.liquibase.org/xml/ns/pro ../../dbchangelog-3.8.xsd" >
|
||||||
<property name="statisticModule" value="(SELECT id FROM module WHERE name = 'statistic')"/>
|
<property name="statisticModule" value="(SELECT id FROM module WHERE name = 'statistic')"/>
|
||||||
<property name="emoteTrackingFeature" value="(SELECT id FROM feature WHERE key = 'emote_tracking')"/>
|
<property name="emoteTrackingFeature" value="(SELECT id FROM feature WHERE key = 'emoteTracking')"/>
|
||||||
<property name="today" value="(SELECT NOW())"/>
|
<property name="today" value="(SELECT NOW())"/>
|
||||||
|
|
||||||
<changeSet author="Sheldan" id="statistic-commands">
|
<changeSet author="Sheldan" id="statistic-commands">
|
||||||
|
|||||||
@@ -8,8 +8,6 @@
|
|||||||
http://www.liquibase.org/xml/ns/pro ../../dbchangelog-3.8.xsd" >
|
http://www.liquibase.org/xml/ns/pro ../../dbchangelog-3.8.xsd" >
|
||||||
<include file="feature.xml" relativeToChangelogFile="true"/>
|
<include file="feature.xml" relativeToChangelogFile="true"/>
|
||||||
<include file="module.xml" relativeToChangelogFile="true"/>
|
<include file="module.xml" relativeToChangelogFile="true"/>
|
||||||
<include file="default_feature_flag.xml" relativeToChangelogFile="true"/>
|
|
||||||
<include file="emote_statistic_job.xml" relativeToChangelogFile="true"/>
|
<include file="emote_statistic_job.xml" relativeToChangelogFile="true"/>
|
||||||
<include file="command.xml" relativeToChangelogFile="true"/>
|
<include file="command.xml" relativeToChangelogFile="true"/>
|
||||||
<include file="default_feature_mode.xml" relativeToChangelogFile="true"/>
|
|
||||||
</databaseChangeLog>
|
</databaseChangeLog>
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
|
|
||||||
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
|
|
||||||
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
|
|
||||||
xmlns:pro="http://www.liquibase.org/xml/ns/pro"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog ../../dbchangelog-3.8.xsd
|
|
||||||
http://www.liquibase.org/xml/ns/dbchangelog-ext ../../dbchangelog-3.8.xsd
|
|
||||||
http://www.liquibase.org/xml/ns/pro ../../dbchangelog-3.8.xsd" >
|
|
||||||
<property name="emoteTrackingFeature" value="(SELECT id FROM feature WHERE key = 'emote_tracking')"/>
|
|
||||||
<property name="today" value="(SELECT NOW())"/>
|
|
||||||
<changeSet author="Sheldan" id="emote_tracking_default_feature_flag-insertion">
|
|
||||||
<insert tableName="default_feature_flag">
|
|
||||||
<column name="enabled" value="false"/>
|
|
||||||
<column name="feature_id" valueComputed="${emoteTrackingFeature}" />
|
|
||||||
<column name="created" valueComputed="${today}"/>
|
|
||||||
</insert>
|
|
||||||
</changeSet>
|
|
||||||
</databaseChangeLog>
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
|
|
||||||
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
|
|
||||||
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
|
|
||||||
xmlns:pro="http://www.liquibase.org/xml/ns/pro"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog ../../dbchangelog-3.8.xsd
|
|
||||||
http://www.liquibase.org/xml/ns/dbchangelog-ext ../../dbchangelog-3.8.xsd
|
|
||||||
http://www.liquibase.org/xml/ns/pro ../../dbchangelog-3.8.xsd" >
|
|
||||||
<property name="emoteTrackingFeature" value="(SELECT id FROM feature WHERE key = 'emote_tracking')"/>
|
|
||||||
<property name="today" value="(SELECT NOW())"/>
|
|
||||||
<changeSet author="Sheldan" id="emote_tracking_default_feature_mode-insertion">
|
|
||||||
<insert tableName="default_feature_mode">
|
|
||||||
<column name="enabled" value="true"/>
|
|
||||||
<column name="mode" value="emoteAutoTrack"/>
|
|
||||||
<column name="feature_id" valueComputed="${emoteTrackingFeature}" />
|
|
||||||
<column name="created" valueComputed="${today}"/>
|
|
||||||
</insert>
|
|
||||||
<insert tableName="default_feature_mode">
|
|
||||||
<column name="enabled" value="false"/>
|
|
||||||
<column name="mode" value="externalEmotes"/>
|
|
||||||
<column name="feature_id" valueComputed="${emoteTrackingFeature}" />
|
|
||||||
<column name="created" valueComputed="${today}"/>
|
|
||||||
</insert>
|
|
||||||
<insert tableName="default_feature_mode">
|
|
||||||
<column name="enabled" value="false"/>
|
|
||||||
<column name="mode" value="autoTrackExternal"/>
|
|
||||||
<column name="feature_id" valueComputed="${emoteTrackingFeature}" />
|
|
||||||
<column name="created" valueComputed="${today}"/>
|
|
||||||
</insert>
|
|
||||||
</changeSet>
|
|
||||||
</databaseChangeLog>
|
|
||||||
@@ -9,7 +9,7 @@
|
|||||||
<property name="today" value="(SELECT NOW())"/>
|
<property name="today" value="(SELECT NOW())"/>
|
||||||
<changeSet author="Sheldan" id="emote_tracking_feature-insertion">
|
<changeSet author="Sheldan" id="emote_tracking_feature-insertion">
|
||||||
<insert tableName="feature">
|
<insert tableName="feature">
|
||||||
<column name="key" value="emote_tracking"/>
|
<column name="key" value="emoteTracking"/>
|
||||||
<column name="created" valueComputed="${today}"/>
|
<column name="created" valueComputed="${today}"/>
|
||||||
</insert>
|
</insert>
|
||||||
</changeSet>
|
</changeSet>
|
||||||
|
|||||||
@@ -0,0 +1,15 @@
|
|||||||
|
abstracto.featureFlags.assignableRole.featureName=assignableRole
|
||||||
|
abstracto.featureFlags.assignableRole.enabled=false
|
||||||
|
|
||||||
|
|
||||||
|
abstracto.featureModes.emoteAutoTrack.featureName=emoteTracking
|
||||||
|
abstracto.featureModes.emoteAutoTrack.mode=emoteAutoTrack
|
||||||
|
abstracto.featureModes.emoteAutoTrack.enabled=true
|
||||||
|
|
||||||
|
abstracto.featureModes.externalEmotes.featureName=emoteTracking
|
||||||
|
abstracto.featureModes.externalEmotes.mode=externalEmotes
|
||||||
|
abstracto.featureModes.externalEmotes.enabled=false
|
||||||
|
|
||||||
|
abstracto.featureModes.autoTrackExternal.featureName=emoteTracking
|
||||||
|
abstracto.featureModes.autoTrackExternal.mode=autoTrackExternal
|
||||||
|
abstracto.featureModes.autoTrackExternal.enabled=false
|
||||||
@@ -9,7 +9,7 @@ public enum StatisticFeatures implements FeatureEnum {
|
|||||||
/**
|
/**
|
||||||
* Feature responsible to track the emotes used in a message on a server.
|
* Feature responsible to track the emotes used in a message on a server.
|
||||||
*/
|
*/
|
||||||
EMOTE_TRACKING("emote_tracking");
|
EMOTE_TRACKING("emoteTracking");
|
||||||
|
|
||||||
private final String key;
|
private final String key;
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,10 @@
|
|||||||
|
package dev.sheldan.abstracto.utility.config;
|
||||||
|
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
import org.springframework.context.annotation.PropertySource;
|
||||||
|
|
||||||
|
@Configuration
|
||||||
|
@PropertySource("classpath:utility-config.properties")
|
||||||
|
public class UtilityConfig {
|
||||||
|
}
|
||||||
|
|
||||||
@@ -6,14 +6,10 @@
|
|||||||
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog ../../dbchangelog-3.8.xsd
|
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog ../../dbchangelog-3.8.xsd
|
||||||
http://www.liquibase.org/xml/ns/dbchangelog-ext ../../dbchangelog-3.8.xsd
|
http://www.liquibase.org/xml/ns/dbchangelog-ext ../../dbchangelog-3.8.xsd
|
||||||
http://www.liquibase.org/xml/ns/pro ../../dbchangelog-3.8.xsd" >
|
http://www.liquibase.org/xml/ns/pro ../../dbchangelog-3.8.xsd" >
|
||||||
<include file="default_config.xml" relativeToChangelogFile="true"/>
|
|
||||||
<include file="default_emote.xml" relativeToChangelogFile="true"/>
|
<include file="default_emote.xml" relativeToChangelogFile="true"/>
|
||||||
<include file="feature.xml" relativeToChangelogFile="true"/>
|
<include file="feature.xml" relativeToChangelogFile="true"/>
|
||||||
<include file="default_feature_flag.xml" relativeToChangelogFile="true"/>
|
|
||||||
<include file="default_posttarget.xml" relativeToChangelogFile="true"/>
|
|
||||||
<include file="module.xml" relativeToChangelogFile="true"/>
|
<include file="module.xml" relativeToChangelogFile="true"/>
|
||||||
<include file="command.xml" relativeToChangelogFile="true"/>
|
<include file="command.xml" relativeToChangelogFile="true"/>
|
||||||
<include file="reminder_job.xml" relativeToChangelogFile="true"/>
|
<include file="reminder_job.xml" relativeToChangelogFile="true"/>
|
||||||
<include file="default_feature_mode.xml" relativeToChangelogFile="true"/>
|
|
||||||
<include file="channel_group_types.xml" relativeToChangelogFile="true"/>
|
<include file="channel_group_types.xml" relativeToChangelogFile="true"/>
|
||||||
</databaseChangeLog>
|
</databaseChangeLog>
|
||||||
@@ -1,50 +0,0 @@
|
|||||||
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
|
|
||||||
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
|
|
||||||
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
|
|
||||||
xmlns:pro="http://www.liquibase.org/xml/ns/pro"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog ../../dbchangelog-3.8.xsd
|
|
||||||
http://www.liquibase.org/xml/ns/dbchangelog-ext ../../dbchangelog-3.8.xsd
|
|
||||||
http://www.liquibase.org/xml/ns/pro ../../dbchangelog-3.8.xsd" >
|
|
||||||
<property name="today" value="(SELECT NOW())"/>
|
|
||||||
<changeSet author="Sheldan" id="starLevels-insert">
|
|
||||||
<insert tableName="default_config">
|
|
||||||
<column name="name" value="starLvl1"/>
|
|
||||||
<column name="long_value" value="5"/>
|
|
||||||
<column name="created" valueComputed="${today}"/>
|
|
||||||
</insert>
|
|
||||||
<insert tableName="default_config">
|
|
||||||
<column name="name" value="starLvl2"/>
|
|
||||||
<column name="long_value" value="8"/>
|
|
||||||
<column name="created" valueComputed="${today}"/>
|
|
||||||
</insert>
|
|
||||||
<insert tableName="default_config">
|
|
||||||
<column name="name" value="starLvl3"/>
|
|
||||||
<column name="long_value" value="13"/>
|
|
||||||
<column name="created" valueComputed="${today}"/>
|
|
||||||
</insert>
|
|
||||||
<insert tableName="default_config">
|
|
||||||
<column name="name" value="starLvl4"/>
|
|
||||||
<column name="long_value" value="17"/>
|
|
||||||
<column name="created" valueComputed="${today}"/>
|
|
||||||
</insert>
|
|
||||||
<insert tableName="default_config">
|
|
||||||
<column name="name" value="starLvls"/>
|
|
||||||
<column name="long_value" value="4"/>
|
|
||||||
<column name="created" valueComputed="${today}"/>
|
|
||||||
</insert>
|
|
||||||
</changeSet>
|
|
||||||
<changeSet author="Sheldan" id="entertainment_default_config-insert">
|
|
||||||
<insert tableName="default_config">
|
|
||||||
<column name="name" value="rouletteBullets"/>
|
|
||||||
<column name="long_value" value="6"/>
|
|
||||||
<column name="created" valueComputed="${today}"/>
|
|
||||||
</insert>
|
|
||||||
<insert tableName="default_config">
|
|
||||||
<column name="name" value="rollDefaultHigh"/>
|
|
||||||
<column name="long_value" value="6"/>
|
|
||||||
<column name="created" valueComputed="${today}"/>
|
|
||||||
</insert>
|
|
||||||
</changeSet>
|
|
||||||
|
|
||||||
</databaseChangeLog>
|
|
||||||
@@ -1,56 +0,0 @@
|
|||||||
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
|
|
||||||
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
|
|
||||||
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
|
|
||||||
xmlns:pro="http://www.liquibase.org/xml/ns/pro"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog ../../dbchangelog-3.8.xsd
|
|
||||||
http://www.liquibase.org/xml/ns/dbchangelog-ext ../../dbchangelog-3.8.xsd
|
|
||||||
http://www.liquibase.org/xml/ns/pro ../../dbchangelog-3.8.xsd" >
|
|
||||||
<property name="starboardFeature" value="(SELECT id FROM feature WHERE key = 'starboard')"/>
|
|
||||||
<property name="remindFeature" value="(SELECT id FROM feature WHERE key = 'remind')"/>
|
|
||||||
<property name="suggestionFeature" value="(SELECT id FROM feature WHERE key = 'suggestion')"/>
|
|
||||||
<property name="utilityFeature" value="(SELECT id FROM feature WHERE key = 'utility')"/>
|
|
||||||
<property name="linkEmbedFeature" value="(SELECT id FROM feature WHERE key = 'link_embeds')"/>
|
|
||||||
<property name="repostDetectionFeature" value="(SELECT id FROM feature WHERE key = 'repostDetection')"/>
|
|
||||||
<property name="entertainmentFeature" value="(SELECT id FROM feature WHERE key = 'entertainment')"/>
|
|
||||||
<property name="today" value="(SELECT NOW())"/>
|
|
||||||
<changeSet author="Sheldan" id="utility_default_feature_flag-insertion">
|
|
||||||
<insert tableName="default_feature_flag">
|
|
||||||
<column name="enabled" value="false"/>
|
|
||||||
<column name="feature_id" valueComputed="${starboardFeature}" />
|
|
||||||
<column name="created" valueComputed="${today}"/>
|
|
||||||
</insert>
|
|
||||||
<insert tableName="default_feature_flag">
|
|
||||||
<column name="enabled" value="false"/>
|
|
||||||
<column name="feature_id" valueComputed="${remindFeature}" />
|
|
||||||
<column name="created" valueComputed="${today}"/>
|
|
||||||
</insert>
|
|
||||||
<insert tableName="default_feature_flag">
|
|
||||||
<column name="enabled" value="false"/>
|
|
||||||
<column name="feature_id" valueComputed="${suggestionFeature}" />
|
|
||||||
<column name="created" valueComputed="${today}"/>
|
|
||||||
</insert>
|
|
||||||
<insert tableName="default_feature_flag">
|
|
||||||
<column name="enabled" value="false"/>
|
|
||||||
<column name="feature_id" valueComputed="${utilityFeature}" />
|
|
||||||
<column name="created" valueComputed="${today}"/>
|
|
||||||
</insert>
|
|
||||||
<insert tableName="default_feature_flag">
|
|
||||||
<column name="enabled" value="false"/>
|
|
||||||
<column name="feature_id" valueComputed="${linkEmbedFeature}" />
|
|
||||||
<column name="created" valueComputed="${today}"/>
|
|
||||||
</insert>
|
|
||||||
<insert tableName="default_feature_flag">
|
|
||||||
<column name="enabled" value="false"/>
|
|
||||||
<column name="feature_id" valueComputed="${repostDetectionFeature}" />
|
|
||||||
<column name="created" valueComputed="${today}"/>
|
|
||||||
</insert>
|
|
||||||
</changeSet>
|
|
||||||
<changeSet author="Sheldan" id="utility_entertainment_default_feature_flag-insertion">
|
|
||||||
<insert tableName="default_feature_flag">
|
|
||||||
<column name="enabled" value="false"/>
|
|
||||||
<column name="feature_id" valueComputed="${entertainmentFeature}" />
|
|
||||||
<column name="created" valueComputed="${today}"/>
|
|
||||||
</insert>
|
|
||||||
</changeSet>
|
|
||||||
</databaseChangeLog>
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
|
|
||||||
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
|
|
||||||
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
|
|
||||||
xmlns:pro="http://www.liquibase.org/xml/ns/pro"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog ../../dbchangelog-3.8.xsd
|
|
||||||
http://www.liquibase.org/xml/ns/dbchangelog-ext ../../dbchangelog-3.8.xsd
|
|
||||||
http://www.liquibase.org/xml/ns/pro ../../dbchangelog-3.8.xsd" >
|
|
||||||
<property name="repostDetectionFeature" value="(SELECT id FROM feature WHERE key = 'repostDetection')"/>
|
|
||||||
<property name="today" value="(SELECT NOW())"/>
|
|
||||||
<changeSet author="Sheldan" id="utilities_default_feature_mode-insertion">
|
|
||||||
<insert tableName="default_feature_mode">
|
|
||||||
<column name="enabled" value="true"/>
|
|
||||||
<column name="mode" value="download"/>
|
|
||||||
<column name="feature_id" valueComputed="${repostDetectionFeature}" />
|
|
||||||
<column name="created" valueComputed="${today}"/>
|
|
||||||
</insert>
|
|
||||||
<insert tableName="default_feature_mode">
|
|
||||||
<column name="enabled" value="true"/>
|
|
||||||
<column name="mode" value="leaderboard"/>
|
|
||||||
<column name="feature_id" valueComputed="${repostDetectionFeature}" />
|
|
||||||
<column name="created" valueComputed="${today}"/>
|
|
||||||
</insert>
|
|
||||||
</changeSet>
|
|
||||||
</databaseChangeLog>
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
|
|
||||||
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
|
|
||||||
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
|
|
||||||
xmlns:pro="http://www.liquibase.org/xml/ns/pro"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog ../../dbchangelog-3.8.xsd
|
|
||||||
http://www.liquibase.org/xml/ns/dbchangelog-ext ../../dbchangelog-3.8.xsd
|
|
||||||
http://www.liquibase.org/xml/ns/pro ../../dbchangelog-3.8.xsd" >
|
|
||||||
<property name="today" value="(SELECT NOW())"/>
|
|
||||||
<changeSet author="Sheldan" id="utility_default_posttarget-insertion">
|
|
||||||
<insert tableName="default_posttarget">
|
|
||||||
<column name="name" value="suggestions"/>
|
|
||||||
<column name="created" valueComputed="${today}"/>
|
|
||||||
</insert>
|
|
||||||
<insert tableName="default_posttarget">
|
|
||||||
<column name="name" value="starboard"/>
|
|
||||||
<column name="created" valueComputed="${today}"/>
|
|
||||||
</insert>
|
|
||||||
</changeSet>
|
|
||||||
</databaseChangeLog>
|
|
||||||
@@ -25,7 +25,7 @@
|
|||||||
<column name="created" valueComputed="${today}"/>
|
<column name="created" valueComputed="${today}"/>
|
||||||
</insert>
|
</insert>
|
||||||
<insert tableName="feature">
|
<insert tableName="feature">
|
||||||
<column name="key" value="link_embeds"/>
|
<column name="key" value="linkEmbeds"/>
|
||||||
<column name="created" valueComputed="${today}"/>
|
<column name="created" valueComputed="${today}"/>
|
||||||
</insert>
|
</insert>
|
||||||
<insert tableName="feature">
|
<insert tableName="feature">
|
||||||
|
|||||||
@@ -0,0 +1,52 @@
|
|||||||
|
abstracto.systemConfigs.starLvl1.name=starLvl1
|
||||||
|
abstracto.systemConfigs.starLvl1.longValue=5
|
||||||
|
|
||||||
|
abstracto.systemConfigs.starLvl2.name=starLvl2
|
||||||
|
abstracto.systemConfigs.starLvl2.longValue=8
|
||||||
|
|
||||||
|
abstracto.systemConfigs.starLvl3.name=starLvl3
|
||||||
|
abstracto.systemConfigs.starLvl3.longValue=13
|
||||||
|
|
||||||
|
abstracto.systemConfigs.starLvl4.name=starLvl4
|
||||||
|
abstracto.systemConfigs.starLvl4.longValue=17
|
||||||
|
|
||||||
|
abstracto.systemConfigs.starLvls.name=starLvls
|
||||||
|
abstracto.systemConfigs.starLvls.longValue=4
|
||||||
|
|
||||||
|
abstracto.systemConfigs.rouletteBullets.name=rouletteBullets
|
||||||
|
abstracto.systemConfigs.rouletteBullets.longValue=6
|
||||||
|
|
||||||
|
abstracto.systemConfigs.rollDefaultHigh.name=rollDefaultHigh
|
||||||
|
abstracto.systemConfigs.rollDefaultHigh.longValue=6
|
||||||
|
|
||||||
|
abstracto.featureFlags.starboard.featureName=starboard
|
||||||
|
abstracto.featureFlags.starboard.enabled=false
|
||||||
|
|
||||||
|
abstracto.featureFlags.remind.featureName=remind
|
||||||
|
abstracto.featureFlags.remind.enabled=false
|
||||||
|
|
||||||
|
abstracto.featureFlags.suggestion.featureName=suggestion
|
||||||
|
abstracto.featureFlags.suggestion.enabled=false
|
||||||
|
|
||||||
|
abstracto.featureFlags.utility.featureName=utility
|
||||||
|
abstracto.featureFlags.utility.enabled=false
|
||||||
|
|
||||||
|
abstracto.featureFlags.linkEmbeds.featureName=linkEmbeds
|
||||||
|
abstracto.featureFlags.linkEmbeds.enabled=false
|
||||||
|
|
||||||
|
abstracto.featureFlags.repostDetection.featureName=repostDetection
|
||||||
|
abstracto.featureFlags.repostDetection.enabled=false
|
||||||
|
|
||||||
|
abstracto.featureFlags.entertainment.featureName=entertainment
|
||||||
|
abstracto.featureFlags.entertainment.enabled=false
|
||||||
|
|
||||||
|
abstracto.postTargets.suggestions.name=suggestions
|
||||||
|
abstracto.postTargets.starboard.name=starboard
|
||||||
|
|
||||||
|
abstracto.featureModes.download.featureName=repostDetection
|
||||||
|
abstracto.featureModes.download.mode=download
|
||||||
|
abstracto.featureModes.download.enabled=true
|
||||||
|
|
||||||
|
abstracto.featureModes.leaderboard.featureName=repostDetection
|
||||||
|
abstracto.featureModes.leaderboard.mode=leaderboard
|
||||||
|
abstracto.featureModes.leaderboard.enabled=true
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
package dev.sheldan.abstracto.utility.config;
|
package dev.sheldan.abstracto.utility.config;
|
||||||
|
|
||||||
import dev.sheldan.abstracto.core.models.database.ADefaultConfig;
|
import dev.sheldan.abstracto.core.models.property.SystemConfigProperty;
|
||||||
import dev.sheldan.abstracto.core.models.database.AServer;
|
import dev.sheldan.abstracto.core.models.database.AServer;
|
||||||
import dev.sheldan.abstracto.core.service.management.ConfigManagementService;
|
import dev.sheldan.abstracto.core.service.management.ConfigManagementService;
|
||||||
import dev.sheldan.abstracto.core.service.management.DefaultConfigManagementService;
|
import dev.sheldan.abstracto.core.service.management.DefaultConfigManagementService;
|
||||||
@@ -9,10 +9,7 @@ import dev.sheldan.abstracto.utility.service.StarboardServiceBean;
|
|||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.mockito.ArgumentCaptor;
|
import org.mockito.*;
|
||||||
import org.mockito.Captor;
|
|
||||||
import org.mockito.InjectMocks;
|
|
||||||
import org.mockito.Mock;
|
|
||||||
import org.mockito.junit.MockitoJUnitRunner;
|
import org.mockito.junit.MockitoJUnitRunner;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -38,7 +35,8 @@ public class StarboardConfigListenerTest {
|
|||||||
public void testUpdateServerConfig() {
|
public void testUpdateServerConfig() {
|
||||||
AServer server = MockUtils.getServer();
|
AServer server = MockUtils.getServer();
|
||||||
int numberOfLevels = 4;
|
int numberOfLevels = 4;
|
||||||
ADefaultConfig config = ADefaultConfig.builder().longValue((long)numberOfLevels).build();
|
SystemConfigProperty config = Mockito.mock(SystemConfigProperty.class);
|
||||||
|
when(config.getLongValue()).thenReturn((long) numberOfLevels);
|
||||||
when(defaultConfigManagementService.getDefaultConfig(StarboardServiceBean.STAR_LEVELS_CONFIG_KEY)).thenReturn(config);
|
when(defaultConfigManagementService.getDefaultConfig(StarboardServiceBean.STAR_LEVELS_CONFIG_KEY)).thenReturn(config);
|
||||||
when(defaultConfigManagementService.getDefaultConfig(StarboardServiceBean.STAR_LVL_CONFIG_PREFIX + 1)).thenReturn(config);
|
when(defaultConfigManagementService.getDefaultConfig(StarboardServiceBean.STAR_LVL_CONFIG_PREFIX + 1)).thenReturn(config);
|
||||||
when(defaultConfigManagementService.getDefaultConfig(StarboardServiceBean.STAR_LVL_CONFIG_PREFIX + 2)).thenReturn(config);
|
when(defaultConfigManagementService.getDefaultConfig(StarboardServiceBean.STAR_LVL_CONFIG_PREFIX + 2)).thenReturn(config);
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package dev.sheldan.abstracto.utility.service;
|
|||||||
|
|
||||||
import dev.sheldan.abstracto.core.exception.UserInServerNotFoundException;
|
import dev.sheldan.abstracto.core.exception.UserInServerNotFoundException;
|
||||||
import dev.sheldan.abstracto.core.models.AServerAChannelMessage;
|
import dev.sheldan.abstracto.core.models.AServerAChannelMessage;
|
||||||
|
import dev.sheldan.abstracto.core.models.property.SystemConfigProperty;
|
||||||
import dev.sheldan.abstracto.core.models.cache.CachedAuthor;
|
import dev.sheldan.abstracto.core.models.cache.CachedAuthor;
|
||||||
import dev.sheldan.abstracto.core.models.cache.CachedMessage;
|
import dev.sheldan.abstracto.core.models.cache.CachedMessage;
|
||||||
import dev.sheldan.abstracto.core.models.database.*;
|
import dev.sheldan.abstracto.core.models.database.*;
|
||||||
@@ -146,7 +147,7 @@ public class StarboardServiceBeanTest {
|
|||||||
when(memberService.getMemberInServerAsync(SERVER_ID, STARRED_USER_ID)).thenReturn(CompletableFuture.completedFuture(authorMember));
|
when(memberService.getMemberInServerAsync(SERVER_ID, STARRED_USER_ID)).thenReturn(CompletableFuture.completedFuture(authorMember));
|
||||||
when(channelService.getTextChannelFromServerOptional(SERVER_ID, CHANNEL_ID)).thenReturn(Optional.of(mockedTextChannel));
|
when(channelService.getTextChannelFromServerOptional(SERVER_ID, CHANNEL_ID)).thenReturn(Optional.of(mockedTextChannel));
|
||||||
when(guildService.getGuildByIdOptional(SERVER_ID)).thenReturn(Optional.of(guild));
|
when(guildService.getGuildByIdOptional(SERVER_ID)).thenReturn(Optional.of(guild));
|
||||||
ADefaultConfig config = Mockito.mock(ADefaultConfig.class);
|
SystemConfigProperty config = Mockito.mock(SystemConfigProperty.class);
|
||||||
when(config.getLongValue()).thenReturn(3L);
|
when(config.getLongValue()).thenReturn(3L);
|
||||||
when(defaultConfigManagementService.getDefaultConfig(StarboardServiceBean.STAR_LEVELS_CONFIG_KEY)).thenReturn(config);
|
when(defaultConfigManagementService.getDefaultConfig(StarboardServiceBean.STAR_LEVELS_CONFIG_KEY)).thenReturn(config);
|
||||||
when(configService.getLongValue("starLvl3", SERVER_ID)).thenReturn(3L);
|
when(configService.getLongValue("starLvl3", SERVER_ID)).thenReturn(3L);
|
||||||
@@ -219,7 +220,7 @@ public class StarboardServiceBeanTest {
|
|||||||
when(templateService.renderEmbedTemplate(eq(STARBOARD_POST_TEMPLATE), starboardPostModelArgumentCaptor.capture())).thenReturn(postMessage);
|
when(templateService.renderEmbedTemplate(eq(STARBOARD_POST_TEMPLATE), starboardPostModelArgumentCaptor.capture())).thenReturn(postMessage);
|
||||||
when(postTargetService.editOrCreatedInPostTarget(oldPostId, postMessage, StarboardPostTarget.STARBOARD, SERVER_ID)).thenReturn(Arrays.asList(CompletableFuture.completedFuture(sendPost)));
|
when(postTargetService.editOrCreatedInPostTarget(oldPostId, postMessage, StarboardPostTarget.STARBOARD, SERVER_ID)).thenReturn(Arrays.asList(CompletableFuture.completedFuture(sendPost)));
|
||||||
when(sendPost.getIdLong()).thenReturn(newPostId);
|
when(sendPost.getIdLong()).thenReturn(newPostId);
|
||||||
ADefaultConfig config = Mockito.mock(ADefaultConfig.class);
|
SystemConfigProperty config = Mockito.mock(SystemConfigProperty.class);
|
||||||
when(config.getLongValue()).thenReturn(4L);
|
when(config.getLongValue()).thenReturn(4L);
|
||||||
when(defaultConfigManagementService.getDefaultConfig(StarboardServiceBean.STAR_LEVELS_CONFIG_KEY)).thenReturn(config);
|
when(defaultConfigManagementService.getDefaultConfig(StarboardServiceBean.STAR_LEVELS_CONFIG_KEY)).thenReturn(config);
|
||||||
when(starboardPostManagementService.findByStarboardPostId(starboardPostId)).thenReturn(Optional.of(post));
|
when(starboardPostManagementService.findByStarboardPostId(starboardPostId)).thenReturn(Optional.of(post));
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
package dev.sheldan.abstracto.utility.validator;
|
package dev.sheldan.abstracto.utility.validator;
|
||||||
|
|
||||||
import dev.sheldan.abstracto.core.models.database.ADefaultConfig;
|
import dev.sheldan.abstracto.core.models.property.SystemConfigProperty;
|
||||||
import dev.sheldan.abstracto.core.models.database.AServer;
|
import dev.sheldan.abstracto.core.models.database.AServer;
|
||||||
import dev.sheldan.abstracto.core.service.FeatureValidatorService;
|
import dev.sheldan.abstracto.core.service.FeatureValidatorService;
|
||||||
import dev.sheldan.abstracto.core.service.management.DefaultConfigManagementService;
|
import dev.sheldan.abstracto.core.service.management.DefaultConfigManagementService;
|
||||||
@@ -9,10 +9,7 @@ import dev.sheldan.abstracto.utility.service.StarboardServiceBean;
|
|||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.mockito.ArgumentCaptor;
|
import org.mockito.*;
|
||||||
import org.mockito.Captor;
|
|
||||||
import org.mockito.InjectMocks;
|
|
||||||
import org.mockito.Mock;
|
|
||||||
import org.mockito.junit.MockitoJUnitRunner;
|
import org.mockito.junit.MockitoJUnitRunner;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -38,7 +35,8 @@ public class StarboardFeatureValidatorServiceTest {
|
|||||||
public void testStarboardFeatureConfig() {
|
public void testStarboardFeatureConfig() {
|
||||||
AServer server = MockUtils.getServer();
|
AServer server = MockUtils.getServer();
|
||||||
int levelCount = 4;
|
int levelCount = 4;
|
||||||
ADefaultConfig config = ADefaultConfig.builder().longValue((long)levelCount).build();
|
SystemConfigProperty config = Mockito.mock(SystemConfigProperty.class);
|
||||||
|
when(config.getLongValue()).thenReturn((long) levelCount);
|
||||||
when(defaultConfigManagementService.getDefaultConfig(StarboardServiceBean.STAR_LEVELS_CONFIG_KEY)).thenReturn(config);
|
when(defaultConfigManagementService.getDefaultConfig(StarboardServiceBean.STAR_LEVELS_CONFIG_KEY)).thenReturn(config);
|
||||||
|
|
||||||
testUnit.featureIsSetup(null, server, null);
|
testUnit.featureIsSetup(null, server, null);
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import lombok.Getter;
|
|||||||
@Getter
|
@Getter
|
||||||
public enum UtilityFeature implements FeatureEnum {
|
public enum UtilityFeature implements FeatureEnum {
|
||||||
REMIND("remind"), STARBOARD("starboard"), SUGGEST("suggestion"), UTILITY("utility"),
|
REMIND("remind"), STARBOARD("starboard"), SUGGEST("suggestion"), UTILITY("utility"),
|
||||||
LINK_EMBEDS("link_embeds"), REPOST_DETECTION("repostDetection"), ENTERTAINMENT("entertainment");
|
LINK_EMBEDS("linkEmbeds"), REPOST_DETECTION("repostDetection"), ENTERTAINMENT("entertainment");
|
||||||
|
|
||||||
private String key;
|
private String key;
|
||||||
|
|
||||||
|
|||||||
@@ -12,8 +12,10 @@ import dev.sheldan.abstracto.core.config.FeatureEnum;
|
|||||||
import dev.sheldan.abstracto.core.converter.FeatureFlagConverter;
|
import dev.sheldan.abstracto.core.converter.FeatureFlagConverter;
|
||||||
import dev.sheldan.abstracto.core.models.database.AFeatureFlag;
|
import dev.sheldan.abstracto.core.models.database.AFeatureFlag;
|
||||||
import dev.sheldan.abstracto.core.models.database.AServer;
|
import dev.sheldan.abstracto.core.models.database.AServer;
|
||||||
|
import dev.sheldan.abstracto.core.models.property.FeatureFlagProperty;
|
||||||
import dev.sheldan.abstracto.core.models.template.commands.FeaturesModel;
|
import dev.sheldan.abstracto.core.models.template.commands.FeaturesModel;
|
||||||
import dev.sheldan.abstracto.core.service.ChannelService;
|
import dev.sheldan.abstracto.core.service.ChannelService;
|
||||||
|
import dev.sheldan.abstracto.core.service.management.DefaultFeatureFlagManagementService;
|
||||||
import dev.sheldan.abstracto.core.service.management.FeatureFlagManagementService;
|
import dev.sheldan.abstracto.core.service.management.FeatureFlagManagementService;
|
||||||
import dev.sheldan.abstracto.core.service.management.ServerManagementService;
|
import dev.sheldan.abstracto.core.service.management.ServerManagementService;
|
||||||
import dev.sheldan.abstracto.core.utils.FutureUtils;
|
import dev.sheldan.abstracto.core.utils.FutureUtils;
|
||||||
@@ -22,8 +24,10 @@ import dev.sheldan.abstracto.templating.service.TemplateService;
|
|||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.util.Comparator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.concurrent.CompletableFuture;
|
import java.util.concurrent.CompletableFuture;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@Component
|
@Component
|
||||||
public class Features extends AbstractConditionableCommand {
|
public class Features extends AbstractConditionableCommand {
|
||||||
@@ -40,6 +44,9 @@ public class Features extends AbstractConditionableCommand {
|
|||||||
@Autowired
|
@Autowired
|
||||||
private FeatureFlagConverter featureFlagConverter;
|
private FeatureFlagConverter featureFlagConverter;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private DefaultFeatureFlagManagementService defaultFeatureFlagManagementService;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private ServerManagementService serverManagementService;
|
private ServerManagementService serverManagementService;
|
||||||
|
|
||||||
@@ -47,8 +54,21 @@ public class Features extends AbstractConditionableCommand {
|
|||||||
public CompletableFuture<CommandResult> executeAsync(CommandContext commandContext) {
|
public CompletableFuture<CommandResult> executeAsync(CommandContext commandContext) {
|
||||||
AServer server = serverManagementService.loadServer(commandContext.getGuild());
|
AServer server = serverManagementService.loadServer(commandContext.getGuild());
|
||||||
List<AFeatureFlag> features = featureFlagManagementService.getFeatureFlagsOfServer(server);
|
List<AFeatureFlag> features = featureFlagManagementService.getFeatureFlagsOfServer(server);
|
||||||
|
List<FeatureFlagProperty> defaultFeatureFlagProperties = defaultFeatureFlagManagementService.getAllDefaultFeatureFlags();
|
||||||
FeaturesModel featuresModel = (FeaturesModel) ContextConverter.fromCommandContext(commandContext, FeaturesModel.class);
|
FeaturesModel featuresModel = (FeaturesModel) ContextConverter.fromCommandContext(commandContext, FeaturesModel.class);
|
||||||
|
features.sort(Comparator.comparing(o -> o.getFeature().getKey()));
|
||||||
featuresModel.setFeatures(featureFlagConverter.fromFeatureFlags(features));
|
featuresModel.setFeatures(featureFlagConverter.fromFeatureFlags(features));
|
||||||
|
defaultFeatureFlagProperties = defaultFeatureFlagProperties
|
||||||
|
.stream()
|
||||||
|
.filter(featureFlagProperty ->
|
||||||
|
features
|
||||||
|
.stream()
|
||||||
|
.noneMatch(aFeatureFlag ->
|
||||||
|
aFeatureFlag.getFeature().getKey()
|
||||||
|
.equals(featureFlagProperty.getFeatureName())))
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
defaultFeatureFlagProperties.sort(Comparator.comparing(FeatureFlagProperty::getFeatureName));
|
||||||
|
featuresModel.setDefaultFeatures(featureFlagConverter.fromFeatureFlagProperties(defaultFeatureFlagProperties));
|
||||||
MessageToSend messageToSend = templateService.renderEmbedTemplate("features_response", featuresModel);
|
MessageToSend messageToSend = templateService.renderEmbedTemplate("features_response", featuresModel);
|
||||||
return FutureUtils.toSingleFutureGeneric(channelService.sendMessageToSendToChannel(messageToSend, commandContext.getChannel()))
|
return FutureUtils.toSingleFutureGeneric(channelService.sendMessageToSendToChannel(messageToSend, commandContext.getChannel()))
|
||||||
.thenApply(aVoid -> CommandResult.fromIgnored());
|
.thenApply(aVoid -> CommandResult.fromIgnored());
|
||||||
|
|||||||
@@ -0,0 +1,23 @@
|
|||||||
|
package dev.sheldan.abstracto.core.config;
|
||||||
|
|
||||||
|
import dev.sheldan.abstracto.core.models.property.FeatureFlagProperty;
|
||||||
|
import dev.sheldan.abstracto.core.models.property.FeatureModeProperty;
|
||||||
|
import dev.sheldan.abstracto.core.models.property.PostTargetProperty;
|
||||||
|
import dev.sheldan.abstracto.core.models.property.SystemConfigProperty;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
|
import org.springframework.boot.context.properties.ConfigurationProperties;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
@Configuration
|
||||||
|
@ConfigurationProperties(prefix = "abstracto")
|
||||||
|
public class DefaultConfigProperties {
|
||||||
|
private Map<String, SystemConfigProperty> systemConfigs;
|
||||||
|
private Map<String, FeatureFlagProperty> featureFlags;
|
||||||
|
private Map<String, PostTargetProperty> postTargets;
|
||||||
|
private Map<String, FeatureModeProperty> featureModes;
|
||||||
|
}
|
||||||
@@ -3,6 +3,8 @@ package dev.sheldan.abstracto.core.converter;
|
|||||||
import dev.sheldan.abstracto.core.config.FeatureConfig;
|
import dev.sheldan.abstracto.core.config.FeatureConfig;
|
||||||
import dev.sheldan.abstracto.core.config.FeatureEnum;
|
import dev.sheldan.abstracto.core.config.FeatureEnum;
|
||||||
import dev.sheldan.abstracto.core.models.database.AFeatureFlag;
|
import dev.sheldan.abstracto.core.models.database.AFeatureFlag;
|
||||||
|
import dev.sheldan.abstracto.core.models.property.FeatureFlagProperty;
|
||||||
|
import dev.sheldan.abstracto.core.models.template.commands.DefaultFeatureFlagDisplay;
|
||||||
import dev.sheldan.abstracto.core.models.template.commands.FeatureFlagDisplay;
|
import dev.sheldan.abstracto.core.models.template.commands.FeatureFlagDisplay;
|
||||||
import dev.sheldan.abstracto.core.service.FeatureConfigService;
|
import dev.sheldan.abstracto.core.service.FeatureConfigService;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
@@ -27,7 +29,21 @@ public class FeatureFlagConverter {
|
|||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public DefaultFeatureFlagDisplay fromFeatureFlagProperty(FeatureFlagProperty featureFlagProperty) {
|
||||||
|
FeatureEnum featureEnum = featureFlagService.getFeatureEnum(featureFlagProperty.getFeatureName());
|
||||||
|
FeatureConfig forFeature = featureFlagService.getFeatureDisplayForFeature(featureEnum);
|
||||||
|
return DefaultFeatureFlagDisplay
|
||||||
|
.builder()
|
||||||
|
.featureConfig(forFeature)
|
||||||
|
.featureFlagProperty(featureFlagProperty)
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
public List<FeatureFlagDisplay> fromFeatureFlags(List<AFeatureFlag> featureFlags) {
|
public List<FeatureFlagDisplay> fromFeatureFlags(List<AFeatureFlag> featureFlags) {
|
||||||
return featureFlags.stream().map(this::fromAFeatureFlag).collect(Collectors.toList());
|
return featureFlags.stream().map(this::fromAFeatureFlag).collect(Collectors.toList());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<DefaultFeatureFlagDisplay> fromFeatureFlagProperties(List<FeatureFlagProperty> featureFlags) {
|
||||||
|
return featureFlags.stream().map(this::fromFeatureFlagProperty).collect(Collectors.toList());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
package dev.sheldan.abstracto.core.interactive;
|
package dev.sheldan.abstracto.core.interactive;
|
||||||
|
|
||||||
|
import dev.sheldan.abstracto.core.models.property.SystemConfigProperty;
|
||||||
import dev.sheldan.abstracto.core.models.AServerChannelUserId;
|
import dev.sheldan.abstracto.core.models.AServerChannelUserId;
|
||||||
import dev.sheldan.abstracto.core.models.database.AChannel;
|
import dev.sheldan.abstracto.core.models.database.AChannel;
|
||||||
import dev.sheldan.abstracto.core.models.database.AConfig;
|
import dev.sheldan.abstracto.core.models.database.AConfig;
|
||||||
import dev.sheldan.abstracto.core.models.database.ADefaultConfig;
|
|
||||||
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
|
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
|
||||||
import dev.sheldan.abstracto.core.models.template.commands.SetupSystemConfigMessageModel;
|
import dev.sheldan.abstracto.core.models.template.commands.SetupSystemConfigMessageModel;
|
||||||
import dev.sheldan.abstracto.core.service.ConfigService;
|
import dev.sheldan.abstracto.core.service.ConfigService;
|
||||||
@@ -52,7 +52,7 @@ public class SystemConfigSetupStep extends AbstractConfigSetupStep {
|
|||||||
@Override
|
@Override
|
||||||
public CompletableFuture<SetupStepResult> execute(AServerChannelUserId user, SetupStepParameter parameter) {
|
public CompletableFuture<SetupStepResult> execute(AServerChannelUserId user, SetupStepParameter parameter) {
|
||||||
SystemConfigStepParameter systemConfigStepParameter = (SystemConfigStepParameter) parameter;
|
SystemConfigStepParameter systemConfigStepParameter = (SystemConfigStepParameter) parameter;
|
||||||
ADefaultConfig defaultConfig = defaultConfigManagementService.getDefaultConfig(systemConfigStepParameter.getConfigKey());
|
SystemConfigProperty defaultConfig = defaultConfigManagementService.getDefaultConfig(systemConfigStepParameter.getConfigKey());
|
||||||
SetupSystemConfigMessageModel model = SetupSystemConfigMessageModel
|
SetupSystemConfigMessageModel model = SetupSystemConfigMessageModel
|
||||||
.builder()
|
.builder()
|
||||||
.configKey(systemConfigStepParameter.getConfigKey())
|
.configKey(systemConfigStepParameter.getConfigKey())
|
||||||
@@ -108,7 +108,7 @@ public class SystemConfigSetupStep extends AbstractConfigSetupStep {
|
|||||||
@Transactional
|
@Transactional
|
||||||
public AConfig loadDefaultConfig(SystemConfigStepParameter systemConfigStepParameter) {
|
public AConfig loadDefaultConfig(SystemConfigStepParameter systemConfigStepParameter) {
|
||||||
AConfig config;
|
AConfig config;
|
||||||
ADefaultConfig defaultConfig = defaultConfigManagementService.getDefaultConfig(systemConfigStepParameter.getConfigKey());
|
SystemConfigProperty defaultConfig = defaultConfigManagementService.getDefaultConfig(systemConfigStepParameter.getConfigKey());
|
||||||
config = AConfig
|
config = AConfig
|
||||||
.builder()
|
.builder()
|
||||||
.name(defaultConfig.getName())
|
.name(defaultConfig.getName())
|
||||||
|
|||||||
@@ -1,35 +0,0 @@
|
|||||||
package dev.sheldan.abstracto.core.listener.sync.entity;
|
|
||||||
|
|
||||||
import dev.sheldan.abstracto.core.models.database.AFeature;
|
|
||||||
import dev.sheldan.abstracto.core.models.database.AServer;
|
|
||||||
import dev.sheldan.abstracto.core.service.management.DefaultFeatureFlagManagementService;
|
|
||||||
import dev.sheldan.abstracto.core.service.management.FeatureFlagManagementService;
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.stereotype.Component;
|
|
||||||
|
|
||||||
|
|
||||||
@Component
|
|
||||||
@Slf4j
|
|
||||||
public class FeatureFlagListener implements ServerConfigListener {
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private FeatureFlagManagementService service;
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private DefaultFeatureFlagManagementService defaultFeatureFlagManagementService;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void updateServerConfig(AServer server) {
|
|
||||||
log.info("Setting up feature flags if necessary.");
|
|
||||||
defaultFeatureFlagManagementService.getAllDefaultFeatureFlags().forEach(defaultFeatureFlag -> {
|
|
||||||
AFeature feature = defaultFeatureFlag.getFeature();
|
|
||||||
if(!service.featureFlagExists(feature, server)) {
|
|
||||||
log.info("Creating feature flag {} for server {}.", feature.getKey(), server.getId());
|
|
||||||
service.createFeatureFlag(feature, server.getId(), defaultFeatureFlag.isEnabled());
|
|
||||||
} else {
|
|
||||||
log.trace("Feature flag {} for server {} already exists.", feature.getKey(), server.getId());
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
package dev.sheldan.abstracto.core.repository;
|
|
||||||
|
|
||||||
import dev.sheldan.abstracto.core.models.database.ADefaultConfig;
|
|
||||||
import org.springframework.data.jpa.repository.JpaRepository;
|
|
||||||
import org.springframework.data.jpa.repository.QueryHints;
|
|
||||||
import org.springframework.stereotype.Repository;
|
|
||||||
|
|
||||||
import javax.persistence.QueryHint;
|
|
||||||
|
|
||||||
@Repository
|
|
||||||
public interface DefaultConfigRepository extends JpaRepository<ADefaultConfig, Long> {
|
|
||||||
@QueryHints(@QueryHint(name = org.hibernate.annotations.QueryHints.CACHEABLE, value = "true"))
|
|
||||||
ADefaultConfig findByName(String name);
|
|
||||||
|
|
||||||
@QueryHints(@QueryHint(name = org.hibernate.annotations.QueryHints.CACHEABLE, value = "true"))
|
|
||||||
boolean existsByName(String name);
|
|
||||||
}
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
package dev.sheldan.abstracto.core.repository;
|
|
||||||
|
|
||||||
import dev.sheldan.abstracto.core.models.database.DefaultFeatureFlag;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
import org.springframework.data.jpa.repository.JpaRepository;
|
|
||||||
import org.springframework.data.jpa.repository.QueryHints;
|
|
||||||
import org.springframework.stereotype.Repository;
|
|
||||||
|
|
||||||
import javax.persistence.QueryHint;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
@Repository
|
|
||||||
public interface DefaultFeatureFlagRepository extends JpaRepository<DefaultFeatureFlag, Long> {
|
|
||||||
@NotNull
|
|
||||||
@Override
|
|
||||||
@QueryHints(@QueryHint(name = org.hibernate.annotations.QueryHints.CACHEABLE, value = "true"))
|
|
||||||
List<DefaultFeatureFlag> findAll();
|
|
||||||
}
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
package dev.sheldan.abstracto.core.repository;
|
|
||||||
|
|
||||||
import dev.sheldan.abstracto.core.models.database.AFeature;
|
|
||||||
import dev.sheldan.abstracto.core.models.database.DefaultFeatureMode;
|
|
||||||
import org.springframework.data.jpa.repository.JpaRepository;
|
|
||||||
import org.springframework.data.jpa.repository.QueryHints;
|
|
||||||
import org.springframework.stereotype.Repository;
|
|
||||||
|
|
||||||
import javax.persistence.QueryHint;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Optional;
|
|
||||||
|
|
||||||
@Repository
|
|
||||||
public interface DefaultFeatureModeRepository extends JpaRepository<DefaultFeatureMode, Long> {
|
|
||||||
@QueryHints(@QueryHint(name = org.hibernate.annotations.QueryHints.CACHEABLE, value = "true"))
|
|
||||||
List<DefaultFeatureMode> findByFeature(AFeature feature);
|
|
||||||
|
|
||||||
@QueryHints(@QueryHint(name = org.hibernate.annotations.QueryHints.CACHEABLE, value = "true"))
|
|
||||||
Optional<DefaultFeatureMode> findByFeatureAndMode(AFeature feature, String mode);
|
|
||||||
}
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
package dev.sheldan.abstracto.core.repository;
|
|
||||||
|
|
||||||
import dev.sheldan.abstracto.core.models.database.DefaultPostTarget;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
import org.springframework.data.jpa.repository.JpaRepository;
|
|
||||||
import org.springframework.data.jpa.repository.QueryHints;
|
|
||||||
import org.springframework.stereotype.Repository;
|
|
||||||
|
|
||||||
import javax.persistence.QueryHint;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
@Repository
|
|
||||||
public interface DefaultPostTargetRepository extends JpaRepository<DefaultPostTarget, Long> {
|
|
||||||
@NotNull
|
|
||||||
@Override
|
|
||||||
@QueryHints(@QueryHint(name = org.hibernate.annotations.QueryHints.CACHEABLE, value = "true"))
|
|
||||||
List<DefaultPostTarget> findAll();
|
|
||||||
}
|
|
||||||
@@ -8,11 +8,12 @@ import org.springframework.data.jpa.repository.QueryHints;
|
|||||||
|
|
||||||
import javax.persistence.QueryHint;
|
import javax.persistence.QueryHint;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
public interface FeatureFlagRepository extends JpaRepository<AFeatureFlag, Long> {
|
public interface FeatureFlagRepository extends JpaRepository<AFeatureFlag, Long> {
|
||||||
|
|
||||||
@QueryHints(@QueryHint(name = org.hibernate.annotations.QueryHints.CACHEABLE, value = "true"))
|
@QueryHints(@QueryHint(name = org.hibernate.annotations.QueryHints.CACHEABLE, value = "true"))
|
||||||
AFeatureFlag findByServerAndFeature(AServer server, AFeature key);
|
Optional<AFeatureFlag> findByServerAndFeature(AServer server, AFeature key);
|
||||||
|
|
||||||
@QueryHints(@QueryHint(name = org.hibernate.annotations.QueryHints.CACHEABLE, value = "true"))
|
@QueryHints(@QueryHint(name = org.hibernate.annotations.QueryHints.CACHEABLE, value = "true"))
|
||||||
boolean existsByServerAndFeature(AServer server, AFeature key);
|
boolean existsByServerAndFeature(AServer server, AFeature key);
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ import java.util.Optional;
|
|||||||
public interface FeatureModeRepository extends JpaRepository<AFeatureMode, Long> {
|
public interface FeatureModeRepository extends JpaRepository<AFeatureMode, Long> {
|
||||||
|
|
||||||
@QueryHints(@QueryHint(name = org.hibernate.annotations.QueryHints.CACHEABLE, value = "true"))
|
@QueryHints(@QueryHint(name = org.hibernate.annotations.QueryHints.CACHEABLE, value = "true"))
|
||||||
Optional<AFeatureMode> findByServerAndFeatureFlag_FeatureAndFeatureMode_Mode(AServer server, AFeature feature, String mode);
|
Optional<AFeatureMode> findByServerAndFeatureFlag_FeatureAndFeatureMode(AServer server, AFeature feature, String mode);
|
||||||
|
|
||||||
@QueryHints(@QueryHint(name = org.hibernate.annotations.QueryHints.CACHEABLE, value = "true"))
|
@QueryHints(@QueryHint(name = org.hibernate.annotations.QueryHints.CACHEABLE, value = "true"))
|
||||||
List<AFeatureMode> findByServer(AServer server);
|
List<AFeatureMode> findByServer(AServer server);
|
||||||
|
|||||||
@@ -7,11 +7,15 @@ import dev.sheldan.abstracto.core.exception.FeatureNotFoundException;
|
|||||||
import dev.sheldan.abstracto.core.models.database.AFeature;
|
import dev.sheldan.abstracto.core.models.database.AFeature;
|
||||||
import dev.sheldan.abstracto.core.models.database.AFeatureFlag;
|
import dev.sheldan.abstracto.core.models.database.AFeatureFlag;
|
||||||
import dev.sheldan.abstracto.core.models.database.AServer;
|
import dev.sheldan.abstracto.core.models.database.AServer;
|
||||||
|
import dev.sheldan.abstracto.core.models.property.FeatureFlagProperty;
|
||||||
|
import dev.sheldan.abstracto.core.service.management.DefaultFeatureFlagManagementService;
|
||||||
import dev.sheldan.abstracto.core.service.management.FeatureFlagManagementService;
|
import dev.sheldan.abstracto.core.service.management.FeatureFlagManagementService;
|
||||||
import dev.sheldan.abstracto.core.service.management.ServerManagementService;
|
import dev.sheldan.abstracto.core.service.management.ServerManagementService;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
@Component
|
@Component
|
||||||
public class FeatureFlagServiceBean implements FeatureFlagService {
|
public class FeatureFlagServiceBean implements FeatureFlagService {
|
||||||
|
|
||||||
@@ -27,6 +31,9 @@ public class FeatureFlagServiceBean implements FeatureFlagService {
|
|||||||
@Autowired
|
@Autowired
|
||||||
private ServerManagementService serverManagementService;
|
private ServerManagementService serverManagementService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private DefaultFeatureFlagManagementService defaultFeatureFlagManagementService;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isFeatureEnabled(FeatureConfig name, Long serverId) {
|
public boolean isFeatureEnabled(FeatureConfig name, Long serverId) {
|
||||||
return getFeatureFlagValue(name.getFeature(), serverId);
|
return getFeatureFlagValue(name.getFeature(), serverId);
|
||||||
@@ -67,6 +74,18 @@ public class FeatureFlagServiceBean implements FeatureFlagService {
|
|||||||
updateFeatureFlag(feature, server, false);
|
updateFeatureFlag(feature, server, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public AFeatureFlag createInstanceFromDefaultConfig(FeatureEnum name, Long serverId) {
|
||||||
|
FeatureFlagProperty defaultFeatureFlag = defaultFeatureFlagManagementService.getDefaultFeatureFlagProperty(name);
|
||||||
|
return updateFeatureFlag(name, serverId, defaultFeatureFlag.getEnabled());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public AFeatureFlag createInstanceFromDefaultConfig(FeatureEnum name, AServer server) {
|
||||||
|
FeatureFlagProperty defaultFeatureFlag = defaultFeatureFlagManagementService.getDefaultFeatureFlagProperty(name);
|
||||||
|
return updateFeatureFlag(name, server, defaultFeatureFlag.getEnabled());
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean getFeatureFlagValue(FeatureEnum key, Long serverId) {
|
public boolean getFeatureFlagValue(FeatureEnum key, Long serverId) {
|
||||||
AServer server = serverManagementService.loadOrCreate(serverId);
|
AServer server = serverManagementService.loadOrCreate(serverId);
|
||||||
@@ -76,8 +95,10 @@ public class FeatureFlagServiceBean implements FeatureFlagService {
|
|||||||
@Override
|
@Override
|
||||||
public boolean getFeatureFlagValue(FeatureEnum key, AServer server) {
|
public boolean getFeatureFlagValue(FeatureEnum key, AServer server) {
|
||||||
AFeature feature = featureManagementService.getFeature(key.getKey());
|
AFeature feature = featureManagementService.getFeature(key.getKey());
|
||||||
AFeatureFlag featureFlag = managementService.getFeatureFlag(feature, server);
|
Optional<AFeatureFlag> featureFlagOptional = managementService.getFeatureFlag(feature, server);
|
||||||
return featureFlag.isEnabled();
|
return featureFlagOptional
|
||||||
|
.map(AFeatureFlag::isEnabled)
|
||||||
|
.orElseGet(() -> defaultFeatureFlagManagementService.getDefaultFeatureFlagProperty(feature).getEnabled());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import dev.sheldan.abstracto.core.config.FeatureEnum;
|
|||||||
import dev.sheldan.abstracto.core.config.FeatureMode;
|
import dev.sheldan.abstracto.core.config.FeatureMode;
|
||||||
import dev.sheldan.abstracto.core.exception.FeatureModeNotFoundException;
|
import dev.sheldan.abstracto.core.exception.FeatureModeNotFoundException;
|
||||||
import dev.sheldan.abstracto.core.models.database.*;
|
import dev.sheldan.abstracto.core.models.database.*;
|
||||||
|
import dev.sheldan.abstracto.core.models.property.FeatureModeProperty;
|
||||||
import dev.sheldan.abstracto.core.models.template.commands.FeatureModeDisplay;
|
import dev.sheldan.abstracto.core.models.template.commands.FeatureModeDisplay;
|
||||||
import dev.sheldan.abstracto.core.service.management.DefaultFeatureModeManagement;
|
import dev.sheldan.abstracto.core.service.management.DefaultFeatureModeManagement;
|
||||||
import dev.sheldan.abstracto.core.service.management.FeatureFlagManagementService;
|
import dev.sheldan.abstracto.core.service.management.FeatureFlagManagementService;
|
||||||
@@ -29,6 +30,9 @@ public class FeatureModeServiceBean implements FeatureModeService {
|
|||||||
@Autowired
|
@Autowired
|
||||||
private FeatureFlagManagementService featureFlagManagementService;
|
private FeatureFlagManagementService featureFlagManagementService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private FeatureFlagService featureFlagService;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private FeatureManagementService featureManagementService;
|
private FeatureManagementService featureManagementService;
|
||||||
|
|
||||||
@@ -43,13 +47,18 @@ public class FeatureModeServiceBean implements FeatureModeService {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void enableFeatureModeForFeature(FeatureEnum featureEnum, AServer server, FeatureMode mode) {
|
public void enableFeatureModeForFeature(FeatureEnum featureEnum, AServer server, FeatureMode mode) {
|
||||||
|
setOrCreateFeatureMode(featureEnum, server, mode, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setOrCreateFeatureMode(FeatureEnum featureEnum, AServer server, FeatureMode mode, boolean featureModeState) {
|
||||||
AFeature feature = featureManagementService.getFeature(featureEnum.getKey());
|
AFeature feature = featureManagementService.getFeature(featureEnum.getKey());
|
||||||
Optional<AFeatureMode> existing = featureModeManagementService.getFeatureMode(feature, server, mode);
|
Optional<AFeatureMode> existing = featureModeManagementService.getFeatureMode(feature, server, mode);
|
||||||
if(existing.isPresent()) {
|
if (existing.isPresent()) {
|
||||||
existing.get().setEnabled(true);
|
existing.get().setEnabled(featureModeState);
|
||||||
} else {
|
} else {
|
||||||
AFeatureFlag featureFlag = featureFlagManagementService.getFeatureFlag(feature, server);
|
Optional<AFeatureFlag> featureFlagOptional = featureFlagManagementService.getFeatureFlag(feature, server);
|
||||||
featureModeManagementService.createMode(featureFlag, mode, true);
|
AFeatureFlag featureFlagInstance = featureFlagOptional.orElseGet(() -> featureFlagService.createInstanceFromDefaultConfig(featureEnum, server));
|
||||||
|
featureModeManagementService.createMode(featureFlagInstance, mode, featureModeState);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -64,14 +73,7 @@ public class FeatureModeServiceBean implements FeatureModeService {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void disableFeatureModeForFeature(FeatureEnum featureEnum, AServer server, FeatureMode mode) {
|
public void disableFeatureModeForFeature(FeatureEnum featureEnum, AServer server, FeatureMode mode) {
|
||||||
AFeature feature = featureManagementService.getFeature(featureEnum.getKey());
|
setOrCreateFeatureMode(featureEnum, server, mode, false);
|
||||||
Optional<AFeatureMode> existing = featureModeManagementService.getFeatureMode(feature, server, mode);
|
|
||||||
if(existing.isPresent()) {
|
|
||||||
existing.get().setEnabled(false);
|
|
||||||
} else {
|
|
||||||
AFeatureFlag featureFlag = featureFlagManagementService.getFeatureFlag(feature, server);
|
|
||||||
featureModeManagementService.createMode(featureFlag, mode, false);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -80,7 +82,7 @@ public class FeatureModeServiceBean implements FeatureModeService {
|
|||||||
if(featureModeManagementService.doesFeatureModeExist(feature, server, mode)) {
|
if(featureModeManagementService.doesFeatureModeExist(feature, server, mode)) {
|
||||||
return featureModeManagementService.isFeatureModeActive(feature, server, mode);
|
return featureModeManagementService.isFeatureModeActive(feature, server, mode);
|
||||||
} else {
|
} else {
|
||||||
return defaultFeatureModeManagement.getFeatureMode(feature, mode.getKey()).isEnabled();
|
return defaultFeatureModeManagement.getFeatureMode(feature, mode.getKey()).getEnabled();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -116,19 +118,19 @@ public class FeatureModeServiceBean implements FeatureModeService {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<FeatureModeDisplay> getEffectiveFeatureModes(AServer server) {
|
public List<FeatureModeDisplay> getEffectiveFeatureModes(AServer server) {
|
||||||
List<DefaultFeatureMode> allDefaultModes = defaultFeatureModeManagement.getAll();
|
List<FeatureModeProperty> allDefaultModes = defaultFeatureModeManagement.getAll();
|
||||||
List<AFeatureMode> allModesFromServer = featureModeManagementService.getFeatureModesOfServer(server);
|
List<AFeatureMode> allModesFromServer = featureModeManagementService.getFeatureModesOfServer(server);
|
||||||
return combineFeatureModesWithDefault(server, allDefaultModes, allModesFromServer);
|
return combineFeatureModesWithDefault(server, allDefaultModes, allModesFromServer);
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<FeatureModeDisplay> combineFeatureModesWithDefault(AServer server, List<DefaultFeatureMode> allDefaultModes, List<AFeatureMode> allModesFromServer) {
|
private List<FeatureModeDisplay> combineFeatureModesWithDefault(AServer server, List<FeatureModeProperty> allDefaultModes, List<AFeatureMode> allModesFromServer) {
|
||||||
List<FeatureModeDisplay> result = new ArrayList<>();
|
List<FeatureModeDisplay> result = new ArrayList<>();
|
||||||
List<AFeatureMode> activeModes = allModesFromServer.stream().filter(AFeatureMode::getEnabled).collect(Collectors.toList());
|
List<AFeatureMode> activeModes = allModesFromServer.stream().filter(AFeatureMode::getEnabled).collect(Collectors.toList());
|
||||||
List<AFeatureMode> disabledModes = allModesFromServer.stream().filter(aFeatureMode -> !aFeatureMode.getEnabled()).collect(Collectors.toList());
|
List<AFeatureMode> disabledModes = allModesFromServer.stream().filter(aFeatureMode -> !aFeatureMode.getEnabled()).collect(Collectors.toList());
|
||||||
List<String> usedModes = allModesFromServer.stream().map(aFeatureMode -> aFeatureMode.getFeatureMode().getMode()).collect(Collectors.toList());
|
List<String> usedModes = allModesFromServer.stream().map(AFeatureMode::getFeatureMode).collect(Collectors.toList());
|
||||||
HashMap<String, FeatureConfig> featureConfigCache = new HashMap<>();
|
HashMap<String, FeatureConfig> featureConfigCache = new HashMap<>();
|
||||||
Consumer<AFeatureMode> loadUsedValues = aFeatureMode -> {
|
Consumer<AFeatureMode> loadUsedValues = aFeatureMode -> {
|
||||||
FeatureConfig featureConfig = getFeatureConfig(featureConfigCache, aFeatureMode.getFeatureFlag().getFeature());
|
FeatureConfig featureConfig = getFeatureConfig(featureConfigCache, aFeatureMode.getFeatureFlag().getFeature().getKey());
|
||||||
FeatureModeDisplay featureModeDisplay = FeatureModeDisplay
|
FeatureModeDisplay featureModeDisplay = FeatureModeDisplay
|
||||||
.builder()
|
.builder()
|
||||||
.featureMode(aFeatureMode)
|
.featureMode(aFeatureMode)
|
||||||
@@ -141,9 +143,10 @@ public class FeatureModeServiceBean implements FeatureModeService {
|
|||||||
disabledModes.forEach(loadUsedValues);
|
disabledModes.forEach(loadUsedValues);
|
||||||
allDefaultModes.forEach(defaultFeatureMode -> {
|
allDefaultModes.forEach(defaultFeatureMode -> {
|
||||||
if(!usedModes.contains(defaultFeatureMode.getMode())) {
|
if(!usedModes.contains(defaultFeatureMode.getMode())) {
|
||||||
FeatureConfig featureConfig = getFeatureConfig(featureConfigCache, defaultFeatureMode.getFeature());
|
FeatureConfig featureConfig = getFeatureConfig(featureConfigCache, defaultFeatureMode.getFeatureName());
|
||||||
AFeatureFlag featureFlag = featureFlagManagementService.getFeatureFlag(defaultFeatureMode.getFeature(), server);
|
AFeatureFlag featureFlag = featureFlagManagementService.getFeatureFlag(defaultFeatureMode.getFeatureName(), server).orElse(null);
|
||||||
AFeatureMode fakeMode = AFeatureMode.builder().server(server).enabled(defaultFeatureMode.isEnabled()).featureMode(defaultFeatureMode).featureFlag(featureFlag).build();
|
// TODO refactor this to a separate display model, instead of building the AFeatureMode instance
|
||||||
|
AFeatureMode fakeMode = AFeatureMode.builder().server(server).enabled(defaultFeatureMode.getEnabled()).featureMode(defaultFeatureMode.getMode()).featureFlag(featureFlag).build();
|
||||||
FeatureModeDisplay featureModeDisplay = FeatureModeDisplay
|
FeatureModeDisplay featureModeDisplay = FeatureModeDisplay
|
||||||
.builder()
|
.builder()
|
||||||
.featureMode(fakeMode)
|
.featureMode(fakeMode)
|
||||||
@@ -156,13 +159,12 @@ public class FeatureModeServiceBean implements FeatureModeService {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
private FeatureConfig getFeatureConfig(HashMap<String, FeatureConfig> featureConfigs, AFeature feature) {
|
private FeatureConfig getFeatureConfig(HashMap<String, FeatureConfig> featureConfigs, String featureKey) {
|
||||||
String featureKey = feature.getKey();
|
|
||||||
FeatureConfig featureConfig;
|
FeatureConfig featureConfig;
|
||||||
if (featureConfigs.containsKey(featureKey)) {
|
if (featureConfigs.containsKey(featureKey)) {
|
||||||
featureConfig = featureConfigs.get(featureKey);
|
featureConfig = featureConfigs.get(featureKey);
|
||||||
} else {
|
} else {
|
||||||
featureConfig = featureConfigService.getFeatureConfigForFeature(feature);
|
featureConfig = featureConfigService.getFeatureDisplayForFeature(featureKey);
|
||||||
featureConfigs.put(featureKey, featureConfig);
|
featureConfigs.put(featureKey, featureConfig);
|
||||||
}
|
}
|
||||||
return featureConfig;
|
return featureConfig;
|
||||||
@@ -170,7 +172,7 @@ public class FeatureModeServiceBean implements FeatureModeService {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<FeatureModeDisplay> getEffectiveFeatureModes(AServer server, AFeature feature) {
|
public List<FeatureModeDisplay> getEffectiveFeatureModes(AServer server, AFeature feature) {
|
||||||
List<DefaultFeatureMode> allDefaultModes = defaultFeatureModeManagement.getFeatureModesForFeature(feature);
|
List<FeatureModeProperty> allDefaultModes = defaultFeatureModeManagement.getFeatureModesForFeature(feature);
|
||||||
List<AFeatureMode> allModesFromServer = featureModeManagementService.getFeatureModesOfFeatureInServer(server, feature);
|
List<AFeatureMode> allModesFromServer = featureModeManagementService.getFeatureModesOfFeatureInServer(server, feature);
|
||||||
return combineFeatureModesWithDefault(server, allDefaultModes, allModesFromServer);
|
return combineFeatureModesWithDefault(server, allDefaultModes, allModesFromServer);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,7 +18,6 @@ import net.dv8tion.jda.api.hooks.ListenerAdapter;
|
|||||||
import org.apache.commons.collections4.SetUtils;
|
import org.apache.commons.collections4.SetUtils;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Isolation;
|
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
import javax.security.auth.login.LoginException;
|
import javax.security.auth.login.LoginException;
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
package dev.sheldan.abstracto.core.service.management;
|
package dev.sheldan.abstracto.core.service.management;
|
||||||
|
|
||||||
import dev.sheldan.abstracto.core.models.database.ADefaultConfig;
|
import dev.sheldan.abstracto.core.config.DefaultConfigProperties;
|
||||||
import dev.sheldan.abstracto.core.repository.DefaultConfigRepository;
|
import dev.sheldan.abstracto.core.models.property.SystemConfigProperty;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
@@ -11,61 +11,10 @@ import org.springframework.stereotype.Component;
|
|||||||
public class DefaultConfigManagementServiceBean implements DefaultConfigManagementService {
|
public class DefaultConfigManagementServiceBean implements DefaultConfigManagementService {
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private DefaultConfigRepository defaultConfigRepository;
|
private DefaultConfigProperties defaultConfigProperties;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void createDefaultConfig(String key, String value) {
|
public SystemConfigProperty getDefaultConfig(String key) {
|
||||||
ADefaultConfig build;
|
return defaultConfigProperties.getSystemConfigs().get(key);
|
||||||
if(defaultConfigRepository.existsByName(key)) {
|
|
||||||
build = defaultConfigRepository.findByName(key);
|
|
||||||
build.setStringValue(value);
|
|
||||||
} else {
|
|
||||||
build = ADefaultConfig
|
|
||||||
.builder()
|
|
||||||
.name(key)
|
|
||||||
.stringValue(value)
|
|
||||||
.build();
|
|
||||||
log.trace("Creating default config entry with type string for key {}.", key);
|
|
||||||
}
|
|
||||||
defaultConfigRepository.save(build);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void createDefaultConfig(String key, Long value) {
|
|
||||||
ADefaultConfig build;
|
|
||||||
if(defaultConfigRepository.existsByName(key)) {
|
|
||||||
build = defaultConfigRepository.findByName(key);
|
|
||||||
build.setLongValue(value);
|
|
||||||
} else {
|
|
||||||
build = ADefaultConfig
|
|
||||||
.builder()
|
|
||||||
.name(key)
|
|
||||||
.longValue(value)
|
|
||||||
.build();
|
|
||||||
log.trace("Creating default config entry with type long for key {}.", key);
|
|
||||||
}
|
|
||||||
defaultConfigRepository.save(build);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void createDefaultConfig(String key, Double value) {
|
|
||||||
ADefaultConfig build;
|
|
||||||
if(defaultConfigRepository.existsByName(key)) {
|
|
||||||
build = defaultConfigRepository.findByName(key);
|
|
||||||
build.setDoubleValue(value);
|
|
||||||
} else {
|
|
||||||
build = ADefaultConfig
|
|
||||||
.builder()
|
|
||||||
.name(key)
|
|
||||||
.doubleValue(value)
|
|
||||||
.build();
|
|
||||||
log.trace("Creating default config entry with type double for key {}.", key);
|
|
||||||
}
|
|
||||||
defaultConfigRepository.save(build);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ADefaultConfig getDefaultConfig(String key) {
|
|
||||||
return defaultConfigRepository.findByName(key);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,26 +1,46 @@
|
|||||||
package dev.sheldan.abstracto.core.service.management;
|
package dev.sheldan.abstracto.core.service.management;
|
||||||
|
|
||||||
import dev.sheldan.abstracto.core.models.database.DefaultFeatureFlag;
|
import dev.sheldan.abstracto.core.config.DefaultConfigProperties;
|
||||||
import dev.sheldan.abstracto.core.repository.DefaultFeatureFlagRepository;
|
import dev.sheldan.abstracto.core.config.FeatureEnum;
|
||||||
|
import dev.sheldan.abstracto.core.exception.AbstractoRunTimeException;
|
||||||
|
import dev.sheldan.abstracto.core.models.database.AFeature;
|
||||||
|
import dev.sheldan.abstracto.core.models.property.FeatureFlagProperty;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
@Component
|
@Component
|
||||||
public class DefaultFeatureFlagManagementServiceBean implements DefaultFeatureFlagManagementService{
|
public class DefaultFeatureFlagManagementServiceBean implements DefaultFeatureFlagManagementService{
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private DefaultFeatureFlagRepository repository;
|
private DefaultConfigProperties defaultConfigProperties;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<String> getDefaultFeatureKeys() {
|
public List<String> getDefaultFeatureKeys() {
|
||||||
return repository.findAll().stream().map(defaultFeatureFlag -> defaultFeatureFlag.getFeature().getKey()).collect(Collectors.toList());
|
return new ArrayList<>(defaultConfigProperties.getFeatureFlags().keySet());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<DefaultFeatureFlag> getAllDefaultFeatureFlags() {
|
public FeatureFlagProperty getDefaultFeatureFlagProperty(AFeature feature) {
|
||||||
return repository.findAll();
|
return findFeatureFlagPropertyViaFeatureKey(feature.getKey());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public FeatureFlagProperty getDefaultFeatureFlagProperty(FeatureEnum feature) {
|
||||||
|
return findFeatureFlagPropertyViaFeatureKey(feature.getKey());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<FeatureFlagProperty> getAllDefaultFeatureFlags() {
|
||||||
|
return new ArrayList<>(defaultConfigProperties.getFeatureFlags().values());
|
||||||
|
}
|
||||||
|
|
||||||
|
private FeatureFlagProperty findFeatureFlagPropertyViaFeatureKey(String featureKey) {
|
||||||
|
return getAllDefaultFeatureFlags()
|
||||||
|
.stream()
|
||||||
|
.filter(featureFlagProperty -> featureFlagProperty.getFeatureName().equals(featureKey)).findFirst()
|
||||||
|
.orElseThrow(() -> new AbstractoRunTimeException(String.format("Feature flag for feature %s has no default value.", featureKey)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,42 +1,51 @@
|
|||||||
package dev.sheldan.abstracto.core.service.management;
|
package dev.sheldan.abstracto.core.service.management;
|
||||||
|
|
||||||
|
import dev.sheldan.abstracto.core.config.DefaultConfigProperties;
|
||||||
import dev.sheldan.abstracto.core.exception.FeatureModeNotFoundException;
|
import dev.sheldan.abstracto.core.exception.FeatureModeNotFoundException;
|
||||||
import dev.sheldan.abstracto.core.models.database.AFeature;
|
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 dev.sheldan.abstracto.core.repository.DefaultFeatureModeRepository;
|
|
||||||
import dev.sheldan.abstracto.core.service.FeatureConfigService;
|
import dev.sheldan.abstracto.core.service.FeatureConfigService;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@Component
|
@Component
|
||||||
public class DefaultFeatureModeManagementBean implements DefaultFeatureModeManagement {
|
public class DefaultFeatureModeManagementBean implements DefaultFeatureModeManagement {
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private DefaultFeatureModeRepository defaultFeatureModeRepository;
|
private DefaultConfigProperties defaultConfigProperties;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private FeatureConfigService featureConfigService;
|
private FeatureConfigService featureConfigService;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<DefaultFeatureMode> getFeatureModesForFeature(AFeature feature) {
|
public List<FeatureModeProperty> getFeatureModesForFeature(AFeature feature) {
|
||||||
return defaultFeatureModeRepository.findByFeature(feature);
|
return defaultConfigProperties
|
||||||
|
.getFeatureModes()
|
||||||
|
.values()
|
||||||
|
.stream()
|
||||||
|
.filter(featureModeProperty -> featureModeProperty.getFeatureName().equals(feature.getKey()))
|
||||||
|
.collect(Collectors.toList());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<DefaultFeatureMode> getAll() {
|
public List<FeatureModeProperty> getAll() {
|
||||||
return defaultFeatureModeRepository.findAll();
|
return new ArrayList<>(defaultConfigProperties.getFeatureModes().values());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Optional<DefaultFeatureMode> getFeatureModeOptional(AFeature feature, String mode) {
|
public Optional<FeatureModeProperty> getFeatureModeOptional(AFeature feature, String mode) {
|
||||||
return defaultFeatureModeRepository.findByFeatureAndMode(feature, mode);
|
return Optional.ofNullable(defaultConfigProperties
|
||||||
|
.getFeatureModes()
|
||||||
|
.get(mode));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public DefaultFeatureMode getFeatureMode(AFeature feature, String mode) {
|
public FeatureModeProperty getFeatureMode(AFeature feature, String mode) {
|
||||||
return getFeatureModeOptional(feature, mode).orElseThrow(() -> new FeatureModeNotFoundException(mode, featureConfigService.getFeatureModesFromFeatureAsString(feature.getKey())));
|
return getFeatureModeOptional(feature, mode).orElseThrow(() -> new FeatureModeNotFoundException(mode, featureConfigService.getFeatureModesFromFeatureAsString(feature.getKey())));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +1,11 @@
|
|||||||
package dev.sheldan.abstracto.core.service.management;
|
package dev.sheldan.abstracto.core.service.management;
|
||||||
|
|
||||||
import dev.sheldan.abstracto.core.models.database.DefaultPostTarget;
|
import dev.sheldan.abstracto.core.config.DefaultConfigProperties;
|
||||||
import dev.sheldan.abstracto.core.repository.DefaultPostTargetRepository;
|
import dev.sheldan.abstracto.core.models.property.PostTargetProperty;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@@ -12,15 +13,15 @@ import java.util.stream.Collectors;
|
|||||||
public class DefaultPostTargetManagementServiceBean implements DefaultPostTargetManagementService {
|
public class DefaultPostTargetManagementServiceBean implements DefaultPostTargetManagementService {
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private DefaultPostTargetRepository repository;
|
private DefaultConfigProperties defaultConfigProperties;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<DefaultPostTarget> getAllDefaultPostTargets() {
|
public List<PostTargetProperty> getAllDefaultPostTargets() {
|
||||||
return repository.findAll();
|
return new ArrayList<>(defaultConfigProperties.getPostTargets().values());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<String> getDefaultPostTargetKeys() {
|
public List<String> getDefaultPostTargetKeys() {
|
||||||
return getAllDefaultPostTargets().stream().map(DefaultPostTarget::getName).collect(Collectors.toList());
|
return getAllDefaultPostTargets().stream().map(PostTargetProperty::getName).collect(Collectors.toList());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import org.springframework.beans.factory.annotation.Autowired;
|
|||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
@Component
|
@Component
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@@ -45,18 +46,30 @@ public class FeatureFlagManagementServiceBean implements FeatureFlagManagementSe
|
|||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public AFeatureFlag getFeatureFlag(AFeature feature, Long serverId) {
|
public Optional<AFeatureFlag> getFeatureFlag(AFeature feature, Long serverId) {
|
||||||
AServer server = serverManagementService.loadOrCreate(serverId);
|
AServer server = serverManagementService.loadOrCreate(serverId);
|
||||||
return getFeatureFlag(feature, server);
|
return getFeatureFlag(feature, server);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Optional<AFeatureFlag> getFeatureFlag(String featureKey, Long serverId) {
|
||||||
|
AFeature feature = featureManagementService.getFeature(featureKey);
|
||||||
|
return getFeatureFlag(feature, serverId);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Optional<AFeatureFlag> getFeatureFlag(String featureKey, AServer server) {
|
||||||
|
AFeature feature = featureManagementService.getFeature(featureKey);
|
||||||
|
return getFeatureFlag(feature, server);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean featureFlagExists(AFeature feature, AServer server) {
|
public boolean featureFlagExists(AFeature feature, AServer server) {
|
||||||
return repository.existsByServerAndFeature(server, feature);
|
return repository.existsByServerAndFeature(server, feature);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public AFeatureFlag getFeatureFlag(AFeature feature, AServer server) {
|
public Optional<AFeatureFlag> getFeatureFlag(AFeature feature, AServer server) {
|
||||||
return repository.findByServerAndFeature(server, feature);
|
return repository.findByServerAndFeature(server, feature);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -73,9 +86,15 @@ public class FeatureFlagManagementServiceBean implements FeatureFlagManagementSe
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public AFeatureFlag setFeatureFlagValue(AFeature feature, AServer server, Boolean newValue) {
|
public AFeatureFlag setFeatureFlagValue(AFeature feature, AServer server, Boolean newValue) {
|
||||||
AFeatureFlag featureFlag = getFeatureFlag(feature, server);
|
Optional<AFeatureFlag> featureFlagOptional = getFeatureFlag(feature, server);
|
||||||
featureFlag.setEnabled(newValue);
|
if(!featureFlagOptional.isPresent()) {
|
||||||
log.info("Setting feature flag for feature {} in server {} to value {}.", feature.getKey(), server.getId(), newValue);
|
log.info("Setting feature flag for feature {} in server {} to value {}.", feature.getKey(), server.getId(), newValue);
|
||||||
return featureFlag;
|
return createFeatureFlag(feature, server, newValue);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
AFeatureFlag featureFlag = featureFlagOptional.get();
|
||||||
|
featureFlag.setEnabled(newValue);
|
||||||
|
return featureFlag;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,13 +25,12 @@ public class FeatureModeManagementServiceBean implements FeatureModeManagementSe
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public AFeatureMode createMode(AFeatureFlag featureFlag, String mode, boolean enabled) {
|
public AFeatureMode createMode(AFeatureFlag featureFlag, String mode, boolean enabled) {
|
||||||
DefaultFeatureMode defaultMode = defaultFeatureModeManagement.getFeatureMode(featureFlag.getFeature(), mode);
|
|
||||||
AFeatureMode aFeatureMode = AFeatureMode
|
AFeatureMode aFeatureMode = AFeatureMode
|
||||||
.builder()
|
.builder()
|
||||||
.featureFlag(featureFlag)
|
.featureFlag(featureFlag)
|
||||||
.server(featureFlag.getServer())
|
.server(featureFlag.getServer())
|
||||||
.enabled(enabled)
|
.enabled(enabled)
|
||||||
.featureMode(defaultMode)
|
.featureMode(mode)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
featureModeRepository.save(aFeatureMode);
|
featureModeRepository.save(aFeatureMode);
|
||||||
@@ -40,7 +39,7 @@ public class FeatureModeManagementServiceBean implements FeatureModeManagementSe
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isFeatureModeActive(AFeature aFeature, AServer server, FeatureMode mode) {
|
public boolean isFeatureModeActive(AFeature aFeature, AServer server, FeatureMode mode) {
|
||||||
Optional<AFeatureMode> featureModeOptional = featureModeRepository.findByServerAndFeatureFlag_FeatureAndFeatureMode_Mode(server, aFeature, mode.getKey());
|
Optional<AFeatureMode> featureModeOptional = featureModeRepository.findByServerAndFeatureFlag_FeatureAndFeatureMode(server, aFeature, mode.getKey());
|
||||||
return featureModeOptional.isPresent() && featureModeOptional.get().getEnabled();
|
return featureModeOptional.isPresent() && featureModeOptional.get().getEnabled();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -51,7 +50,7 @@ public class FeatureModeManagementServiceBean implements FeatureModeManagementSe
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean doesFeatureModeExist(AFeature aFeature, AServer server, String modeKey) {
|
public boolean doesFeatureModeExist(AFeature aFeature, AServer server, String modeKey) {
|
||||||
return featureModeRepository.findByServerAndFeatureFlag_FeatureAndFeatureMode_Mode(server, aFeature, modeKey).isPresent();
|
return featureModeRepository.findByServerAndFeatureFlag_FeatureAndFeatureMode(server, aFeature, modeKey).isPresent();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -61,7 +60,7 @@ public class FeatureModeManagementServiceBean implements FeatureModeManagementSe
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Optional<AFeatureMode> getFeatureMode(AFeature aFeature, AServer server, String modeKey) {
|
public Optional<AFeatureMode> getFeatureMode(AFeature aFeature, AServer server, String modeKey) {
|
||||||
return featureModeRepository.findByServerAndFeatureFlag_FeatureAndFeatureMode_Mode(server, aFeature, modeKey);
|
return featureModeRepository.findByServerAndFeatureFlag_FeatureAndFeatureMode(server, aFeature, modeKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -7,3 +7,11 @@ server.port=8080
|
|||||||
abstracto.allowedmention.everyone=false
|
abstracto.allowedmention.everyone=false
|
||||||
abstracto.allowedmention.role=true
|
abstracto.allowedmention.role=true
|
||||||
abstracto.allowedmention.user=true
|
abstracto.allowedmention.user=true
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
abstracto.systemConfigs.prefix.name=prefix
|
||||||
|
abstracto.systemConfigs.prefix.stringValue=!
|
||||||
|
|
||||||
|
abstracto.featureFlags.core.featureName=core
|
||||||
|
abstracto.featureFlags.core.enabled=true
|
||||||
@@ -9,8 +9,6 @@
|
|||||||
<include file="feature.xml" relativeToChangelogFile="true"/>
|
<include file="feature.xml" relativeToChangelogFile="true"/>
|
||||||
<include file="module.xml" relativeToChangelogFile="true"/>
|
<include file="module.xml" relativeToChangelogFile="true"/>
|
||||||
<include file="command.xml" relativeToChangelogFile="true"/>
|
<include file="command.xml" relativeToChangelogFile="true"/>
|
||||||
<include file="default_config.xml" relativeToChangelogFile="true"/>
|
|
||||||
<include file="lock.xml" relativeToChangelogFile="true"/>
|
<include file="lock.xml" relativeToChangelogFile="true"/>
|
||||||
<include file="default_feature_flag.xml" relativeToChangelogFile="true"/>
|
|
||||||
<include file="default_emote.xml" relativeToChangelogFile="true"/>
|
<include file="default_emote.xml" relativeToChangelogFile="true"/>
|
||||||
</databaseChangeLog>
|
</databaseChangeLog>
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
|
|
||||||
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
|
|
||||||
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
|
|
||||||
xmlns:pro="http://www.liquibase.org/xml/ns/pro"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog ../../dbchangelog-3.8.xsd
|
|
||||||
http://www.liquibase.org/xml/ns/dbchangelog-ext ../../dbchangelog-3.8.xsd
|
|
||||||
http://www.liquibase.org/xml/ns/pro ../../dbchangelog-3.8.xsd" >
|
|
||||||
<property name="today" value="(SELECT NOW())"/>
|
|
||||||
<changeSet author="Sheldan" id="prefix-insert">
|
|
||||||
<insert tableName="default_config">
|
|
||||||
<column name="string_value" value="!"/>
|
|
||||||
<column name="name" value="prefix"/>
|
|
||||||
<column name="created" valueComputed="${today}"/>
|
|
||||||
</insert>
|
|
||||||
</changeSet>
|
|
||||||
|
|
||||||
</databaseChangeLog>
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
|
|
||||||
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
|
|
||||||
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
|
|
||||||
xmlns:pro="http://www.liquibase.org/xml/ns/pro"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog ../../dbchangelog-3.8.xsd
|
|
||||||
http://www.liquibase.org/xml/ns/dbchangelog-ext ../../dbchangelog-3.8.xsd
|
|
||||||
http://www.liquibase.org/xml/ns/pro ../../dbchangelog-3.8.xsd" >
|
|
||||||
<property name="coreFeature" value="(SELECT id FROM feature WHERE key = 'core')"/>
|
|
||||||
<property name="today" value="(SELECT NOW())"/>
|
|
||||||
<changeSet author="Sheldan" id="core_default_feature_flag-insertion">
|
|
||||||
<insert tableName="default_feature_flag">
|
|
||||||
<column name="enabled" value="true"/>
|
|
||||||
<column name="feature_id" valueComputed="${coreFeature}" />
|
|
||||||
<column name="created" valueComputed="${today}"/>
|
|
||||||
</insert>
|
|
||||||
</changeSet>
|
|
||||||
</databaseChangeLog>
|
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
|
|
||||||
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
|
|
||||||
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
|
|
||||||
xmlns:pro="http://www.liquibase.org/xml/ns/pro"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog ../../dbchangelog-3.8.xsd
|
|
||||||
http://www.liquibase.org/xml/ns/dbchangelog-ext ../../dbchangelog-3.8.xsd
|
|
||||||
http://www.liquibase.org/xml/ns/pro ../../dbchangelog-3.8.xsd" >
|
|
||||||
<changeSet author="Sheldan" id="default_config-table">
|
|
||||||
<createTable tableName="default_config">
|
|
||||||
<column autoIncrement="true" name="id" type="INTEGER">
|
|
||||||
<constraints nullable="false" primaryKey="true" primaryKeyName="default_config_pkey"/>
|
|
||||||
</column>
|
|
||||||
<column name="double_value" type="FLOAT8"/>
|
|
||||||
<column name="long_value" type="BIGINT"/>
|
|
||||||
<column name="name" type="VARCHAR(255)">
|
|
||||||
<constraints nullable="true"/>
|
|
||||||
</column>
|
|
||||||
<column name="string_value" type="VARCHAR(255)"/>
|
|
||||||
<column name="created" type="TIMESTAMP WITHOUT TIME ZONE">
|
|
||||||
<constraints nullable="true"/>
|
|
||||||
</column>
|
|
||||||
<column name="updated" type="TIMESTAMP WITHOUT TIME ZONE"/>
|
|
||||||
</createTable>
|
|
||||||
<sql>
|
|
||||||
DROP TRIGGER IF EXISTS default_config_update_trigger ON default_config;
|
|
||||||
CREATE TRIGGER default_config_update_trigger BEFORE UPDATE ON default_config FOR EACH ROW EXECUTE PROCEDURE update_trigger_procedure();
|
|
||||||
</sql>
|
|
||||||
<sql>
|
|
||||||
DROP TRIGGER IF EXISTS default_config_insert_trigger ON default_config;
|
|
||||||
CREATE TRIGGER default_config_insert_trigger BEFORE INSERT ON default_config FOR EACH ROW EXECUTE PROCEDURE insert_trigger_procedure();
|
|
||||||
</sql>
|
|
||||||
</changeSet>
|
|
||||||
|
|
||||||
</databaseChangeLog>
|
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
|
|
||||||
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
|
|
||||||
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
|
|
||||||
xmlns:pro="http://www.liquibase.org/xml/ns/pro"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog ../../dbchangelog-3.8.xsd
|
|
||||||
http://www.liquibase.org/xml/ns/dbchangelog-ext ../../dbchangelog-3.8.xsd
|
|
||||||
http://www.liquibase.org/xml/ns/pro ../../dbchangelog-3.8.xsd" >
|
|
||||||
<changeSet author="Sheldan" id="default_feature_flag-table">
|
|
||||||
<createTable tableName="default_feature_flag">
|
|
||||||
<column autoIncrement="true" name="id" type="BIGINT">
|
|
||||||
<constraints nullable="false" primaryKey="true" primaryKeyName="default_feature_flag_pkey"/>
|
|
||||||
</column>
|
|
||||||
<column name="created" type="TIMESTAMP WITHOUT TIME ZONE">
|
|
||||||
<constraints nullable="true"/>
|
|
||||||
</column>
|
|
||||||
<column name="updated" type="TIMESTAMP WITHOUT TIME ZONE"/>
|
|
||||||
<column name="enabled" type="BOOLEAN">
|
|
||||||
<constraints nullable="false"/>
|
|
||||||
</column>
|
|
||||||
<column name="feature_id" type="BIGINT">
|
|
||||||
<constraints nullable="false"/>
|
|
||||||
</column>
|
|
||||||
</createTable>
|
|
||||||
<addForeignKeyConstraint baseColumnNames="feature_id" baseTableName="default_feature_flag" constraintName="fk_default_feature_flag_feature" deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION" referencedColumnNames="id" referencedTableName="feature" validate="true"/>
|
|
||||||
<sql>
|
|
||||||
DROP TRIGGER IF EXISTS default_feature_flag_update_trigger ON default_feature_flag;
|
|
||||||
CREATE TRIGGER default_feature_flag_update_trigger BEFORE UPDATE ON default_feature_flag FOR EACH ROW EXECUTE PROCEDURE update_trigger_procedure();
|
|
||||||
</sql>
|
|
||||||
<sql>
|
|
||||||
DROP TRIGGER IF EXISTS default_feature_flag_insert_trigger ON default_feature_flag;
|
|
||||||
CREATE TRIGGER default_feature_flag_insert_trigger BEFORE INSERT ON default_feature_flag FOR EACH ROW EXECUTE PROCEDURE insert_trigger_procedure();
|
|
||||||
</sql>
|
|
||||||
</changeSet>
|
|
||||||
</databaseChangeLog>
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
|
|
||||||
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
|
|
||||||
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
|
|
||||||
xmlns:pro="http://www.liquibase.org/xml/ns/pro"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog ../../dbchangelog-3.8.xsd
|
|
||||||
http://www.liquibase.org/xml/ns/dbchangelog-ext ../../dbchangelog-3.8.xsd
|
|
||||||
http://www.liquibase.org/xml/ns/pro ../../dbchangelog-3.8.xsd" >
|
|
||||||
<changeSet author="Sheldan" id="default_feature_mode-table">
|
|
||||||
<createTable tableName="default_feature_mode">
|
|
||||||
<column autoIncrement="true" name="id" type="BIGINT">
|
|
||||||
<constraints nullable="false" primaryKey="true" primaryKeyName="default_feature_mode_pkey"/>
|
|
||||||
</column>
|
|
||||||
<column name="created" type="TIMESTAMP WITHOUT TIME ZONE">
|
|
||||||
<constraints nullable="true"/>
|
|
||||||
</column>
|
|
||||||
<column name="updated" type="TIMESTAMP WITHOUT TIME ZONE"/>
|
|
||||||
<column name="mode" type="VARCHAR(255)">
|
|
||||||
<constraints nullable="true"/>
|
|
||||||
</column>
|
|
||||||
<column name="enabled" type="BOOLEAN">
|
|
||||||
<constraints nullable="false"/>
|
|
||||||
</column>
|
|
||||||
<column name="feature_id" type="BIGINT">
|
|
||||||
<constraints nullable="false"/>
|
|
||||||
</column>
|
|
||||||
</createTable>
|
|
||||||
<addForeignKeyConstraint baseColumnNames="feature_id" baseTableName="default_feature_mode" constraintName="fk_default_feature_mode_feature" deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION" referencedColumnNames="id" referencedTableName="feature" validate="true"/>
|
|
||||||
<sql>
|
|
||||||
DROP TRIGGER IF EXISTS default_feature_mode_update_trigger ON default_feature_mode;
|
|
||||||
CREATE TRIGGER default_feature_mode_update_trigger BEFORE UPDATE ON default_feature_mode FOR EACH ROW EXECUTE PROCEDURE update_trigger_procedure();
|
|
||||||
</sql>
|
|
||||||
<sql>
|
|
||||||
DROP TRIGGER IF EXISTS default_feature_mode_insert_trigger ON default_feature_mode;
|
|
||||||
CREATE TRIGGER default_feature_mode_insert_trigger BEFORE INSERT ON default_feature_mode FOR EACH ROW EXECUTE PROCEDURE insert_trigger_procedure();
|
|
||||||
</sql>
|
|
||||||
</changeSet>
|
|
||||||
|
|
||||||
</databaseChangeLog>
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
|
|
||||||
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
|
|
||||||
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
|
|
||||||
xmlns:pro="http://www.liquibase.org/xml/ns/pro"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog ../../dbchangelog-3.8.xsd
|
|
||||||
http://www.liquibase.org/xml/ns/dbchangelog-ext ../../dbchangelog-3.8.xsd
|
|
||||||
http://www.liquibase.org/xml/ns/pro ../../dbchangelog-3.8.xsd" >
|
|
||||||
<changeSet author="Sheldan" id="default_posttarget-table">
|
|
||||||
<createTable tableName="default_posttarget">
|
|
||||||
<column autoIncrement="true" name="id" type="BIGINT">
|
|
||||||
<constraints nullable="false" primaryKey="true" primaryKeyName="default_posttarget_pkey"/>
|
|
||||||
</column>
|
|
||||||
<column name="name" type="VARCHAR(255)">
|
|
||||||
<constraints nullable="true"/>
|
|
||||||
</column>
|
|
||||||
<column name="created" type="TIMESTAMP WITHOUT TIME ZONE">
|
|
||||||
<constraints nullable="true"/>
|
|
||||||
</column>
|
|
||||||
<column name="updated" type="TIMESTAMP WITHOUT TIME ZONE"/>
|
|
||||||
</createTable>
|
|
||||||
<sql>
|
|
||||||
DROP TRIGGER IF EXISTS default_posttarget_update_trigger ON default_posttarget;
|
|
||||||
CREATE TRIGGER default_posttarget_update_trigger BEFORE UPDATE ON default_posttarget FOR EACH ROW EXECUTE PROCEDURE update_trigger_procedure();
|
|
||||||
</sql>
|
|
||||||
<sql>
|
|
||||||
DROP TRIGGER IF EXISTS default_posttarget_insert_trigger ON default_posttarget;
|
|
||||||
CREATE TRIGGER default_posttarget_insert_trigger BEFORE INSERT ON default_posttarget FOR EACH ROW EXECUTE PROCEDURE insert_trigger_procedure();
|
|
||||||
</sql>
|
|
||||||
</changeSet>
|
|
||||||
|
|
||||||
</databaseChangeLog>
|
|
||||||
@@ -18,7 +18,7 @@
|
|||||||
<column name="enabled" type="BOOLEAN">
|
<column name="enabled" type="BOOLEAN">
|
||||||
<constraints nullable="false"/>
|
<constraints nullable="false"/>
|
||||||
</column>
|
</column>
|
||||||
<column name="feature_mode_id" type="BIGINT">
|
<column name="feature_mode" type="VARCHAR(255)">
|
||||||
<constraints nullable="false"/>
|
<constraints nullable="false"/>
|
||||||
</column>
|
</column>
|
||||||
<column name="feature_flag_id" type="BIGINT">
|
<column name="feature_flag_id" type="BIGINT">
|
||||||
@@ -34,10 +34,9 @@
|
|||||||
<createIndex indexName="idx_feature_mode_flag_server_mode" tableName="feature_mode">
|
<createIndex indexName="idx_feature_mode_flag_server_mode" tableName="feature_mode">
|
||||||
<column name="server_id"/>
|
<column name="server_id"/>
|
||||||
<column name="feature_flag_id"/>
|
<column name="feature_flag_id"/>
|
||||||
<column name="feature_mode_id"/>
|
<column name="feature_mode"/>
|
||||||
</createIndex>
|
</createIndex>
|
||||||
<addForeignKeyConstraint baseColumnNames="feature_flag_id" baseTableName="feature_mode" constraintName="fk_feature_mode_flag" deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION" referencedColumnNames="id" referencedTableName="feature_flag" validate="true"/>
|
<addForeignKeyConstraint baseColumnNames="feature_flag_id" baseTableName="feature_mode" constraintName="fk_feature_mode_flag" deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION" referencedColumnNames="id" referencedTableName="feature_flag" validate="true"/>
|
||||||
<addForeignKeyConstraint baseColumnNames="feature_mode_id" baseTableName="feature_mode" constraintName="fk_feature_mode_mode" deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION" referencedColumnNames="id" referencedTableName="default_feature_mode" validate="true"/>
|
|
||||||
<addForeignKeyConstraint baseColumnNames="server_id" baseTableName="feature_mode" constraintName="fk_feature_mode_server" deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION" referencedColumnNames="id" referencedTableName="server" validate="true"/>
|
<addForeignKeyConstraint baseColumnNames="server_id" baseTableName="feature_mode" constraintName="fk_feature_mode_server" deferrable="false" initiallyDeferred="false" onDelete="NO ACTION" onUpdate="NO ACTION" referencedColumnNames="id" referencedTableName="server" validate="true"/>
|
||||||
<sql>
|
<sql>
|
||||||
DROP TRIGGER IF EXISTS feature_mode_update_trigger ON feature_mode;
|
DROP TRIGGER IF EXISTS feature_mode_update_trigger ON feature_mode;
|
||||||
|
|||||||
@@ -9,9 +9,7 @@
|
|||||||
<include file="trigger_functions.xml" relativeToChangelogFile="true"/>
|
<include file="trigger_functions.xml" relativeToChangelogFile="true"/>
|
||||||
<include file="server.xml" relativeToChangelogFile="true"/>
|
<include file="server.xml" relativeToChangelogFile="true"/>
|
||||||
<include file="channel.xml" relativeToChangelogFile="true"/>
|
<include file="channel.xml" relativeToChangelogFile="true"/>
|
||||||
<include file="default_post_target.xml" relativeToChangelogFile="true"/>
|
|
||||||
<include file="post_target.xml" relativeToChangelogFile="true"/>
|
<include file="post_target.xml" relativeToChangelogFile="true"/>
|
||||||
<include file="default_config.xml" relativeToChangelogFile="true"/>
|
|
||||||
<include file="default_emote.xml" relativeToChangelogFile="true"/>
|
<include file="default_emote.xml" relativeToChangelogFile="true"/>
|
||||||
<include file="emote.xml" relativeToChangelogFile="true"/>
|
<include file="emote.xml" relativeToChangelogFile="true"/>
|
||||||
<include file="feature.xml" relativeToChangelogFile="true"/>
|
<include file="feature.xml" relativeToChangelogFile="true"/>
|
||||||
@@ -20,8 +18,6 @@
|
|||||||
<include file="command.xml" relativeToChangelogFile="true"/>
|
<include file="command.xml" relativeToChangelogFile="true"/>
|
||||||
<include file="channel_group_type.xml" relativeToChangelogFile="true"/>
|
<include file="channel_group_type.xml" relativeToChangelogFile="true"/>
|
||||||
<include file="channel_group.xml" relativeToChangelogFile="true"/>
|
<include file="channel_group.xml" relativeToChangelogFile="true"/>
|
||||||
<include file="default_feature_flag.xml" relativeToChangelogFile="true"/>
|
|
||||||
<include file="default_feature_mode.xml" relativeToChangelogFile="true" />
|
|
||||||
<include file="feature_flag.xml" relativeToChangelogFile="true"/>
|
<include file="feature_flag.xml" relativeToChangelogFile="true"/>
|
||||||
<include file="feature_mode.xml" relativeToChangelogFile="true"/>
|
<include file="feature_mode.xml" relativeToChangelogFile="true"/>
|
||||||
<include file="lock.xml" relativeToChangelogFile="true"/>
|
<include file="lock.xml" relativeToChangelogFile="true"/>
|
||||||
|
|||||||
@@ -1,64 +0,0 @@
|
|||||||
package dev.sheldan.abstracto.core.listener;
|
|
||||||
|
|
||||||
import dev.sheldan.abstracto.core.listener.sync.entity.FeatureFlagListener;
|
|
||||||
import dev.sheldan.abstracto.core.models.database.AFeature;
|
|
||||||
import dev.sheldan.abstracto.core.models.database.AFeatureFlag;
|
|
||||||
import dev.sheldan.abstracto.core.models.database.AServer;
|
|
||||||
import dev.sheldan.abstracto.core.models.database.DefaultFeatureFlag;
|
|
||||||
import dev.sheldan.abstracto.core.service.management.DefaultFeatureFlagManagementService;
|
|
||||||
import dev.sheldan.abstracto.core.service.management.FeatureFlagManagementService;
|
|
||||||
import org.junit.Test;
|
|
||||||
import org.junit.runner.RunWith;
|
|
||||||
import org.mockito.InjectMocks;
|
|
||||||
import org.mockito.Mock;
|
|
||||||
import org.mockito.junit.MockitoJUnitRunner;
|
|
||||||
|
|
||||||
import java.util.Arrays;
|
|
||||||
|
|
||||||
import static org.mockito.Mockito.when;
|
|
||||||
|
|
||||||
@RunWith(MockitoJUnitRunner.class)
|
|
||||||
public class FeatureFlagListenerTest {
|
|
||||||
|
|
||||||
@InjectMocks
|
|
||||||
private FeatureFlagListener testUnit;
|
|
||||||
|
|
||||||
@Mock
|
|
||||||
private FeatureFlagManagementService service;
|
|
||||||
|
|
||||||
@Mock
|
|
||||||
private DefaultFeatureFlagManagementService defaultFeatureFlagManagementService;
|
|
||||||
|
|
||||||
@Mock
|
|
||||||
private DefaultFeatureFlag defaultFeatureFlag1;
|
|
||||||
|
|
||||||
@Mock
|
|
||||||
private DefaultFeatureFlag defaultFeatureFlag2;
|
|
||||||
|
|
||||||
@Mock
|
|
||||||
private AFeature aFeature1;
|
|
||||||
|
|
||||||
@Mock
|
|
||||||
private AFeature aFeature2;
|
|
||||||
|
|
||||||
@Mock
|
|
||||||
private AServer server;
|
|
||||||
|
|
||||||
@Mock
|
|
||||||
private AFeatureFlag aFeatureFlag;
|
|
||||||
|
|
||||||
private static final Long SERVER_ID = 8L;
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testCreateMultipleOneAlreadyExisting() {
|
|
||||||
when(server.getId()).thenReturn(SERVER_ID);
|
|
||||||
when(defaultFeatureFlagManagementService.getAllDefaultFeatureFlags()).thenReturn(Arrays.asList(defaultFeatureFlag1, defaultFeatureFlag2));
|
|
||||||
when(defaultFeatureFlag1.getFeature()).thenReturn(aFeature1);
|
|
||||||
when(defaultFeatureFlag2.getFeature()).thenReturn(aFeature2);
|
|
||||||
when(defaultFeatureFlag2.isEnabled()).thenReturn(true);
|
|
||||||
when(service.featureFlagExists(aFeature1, server)).thenReturn(true);
|
|
||||||
when(service.featureFlagExists(aFeature2, server)).thenReturn(false);
|
|
||||||
when(service.createFeatureFlag(aFeature2, SERVER_ID, true)).thenReturn(aFeatureFlag);
|
|
||||||
testUnit.updateServerConfig(server);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -5,6 +5,7 @@ import dev.sheldan.abstracto.core.config.FeatureConfig;
|
|||||||
import dev.sheldan.abstracto.core.config.FeatureEnum;
|
import dev.sheldan.abstracto.core.config.FeatureEnum;
|
||||||
import dev.sheldan.abstracto.core.config.FeatureMode;
|
import dev.sheldan.abstracto.core.config.FeatureMode;
|
||||||
import dev.sheldan.abstracto.core.models.database.*;
|
import dev.sheldan.abstracto.core.models.database.*;
|
||||||
|
import dev.sheldan.abstracto.core.models.property.FeatureModeProperty;
|
||||||
import dev.sheldan.abstracto.core.models.template.commands.FeatureModeDisplay;
|
import dev.sheldan.abstracto.core.models.template.commands.FeatureModeDisplay;
|
||||||
import dev.sheldan.abstracto.core.service.management.DefaultFeatureModeManagement;
|
import dev.sheldan.abstracto.core.service.management.DefaultFeatureModeManagement;
|
||||||
import dev.sheldan.abstracto.core.service.management.FeatureFlagManagementService;
|
import dev.sheldan.abstracto.core.service.management.FeatureFlagManagementService;
|
||||||
@@ -64,7 +65,7 @@ public class FeatureModeServiceBeanTest {
|
|||||||
private AFeatureFlag featureFlag;
|
private AFeatureFlag featureFlag;
|
||||||
|
|
||||||
@Mock
|
@Mock
|
||||||
private DefaultFeatureMode defaultFeatureMode;
|
private FeatureModeProperty defaultFeatureMode;
|
||||||
|
|
||||||
@Mock
|
@Mock
|
||||||
private FeatureConfig featureConfig;
|
private FeatureConfig featureConfig;
|
||||||
@@ -86,7 +87,7 @@ public class FeatureModeServiceBeanTest {
|
|||||||
when(featureEnum.getKey()).thenReturn(FEATURE_NAME);
|
when(featureEnum.getKey()).thenReturn(FEATURE_NAME);
|
||||||
when(featureManagementService.getFeature(featureEnum.getKey())).thenReturn(feature);
|
when(featureManagementService.getFeature(featureEnum.getKey())).thenReturn(feature);
|
||||||
when(featureModeManagementService.getFeatureMode(feature, server, featureMode)).thenReturn(Optional.empty());
|
when(featureModeManagementService.getFeatureMode(feature, server, featureMode)).thenReturn(Optional.empty());
|
||||||
when(featureFlagManagementService.getFeatureFlag(feature, server)).thenReturn(featureFlag);
|
when(featureFlagManagementService.getFeatureFlag(feature, server)).thenReturn(Optional.of(featureFlag));
|
||||||
testUnit.enableFeatureModeForFeature(featureEnum, server, featureMode);
|
testUnit.enableFeatureModeForFeature(featureEnum, server, featureMode);
|
||||||
verify(featureModeManagementService, times(1)).createMode(featureFlag, featureMode, true);
|
verify(featureModeManagementService, times(1)).createMode(featureFlag, featureMode, true);
|
||||||
}
|
}
|
||||||
@@ -123,7 +124,7 @@ public class FeatureModeServiceBeanTest {
|
|||||||
when(featureEnum.getKey()).thenReturn(FEATURE_NAME);
|
when(featureEnum.getKey()).thenReturn(FEATURE_NAME);
|
||||||
when(featureManagementService.getFeature(featureEnum.getKey())).thenReturn(feature);
|
when(featureManagementService.getFeature(featureEnum.getKey())).thenReturn(feature);
|
||||||
when(featureModeManagementService.getFeatureMode(feature, server, featureMode)).thenReturn(Optional.empty());
|
when(featureModeManagementService.getFeatureMode(feature, server, featureMode)).thenReturn(Optional.empty());
|
||||||
when(featureFlagManagementService.getFeatureFlag(feature, server)).thenReturn(featureFlag);
|
when(featureFlagManagementService.getFeatureFlag(feature, server)).thenReturn(Optional.of(featureFlag));
|
||||||
testUnit.disableFeatureModeForFeature(featureEnum, server, featureMode);
|
testUnit.disableFeatureModeForFeature(featureEnum, server, featureMode);
|
||||||
verify(featureModeManagementService, times(1)).createMode(featureFlag, featureMode, false);
|
verify(featureModeManagementService, times(1)).createMode(featureFlag, featureMode, false);
|
||||||
}
|
}
|
||||||
@@ -145,7 +146,7 @@ public class FeatureModeServiceBeanTest {
|
|||||||
when(featureManagementService.getFeature(featureEnum.getKey())).thenReturn(feature);
|
when(featureManagementService.getFeature(featureEnum.getKey())).thenReturn(feature);
|
||||||
when(featureModeManagementService.doesFeatureModeExist(feature, server, featureMode)).thenReturn(false);
|
when(featureModeManagementService.doesFeatureModeExist(feature, server, featureMode)).thenReturn(false);
|
||||||
when(defaultFeatureModeManagement.getFeatureMode(feature, FEATURE_MODE)).thenReturn(defaultFeatureMode);
|
when(defaultFeatureModeManagement.getFeatureMode(feature, FEATURE_MODE)).thenReturn(defaultFeatureMode);
|
||||||
when(defaultFeatureMode.isEnabled()).thenReturn(true);
|
when(defaultFeatureMode.getEnabled()).thenReturn(true);
|
||||||
boolean actualResult = testUnit.featureModeActive(featureEnum, server, featureMode);
|
boolean actualResult = testUnit.featureModeActive(featureEnum, server, featureMode);
|
||||||
Assert.assertTrue(actualResult);
|
Assert.assertTrue(actualResult);
|
||||||
}
|
}
|
||||||
@@ -181,14 +182,13 @@ public class FeatureModeServiceBeanTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testEffectiveFeatureModesOnlyOneDefault() {
|
public void testEffectiveFeatureModesOnlyOneDefault() {
|
||||||
when(defaultFeatureMode.getFeature()).thenReturn(feature);
|
when(defaultFeatureMode.getEnabled()).thenReturn(true);
|
||||||
when(defaultFeatureMode.isEnabled()).thenReturn(true);
|
when(defaultFeatureMode.getFeatureName()).thenReturn(FEATURE_NAME);
|
||||||
when(defaultFeatureMode.getFeature()).thenReturn(feature);
|
|
||||||
when(defaultFeatureModeManagement.getAll()).thenReturn(Arrays.asList(defaultFeatureMode));
|
when(defaultFeatureModeManagement.getAll()).thenReturn(Arrays.asList(defaultFeatureMode));
|
||||||
when(featureConfigService.getFeatureConfigForFeature(feature)).thenReturn(featureConfig);
|
when(featureConfigService.getFeatureDisplayForFeature(FEATURE_NAME)).thenReturn(featureConfig);
|
||||||
when(featureModeManagementService.getFeatureModesOfServer(server)).thenReturn(new ArrayList<>());
|
when(featureModeManagementService.getFeatureModesOfServer(server)).thenReturn(new ArrayList<>());
|
||||||
when(defaultFeatureMode.getMode()).thenReturn(FEATURE_MODE);
|
when(defaultFeatureMode.getMode()).thenReturn(FEATURE_MODE);
|
||||||
when(featureFlagManagementService.getFeatureFlag(feature, server)).thenReturn(featureFlag);
|
when(featureFlagManagementService.getFeatureFlag(FEATURE_NAME, server)).thenReturn(Optional.of(featureFlag));
|
||||||
List<FeatureModeDisplay> effectiveFeatureModes = testUnit.getEffectiveFeatureModes(server);
|
List<FeatureModeDisplay> effectiveFeatureModes = testUnit.getEffectiveFeatureModes(server);
|
||||||
Assert.assertEquals(1, effectiveFeatureModes.size());
|
Assert.assertEquals(1, effectiveFeatureModes.size());
|
||||||
FeatureModeDisplay featureModeDisplay = effectiveFeatureModes.get(0);
|
FeatureModeDisplay featureModeDisplay = effectiveFeatureModes.get(0);
|
||||||
@@ -196,7 +196,7 @@ public class FeatureModeServiceBeanTest {
|
|||||||
Assert.assertTrue(featureModeDisplay.getFeatureMode().getEnabled());
|
Assert.assertTrue(featureModeDisplay.getFeatureMode().getEnabled());
|
||||||
Assert.assertEquals(featureFlag, featureModeDisplay.getFeatureMode().getFeatureFlag());
|
Assert.assertEquals(featureFlag, featureModeDisplay.getFeatureMode().getFeatureFlag());
|
||||||
Assert.assertEquals(server, featureModeDisplay.getFeatureMode().getServer());
|
Assert.assertEquals(server, featureModeDisplay.getFeatureMode().getServer());
|
||||||
Assert.assertEquals(defaultFeatureMode, featureModeDisplay.getFeatureMode().getFeatureMode());
|
Assert.assertEquals(FEATURE_MODE, featureModeDisplay.getFeatureMode().getFeatureMode());
|
||||||
Assert.assertEquals(featureConfig, featureModeDisplay.getFeatureConfig());
|
Assert.assertEquals(featureConfig, featureModeDisplay.getFeatureConfig());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -205,10 +205,11 @@ public class FeatureModeServiceBeanTest {
|
|||||||
when(aFeatureMode.getEnabled()).thenReturn(true);
|
when(aFeatureMode.getEnabled()).thenReturn(true);
|
||||||
when(aFeatureMode.getFeatureFlag()).thenReturn(featureFlag);
|
when(aFeatureMode.getFeatureFlag()).thenReturn(featureFlag);
|
||||||
when(aFeatureMode.getServer()).thenReturn(server);
|
when(aFeatureMode.getServer()).thenReturn(server);
|
||||||
when(aFeatureMode.getFeatureMode()).thenReturn(defaultFeatureMode);
|
when(aFeatureMode.getFeatureMode()).thenReturn(FEATURE_MODE);
|
||||||
when(featureFlag.getFeature()).thenReturn(feature);
|
when(featureFlag.getFeature()).thenReturn(feature);
|
||||||
|
when(feature.getKey()).thenReturn(FEATURE_NAME);
|
||||||
when(defaultFeatureModeManagement.getAll()).thenReturn(Arrays.asList(defaultFeatureMode));
|
when(defaultFeatureModeManagement.getAll()).thenReturn(Arrays.asList(defaultFeatureMode));
|
||||||
when(featureConfigService.getFeatureConfigForFeature(feature)).thenReturn(featureConfig);
|
when(featureConfigService.getFeatureDisplayForFeature(FEATURE_NAME)).thenReturn(featureConfig);
|
||||||
when(featureModeManagementService.getFeatureModesOfServer(server)).thenReturn(Arrays.asList(aFeatureMode));
|
when(featureModeManagementService.getFeatureModesOfServer(server)).thenReturn(Arrays.asList(aFeatureMode));
|
||||||
when(defaultFeatureMode.getMode()).thenReturn(FEATURE_MODE);
|
when(defaultFeatureMode.getMode()).thenReturn(FEATURE_MODE);
|
||||||
List<FeatureModeDisplay> effectiveFeatureModes = testUnit.getEffectiveFeatureModes(server);
|
List<FeatureModeDisplay> effectiveFeatureModes = testUnit.getEffectiveFeatureModes(server);
|
||||||
@@ -218,7 +219,7 @@ public class FeatureModeServiceBeanTest {
|
|||||||
Assert.assertTrue(featureModeDisplay.getFeatureMode().getEnabled());
|
Assert.assertTrue(featureModeDisplay.getFeatureMode().getEnabled());
|
||||||
Assert.assertEquals(featureFlag, featureModeDisplay.getFeatureMode().getFeatureFlag());
|
Assert.assertEquals(featureFlag, featureModeDisplay.getFeatureMode().getFeatureFlag());
|
||||||
Assert.assertEquals(server, featureModeDisplay.getFeatureMode().getServer());
|
Assert.assertEquals(server, featureModeDisplay.getFeatureMode().getServer());
|
||||||
Assert.assertEquals(defaultFeatureMode, featureModeDisplay.getFeatureMode().getFeatureMode());
|
Assert.assertEquals(FEATURE_MODE, featureModeDisplay.getFeatureMode().getFeatureMode());
|
||||||
Assert.assertEquals(featureConfig, featureModeDisplay.getFeatureConfig());
|
Assert.assertEquals(featureConfig, featureModeDisplay.getFeatureConfig());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -227,48 +228,51 @@ public class FeatureModeServiceBeanTest {
|
|||||||
when(aFeatureMode.getEnabled()).thenReturn(true);
|
when(aFeatureMode.getEnabled()).thenReturn(true);
|
||||||
when(aFeatureMode.getFeatureFlag()).thenReturn(featureFlag);
|
when(aFeatureMode.getFeatureFlag()).thenReturn(featureFlag);
|
||||||
when(aFeatureMode.getServer()).thenReturn(server);
|
when(aFeatureMode.getServer()).thenReturn(server);
|
||||||
when(aFeatureMode.getFeatureMode()).thenReturn(defaultFeatureMode);
|
when(aFeatureMode.getFeatureMode()).thenReturn(FEATURE_MODE);
|
||||||
when(featureFlag.getFeature()).thenReturn(feature);
|
when(featureFlag.getFeature()).thenReturn(feature);
|
||||||
DefaultFeatureMode defaultFeatureMode2 = Mockito.mock(DefaultFeatureMode.class);
|
when(feature.getKey()).thenReturn(FEATURE_NAME);
|
||||||
when(defaultFeatureMode2.getMode()).thenReturn("SECOND");
|
FeatureModeProperty defaultFeatureMode2 = Mockito.mock(FeatureModeProperty.class);
|
||||||
when(defaultFeatureMode2.getFeature()).thenReturn(feature);
|
String secondMode = "SECOND";
|
||||||
when(defaultFeatureMode2.isEnabled()).thenReturn(false);
|
when(defaultFeatureMode2.getMode()).thenReturn(secondMode);
|
||||||
|
String feature2 = "FEATURE2";
|
||||||
|
when(defaultFeatureMode2.getFeatureName()).thenReturn(feature2);
|
||||||
|
when(defaultFeatureMode2.getEnabled()).thenReturn(false);
|
||||||
when(defaultFeatureModeManagement.getAll()).thenReturn(Arrays.asList(defaultFeatureMode2, defaultFeatureMode));
|
when(defaultFeatureModeManagement.getAll()).thenReturn(Arrays.asList(defaultFeatureMode2, defaultFeatureMode));
|
||||||
when(featureConfigService.getFeatureConfigForFeature(feature)).thenReturn(featureConfig);
|
when(featureConfigService.getFeatureDisplayForFeature(FEATURE_NAME)).thenReturn(featureConfig);
|
||||||
|
when(featureConfigService.getFeatureDisplayForFeature(feature2)).thenReturn(featureConfig);
|
||||||
when(featureModeManagementService.getFeatureModesOfServer(server)).thenReturn(Arrays.asList(aFeatureMode));
|
when(featureModeManagementService.getFeatureModesOfServer(server)).thenReturn(Arrays.asList(aFeatureMode));
|
||||||
when(defaultFeatureMode.getMode()).thenReturn(FEATURE_MODE);
|
when(defaultFeatureMode.getMode()).thenReturn(FEATURE_MODE);
|
||||||
when(featureFlagManagementService.getFeatureFlag(feature, server)).thenReturn(featureFlag);
|
when(featureFlagManagementService.getFeatureFlag(feature2, server)).thenReturn(Optional.of(featureFlag));
|
||||||
|
|
||||||
List<FeatureModeDisplay> effectiveFeatureModes = testUnit.getEffectiveFeatureModes(server);
|
List<FeatureModeDisplay> effectiveFeatureModes = testUnit.getEffectiveFeatureModes(server);
|
||||||
|
|
||||||
Assert.assertEquals(2, effectiveFeatureModes.size());
|
Assert.assertEquals(2, effectiveFeatureModes.size());
|
||||||
FeatureModeDisplay featureModeDisplay = effectiveFeatureModes.get(0);
|
FeatureModeDisplay activeFeaturemodeDisplay = effectiveFeatureModes.get(0);
|
||||||
Assert.assertEquals(false, featureModeDisplay.getIsDefaultValue());
|
Assert.assertEquals(false, activeFeaturemodeDisplay.getIsDefaultValue());
|
||||||
Assert.assertTrue(featureModeDisplay.getFeatureMode().getEnabled());
|
Assert.assertTrue(activeFeaturemodeDisplay.getFeatureMode().getEnabled());
|
||||||
Assert.assertEquals(featureFlag, featureModeDisplay.getFeatureMode().getFeatureFlag());
|
Assert.assertEquals(featureFlag, activeFeaturemodeDisplay.getFeatureMode().getFeatureFlag());
|
||||||
Assert.assertEquals(server, featureModeDisplay.getFeatureMode().getServer());
|
Assert.assertEquals(server, activeFeaturemodeDisplay.getFeatureMode().getServer());
|
||||||
Assert.assertEquals(defaultFeatureMode, featureModeDisplay.getFeatureMode().getFeatureMode());
|
Assert.assertEquals(FEATURE_MODE, activeFeaturemodeDisplay.getFeatureMode().getFeatureMode());
|
||||||
Assert.assertEquals(featureConfig, featureModeDisplay.getFeatureConfig());
|
Assert.assertEquals(featureConfig, activeFeaturemodeDisplay.getFeatureConfig());
|
||||||
|
|
||||||
FeatureModeDisplay featureModeDisplay2 = effectiveFeatureModes.get(1);
|
FeatureModeDisplay defaultFeatureModeDisplay = effectiveFeatureModes.get(1);
|
||||||
Assert.assertEquals(true, featureModeDisplay2.getIsDefaultValue());
|
Assert.assertEquals(true, defaultFeatureModeDisplay.getIsDefaultValue());
|
||||||
Assert.assertFalse(featureModeDisplay2.getFeatureMode().getEnabled());
|
Assert.assertFalse(defaultFeatureModeDisplay.getFeatureMode().getEnabled());
|
||||||
Assert.assertEquals(featureFlag, featureModeDisplay2.getFeatureMode().getFeatureFlag());
|
Assert.assertEquals(featureFlag, defaultFeatureModeDisplay.getFeatureMode().getFeatureFlag());
|
||||||
Assert.assertEquals(server, featureModeDisplay2.getFeatureMode().getServer());
|
Assert.assertEquals(server, defaultFeatureModeDisplay.getFeatureMode().getServer());
|
||||||
Assert.assertEquals(defaultFeatureMode2, featureModeDisplay2.getFeatureMode().getFeatureMode());
|
Assert.assertEquals(secondMode, defaultFeatureModeDisplay.getFeatureMode().getFeatureMode());
|
||||||
Assert.assertEquals(featureConfig, featureModeDisplay2.getFeatureConfig());
|
Assert.assertEquals(featureConfig, defaultFeatureModeDisplay.getFeatureConfig());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testGetEffectiveFeatureModesForFeature() {
|
public void testGetEffectiveFeatureModesForFeature() {
|
||||||
when(defaultFeatureMode.getFeature()).thenReturn(feature);
|
when(defaultFeatureMode.getEnabled()).thenReturn(true);
|
||||||
when(defaultFeatureMode.isEnabled()).thenReturn(true);
|
when(defaultFeatureMode.getFeatureName()).thenReturn(FEATURE_NAME);
|
||||||
when(defaultFeatureMode.getFeature()).thenReturn(feature);
|
|
||||||
when(defaultFeatureModeManagement.getFeatureModesForFeature(feature)).thenReturn(Arrays.asList(defaultFeatureMode));
|
when(defaultFeatureModeManagement.getFeatureModesForFeature(feature)).thenReturn(Arrays.asList(defaultFeatureMode));
|
||||||
when(featureConfigService.getFeatureConfigForFeature(feature)).thenReturn(featureConfig);
|
when(featureConfigService.getFeatureDisplayForFeature(FEATURE_NAME)).thenReturn(featureConfig);
|
||||||
when(featureModeManagementService.getFeatureModesOfFeatureInServer(server, feature)).thenReturn(new ArrayList<>());
|
when(featureModeManagementService.getFeatureModesOfFeatureInServer(server, feature)).thenReturn(new ArrayList<>());
|
||||||
when(defaultFeatureMode.getMode()).thenReturn(FEATURE_MODE);
|
when(defaultFeatureMode.getMode()).thenReturn(FEATURE_MODE);
|
||||||
when(featureFlagManagementService.getFeatureFlag(feature, server)).thenReturn(featureFlag);
|
when(featureFlagManagementService.getFeatureFlag(FEATURE_NAME, server)).thenReturn(Optional.of(featureFlag));
|
||||||
List<FeatureModeDisplay> effectiveFeatureModes = testUnit.getEffectiveFeatureModes(server, feature);
|
List<FeatureModeDisplay> effectiveFeatureModes = testUnit.getEffectiveFeatureModes(server, feature);
|
||||||
Assert.assertEquals(1, effectiveFeatureModes.size());
|
Assert.assertEquals(1, effectiveFeatureModes.size());
|
||||||
FeatureModeDisplay featureModeDisplay = effectiveFeatureModes.get(0);
|
FeatureModeDisplay featureModeDisplay = effectiveFeatureModes.get(0);
|
||||||
@@ -276,7 +280,7 @@ public class FeatureModeServiceBeanTest {
|
|||||||
Assert.assertTrue(featureModeDisplay.getFeatureMode().getEnabled());
|
Assert.assertTrue(featureModeDisplay.getFeatureMode().getEnabled());
|
||||||
Assert.assertEquals(featureFlag, featureModeDisplay.getFeatureMode().getFeatureFlag());
|
Assert.assertEquals(featureFlag, featureModeDisplay.getFeatureMode().getFeatureFlag());
|
||||||
Assert.assertEquals(server, featureModeDisplay.getFeatureMode().getServer());
|
Assert.assertEquals(server, featureModeDisplay.getFeatureMode().getServer());
|
||||||
Assert.assertEquals(defaultFeatureMode, featureModeDisplay.getFeatureMode().getFeatureMode());
|
Assert.assertEquals(FEATURE_MODE, featureModeDisplay.getFeatureMode().getFeatureMode());
|
||||||
Assert.assertEquals(featureConfig, featureModeDisplay.getFeatureConfig());
|
Assert.assertEquals(featureConfig, featureModeDisplay.getFeatureConfig());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
package dev.sheldan.abstracto.core.service.management;
|
package dev.sheldan.abstracto.core.service.management;
|
||||||
|
|
||||||
|
import dev.sheldan.abstracto.core.config.DefaultConfigProperties;
|
||||||
import dev.sheldan.abstracto.core.exception.FeatureModeNotFoundException;
|
import dev.sheldan.abstracto.core.exception.FeatureModeNotFoundException;
|
||||||
import dev.sheldan.abstracto.core.models.database.AFeature;
|
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 dev.sheldan.abstracto.core.repository.DefaultFeatureModeRepository;
|
|
||||||
import dev.sheldan.abstracto.core.service.FeatureConfigService;
|
import dev.sheldan.abstracto.core.service.FeatureConfigService;
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
@@ -12,10 +12,9 @@ import org.mockito.InjectMocks;
|
|||||||
import org.mockito.Mock;
|
import org.mockito.Mock;
|
||||||
import org.mockito.junit.MockitoJUnitRunner;
|
import org.mockito.junit.MockitoJUnitRunner;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.*;
|
||||||
import java.util.List;
|
|
||||||
import java.util.Optional;
|
|
||||||
|
|
||||||
|
import static org.mockito.Mockito.mock;
|
||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
|
|
||||||
@@ -26,44 +25,54 @@ public class DefaultFeatureModeManagementBeanTest {
|
|||||||
private DefaultFeatureModeManagementBean testUnit;
|
private DefaultFeatureModeManagementBean testUnit;
|
||||||
|
|
||||||
@Mock
|
@Mock
|
||||||
private DefaultFeatureModeRepository defaultFeatureModeRepository;
|
private DefaultConfigProperties defaultConfigProperties;
|
||||||
|
|
||||||
@Mock
|
|
||||||
private FeatureConfigService featureConfigService;
|
|
||||||
|
|
||||||
@Mock
|
@Mock
|
||||||
private AFeature feature;
|
private AFeature feature;
|
||||||
|
|
||||||
@Mock
|
@Mock
|
||||||
private DefaultFeatureMode defaultFeatureMode1;
|
private FeatureConfigService featureConfigService;
|
||||||
|
|
||||||
@Mock
|
@Mock
|
||||||
private DefaultFeatureMode defaultFeatureMode2;
|
private FeatureModeProperty defaultFeatureMode1;
|
||||||
|
|
||||||
|
@Mock
|
||||||
|
private FeatureModeProperty defaultFeatureMode2;
|
||||||
|
|
||||||
private static final String MODE_NAME = "mode";
|
private static final String MODE_NAME = "mode";
|
||||||
|
private static final String FEATURE_NAME = "feature";
|
||||||
|
|
||||||
|
@Mock
|
||||||
|
private HashMap<String, FeatureModeProperty> mockedMap;
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void getFeatureModesForFeature() {
|
public void getFeatureModesForFeature() {
|
||||||
List<DefaultFeatureMode> defaultFeatureModes = Arrays.asList(defaultFeatureMode1, defaultFeatureMode2);
|
when(defaultFeatureMode1.getFeatureName()).thenReturn(FEATURE_NAME);
|
||||||
when(defaultFeatureModeRepository.findByFeature(feature)).thenReturn(defaultFeatureModes);
|
when(defaultFeatureMode2.getFeatureName()).thenReturn(FEATURE_NAME);
|
||||||
List<DefaultFeatureMode> featureModesForFeature = testUnit.getFeatureModesForFeature(feature);
|
when(feature.getKey()).thenReturn(FEATURE_NAME);
|
||||||
|
List<FeatureModeProperty> defaultFeatureModes = Arrays.asList(defaultFeatureMode1, defaultFeatureMode2);
|
||||||
|
when(defaultConfigProperties.getFeatureModes()).thenReturn(mockedMap);
|
||||||
|
when(mockedMap.values()).thenReturn(defaultFeatureModes);
|
||||||
|
List<FeatureModeProperty> featureModesForFeature = testUnit.getFeatureModesForFeature(feature);
|
||||||
Assert.assertEquals(defaultFeatureModes.size(), featureModesForFeature.size());
|
Assert.assertEquals(defaultFeatureModes.size(), featureModesForFeature.size());
|
||||||
Assert.assertEquals(defaultFeatureModes, featureModesForFeature);
|
Assert.assertEquals(defaultFeatureModes, featureModesForFeature);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testGetAll() {
|
public void testGetAll() {
|
||||||
List<DefaultFeatureMode> defaultFeatureModes = Arrays.asList(defaultFeatureMode1, defaultFeatureMode2);
|
List<FeatureModeProperty> defaultFeatureModes = Arrays.asList(defaultFeatureMode1, defaultFeatureMode2);
|
||||||
when(defaultFeatureModeRepository.findAll()).thenReturn(defaultFeatureModes);
|
when(defaultConfigProperties.getFeatureModes()).thenReturn(mockedMap);
|
||||||
List<DefaultFeatureMode> featureModesForFeature = testUnit.getAll();
|
when(mockedMap.values()).thenReturn(defaultFeatureModes);
|
||||||
|
List<FeatureModeProperty> featureModesForFeature = testUnit.getAll();
|
||||||
Assert.assertEquals(defaultFeatureModes.size(), featureModesForFeature.size());
|
Assert.assertEquals(defaultFeatureModes.size(), featureModesForFeature.size());
|
||||||
Assert.assertEquals(defaultFeatureModes, featureModesForFeature);
|
Assert.assertEquals(defaultFeatureModes, featureModesForFeature);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void getFeatureModeOptional() {
|
public void getFeatureModeOptional() {
|
||||||
when(defaultFeatureModeRepository.findByFeatureAndMode(feature, MODE_NAME)).thenReturn(Optional.of(defaultFeatureMode1));
|
when(defaultConfigProperties.getFeatureModes()).thenReturn(mockedMap);
|
||||||
Optional<DefaultFeatureMode> featureModeOptional = testUnit.getFeatureModeOptional(feature, MODE_NAME);
|
when(mockedMap.get(MODE_NAME)).thenReturn(defaultFeatureMode1);
|
||||||
|
Optional<FeatureModeProperty> featureModeOptional = testUnit.getFeatureModeOptional(feature, MODE_NAME);
|
||||||
Assert.assertTrue(featureModeOptional.isPresent());
|
Assert.assertTrue(featureModeOptional.isPresent());
|
||||||
featureModeOptional.ifPresent(defaultFeatureMode ->
|
featureModeOptional.ifPresent(defaultFeatureMode ->
|
||||||
Assert.assertEquals(defaultFeatureMode1, defaultFeatureMode)
|
Assert.assertEquals(defaultFeatureMode1, defaultFeatureMode)
|
||||||
@@ -72,21 +81,22 @@ public class DefaultFeatureModeManagementBeanTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void getFeatureModeOptionalNotExisting() {
|
public void getFeatureModeOptionalNotExisting() {
|
||||||
when(defaultFeatureModeRepository.findByFeatureAndMode(feature, MODE_NAME)).thenReturn(Optional.empty());
|
Optional<FeatureModeProperty> featureModeOptional = testUnit.getFeatureModeOptional(feature, MODE_NAME);
|
||||||
Optional<DefaultFeatureMode> featureModeOptional = testUnit.getFeatureModeOptional(feature, MODE_NAME);
|
|
||||||
Assert.assertFalse(featureModeOptional.isPresent());
|
Assert.assertFalse(featureModeOptional.isPresent());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void getFeatureMode() {
|
public void getFeatureMode() {
|
||||||
when(defaultFeatureModeRepository.findByFeatureAndMode(feature, MODE_NAME)).thenReturn(Optional.of(defaultFeatureMode1));
|
when(defaultConfigProperties.getFeatureModes()).thenReturn(mockedMap);
|
||||||
DefaultFeatureMode defaultFeatureMode = testUnit.getFeatureMode(feature, MODE_NAME);
|
when(mockedMap.get(MODE_NAME)).thenReturn(defaultFeatureMode1);
|
||||||
|
FeatureModeProperty defaultFeatureMode = testUnit.getFeatureMode(feature, MODE_NAME);
|
||||||
Assert.assertEquals(defaultFeatureMode1, defaultFeatureMode);
|
Assert.assertEquals(defaultFeatureMode1, defaultFeatureMode);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(expected = FeatureModeNotFoundException.class)
|
@Test(expected = FeatureModeNotFoundException.class)
|
||||||
public void getFeatureModeNotExisting() {
|
public void getFeatureModeNotExisting() {
|
||||||
when(defaultFeatureModeRepository.findByFeatureAndMode(feature, MODE_NAME)).thenReturn(Optional.empty());
|
when(feature.getKey()).thenReturn(FEATURE_NAME);
|
||||||
|
when(featureConfigService.getFeatureModesFromFeatureAsString(FEATURE_NAME)).thenReturn(new ArrayList<>());
|
||||||
testUnit.getFeatureMode(feature, MODE_NAME);
|
testUnit.getFeatureMode(feature, MODE_NAME);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -31,9 +31,6 @@ public class FeatureModeManagementServiceBeanTest {
|
|||||||
@Mock
|
@Mock
|
||||||
private AFeature feature;
|
private AFeature feature;
|
||||||
|
|
||||||
@Mock
|
|
||||||
private DefaultFeatureMode defaultFeatureMode;
|
|
||||||
|
|
||||||
@Mock
|
@Mock
|
||||||
private AFeatureFlag featureFlag;
|
private AFeatureFlag featureFlag;
|
||||||
|
|
||||||
@@ -51,12 +48,10 @@ public class FeatureModeManagementServiceBeanTest {
|
|||||||
@Test
|
@Test
|
||||||
public void createModeWithModeAsString() {
|
public void createModeWithModeAsString() {
|
||||||
when(featureFlag.getServer()).thenReturn(server);
|
when(featureFlag.getServer()).thenReturn(server);
|
||||||
when(featureFlag.getFeature()).thenReturn(feature);
|
|
||||||
when(defaultFeatureModeManagement.getFeatureMode(feature, FEATURE_MODE)).thenReturn(defaultFeatureMode);
|
|
||||||
AFeatureMode createdMode = testUnit.createMode(featureFlag, FEATURE_MODE, true);
|
AFeatureMode createdMode = testUnit.createMode(featureFlag, FEATURE_MODE, true);
|
||||||
Assert.assertEquals(true, createdMode.getEnabled());
|
Assert.assertEquals(true, createdMode.getEnabled());
|
||||||
Assert.assertEquals(featureFlag, createdMode.getFeatureFlag());
|
Assert.assertEquals(featureFlag, createdMode.getFeatureFlag());
|
||||||
Assert.assertEquals(defaultFeatureMode, createdMode.getFeatureMode());
|
Assert.assertEquals(FEATURE_MODE, createdMode.getFeatureMode());
|
||||||
Assert.assertEquals(server, createdMode.getServer());
|
Assert.assertEquals(server, createdMode.getServer());
|
||||||
verify(featureModeRepository, times(1)).save(createdMode);
|
verify(featureModeRepository, times(1)).save(createdMode);
|
||||||
}
|
}
|
||||||
@@ -64,13 +59,11 @@ public class FeatureModeManagementServiceBeanTest {
|
|||||||
@Test
|
@Test
|
||||||
public void testCreateMode() {
|
public void testCreateMode() {
|
||||||
when(featureFlag.getServer()).thenReturn(server);
|
when(featureFlag.getServer()).thenReturn(server);
|
||||||
when(featureFlag.getFeature()).thenReturn(feature);
|
|
||||||
when(featureMode.getKey()).thenReturn(FEATURE_MODE);
|
when(featureMode.getKey()).thenReturn(FEATURE_MODE);
|
||||||
when(defaultFeatureModeManagement.getFeatureMode(feature, FEATURE_MODE)).thenReturn(defaultFeatureMode);
|
|
||||||
AFeatureMode createdMode = testUnit.createMode(featureFlag, featureMode, true);
|
AFeatureMode createdMode = testUnit.createMode(featureFlag, featureMode, true);
|
||||||
Assert.assertEquals(true, createdMode.getEnabled());
|
Assert.assertEquals(true, createdMode.getEnabled());
|
||||||
Assert.assertEquals(featureFlag, createdMode.getFeatureFlag());
|
Assert.assertEquals(featureFlag, createdMode.getFeatureFlag());
|
||||||
Assert.assertEquals(defaultFeatureMode, createdMode.getFeatureMode());
|
Assert.assertEquals(FEATURE_MODE, createdMode.getFeatureMode());
|
||||||
Assert.assertEquals(server, createdMode.getServer());
|
Assert.assertEquals(server, createdMode.getServer());
|
||||||
verify(featureModeRepository, times(1)).save(createdMode);
|
verify(featureModeRepository, times(1)).save(createdMode);
|
||||||
}
|
}
|
||||||
@@ -79,7 +72,7 @@ public class FeatureModeManagementServiceBeanTest {
|
|||||||
public void featureModeActive() {
|
public void featureModeActive() {
|
||||||
when(featureMode.getKey()).thenReturn(FEATURE_MODE);
|
when(featureMode.getKey()).thenReturn(FEATURE_MODE);
|
||||||
when(aFeatureMode.getEnabled()).thenReturn(true);
|
when(aFeatureMode.getEnabled()).thenReturn(true);
|
||||||
when(featureModeRepository.findByServerAndFeatureFlag_FeatureAndFeatureMode_Mode(server, feature, FEATURE_MODE)).thenReturn(Optional.of(aFeatureMode));
|
when(featureModeRepository.findByServerAndFeatureFlag_FeatureAndFeatureMode(server, feature, FEATURE_MODE)).thenReturn(Optional.of(aFeatureMode));
|
||||||
Assert.assertTrue(testUnit.isFeatureModeActive(feature, server, featureMode));
|
Assert.assertTrue(testUnit.isFeatureModeActive(feature, server, featureMode));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -87,40 +80,40 @@ public class FeatureModeManagementServiceBeanTest {
|
|||||||
public void featureModeNotActive() {
|
public void featureModeNotActive() {
|
||||||
when(featureMode.getKey()).thenReturn(FEATURE_MODE);
|
when(featureMode.getKey()).thenReturn(FEATURE_MODE);
|
||||||
when(aFeatureMode.getEnabled()).thenReturn(false);
|
when(aFeatureMode.getEnabled()).thenReturn(false);
|
||||||
when(featureModeRepository.findByServerAndFeatureFlag_FeatureAndFeatureMode_Mode(server, feature, FEATURE_MODE)).thenReturn(Optional.of(aFeatureMode));
|
when(featureModeRepository.findByServerAndFeatureFlag_FeatureAndFeatureMode(server, feature, FEATURE_MODE)).thenReturn(Optional.of(aFeatureMode));
|
||||||
Assert.assertFalse(testUnit.isFeatureModeActive(feature, server, featureMode));
|
Assert.assertFalse(testUnit.isFeatureModeActive(feature, server, featureMode));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void featureModeNotPresent() {
|
public void featureModeNotPresent() {
|
||||||
when(featureMode.getKey()).thenReturn(FEATURE_MODE);
|
when(featureMode.getKey()).thenReturn(FEATURE_MODE);
|
||||||
when(featureModeRepository.findByServerAndFeatureFlag_FeatureAndFeatureMode_Mode(server, feature, FEATURE_MODE)).thenReturn(Optional.empty());
|
when(featureModeRepository.findByServerAndFeatureFlag_FeatureAndFeatureMode(server, feature, FEATURE_MODE)).thenReturn(Optional.empty());
|
||||||
Assert.assertFalse(testUnit.isFeatureModeActive(feature, server, featureMode));
|
Assert.assertFalse(testUnit.isFeatureModeActive(feature, server, featureMode));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void featureModeStringExists() {
|
public void featureModeStringExists() {
|
||||||
when(featureModeRepository.findByServerAndFeatureFlag_FeatureAndFeatureMode_Mode(server, feature, FEATURE_MODE)).thenReturn(Optional.of(aFeatureMode));
|
when(featureModeRepository.findByServerAndFeatureFlag_FeatureAndFeatureMode(server, feature, FEATURE_MODE)).thenReturn(Optional.of(aFeatureMode));
|
||||||
Assert.assertTrue(testUnit.doesFeatureModeExist(feature, server, FEATURE_MODE));
|
Assert.assertTrue(testUnit.doesFeatureModeExist(feature, server, FEATURE_MODE));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void featureModeObjectExists() {
|
public void featureModeObjectExists() {
|
||||||
when(featureModeRepository.findByServerAndFeatureFlag_FeatureAndFeatureMode_Mode(server, feature, FEATURE_MODE)).thenReturn(Optional.of(aFeatureMode));
|
when(featureModeRepository.findByServerAndFeatureFlag_FeatureAndFeatureMode(server, feature, FEATURE_MODE)).thenReturn(Optional.of(aFeatureMode));
|
||||||
when(featureMode.getKey()).thenReturn(FEATURE_MODE);
|
when(featureMode.getKey()).thenReturn(FEATURE_MODE);
|
||||||
Assert.assertTrue(testUnit.doesFeatureModeExist(feature, server, featureMode));
|
Assert.assertTrue(testUnit.doesFeatureModeExist(feature, server, featureMode));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void featureModeDoesNotExist() {
|
public void featureModeDoesNotExist() {
|
||||||
when(featureModeRepository.findByServerAndFeatureFlag_FeatureAndFeatureMode_Mode(server, feature, FEATURE_MODE)).thenReturn(Optional.empty());
|
when(featureModeRepository.findByServerAndFeatureFlag_FeatureAndFeatureMode(server, feature, FEATURE_MODE)).thenReturn(Optional.empty());
|
||||||
when(featureMode.getKey()).thenReturn(FEATURE_MODE);
|
when(featureMode.getKey()).thenReturn(FEATURE_MODE);
|
||||||
Assert.assertFalse(testUnit.doesFeatureModeExist(feature, server, featureMode));
|
Assert.assertFalse(testUnit.doesFeatureModeExist(feature, server, featureMode));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testGetFeatureModeOptional() {
|
public void testGetFeatureModeOptional() {
|
||||||
when(featureModeRepository.findByServerAndFeatureFlag_FeatureAndFeatureMode_Mode(server, feature, FEATURE_MODE)).thenReturn(Optional.of(aFeatureMode));
|
when(featureModeRepository.findByServerAndFeatureFlag_FeatureAndFeatureMode(server, feature, FEATURE_MODE)).thenReturn(Optional.of(aFeatureMode));
|
||||||
Optional<AFeatureMode> featureModeOptional = testUnit.getFeatureMode(feature, server, FEATURE_MODE);
|
Optional<AFeatureMode> featureModeOptional = testUnit.getFeatureMode(feature, server, FEATURE_MODE);
|
||||||
Assert.assertTrue(featureModeOptional.isPresent());
|
Assert.assertTrue(featureModeOptional.isPresent());
|
||||||
featureModeOptional.ifPresent(aFeatureMode1 ->
|
featureModeOptional.ifPresent(aFeatureMode1 ->
|
||||||
@@ -130,7 +123,7 @@ public class FeatureModeManagementServiceBeanTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testGetFeatureModeOptionalNotExisting() {
|
public void testGetFeatureModeOptionalNotExisting() {
|
||||||
when(featureModeRepository.findByServerAndFeatureFlag_FeatureAndFeatureMode_Mode(server, feature, FEATURE_MODE)).thenReturn(Optional.empty());
|
when(featureModeRepository.findByServerAndFeatureFlag_FeatureAndFeatureMode(server, feature, FEATURE_MODE)).thenReturn(Optional.empty());
|
||||||
Optional<AFeatureMode> featureModeOptional = testUnit.getFeatureMode(feature, server, FEATURE_MODE);
|
Optional<AFeatureMode> featureModeOptional = testUnit.getFeatureMode(feature, server, FEATURE_MODE);
|
||||||
Assert.assertFalse(featureModeOptional.isPresent());
|
Assert.assertFalse(featureModeOptional.isPresent());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -27,9 +27,8 @@ public class AFeatureMode implements Serializable {
|
|||||||
@JoinColumn(name = "feature_flag_id", nullable = false)
|
@JoinColumn(name = "feature_flag_id", nullable = false)
|
||||||
private AFeatureFlag featureFlag;
|
private AFeatureFlag featureFlag;
|
||||||
|
|
||||||
@ManyToOne(fetch = FetchType.LAZY)
|
@Column(name = "feature_mode")
|
||||||
@JoinColumn(name = "feature_mode_id", nullable = false)
|
private String featureMode;
|
||||||
private DefaultFeatureMode featureMode;
|
|
||||||
|
|
||||||
@ManyToOne(fetch = FetchType.LAZY)
|
@ManyToOne(fetch = FetchType.LAZY)
|
||||||
@JoinColumn(name = "server_id", nullable = false)
|
@JoinColumn(name = "server_id", nullable = false)
|
||||||
|
|||||||
@@ -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;
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -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;
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -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;
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
@@ -12,4 +12,5 @@ import java.util.List;
|
|||||||
@Setter
|
@Setter
|
||||||
public class FeaturesModel extends UserInitiatedServerContext {
|
public class FeaturesModel extends UserInitiatedServerContext {
|
||||||
private List<FeatureFlagDisplay> features;
|
private List<FeatureFlagDisplay> features;
|
||||||
|
private List<DefaultFeatureFlagDisplay> defaultFeatures;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
package dev.sheldan.abstracto.core.models.template.commands;
|
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.Builder;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
@@ -10,5 +10,5 @@ import lombok.Setter;
|
|||||||
@Builder
|
@Builder
|
||||||
public class SetupSystemConfigMessageModel {
|
public class SetupSystemConfigMessageModel {
|
||||||
private String configKey;
|
private String configKey;
|
||||||
private ADefaultConfig defaultConfig;
|
private SystemConfigProperty defaultConfig;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,6 +12,8 @@ public interface FeatureFlagService {
|
|||||||
void enableFeature(FeatureConfig name, AServer server);
|
void enableFeature(FeatureConfig name, AServer server);
|
||||||
void disableFeature(FeatureConfig name, Long serverId);
|
void disableFeature(FeatureConfig name, Long serverId);
|
||||||
void disableFeature(FeatureConfig name, AServer server);
|
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, Long serverId);
|
||||||
boolean getFeatureFlagValue(FeatureEnum key, AServer server);
|
boolean getFeatureFlagValue(FeatureEnum key, AServer server);
|
||||||
AFeatureFlag updateFeatureFlag(FeatureEnum key, Long serverId, Boolean newValue);
|
AFeatureFlag updateFeatureFlag(FeatureEnum key, Long serverId, Boolean newValue);
|
||||||
|
|||||||
@@ -1,10 +1,7 @@
|
|||||||
package dev.sheldan.abstracto.core.service.management;
|
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 {
|
public interface DefaultConfigManagementService {
|
||||||
void createDefaultConfig(String key, String value);
|
SystemConfigProperty getDefaultConfig(String key);
|
||||||
void createDefaultConfig(String key, Long value);
|
|
||||||
void createDefaultConfig(String key, Double value);
|
|
||||||
ADefaultConfig getDefaultConfig(String key);
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +1,14 @@
|
|||||||
package dev.sheldan.abstracto.core.service.management;
|
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;
|
import java.util.List;
|
||||||
|
|
||||||
public interface DefaultFeatureFlagManagementService {
|
public interface DefaultFeatureFlagManagementService {
|
||||||
List<String> getDefaultFeatureKeys();
|
List<String> getDefaultFeatureKeys();
|
||||||
List<DefaultFeatureFlag> getAllDefaultFeatureFlags();
|
FeatureFlagProperty getDefaultFeatureFlagProperty(AFeature feature);
|
||||||
|
FeatureFlagProperty getDefaultFeatureFlagProperty(FeatureEnum feature);
|
||||||
|
List<FeatureFlagProperty> getAllDefaultFeatureFlags();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,14 +1,14 @@
|
|||||||
package dev.sheldan.abstracto.core.service.management;
|
package dev.sheldan.abstracto.core.service.management;
|
||||||
|
|
||||||
import dev.sheldan.abstracto.core.models.database.AFeature;
|
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.List;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
public interface DefaultFeatureModeManagement {
|
public interface DefaultFeatureModeManagement {
|
||||||
List<DefaultFeatureMode> getFeatureModesForFeature(AFeature feature);
|
List<FeatureModeProperty> getFeatureModesForFeature(AFeature feature);
|
||||||
List<DefaultFeatureMode> getAll();
|
List<FeatureModeProperty> getAll();
|
||||||
Optional<DefaultFeatureMode> getFeatureModeOptional(AFeature feature, String mode);
|
Optional<FeatureModeProperty> getFeatureModeOptional(AFeature feature, String mode);
|
||||||
DefaultFeatureMode getFeatureMode(AFeature feature, String mode);
|
FeatureModeProperty getFeatureMode(AFeature feature, String mode);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
package dev.sheldan.abstracto.core.service.management;
|
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;
|
import java.util.List;
|
||||||
|
|
||||||
public interface DefaultPostTargetManagementService {
|
public interface DefaultPostTargetManagementService {
|
||||||
List<DefaultPostTarget> getAllDefaultPostTargets();
|
List<PostTargetProperty> getAllDefaultPostTargets();
|
||||||
List<String> getDefaultPostTargetKeys();
|
List<String> getDefaultPostTargetKeys();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,13 +5,16 @@ import dev.sheldan.abstracto.core.models.database.AFeatureFlag;
|
|||||||
import dev.sheldan.abstracto.core.models.database.AServer;
|
import dev.sheldan.abstracto.core.models.database.AServer;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
public interface FeatureFlagManagementService {
|
public interface FeatureFlagManagementService {
|
||||||
AFeatureFlag createFeatureFlag(AFeature feature, Long serverId, Boolean newValue);
|
AFeatureFlag createFeatureFlag(AFeature feature, Long serverId, Boolean newValue);
|
||||||
AFeatureFlag createFeatureFlag(AFeature feature, AServer server, 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);
|
boolean featureFlagExists(AFeature feature, AServer server);
|
||||||
AFeatureFlag getFeatureFlag(AFeature key, AServer server);
|
Optional<AFeatureFlag> getFeatureFlag(AFeature feature, AServer server);
|
||||||
List<AFeatureFlag> getFeatureFlagsOfServer(AServer server);
|
List<AFeatureFlag> getFeatureFlagsOfServer(AServer server);
|
||||||
AFeatureFlag setFeatureFlagValue(AFeature feature, Long serverId, Boolean newValue);
|
AFeatureFlag setFeatureFlagValue(AFeature feature, Long serverId, Boolean newValue);
|
||||||
AFeatureFlag setFeatureFlagValue(AFeature feature, AServer server, Boolean newValue);
|
AFeatureFlag setFeatureFlagValue(AFeature feature, AServer server, Boolean newValue);
|
||||||
|
|||||||
@@ -104,10 +104,10 @@ Enforce the role restrictions of commands::
|
|||||||
* Description: Causes the role restrictions for a all commands in the `feature`/the `command` to be in effect again.
|
* Description: Causes the role restrictions for a all commands in the `feature`/the `command` to be in effect again.
|
||||||
Enabling a feature mode::
|
Enabling a feature mode::
|
||||||
* Usage: `enableMode <featureName> <mode>`
|
* Usage: `enableMode <featureName> <mode>`
|
||||||
* Description: Enables the mode `mode` in feature `featureName`.
|
* Description: Enables the mode `mode` in feature `featureName`. If the enabled state of the feature `featureName` is part of the default config, it will no longer be default config that after executing `enableMode`.
|
||||||
Disabling a feature mode::
|
Disabling a feature mode::
|
||||||
* Usage: `disableMode <featureName> <mode>`
|
* Usage: `disableMode <featureName> <mode>`
|
||||||
* Description: Disables the mode `mode` in feature `featureName`.
|
* Description: Disables the mode `mode` in feature `featureName`. If the enabled state of the feature `featureName` is part of the default config, it will no longer be default config after executing `disableMode`.
|
||||||
Listing all feature modes::
|
Listing all feature modes::
|
||||||
* usage `featureModes [feature]`
|
* usage `featureModes [feature]`
|
||||||
* Description: Lists all of the currently available feature modes and the feature they are associated with. If `feature` is given, it only lists the feature modes of this feature. The output also includes whether or not the current mode is enabled and if this value comes from the default configuration.
|
* Description: Lists all of the currently available feature modes and the feature they are associated with. If `feature` is given, it only lists the feature modes of this feature. The output also includes whether or not the current mode is enabled and if this value comes from the default configuration.
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ This component will contain multiple features, currently only emote tracking is
|
|||||||
This feature is about tracking the usage of emotes from the server and external servers.
|
This feature is about tracking the usage of emotes from the server and external servers.
|
||||||
The intention of this feature is to see what emotes are doing better than others and which emotes might be interesting to add to the server.
|
The intention of this feature is to see what emotes are doing better than others and which emotes might be interesting to add to the server.
|
||||||
|
|
||||||
Feature key: `emote_tracking`
|
Feature key: `emoteTracking`
|
||||||
|
|
||||||
==== Feature modes
|
==== Feature modes
|
||||||
`emoteAutoTrack`:: If this is enabled, emotes which are created within the server, are automatically stored and tracked. If they are renamed/deleted this will also be reflected automatically. Enabled by default.
|
`emoteAutoTrack`:: If this is enabled, emotes which are created within the server, are automatically stored and tracked. If they are renamed/deleted this will also be reflected automatically. Enabled by default.
|
||||||
|
|||||||
@@ -118,7 +118,7 @@ This feature enables the automatic embedding of messages containing a message li
|
|||||||
If a message contains a link to a discord message this will create an embed containing the the message content. This supports image attachments, but not videos or files.
|
If a message contains a link to a discord message this will create an embed containing the the message content. This supports image attachments, but not videos or files.
|
||||||
A reaction is placed on the embedded message which can be used to delete this embed. Only the original author and the person creating the embed can delete the embed this way.
|
A reaction is placed on the embedded message which can be used to delete this embed. Only the original author and the person creating the embed can delete the embed this way.
|
||||||
|
|
||||||
Feature key: `link_embeds`
|
Feature key: `linkEmbeds`
|
||||||
|
|
||||||
=== Repost detection and tracking
|
=== Repost detection and tracking
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user