mirror of
https://github.com/Sheldan/abstracto.git
synced 2026-03-09 09:09:52 +00:00
[AB-57] [AB-61] reworked commands and services to work with completable futures and moved the database operations to the very last operation so we have transaction safety in more areas
added some cache annotations to the default repository functions reworked how the undo cations are processed within commands, they are executed in a post command listener when the state is error added a counter id to generate ids to be unique within servers, changed a few tables to be unique within a server added future utils class for wrapping a list of futures into one moved abstracto tables to separate schema in the installer refactored experience gain to work with more futures and delayed database access
This commit is contained in:
@@ -7,6 +7,8 @@ import dev.sheldan.abstracto.assignableroles.models.database.AssignableRolePlace
|
||||
import dev.sheldan.abstracto.assignableroles.models.database.AssignedRoleUser;
|
||||
import dev.sheldan.abstracto.assignableroles.service.AssignableRolePlaceService;
|
||||
import dev.sheldan.abstracto.assignableroles.service.AssignableRoleServiceBean;
|
||||
import dev.sheldan.abstracto.assignableroles.service.management.AssignableRoleManagementService;
|
||||
import dev.sheldan.abstracto.assignableroles.service.management.AssignableRolePlaceManagementService;
|
||||
import dev.sheldan.abstracto.assignableroles.service.management.AssignableRolePlacePostManagementService;
|
||||
import dev.sheldan.abstracto.assignableroles.service.management.AssignedRoleUserManagementService;
|
||||
import dev.sheldan.abstracto.core.config.FeatureEnum;
|
||||
@@ -14,12 +16,15 @@ import dev.sheldan.abstracto.core.listener.ReactedAddedListener;
|
||||
import dev.sheldan.abstracto.core.models.cache.CachedMessage;
|
||||
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
|
||||
import dev.sheldan.abstracto.core.service.EmoteService;
|
||||
import dev.sheldan.abstracto.core.service.management.UserInServerManagementService;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import net.dv8tion.jda.api.entities.MessageReaction;
|
||||
import net.dv8tion.jda.api.events.message.guild.react.GuildMessageReactionAddEvent;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
|
||||
@@ -42,6 +47,18 @@ public class AssignablePostReactionAdded implements ReactedAddedListener {
|
||||
@Autowired
|
||||
private AssignedRoleUserManagementService assignedRoleUserManagementService;
|
||||
|
||||
@Autowired
|
||||
private AssignableRolePlaceManagementService assignableRolePlaceManagementService;
|
||||
|
||||
@Autowired
|
||||
private AssignablePostReactionAdded self;
|
||||
|
||||
@Autowired
|
||||
private UserInServerManagementService userInServerManagementService;
|
||||
|
||||
@Autowired
|
||||
private AssignableRoleManagementService assignableRoleManagementService;
|
||||
|
||||
@Override
|
||||
public void executeReactionAdded(CachedMessage message, GuildMessageReactionAddEvent event, AUserInAServer userAdding) {
|
||||
Optional<AssignableRolePlacePost> messageOptional = service.findByMessageIdOptional(message.getMessageId());
|
||||
@@ -65,38 +82,41 @@ public class AssignablePostReactionAdded implements ReactedAddedListener {
|
||||
private void addAppropriateRoles(GuildMessageReactionAddEvent event, MessageReaction reaction, AssignableRolePlacePost assignablePlacePost, MessageReaction.ReactionEmote reactionEmote, AUserInAServer userAdding) {
|
||||
boolean validReaction = false;
|
||||
AssignableRolePlace assignableRolePlace = assignablePlacePost.getAssignablePlace();
|
||||
List<CompletableFuture<Void>> futures = new ArrayList<>();
|
||||
for (AssignableRole assignableRole : assignablePlacePost.getAssignableRoles()) {
|
||||
if (emoteService.isReactionEmoteAEmote(reactionEmote, assignableRole.getEmote())) {
|
||||
CompletableFuture<Void> future;
|
||||
if(assignableRolePlace.getUniqueRoles()) {
|
||||
Optional<AssignedRoleUser> byUserInServer = assignedRoleUserManagementService.findByUserInServerOptional(userAdding);
|
||||
if(byUserInServer.isPresent()){
|
||||
future = assignableRolePlaceService.removeExistingReactionsAndRoles(assignableRolePlace, byUserInServer.get());
|
||||
} else {
|
||||
future = CompletableFuture.completedFuture(null);
|
||||
}
|
||||
} else {
|
||||
future = CompletableFuture.completedFuture(null);
|
||||
byUserInServer.ifPresent(user -> futures.add(assignableRolePlaceService.removeExistingReactionsAndRoles(assignableRolePlace, user)));
|
||||
}
|
||||
|
||||
Long assignableRoleId = assignableRole.getId();
|
||||
future.whenComplete((aVoid, throwable) -> {
|
||||
if(throwable != null) {
|
||||
log.warn("Failed to remove previous role assignments for {} in server {} at place {}.",
|
||||
userAdding.getUserReference().getId(), userAdding.getServerReference().getId(), assignablePlacePost.getAssignablePlace().getKey());
|
||||
}
|
||||
assignableRoleServiceBean.assignAssignableRoleToUser(assignableRoleId, event.getMember()).exceptionally(innerThrowable -> {
|
||||
log.error("Failed to add new role assignment.", innerThrowable);
|
||||
return null;
|
||||
});
|
||||
});
|
||||
CompletableFuture<Void> roleAdditionFuture = assignableRoleServiceBean.assignAssignableRoleToUser(assignableRoleId, event.getMember());
|
||||
|
||||
futures.add(CompletableFuture.allOf(roleAdditionFuture));
|
||||
validReaction = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(!validReaction || assignableRolePlace.getAutoRemove()) {
|
||||
reaction.removeReaction(event.getUser()).submit();
|
||||
if(!validReaction) {
|
||||
futures.add(reaction.removeReaction(event.getUser()).submit());
|
||||
}
|
||||
Long assignableRolePlaceId = assignableRolePlace.getId();
|
||||
Long userInServerId = userAdding.getUserInServerId();
|
||||
CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).thenAccept(aVoid ->
|
||||
self.updateStoredAssignableRoles(assignableRolePlaceId, userInServerId, reactionEmote)
|
||||
);
|
||||
}
|
||||
|
||||
private void updateStoredAssignableRoles(Long assignableRolePlaceId, Long userAdding, MessageReaction.ReactionEmote reactionEmote) {
|
||||
AssignableRolePlace place = assignableRolePlaceManagementService.findByPlaceId(assignableRolePlaceId);
|
||||
AUserInAServer userInAServer = userInServerManagementService.loadUser(userAdding);
|
||||
if(place.getUniqueRoles()) {
|
||||
assignableRoleServiceBean.clearAllRolesOfUserInPlace(place, userInAServer);
|
||||
}
|
||||
AssignableRole role = assignableRoleManagementService.getRoleForReactionEmote(reactionEmote, place);
|
||||
assignableRoleServiceBean.addRoleToUser(role.getId(), userInAServer);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -49,7 +49,7 @@ public class AssignablePostReactionRemoved implements ReactedRemovedListener {
|
||||
assignablePlacePost.getAssignableRoles().forEach(assignableRole -> {
|
||||
if(emoteService.isReactionEmoteAEmote(reactionEmote, assignableRole.getEmote())) {
|
||||
Long assignableRoleId = assignableRole.getId();
|
||||
assignableRoleService.removeAssignableRoleFromUser(assignableRole, event.getMember()).exceptionally(throwable -> {
|
||||
assignableRoleService.fullyRemoveAssignableRoleFromUser(assignableRole, event.getMember()).exceptionally(throwable -> {
|
||||
log.error("Failed to remove assignable role {} from user {}.", assignableRoleId, event.getMember(), throwable);
|
||||
return null;
|
||||
});
|
||||
|
||||
@@ -1,10 +1,19 @@
|
||||
package dev.sheldan.abstracto.assignableroles.repository;
|
||||
|
||||
import dev.sheldan.abstracto.assignableroles.models.database.AssignableRolePlacePost;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
import org.springframework.data.jpa.repository.QueryHints;
|
||||
import org.springframework.lang.NonNull;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
import javax.persistence.QueryHint;
|
||||
import java.util.Optional;
|
||||
|
||||
@Repository
|
||||
public interface AssignableRolePlacePostRepository extends JpaRepository<AssignableRolePlacePost, Long> {
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
@QueryHints(@QueryHint(name = org.hibernate.annotations.QueryHints.CACHEABLE, value = "true"))
|
||||
Optional<AssignableRolePlacePost> findById(@NonNull Long aLong);
|
||||
}
|
||||
|
||||
@@ -2,15 +2,30 @@ package dev.sheldan.abstracto.assignableroles.repository;
|
||||
|
||||
import dev.sheldan.abstracto.assignableroles.models.database.AssignableRolePlace;
|
||||
import dev.sheldan.abstracto.core.models.database.AServer;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
import org.springframework.data.jpa.repository.QueryHints;
|
||||
import org.springframework.lang.NonNull;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
import javax.persistence.QueryHint;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
|
||||
@Repository
|
||||
public interface AssignableRolePlaceRepository extends JpaRepository<AssignableRolePlace, Long> {
|
||||
|
||||
@QueryHints(@QueryHint(name = org.hibernate.annotations.QueryHints.CACHEABLE, value = "true"))
|
||||
boolean existsByServerAndKey(AServer server, String key);
|
||||
|
||||
@QueryHints(@QueryHint(name = org.hibernate.annotations.QueryHints.CACHEABLE, value = "true"))
|
||||
Optional<AssignableRolePlace> findByServerAndKey(AServer server, String key);
|
||||
|
||||
@QueryHints(@QueryHint(name = org.hibernate.annotations.QueryHints.CACHEABLE, value = "true"))
|
||||
List<AssignableRolePlace> findByServer(AServer server);
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
@QueryHints(@QueryHint(name = org.hibernate.annotations.QueryHints.CACHEABLE, value = "true"))
|
||||
Optional<AssignableRolePlace> findById(@NonNull Long aLong);
|
||||
}
|
||||
|
||||
@@ -1,9 +1,19 @@
|
||||
package dev.sheldan.abstracto.assignableroles.repository;
|
||||
|
||||
import dev.sheldan.abstracto.assignableroles.models.database.AssignableRole;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
import org.springframework.data.jpa.repository.QueryHints;
|
||||
import org.springframework.lang.NonNull;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
import javax.persistence.QueryHint;
|
||||
import java.util.Optional;
|
||||
|
||||
@Repository
|
||||
public interface AssignableRoleRepository extends JpaRepository<AssignableRole, Long> {
|
||||
@NotNull
|
||||
@Override
|
||||
@QueryHints(@QueryHint(name = org.hibernate.annotations.QueryHints.CACHEABLE, value = "true"))
|
||||
Optional<AssignableRole> findById(@NonNull Long aLong);
|
||||
}
|
||||
|
||||
@@ -1,9 +1,23 @@
|
||||
package dev.sheldan.abstracto.assignableroles.repository;
|
||||
|
||||
import dev.sheldan.abstracto.assignableroles.models.database.AssignedRoleUser;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
import org.springframework.data.jpa.repository.QueryHints;
|
||||
import org.springframework.lang.NonNull;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
import javax.persistence.QueryHint;
|
||||
import java.util.Optional;
|
||||
|
||||
@Repository
|
||||
public interface AssignedRoleUserRepository extends JpaRepository<AssignedRoleUser, Long> {
|
||||
@NotNull
|
||||
@Override
|
||||
@QueryHints(@QueryHint(name = org.hibernate.annotations.QueryHints.CACHEABLE, value = "true"))
|
||||
Optional<AssignedRoleUser> findById(@NonNull Long aLong);
|
||||
|
||||
@Override
|
||||
@QueryHints(@QueryHint(name = org.hibernate.annotations.QueryHints.CACHEABLE, value = "true"))
|
||||
boolean existsById(@NonNull Long aLong);
|
||||
}
|
||||
|
||||
@@ -150,12 +150,8 @@ public class AssignableRolePlaceServiceBean implements AssignableRolePlaceServic
|
||||
emoteUsable = emoteService.isEmoteUsableByBot(fakeEmote.getEmote()) && fakeEmote.getEmote().isAvailable();
|
||||
}
|
||||
if(emoteUsable) {
|
||||
AEmote createdEmote = emoteManagementService.createEmote(null, fakeEmote.getFakeEmote(), server.getId(), false);
|
||||
Integer emoteId = createdEmote.getId();
|
||||
|
||||
List<AssignableRolePlacePost> existingMessagePosts = assignableRolePlace.getMessagePosts();
|
||||
existingMessagePosts.sort(Comparator.comparingLong(AssignableRolePlacePost::getId));
|
||||
createdEmote.setChangeable(false);
|
||||
|
||||
if(!assignableRolePlace.getMessagePosts().isEmpty()){
|
||||
AssignableRolePlacePost latestPost = existingMessagePosts.get(assignableRolePlace.getMessagePosts().size() - 1);
|
||||
@@ -173,16 +169,16 @@ public class AssignableRolePlaceServiceBean implements AssignableRolePlaceServic
|
||||
if(channelOptional.isPresent()) {
|
||||
TextChannel textChannel = channelOptional.get();
|
||||
if(latestPost.getAssignableRoles().size() < 20) {
|
||||
return addReactionToExistingAssignableRolePlacePost(fakeEmote, description, assignableRolePlace, placeId, roleId, serverId, emoteId, latestPost, messageToSend, textChannel);
|
||||
return addReactionToExistingAssignableRolePlacePost(fakeEmote, description, assignableRolePlace, placeId, roleId, serverId, latestPost, messageToSend, textChannel, fakeEmote);
|
||||
} else {
|
||||
return addNewMessageToAssignableRolePlace(placeName, fakeEmote, description, roleId, serverId, emoteId, messageToSend, textChannel);
|
||||
return addNewMessageToAssignableRolePlace(placeName, fakeEmote, description, roleId, serverId, messageToSend, textChannel, fakeEmote);
|
||||
}
|
||||
} else {
|
||||
throw new ChannelNotFoundException(latestPost.getUsedChannel().getId());
|
||||
}
|
||||
} else {
|
||||
log.info("Added emote to assignable place {} in server {}, but no message post yet.", placeName, serverId);
|
||||
self.addAssignableRoleInstanceWithoutPost(placeId, roleId, emoteId, description);
|
||||
self.addAssignableRoleInstanceWithoutPost(placeId, roleId, fakeEmote, description);
|
||||
}
|
||||
} else {
|
||||
throw new EmoteNotUsableException(fakeEmote.getEmote());
|
||||
@@ -190,7 +186,8 @@ public class AssignableRolePlaceServiceBean implements AssignableRolePlaceServic
|
||||
return CompletableFuture.completedFuture(null);
|
||||
}
|
||||
|
||||
private CompletableFuture<Void> addReactionToExistingAssignableRolePlacePost(FullEmote fakeEmote, String description, AssignableRolePlace assignableRolePlace, Long placeId, Long roleId, Long serverId, Integer emoteId, AssignableRolePlacePost latestPost, MessageToSend messageToSend, TextChannel textChannel) {
|
||||
private CompletableFuture<Void> addReactionToExistingAssignableRolePlacePost(FullEmote fakeEmote, String description, AssignableRolePlace assignableRolePlace, Long placeId, Long roleId, Long serverId, AssignableRolePlacePost latestPost, MessageToSend messageToSend, TextChannel textChannel, FullEmote emote) {
|
||||
// TODO maybe refactor to use the same message object, so we dont need to retrieve it twice and do in parallel
|
||||
return textChannel.retrieveMessageById(latestPost.getId()).submit()
|
||||
.thenCompose(message -> messageService.addReactionToMessageWithFuture(fakeEmote.getFakeEmote(), serverId, message))
|
||||
.thenCompose(aVoid -> {
|
||||
@@ -198,26 +195,27 @@ public class AssignableRolePlaceServiceBean implements AssignableRolePlaceServic
|
||||
return channelService.editEmbedMessageInAChannel(embedToUse, textChannel, latestPost.getId());
|
||||
})
|
||||
.thenCompose(message -> {
|
||||
self.addAssignableRoleInstanceWithPost(message.getIdLong(), placeId, roleId, emoteId, description);
|
||||
self.addAssignableRoleInstanceWithPost(message.getIdLong(), placeId, roleId, description, emote);
|
||||
return CompletableFuture.completedFuture(null);
|
||||
});
|
||||
}
|
||||
|
||||
private CompletableFuture<Void> addNewMessageToAssignableRolePlace(String placeName, FullEmote fakeEmote, String description, Long roleId, Long serverId, Integer emoteId, MessageToSend messageToSend, TextChannel textChannel) {
|
||||
private CompletableFuture<Void> addNewMessageToAssignableRolePlace(String placeName, FullEmote fakeEmote, String description, Long roleId, Long serverId, MessageToSend messageToSend, TextChannel textChannel, FullEmote emote) {
|
||||
MessageEmbed embedToUse = messageToSend.getEmbeds().get(messageToSend.getEmbeds().size() - 1);
|
||||
return channelService.sendEmbedToChannel(embedToUse, textChannel)
|
||||
.thenCompose(message -> messageService.addReactionToMessageWithFuture(fakeEmote.getFakeEmote(), serverId, message).thenAccept(aVoid ->
|
||||
self.addNewlyCreatedAssignablePlacePost(placeName, description, roleId, serverId, emoteId, textChannel, message)
|
||||
self.addNewlyCreatedAssignablePlacePost(placeName, description, roleId, serverId, textChannel, message, emote)
|
||||
));
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public void addNewlyCreatedAssignablePlacePost(String placeName, String description,Long roleId, Long serverId, Integer emoteId, TextChannel textChannel, Message message) {
|
||||
public void addNewlyCreatedAssignablePlacePost(String placeName, String description,Long roleId, Long serverId, TextChannel textChannel, Message message, FullEmote fakeEmote) {
|
||||
AChannel loadedChannel = channelManagementService.loadChannel(textChannel.getIdLong());
|
||||
AServer loadedServer = serverManagementService.loadOrCreate(serverId);
|
||||
ARole role = roleManagementService.findRole(roleId);
|
||||
AEmote emote = emoteManagementService.loadEmote(emoteId);
|
||||
AssignableRolePlace loadedPlace = rolePlaceManagementService.findByServerAndKey(loadedServer, placeName);
|
||||
AEmote emote = emoteManagementService.createEmote(null, fakeEmote.getFakeEmote(), serverId, false);
|
||||
emote.setChangeable(false);
|
||||
|
||||
AssignableRolePlacePost newPost = AssignableRolePlacePost
|
||||
.builder()
|
||||
@@ -231,13 +229,17 @@ public class AssignableRolePlaceServiceBean implements AssignableRolePlaceServic
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public void addAssignableRoleInstanceWithPost(Long messageId, Long placeId, Long roleId, Integer emoteId, String description) {
|
||||
assignableRoleManagementServiceBean.addRoleToPlace(placeId, emoteId, roleId, description, messageId);
|
||||
public void addAssignableRoleInstanceWithPost(Long messageId, Long placeId, Long roleId, String description, FullEmote fakeEmote) {
|
||||
AEmote emote = emoteManagementService.createEmote(null, fakeEmote.getFakeEmote(), fakeEmote.getEmote().getGuild().getIdLong(), false);
|
||||
emote.setChangeable(false);
|
||||
assignableRoleManagementServiceBean.addRoleToPlace(placeId, emote.getId(), roleId, description, messageId);
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public void addAssignableRoleInstanceWithoutPost(Long placeId, Long roleId, Integer emoteId, String description) {
|
||||
assignableRoleManagementServiceBean.addRoleToPlace(placeId, emoteId, roleId, description);
|
||||
public void addAssignableRoleInstanceWithoutPost(Long placeId, Long roleId, FullEmote fakeEmote, String description) {
|
||||
AEmote emote = emoteManagementService.createEmote(null, fakeEmote.getFakeEmote(), fakeEmote.getEmote().getGuild().getIdLong(), false);
|
||||
emote.setChangeable(false);
|
||||
assignableRoleManagementServiceBean.addRoleToPlace(placeId, emote.getId(), roleId, description);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
package dev.sheldan.abstracto.assignableroles.service;
|
||||
|
||||
import dev.sheldan.abstracto.assignableroles.models.database.AssignableRole;
|
||||
import dev.sheldan.abstracto.assignableroles.models.database.AssignableRolePlace;
|
||||
import dev.sheldan.abstracto.assignableroles.models.database.AssignedRoleUser;
|
||||
import dev.sheldan.abstracto.assignableroles.service.management.AssignableRoleManagementServiceBean;
|
||||
import dev.sheldan.abstracto.assignableroles.service.management.AssignedRoleUserManagementService;
|
||||
import dev.sheldan.abstracto.assignableroles.service.management.AssignedRoleUserManagementServiceBean;
|
||||
@@ -38,30 +40,71 @@ public class AssignableRoleServiceBean implements AssignableRoleService {
|
||||
@Override
|
||||
public CompletableFuture<Void> assignAssignableRoleToUser(Long assignableRoleId, Member toAdd) {
|
||||
AssignableRole role = assignableRoleManagementServiceBean.getByAssignableRoleId(assignableRoleId);
|
||||
return roleService.addRoleToMemberFuture(toAdd, role.getRole()).thenApply(aVoid -> {
|
||||
self.persistRoleAssignment(assignableRoleId, toAdd);
|
||||
return null;
|
||||
return roleService.addRoleToMemberFuture(toAdd, role.getRole());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void clearAllRolesOfUserInPlace(AssignableRolePlace place, AUserInAServer userInAServer) {
|
||||
AssignedRoleUser user = assignedRoleUserManagementServiceBean.findByUserInServer(userInAServer);
|
||||
user.getRoles().forEach(assignableRole -> {
|
||||
if(assignableRole.getAssignablePlace().equals(place)) {
|
||||
assignableRole.getAssignedUsers().remove(user);
|
||||
}
|
||||
});
|
||||
user.getRoles().removeIf(assignableRole -> assignableRole.getAssignablePlace().equals(place));
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> fullyAssignAssignableRoleToUser(Long assignableRoleId, Member toAdd) {
|
||||
return this.assignAssignableRoleToUser(assignableRoleId, toAdd).thenAccept(aVoid ->
|
||||
self.addRoleToUser(assignableRoleId, toAdd)
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> removeAssignableRoleFromUser(AssignableRole assignableRole, Member member) {
|
||||
return roleService.removeRoleFromMemberFuture(member, assignableRole.getRole());
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> fullyRemoveAssignableRoleFromUser(AssignableRole assignableRole, Member member) {
|
||||
Long assignableRoleId = assignableRole.getId();
|
||||
return roleService.removeRoleFromMemberFuture(member, assignableRole.getRole()).thenApply(aVoid -> {
|
||||
self.persistRoleRemoval(assignableRoleId, member);
|
||||
return null;
|
||||
});
|
||||
return this.removeAssignableRoleFromUser(assignableRole, member).thenAccept(aVoid ->
|
||||
self.removeRoleFromUser(assignableRoleId, member)
|
||||
);
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public void persistRoleAssignment(Long assignableRoleId, Member member) {
|
||||
public void addRoleToUser(Long assignableRoleId, AUserInAServer aUserInAServer) {
|
||||
AssignableRole role = assignableRoleManagementServiceBean.getByAssignableRoleId(assignableRoleId);
|
||||
addRoleToUser(role, aUserInAServer);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addRoleToUser(AssignableRole assignableRole, AUserInAServer aUserInAServer) {
|
||||
assignedRoleUserManagementServiceBean.addAssignedRoleToUser(assignableRole, aUserInAServer);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeRoleFromUser(AssignableRole assignableRole, AUserInAServer aUserInAServer) {
|
||||
assignedRoleUserManagementServiceBean.removeAssignedRoleFromUser(assignableRole, aUserInAServer);
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public void addRoleToUser(Long assignableRoleId, Member member) {
|
||||
AssignableRole role = assignableRoleManagementServiceBean.getByAssignableRoleId(assignableRoleId);
|
||||
AUserInAServer aUserInAServer = userInServerManagementService.loadUser(member);
|
||||
assignedRoleUserManagementServiceBean.addAssignedRoleToUser(role, aUserInAServer);
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public void persistRoleRemoval(Long assignableRoleId, Member member) {
|
||||
public void removeRoleFromUser(Long assignableRoleId, AUserInAServer aUserInAServer) {
|
||||
AssignableRole role = assignableRoleManagementServiceBean.getByAssignableRoleId(assignableRoleId);
|
||||
removeRoleFromUser(role, aUserInAServer);
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public void removeRoleFromUser(Long assignableRoleId, Member member) {
|
||||
AssignableRole role = assignableRoleManagementServiceBean.getByAssignableRoleId(assignableRoleId);
|
||||
AUserInAServer aUserInAServer = userInServerManagementService.loadUser(member);
|
||||
assignedRoleUserManagementServiceBean.removeAssignedRoleFromUser(role, aUserInAServer);
|
||||
|
||||
@@ -8,8 +8,10 @@ import dev.sheldan.abstracto.assignableroles.repository.AssignableRoleRepository
|
||||
import dev.sheldan.abstracto.core.exception.AbstractoRunTimeException;
|
||||
import dev.sheldan.abstracto.core.models.database.AEmote;
|
||||
import dev.sheldan.abstracto.core.models.database.ARole;
|
||||
import dev.sheldan.abstracto.core.service.EmoteService;
|
||||
import dev.sheldan.abstracto.core.service.management.EmoteManagementService;
|
||||
import dev.sheldan.abstracto.core.service.management.RoleManagementService;
|
||||
import net.dv8tion.jda.api.entities.MessageReaction;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
@@ -31,6 +33,9 @@ public class AssignableRoleManagementServiceBean implements AssignableRoleManage
|
||||
@Autowired
|
||||
private AssignableRoleRepository repository;
|
||||
|
||||
@Autowired
|
||||
private EmoteService emoteService;
|
||||
|
||||
@Override
|
||||
public AssignableRole addRoleToPlace(AssignableRolePlace place, AEmote emote, ARole role, String description, AssignableRolePlacePost post) {
|
||||
Integer maxPosition = place.getAssignableRoles().stream().map(AssignableRole::getPosition).max(Integer::compareTo).orElse(0);
|
||||
@@ -53,7 +58,7 @@ public class AssignableRoleManagementServiceBean implements AssignableRoleManage
|
||||
|
||||
@Override
|
||||
public AssignableRole addRoleToPlace(Long placeId, Integer emoteId, Long roleId, String description, Long messageId) {
|
||||
AssignableRolePlace place = rolePlaceManagementService.findByPlaceId(placeId).orElseThrow(() -> new AssignableRolePlaceNotFoundException(placeId));
|
||||
AssignableRolePlace place = rolePlaceManagementService.findByPlaceIdOptional(placeId).orElseThrow(() -> new AssignableRolePlaceNotFoundException(placeId));
|
||||
AEmote emote = emoteManagementService.loadEmote(emoteId);
|
||||
ARole role = roleManagementService.findRole(roleId);
|
||||
AssignableRolePlacePost post = postManagementService.findByMessageId(messageId);
|
||||
@@ -64,7 +69,7 @@ public class AssignableRoleManagementServiceBean implements AssignableRoleManage
|
||||
|
||||
@Override
|
||||
public AssignableRole addRoleToPlace(Long placeId, Integer emoteId, Long roleId, String description) {
|
||||
AssignableRolePlace place = rolePlaceManagementService.findByPlaceId(placeId).orElseThrow(() -> new AssignableRolePlaceNotFoundException(placeId));
|
||||
AssignableRolePlace place = rolePlaceManagementService.findByPlaceIdOptional(placeId).orElseThrow(() -> new AssignableRolePlaceNotFoundException(placeId));
|
||||
AEmote emote = emoteManagementService.loadEmote(emoteId);
|
||||
ARole role = roleManagementService.findRole(roleId);
|
||||
return addRoleToPlace(place, emote, role, description, null);
|
||||
@@ -74,4 +79,16 @@ public class AssignableRoleManagementServiceBean implements AssignableRoleManage
|
||||
public AssignableRole getByAssignableRoleId(Long assignableRoleId) {
|
||||
return repository.findById(assignableRoleId).orElseThrow(() -> new AbstractoRunTimeException("Assignable role not found"));
|
||||
}
|
||||
|
||||
@Override
|
||||
public AssignableRole getRoleForReactionEmote(MessageReaction.ReactionEmote emote, AssignableRolePlace assignableRolePlace) {
|
||||
for (AssignableRolePlacePost post : assignableRolePlace.getMessagePosts()) {
|
||||
for (AssignableRole assignableRole : post.getAssignableRoles()) {
|
||||
if (emoteService.isReactionEmoteAEmote(emote, assignableRole.getEmote())) {
|
||||
return assignableRole;
|
||||
}
|
||||
}
|
||||
}
|
||||
throw new AbstractoRunTimeException("Role for reaction was not found.");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -42,10 +42,15 @@ public class AssignableRolePlaceManagementServiceBean implements AssignableRoleP
|
||||
}
|
||||
|
||||
@Override
|
||||
public Optional<AssignableRolePlace> findByPlaceId(Long id) {
|
||||
public Optional<AssignableRolePlace> findByPlaceIdOptional(Long id) {
|
||||
return repository.findById(id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AssignableRolePlace findByPlaceId(Long id) {
|
||||
return findByPlaceIdOptional(id).orElseThrow(() -> new AssignableRolePlaceNotFoundException(id));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void moveAssignableRolePlace(AServer server, String name, AChannel newChannel) {
|
||||
AssignableRolePlace assignablePlaceToChange = findByServerAndKey(server, name);
|
||||
|
||||
@@ -37,6 +37,15 @@ public class AssignedRoleUserManagementServiceBean implements AssignedRoleUserMa
|
||||
return repository.save(newUser);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void clearAllAssignedRolesOfUser(AUserInAServer userInAServer) {
|
||||
AssignedRoleUser user = findByUserInServer(userInAServer);
|
||||
user.getRoles().forEach(assignableRole ->
|
||||
assignableRole.getAssignedUsers().remove(user)
|
||||
);
|
||||
user.getRoles().clear();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean doesAssignedRoleUserExist(AUserInAServer aUserInAServer) {
|
||||
return repository.existsById(aUserInAServer.getUserInServerId());
|
||||
|
||||
Reference in New Issue
Block a user