[AB-112] adding star levels to setup feature wizard

moving star level configuration to only be instantiated when needed
This commit is contained in:
Sheldan
2021-02-14 16:35:51 +01:00
parent 23bdf4e906
commit 94532be54d
22 changed files with 153 additions and 142 deletions

View File

@@ -1,32 +0,0 @@
package dev.sheldan.abstracto.utility.config;
import dev.sheldan.abstracto.core.listener.sync.entity.ServerConfigListener;
import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.core.service.management.ConfigManagementService;
import dev.sheldan.abstracto.core.service.management.DefaultConfigManagementService;
import dev.sheldan.abstracto.utility.service.StarboardServiceBean;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
@Slf4j
public class StarboardConfigListener implements ServerConfigListener {
@Autowired
private ConfigManagementService configManagementService;
@Autowired
private DefaultConfigManagementService defaultConfigManagementService;
@Override
public void updateServerConfig(AServer server) {
log.info("Creating starboard config for server {}", server.getId());
int maxLevels = defaultConfigManagementService.getDefaultConfig(StarboardServiceBean.STAR_LEVELS_CONFIG_KEY).getLongValue().intValue();
for (int i = 0; i < maxLevels; i++) {
String configKey = StarboardServiceBean.STAR_LVL_CONFIG_PREFIX + (i + 1);
Integer value = defaultConfigManagementService.getDefaultConfig(configKey).getLongValue().intValue();
configManagementService.createIfNotExists(server.getId(), configKey, Long.valueOf(value));
}
}
}

View File

@@ -7,6 +7,7 @@ import dev.sheldan.abstracto.core.models.database.AChannel;
import dev.sheldan.abstracto.core.models.database.AUser;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import dev.sheldan.abstracto.core.models.database.PostTarget;
import dev.sheldan.abstracto.core.models.property.SystemConfigProperty;
import dev.sheldan.abstracto.core.service.*;
import dev.sheldan.abstracto.core.service.management.ChannelManagementService;
import dev.sheldan.abstracto.core.service.management.DefaultConfigManagementService;
@@ -15,6 +16,7 @@ import dev.sheldan.abstracto.core.service.management.UserInServerManagementServi
import dev.sheldan.abstracto.core.utils.FutureUtils;
import dev.sheldan.abstracto.templating.model.MessageToSend;
import dev.sheldan.abstracto.templating.service.TemplateService;
import dev.sheldan.abstracto.utility.config.features.StarboardFeature;
import dev.sheldan.abstracto.utility.config.posttargets.StarboardPostTarget;
import dev.sheldan.abstracto.utility.models.database.StarboardPost;
import dev.sheldan.abstracto.utility.models.template.commands.starboard.StarStatsModel;
@@ -44,8 +46,6 @@ import java.util.stream.Collectors;
public class StarboardServiceBean implements StarboardService {
public static final String STARBOARD_POST_TEMPLATE = "starboard_post";
public static final String STAR_LVL_CONFIG_PREFIX = "starLvl";
public static final String STAR_LEVELS_CONFIG_KEY = "starLvls";
@Autowired
private MemberService memberService;
@@ -227,17 +227,19 @@ public class StarboardServiceBean implements StarboardService {
}
private String buildBadgeName(Integer position) {
return "starboardBadge" + position;
return StarboardFeature.STAR_BADGE_EMOTE_PREFIX + position;
}
private String getAppropriateEmote(Long serverId, Integer starCount) {
int maxLevels = defaultConfigManagementService.getDefaultConfig(StarboardServiceBean.STAR_LEVELS_CONFIG_KEY).getLongValue().intValue();
int maxLevels = defaultConfigManagementService.getDefaultConfig(StarboardFeature.STAR_LEVELS_CONFIG_KEY).getLongValue().intValue();
for(int i = maxLevels; i > 0; i--) {
Long starMinimum = configService.getLongValue(STAR_LVL_CONFIG_PREFIX + i, serverId);
String key = StarboardFeature.STAR_LVL_CONFIG_PREFIX + i;
SystemConfigProperty defaultStars = defaultConfigManagementService.getDefaultConfig(key);
Long starMinimum = configService.getLongValue(key, serverId, defaultStars.getLongValue());
if(starCount >= starMinimum) {
return emoteService.getUsableEmoteOrDefault(serverId, "star" + i);
return emoteService.getUsableEmoteOrDefault(serverId, StarboardFeature.STAR_EMOTE_PREFIX + i);
}
}
return emoteService.getUsableEmoteOrDefault(serverId, "star0");
return emoteService.getUsableEmoteOrDefault(serverId, StarboardFeature.STAR_EMOTE_PREFIX);
}
}

