mirror of
https://github.com/Sheldan/abstracto.git
synced 2026-01-23 20:30:21 +00:00
[AB-203] using task executors for the async listeners
fixing starboard post listener and service method
This commit is contained in:
@@ -11,8 +11,13 @@ public class StarboardListenerConfig {
|
||||
@Autowired
|
||||
private ExecutorService executorService;
|
||||
|
||||
@Bean(name = "starboardStatusListenerExecutor")
|
||||
public TaskExecutor joinListenerExecutor() {
|
||||
return executorService.setupExecutorFor("starboardStatusListener");
|
||||
@Bean(name = "starboardCreatedListenerExecutor")
|
||||
public TaskExecutor starboardPostCreatedExecutor() {
|
||||
return executorService.setupExecutorFor("starboardCreatedListener");
|
||||
}
|
||||
|
||||
@Bean(name = "starboardDeletedListenerExecutor")
|
||||
public TaskExecutor starboardPostDeletedExecutor() {
|
||||
return executorService.setupExecutorFor("starboardDeletedListener");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,7 +16,7 @@ import java.util.Optional;
|
||||
|
||||
@Component
|
||||
@Slf4j
|
||||
public class StarboardPostDeletedListener implements AsyncMessageDeletedListener {
|
||||
public class StarboardMessagePostDeletedListener implements AsyncMessageDeletedListener {
|
||||
|
||||
@Autowired
|
||||
private StarboardPostManagementService starboardPostManagementService;
|
||||
@@ -24,7 +24,7 @@ public class StarboardPostDeletedListener implements AsyncMessageDeletedListener
|
||||
@Override
|
||||
public DefaultListenerResult execute(MessageDeletedModel model) {
|
||||
CachedMessage message = model.getCachedMessage();
|
||||
Optional<StarboardPost> byStarboardPostId = starboardPostManagementService.findByStarboardPostId(message.getMessageId());
|
||||
Optional<StarboardPost> byStarboardPostId = starboardPostManagementService.findByStarboardPostMessageId(message.getMessageId());
|
||||
if(byStarboardPostId.isPresent()) {
|
||||
StarboardPost post = byStarboardPostId.get();
|
||||
log.info("Removing starboard post: message {}, channel {}, server {}, because the message was deleted",
|
||||
@@ -5,9 +5,8 @@ import dev.sheldan.abstracto.core.models.ServerChannelMessage;
|
||||
import dev.sheldan.abstracto.core.models.ServerUser;
|
||||
import dev.sheldan.abstracto.core.service.FeatureConfigService;
|
||||
import dev.sheldan.abstracto.core.service.FeatureFlagService;
|
||||
import dev.sheldan.abstracto.starboard.listener.StarboardPostState;
|
||||
import dev.sheldan.abstracto.starboard.listener.StarboardPostUpdatedListener;
|
||||
import dev.sheldan.abstracto.starboard.model.StarboardPostUpdatedModel;
|
||||
import dev.sheldan.abstracto.starboard.listener.StarboardPostCreatedListener;
|
||||
import dev.sheldan.abstracto.starboard.model.StarboardPostCreatedModel;
|
||||
import dev.sheldan.abstracto.starboard.model.database.StarboardPost;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
@@ -20,17 +19,17 @@ import java.util.stream.Collectors;
|
||||
|
||||
@Component
|
||||
@Slf4j
|
||||
public class StarboardPostListenerManager {
|
||||
public class StarboardPostCreatedListenerManager {
|
||||
|
||||
@Autowired(required = false)
|
||||
private List<StarboardPostUpdatedListener> listeners;
|
||||
private List<StarboardPostCreatedListener> listeners;
|
||||
|
||||
@Autowired
|
||||
@Qualifier("starboardStatusListenerExecutor")
|
||||
private TaskExecutor starboardStatusExecutor;
|
||||
@Qualifier("starboardCreatedListenerExecutor")
|
||||
private TaskExecutor starboardCreatedExecutor;
|
||||
|
||||
@Autowired
|
||||
private StarboardPostListenerManager self;
|
||||
private StarboardPostCreatedListenerManager self;
|
||||
|
||||
@Autowired
|
||||
private FeatureConfigService featureConfigService;
|
||||
@@ -46,20 +45,11 @@ public class StarboardPostListenerManager {
|
||||
return;
|
||||
}
|
||||
ServerUser userReactingServerUser = ServerUser.builder().serverId(post.getServer().getId()).userId(userReactingId).build();
|
||||
StarboardPostUpdatedModel model = createStarboardStatusModel(post, userReactingServerUser);
|
||||
model.setNewState(StarboardPostState.CREATED);
|
||||
listeners.forEach(listener -> listenerService.executeFeatureAwareListener(listener, model));
|
||||
StarboardPostCreatedModel model = createStarboardStatusModel(post, userReactingServerUser);
|
||||
listeners.forEach(listener -> listenerService.executeFeatureAwareListener(listener, model, starboardCreatedExecutor));
|
||||
}
|
||||
|
||||
public void sendStarboardPostDeletedEvent(StarboardPost post, ServerUser userReacting) {
|
||||
if(listeners == null || listeners.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
StarboardPostUpdatedModel model = createStarboardStatusModel(post, userReacting);
|
||||
model.setNewState(StarboardPostState.DELETED);
|
||||
}
|
||||
|
||||
private StarboardPostUpdatedModel createStarboardStatusModel(StarboardPost post, ServerUser userReacting) {
|
||||
private StarboardPostCreatedModel createStarboardStatusModel(StarboardPost post, ServerUser userReacting) {
|
||||
Long serverId = post.getServer().getId();
|
||||
ServerUser starredUser = ServerUser
|
||||
.builder()
|
||||
@@ -85,9 +75,10 @@ public class StarboardPostListenerManager {
|
||||
.stream()
|
||||
.map(starboardPostReaction -> starboardPostReaction.getReactor().getUserReference().getId())
|
||||
.collect(Collectors.toList());
|
||||
return StarboardPostUpdatedModel
|
||||
return StarboardPostCreatedModel
|
||||
.builder()
|
||||
.lastStarrer(userReacting)
|
||||
.starboardPostId(post.getId())
|
||||
.starredUser(starredUser)
|
||||
.starboardMessage(starboardMessagePayLoad)
|
||||
.starredMessage(starredMessage)
|
||||
@@ -0,0 +1,88 @@
|
||||
package dev.sheldan.abstracto.starboard.service;
|
||||
|
||||
import dev.sheldan.abstracto.core.listener.ListenerService;
|
||||
import dev.sheldan.abstracto.core.models.ServerChannelMessage;
|
||||
import dev.sheldan.abstracto.core.models.ServerUser;
|
||||
import dev.sheldan.abstracto.core.service.FeatureConfigService;
|
||||
import dev.sheldan.abstracto.core.service.FeatureFlagService;
|
||||
import dev.sheldan.abstracto.starboard.listener.StarboardPostDeletedListener;
|
||||
import dev.sheldan.abstracto.starboard.model.StarboardPostDeletedModel;
|
||||
import dev.sheldan.abstracto.starboard.model.database.StarboardPost;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Qualifier;
|
||||
import org.springframework.core.task.TaskExecutor;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Component
|
||||
@Slf4j
|
||||
public class StarboardPostDeletedListenerManager {
|
||||
|
||||
@Autowired(required = false)
|
||||
private List<StarboardPostDeletedListener> listeners;
|
||||
|
||||
@Autowired
|
||||
@Qualifier("starboardDeletedListenerExecutor")
|
||||
private TaskExecutor starboardDeletedExecutor;
|
||||
|
||||
@Autowired
|
||||
private StarboardPostDeletedListenerManager self;
|
||||
|
||||
@Autowired
|
||||
private FeatureConfigService featureConfigService;
|
||||
|
||||
@Autowired
|
||||
private FeatureFlagService featureFlagService;
|
||||
|
||||
@Autowired
|
||||
private ListenerService listenerService;
|
||||
|
||||
public void sendStarboardPostDeletedEvent(StarboardPost post, ServerUser userReacting) {
|
||||
if(listeners == null || listeners.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
StarboardPostDeletedModel model = createStarboardStatusModel(post, userReacting);
|
||||
listeners.forEach(listener -> listenerService.executeFeatureAwareListener(listener, model, starboardDeletedExecutor));
|
||||
}
|
||||
|
||||
private StarboardPostDeletedModel createStarboardStatusModel(StarboardPost post, ServerUser userReacting) {
|
||||
Long serverId = post.getServer().getId();
|
||||
ServerUser starredUser = ServerUser
|
||||
.builder()
|
||||
.serverId(serverId)
|
||||
.userId(post.getAuthor().getUserReference().getId())
|
||||
.build();
|
||||
ServerChannelMessage starboardMessagePayLoad = ServerChannelMessage
|
||||
.builder()
|
||||
.serverId(serverId)
|
||||
.channelId(post.getStarboardChannel().getId())
|
||||
.messageId(post.getStarboardMessageId())
|
||||
.build();
|
||||
|
||||
ServerChannelMessage starredMessage = ServerChannelMessage
|
||||
.builder()
|
||||
.serverId(serverId)
|
||||
.channelId(post.getSourceChannel().getId())
|
||||
.messageId(post.getPostMessageId())
|
||||
.build();
|
||||
|
||||
List<Long> starrerIds = post.
|
||||
getReactions()
|
||||
.stream()
|
||||
.map(starboardPostReaction -> starboardPostReaction.getReactor().getUserReference().getId())
|
||||
.collect(Collectors.toList());
|
||||
return StarboardPostDeletedModel
|
||||
.builder()
|
||||
.lastStarrer(userReacting)
|
||||
.starboardPostId(post.getId())
|
||||
.starredUser(starredUser)
|
||||
.starboardMessage(starboardMessagePayLoad)
|
||||
.starredMessage(starredMessage)
|
||||
.allStarrer(starrerIds)
|
||||
.build();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -91,7 +91,10 @@ public class StarboardServiceBean implements StarboardService {
|
||||
private StarboardServiceBean self;
|
||||
|
||||
@Autowired
|
||||
private StarboardPostListenerManager starboardPostListenerManager;
|
||||
private StarboardPostDeletedListenerManager starboardPostDeletedListenerManager;
|
||||
|
||||
@Autowired
|
||||
private StarboardPostCreatedListenerManager starboardPostCreatedListenerManager;
|
||||
|
||||
@Autowired
|
||||
private UserService userService;
|
||||
@@ -138,7 +141,7 @@ public class StarboardServiceBean implements StarboardService {
|
||||
AUserInAServer user = userInServerManagementService.loadUserOptional(aLong).orElseThrow(() -> new UserInServerNotFoundException(aLong));
|
||||
starboardPostReactorManagementService.addReactor(starboardPost, user);
|
||||
});
|
||||
starboardPostListenerManager.sendStarboardPostCreatedEvent(userReactingId, starboardPost);
|
||||
starboardPostCreatedListenerManager.sendStarboardPostCreatedEvent(userReactingId, starboardPost);
|
||||
}
|
||||
|
||||
|
||||
@@ -250,7 +253,7 @@ public class StarboardServiceBean implements StarboardService {
|
||||
public void deleteStarboardPost(StarboardPost starboardPost, ServerUser userReacting) {
|
||||
deleteStarboardMessagePost(starboardPost);
|
||||
starboardPostManagementService.removePost(starboardPost);
|
||||
starboardPostListenerManager.sendStarboardPostDeletedEvent(starboardPost, userReacting);
|
||||
starboardPostDeletedListenerManager.sendStarboardPostDeletedEvent(starboardPost, userReacting);
|
||||
}
|
||||
|
||||
private String getStarboardRankingEmote(Long serverId, Integer position) {
|
||||
|
||||
@@ -97,6 +97,11 @@ public class StarboardPostManagementServiceBean implements StarboardPostManageme
|
||||
|
||||
@Override
|
||||
public Optional<StarboardPost> findByStarboardPostId(Long postId) {
|
||||
return repository.findById(postId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Optional<StarboardPost> findByStarboardPostMessageId(Long postId) {
|
||||
return Optional.ofNullable(repository.findByStarboardMessageId(postId));
|
||||
}
|
||||
|
||||
|
||||
@@ -17,10 +17,10 @@ import java.util.Optional;
|
||||
import static org.mockito.Mockito.*;
|
||||
|
||||
@RunWith(MockitoJUnitRunner.class)
|
||||
public class StarboardPostDeletedListenerTest {
|
||||
public class StarboardMessagePostDeletedListenerTest {
|
||||
|
||||
@InjectMocks
|
||||
private StarboardPostDeletedListener testUnit;
|
||||
private StarboardMessagePostDeletedListener testUnit;
|
||||
|
||||
@Mock
|
||||
private StarboardPostManagementService starboardPostManagementService;
|
||||
@@ -28,7 +28,7 @@ public class StarboardPostDeletedListenerTest {
|
||||
@Test
|
||||
public void deleteNonStarboardPost() {
|
||||
Long messageId = 4L;
|
||||
when(starboardPostManagementService.findByStarboardPostId(messageId)).thenReturn(Optional.empty());
|
||||
when(starboardPostManagementService.findByStarboardPostMessageId(messageId)).thenReturn(Optional.empty());
|
||||
MessageDeletedModel model = Mockito.mock(MessageDeletedModel.class);
|
||||
CachedMessage cachedMessage = Mockito.mock(CachedMessage.class);
|
||||
when(cachedMessage.getMessageId()).thenReturn(messageId);
|
||||
@@ -46,7 +46,7 @@ public class StarboardPostDeletedListenerTest {
|
||||
StarboardPost post = Mockito.mock(StarboardPost.class);
|
||||
when(post.getSourceChannel()) .thenReturn(sourceChannel);
|
||||
when(post.getPostMessageId()).thenReturn(postMessageId);
|
||||
when(starboardPostManagementService.findByStarboardPostId(messageId)).thenReturn(Optional.of(post));
|
||||
when(starboardPostManagementService.findByStarboardPostMessageId(messageId)).thenReturn(Optional.of(post));
|
||||
CachedMessage cachedMessage = Mockito.mock(CachedMessage.class);
|
||||
when(cachedMessage.getServerId()).thenReturn(serverId);
|
||||
when(cachedMessage.getMessageId()).thenReturn(messageId);
|
||||
@@ -242,7 +242,7 @@ public class StarboardServiceBeanTest {
|
||||
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(starboardPostManagementService.findByStarboardPostMessageId(starboardPostId)).thenReturn(Optional.of(post));
|
||||
when(userService.retrieveUserForId(STARRED_USER_ID)).thenReturn(CompletableFuture.completedFuture(starredJdaUser));
|
||||
List<AUserInAServer > userExceptAuthor = new ArrayList<>();
|
||||
CompletableFuture<Void> future = testUnit.updateStarboardPost(post, message, userExceptAuthor);
|
||||
|
||||
@@ -179,7 +179,7 @@ public class StarboardPostManagementServiceBeanTest {
|
||||
Long postId = 5L;
|
||||
StarboardPost post = Mockito.mock(StarboardPost.class);
|
||||
when(repository.findByStarboardMessageId(postId)).thenReturn(post);
|
||||
Optional<StarboardPost> postOptional = testUnit.findByStarboardPostId(postId);
|
||||
Optional<StarboardPost> postOptional = testUnit.findByStarboardPostMessageId(postId);
|
||||
Assert.assertTrue(postOptional.isPresent());
|
||||
postOptional.ifPresent(starboardPost -> Assert.assertEquals(starboardPost, post));
|
||||
}
|
||||
@@ -188,7 +188,7 @@ public class StarboardPostManagementServiceBeanTest {
|
||||
public void testFindByStarboardPostIdMissing() {
|
||||
Long postId = 5L;
|
||||
when(repository.findByStarboardMessageId(postId)).thenReturn(null);
|
||||
Optional<StarboardPost> postOptional = testUnit.findByStarboardPostId(postId);
|
||||
Optional<StarboardPost> postOptional = testUnit.findByStarboardPostMessageId(postId);
|
||||
Assert.assertFalse(postOptional.isPresent());
|
||||
}
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@ package dev.sheldan.abstracto.starboard.listener;
|
||||
|
||||
import dev.sheldan.abstracto.core.listener.DefaultListenerResult;
|
||||
import dev.sheldan.abstracto.core.listener.FeatureAwareListener;
|
||||
import dev.sheldan.abstracto.starboard.model.StarboardPostUpdatedModel;
|
||||
import dev.sheldan.abstracto.starboard.model.StarboardPostCreatedModel;
|
||||
|
||||
public interface StarboardPostUpdatedListener extends FeatureAwareListener<StarboardPostUpdatedModel, DefaultListenerResult> {
|
||||
public interface StarboardPostCreatedListener extends FeatureAwareListener<StarboardPostCreatedModel, DefaultListenerResult> {
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
package dev.sheldan.abstracto.starboard.listener;
|
||||
|
||||
import dev.sheldan.abstracto.core.listener.DefaultListenerResult;
|
||||
import dev.sheldan.abstracto.core.listener.FeatureAwareListener;
|
||||
import dev.sheldan.abstracto.starboard.model.StarboardPostDeletedModel;
|
||||
|
||||
public interface StarboardPostDeletedListener extends FeatureAwareListener<StarboardPostDeletedModel, DefaultListenerResult> {
|
||||
}
|
||||
@@ -1,5 +0,0 @@
|
||||
package dev.sheldan.abstracto.starboard.listener;
|
||||
|
||||
public enum StarboardPostState {
|
||||
CREATED, UPDATED, UPDATED_CHANGED_THRESHOLD, DELETED
|
||||
}
|
||||
@@ -3,7 +3,6 @@ package dev.sheldan.abstracto.starboard.model;
|
||||
import dev.sheldan.abstracto.core.listener.FeatureAwareListenerModel;
|
||||
import dev.sheldan.abstracto.core.models.ServerChannelMessage;
|
||||
import dev.sheldan.abstracto.core.models.ServerUser;
|
||||
import dev.sheldan.abstracto.starboard.listener.StarboardPostState;
|
||||
import lombok.Builder;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
@@ -13,14 +12,13 @@ import java.util.List;
|
||||
@Getter
|
||||
@Setter
|
||||
@Builder
|
||||
public class StarboardPostUpdatedModel implements FeatureAwareListenerModel {
|
||||
public class StarboardPostCreatedModel implements FeatureAwareListenerModel {
|
||||
private ServerChannelMessage starredMessage;
|
||||
private ServerChannelMessage starboardMessage;
|
||||
private ServerUser starredUser;
|
||||
private ServerUser lastStarrer;
|
||||
private Long starboardPostId;
|
||||
private List<Long> allStarrer;
|
||||
private StarboardPostState newState;
|
||||
|
||||
@Override
|
||||
public Long getServerId() {
|
||||
@@ -0,0 +1,27 @@
|
||||
package dev.sheldan.abstracto.starboard.model;
|
||||
|
||||
import dev.sheldan.abstracto.core.listener.FeatureAwareListenerModel;
|
||||
import dev.sheldan.abstracto.core.models.ServerChannelMessage;
|
||||
import dev.sheldan.abstracto.core.models.ServerUser;
|
||||
import lombok.Builder;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
@Builder
|
||||
public class StarboardPostDeletedModel implements FeatureAwareListenerModel {
|
||||
private ServerChannelMessage starredMessage;
|
||||
private ServerChannelMessage starboardMessage;
|
||||
private ServerUser starredUser;
|
||||
private ServerUser lastStarrer;
|
||||
private Long starboardPostId;
|
||||
private List<Long> allStarrer;
|
||||
|
||||
@Override
|
||||
public Long getServerId() {
|
||||
return starredUser.getServerId();
|
||||
}
|
||||
}
|
||||
@@ -20,6 +20,7 @@ public interface StarboardPostManagementService {
|
||||
Integer getPostCount(Long serverId);
|
||||
Optional<StarboardPost> findByMessageId(Long messageId);
|
||||
Optional<StarboardPost> findByStarboardPostId(Long postId);
|
||||
Optional<StarboardPost> findByStarboardPostMessageId(Long postId);
|
||||
void setStarboardPostIgnored(Long starboardPostId, Boolean newValue);
|
||||
boolean isStarboardPost(Long starboardPostId);
|
||||
void removePost(StarboardPost starboardPost);
|
||||
|
||||
Reference in New Issue
Block a user