View File

@@ -6,7 +6,7 @@ import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.core.service.FeatureValidatorService;
import dev.sheldan.abstracto.core.service.management.DefaultConfigManagementService;
import dev.sheldan.abstracto.utility.StarboardFeatureValidator;
import dev.sheldan.abstracto.utility.service.StarboardServiceBean;
import dev.sheldan.abstracto.utility.config.features.StarboardFeature;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@@ -23,10 +23,10 @@ public class StarboardFeatureValidatorService implements StarboardFeatureValidat
@Override
public void featureIsSetup(FeatureConfig featureConfig, AServer server, FeatureValidationResult validationResult) {
int levelAmount = defaultConfigManagementService.getDefaultConfig(StarboardServiceBean.STAR_LEVELS_CONFIG_KEY).getLongValue().intValue();
int levelAmount = defaultConfigManagementService.getDefaultConfig(StarboardFeature.STAR_LEVELS_CONFIG_KEY).getLongValue().intValue();
log.info("Validating starboard feature for server {}.", server.getId());
for(int i = 1; i <= levelAmount; i++) {
featureValidatorService.checkSystemConfig("starLvl" + i, server, validationResult);
featureValidatorService.checkSystemConfig(StarboardFeature.STAR_LVL_CONFIG_PREFIX + i, server, validationResult);
}
}
}

View File

@@ -1,54 +0,0 @@
package dev.sheldan.abstracto.utility.config;
import dev.sheldan.abstracto.core.models.property.SystemConfigProperty;
import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.core.service.management.ConfigManagementService;
import dev.sheldan.abstracto.core.service.management.DefaultConfigManagementService;
import dev.sheldan.abstracto.core.test.MockUtils;
import dev.sheldan.abstracto.utility.service.StarboardServiceBean;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.*;
import org.mockito.junit.MockitoJUnitRunner;
import java.util.List;
import static org.mockito.Mockito.*;
@RunWith(MockitoJUnitRunner.class)
public class StarboardConfigListenerTest {
@InjectMocks
private StarboardConfigListener testUnit;
@Mock
private ConfigManagementService configManagementService;
@Mock
private DefaultConfigManagementService defaultConfigManagementService;
@Captor
private ArgumentCaptor<String> configKeyCaptor;
@Test
public void testUpdateServerConfig() {
AServer server = MockUtils.getServer();
int numberOfLevels = 4;
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_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 + 3)).thenReturn(config);
when(defaultConfigManagementService.getDefaultConfig(StarboardServiceBean.STAR_LVL_CONFIG_PREFIX + 4)).thenReturn(config);
testUnit.updateServerConfig(server);
verify(configManagementService, times(numberOfLevels)).createIfNotExists(eq(server.getId()), configKeyCaptor.capture(), anyLong());
List<String> keys = configKeyCaptor.getAllValues();
for (int i = 0; i < numberOfLevels; i++) {
Assert.assertEquals(StarboardServiceBean.STAR_LVL_CONFIG_PREFIX + (i + 1), keys.get(i));
}
Assert.assertEquals(numberOfLevels, keys.size());
}
}

View File

@@ -13,6 +13,7 @@ import dev.sheldan.abstracto.core.service.management.PostTargetManagement;
import dev.sheldan.abstracto.core.service.management.UserInServerManagementService;
import dev.sheldan.abstracto.templating.model.MessageToSend;
import dev.sheldan.abstracto.templating.service.TemplateService;
import dev.sheldan.abstracto.utility.config.features.StarboardFeature;
import dev.sheldan.abstracto.utility.config.posttargets.StarboardPostTarget;
import dev.sheldan.abstracto.utility.models.database.StarboardPost;
import dev.sheldan.abstracto.utility.models.database.StarboardPostReaction;
@@ -38,7 +39,7 @@ import java.util.List;
import java.util.Optional;
import java.util.concurrent.CompletableFuture;
import static dev.sheldan.abstracto.utility.service.StarboardServiceBean.STARBOARD_POST_TEMPLATE;
import static dev.sheldan.abstracto.utility.config.features.StarboardFeature.STAR_EMOTE_PREFIX;
import static org.mockito.Mockito.*;
@RunWith(MockitoJUnitRunner.class)
@@ -148,14 +149,18 @@ public class StarboardServiceBeanTest {
when(channelService.getTextChannelFromServerOptional(SERVER_ID, CHANNEL_ID)).thenReturn(Optional.of(mockedTextChannel));
when(guildService.getGuildByIdOptional(SERVER_ID)).thenReturn(Optional.of(guild));
SystemConfigProperty config = Mockito.mock(SystemConfigProperty.class);
when(config.getLongValue()).thenReturn(3L);
when(defaultConfigManagementService.getDefaultConfig(StarboardServiceBean.STAR_LEVELS_CONFIG_KEY)).thenReturn(config);
when(configService.getLongValue("starLvl3", SERVER_ID)).thenReturn(3L);
when(configService.getLongValue("starLvl2", SERVER_ID)).thenReturn(2L);
when(emoteService.getUsableEmoteOrDefault(SERVER_ID, "star2")).thenReturn("b");
Long defaultValue = 3L;
when(config.getLongValue()).thenReturn(defaultValue);
when(defaultConfigManagementService.getDefaultConfig(StarboardFeature.STAR_LEVELS_CONFIG_KEY)).thenReturn(config);
when(configService.getLongValue(StarboardFeature.STAR_LVL_CONFIG_PREFIX + "2", SERVER_ID, defaultValue)).thenReturn(2L);
when(configService.getLongValue(StarboardFeature.STAR_LVL_CONFIG_PREFIX + "3", SERVER_ID, defaultValue)).thenReturn(3L);
when(defaultConfigManagementService.getDefaultConfig(StarboardFeature.STAR_LVL_CONFIG_PREFIX + "2")).thenReturn(config);
when(defaultConfigManagementService.getDefaultConfig(StarboardFeature.STAR_LVL_CONFIG_PREFIX + "3")).thenReturn(config);
when(emoteService.getUsableEmoteOrDefault(SERVER_ID, STAR_EMOTE_PREFIX + "2")).thenReturn("b");
when(self.sendStarboardPostAndStore(eq(message), eq(STARRED_SERVER_USER_ID), anyList(), any())).thenReturn(CompletableFuture.completedFuture(null));
CompletableFuture<Void> createPostFuture = testUnit.createStarboardPost(message, userExceptAuthor, userReacting, starredUser);
Assert.assertTrue(createPostFuture.isDone());
createPostFuture.join();
Assert.assertFalse(createPostFuture.isCompletedExceptionally());
}
@Test
@@ -163,7 +168,7 @@ public class StarboardServiceBeanTest {
CachedMessage message = Mockito.mock(CachedMessage.class);
when(message.getServerId()).thenReturn(SERVER_ID);
StarboardPostModel model = Mockito.mock(StarboardPostModel.class);
when(templateService.renderEmbedTemplate(STARBOARD_POST_TEMPLATE, model)).thenReturn(messageToSend);
when(templateService.renderEmbedTemplate(StarboardServiceBean.STARBOARD_POST_TEMPLATE, model)).thenReturn(messageToSend);
PostTarget postTarget = Mockito.mock(PostTarget.class);
when(postTarget.getChannelReference()).thenReturn(starboardChannel);
when(starboardChannel.getId()).thenReturn(STARBOARD_CHANNEL_ID);
@@ -217,16 +222,19 @@ public class StarboardServiceBeanTest {
when(post.getSourceChanel()).thenReturn(sourceChannel);
when(post.getId()).thenReturn(starboardPostId);
MessageToSend postMessage = Mockito.mock(MessageToSend.class);
when(templateService.renderEmbedTemplate(eq(STARBOARD_POST_TEMPLATE), starboardPostModelArgumentCaptor.capture())).thenReturn(postMessage);
when(templateService.renderEmbedTemplate(eq(StarboardServiceBean.STARBOARD_POST_TEMPLATE), starboardPostModelArgumentCaptor.capture())).thenReturn(postMessage);
when(postTargetService.editOrCreatedInPostTarget(oldPostId, postMessage, StarboardPostTarget.STARBOARD, SERVER_ID)).thenReturn(Arrays.asList(CompletableFuture.completedFuture(sendPost)));
when(sendPost.getIdLong()).thenReturn(newPostId);
SystemConfigProperty config = Mockito.mock(SystemConfigProperty.class);
when(config.getLongValue()).thenReturn(4L);
when(defaultConfigManagementService.getDefaultConfig(StarboardServiceBean.STAR_LEVELS_CONFIG_KEY)).thenReturn(config);
when(config.getLongValue()).thenReturn(1L);
when(defaultConfigManagementService.getDefaultConfig(StarboardFeature.STAR_LEVELS_CONFIG_KEY)).thenReturn(config);
when(defaultConfigManagementService.getDefaultConfig(StarboardFeature.STAR_LVL_CONFIG_PREFIX + 1)).thenReturn(config);
when(starboardPostManagementService.findByStarboardPostId(starboardPostId)).thenReturn(Optional.of(post));
when(memberService.getMemberInServerAsync(SERVER_ID, STARRED_USER_ID)).thenReturn(CompletableFuture.completedFuture(starredMember));
List<AUserInAServer > userExceptAuthor = new ArrayList<>();
testUnit.updateStarboardPost(post, message, userExceptAuthor);
CompletableFuture<Void> future = testUnit.updateStarboardPost(post, message, userExceptAuthor);
future.join();
Assert.assertFalse(future.isCompletedExceptionally());
verify(postTargetService, times(1)).editOrCreatedInPostTarget(oldPostId, postMessage, StarboardPostTarget.STARBOARD, SERVER_ID);
verify(starboardPostManagementService, times(1)).setStarboardPostMessageId(post, newPostId);
}

View File

@@ -5,7 +5,7 @@ import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.core.service.FeatureValidatorService;
import dev.sheldan.abstracto.core.service.management.DefaultConfigManagementService;
import dev.sheldan.abstracto.core.test.MockUtils;
import dev.sheldan.abstracto.utility.service.StarboardServiceBean;
import dev.sheldan.abstracto.utility.config.features.StarboardFeature;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -37,14 +37,14 @@ public class StarboardFeatureValidatorServiceTest {
int levelCount = 4;
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(StarboardFeature.STAR_LEVELS_CONFIG_KEY)).thenReturn(config);
testUnit.featureIsSetup(null, server, null);
verify(featureValidatorService, times(levelCount)).checkSystemConfig(configKeyCaptor.capture(), eq(server), any());
List<String> allValues = configKeyCaptor.getAllValues();
for (int i = 0; i < allValues.size(); i++) {
String key = allValues.get(i);
Assert.assertEquals("starLvl" + ( i + 1 ), key);
Assert.assertEquals(StarboardFeature.STAR_LVL_CONFIG_PREFIX + ( i + 1 ), key);
}
Assert.assertEquals(levelCount, allValues.size());
}

View File

@@ -4,20 +4,30 @@ import dev.sheldan.abstracto.core.config.FeatureConfig;
import dev.sheldan.abstracto.core.config.FeatureEnum;
import dev.sheldan.abstracto.core.config.PostTargetEnum;
import dev.sheldan.abstracto.core.service.FeatureValidator;
import dev.sheldan.abstracto.core.service.management.DefaultConfigManagementService;
import dev.sheldan.abstracto.utility.StarboardFeatureValidator;
import dev.sheldan.abstracto.utility.config.posttargets.StarboardPostTarget;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@Component
public class StarboardFeature implements FeatureConfig {
public static final String STAR_LVL_CONFIG_PREFIX = "starLvl";
public static final String STAR_EMOTE_PREFIX = "star";
public static final String STAR_BADGE_EMOTE_PREFIX = "starboardBadge";
public static final String STAR_LEVELS_CONFIG_KEY = "starLvls";
@Autowired
private StarboardFeatureValidator starboardFeatureValidator;
@Autowired
private DefaultConfigManagementService defaultConfigManagementService;
@Override
public FeatureEnum getFeature() {
return UtilityFeature.STARBOARD;
@@ -33,10 +43,30 @@ public class StarboardFeature implements FeatureConfig {
return Arrays.asList(starboardFeatureValidator);
}
// TODO add missing system config keys
@Override
public List<String> getRequiredSystemConfigKeys() {
List<String> configKeys = new ArrayList<>();
int maxLevels = getMaxLevels();
for(int i = maxLevels; i > 0; i--) {
configKeys.add(StarboardFeature.STAR_LVL_CONFIG_PREFIX + i);
}
return configKeys;
}
@Override
public List<String> getRequiredEmotes() {
return Arrays.asList("star", "star1", "star2", "star3", "star4", "starboardBadge1", "starboardBadge2", "starboardBadge3");
List<String> emoteNames = new ArrayList<>();
int maxLevels = getMaxLevels();
for(int i = maxLevels; i > 0; i--) {
emoteNames.add(StarboardFeature.STAR_EMOTE_PREFIX + i);
}
emoteNames.add(StarboardFeature.STAR_BADGE_EMOTE_PREFIX + 1);
emoteNames.add(StarboardFeature.STAR_BADGE_EMOTE_PREFIX + 2);
emoteNames.add(StarboardFeature.STAR_BADGE_EMOTE_PREFIX + 3);
return emoteNames;
}
private int getMaxLevels() {
return defaultConfigManagementService.getDefaultConfig(STAR_LEVELS_CONFIG_KEY).getLongValue().intValue();
}
}