[AB-192] removing second level cache

changing assignable role place module name
fixing starboard retrieving the starstats incorrectly
fixing removing user assigned roles when removing a role from assignable role place
fixing not being able to remove external emote for assignable role place
This commit is contained in:
Sheldan
2021-02-13 14:48:56 +01:00
parent 047c574319
commit 34b9bca7ac
114 changed files with 88 additions and 460 deletions

View File

@@ -6,7 +6,7 @@ import org.springframework.stereotype.Component;
@Component
public class AssignableRoleModule implements ModuleInterface {
public static final String ASSIGNABLE_ROLES = "assignableRoles";
public static final String ASSIGNABLE_ROLES = "assignableRole";
@Override
public ModuleInfo getInfo() {

View File

@@ -19,6 +19,7 @@ import dev.sheldan.abstracto.core.models.cache.CachedReaction;
import dev.sheldan.abstracto.core.models.cache.CachedReactions;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import dev.sheldan.abstracto.core.service.EmoteService;
import dev.sheldan.abstracto.core.service.MemberService;
import dev.sheldan.abstracto.core.service.ReactionService;
import dev.sheldan.abstracto.core.service.management.UserInServerManagementService;
import lombok.extern.slf4j.Slf4j;
@@ -65,6 +66,9 @@ public class AssignablePostReactionAdded implements AsyncReactionAddedListener {
@Autowired
private ReactionService reactionService;
@Autowired
private MemberService memberService;
@Override
public void executeReactionAdded(CachedMessage message, CachedReactions cachedReaction, ServerUser serverUser) {
Optional<AssignableRolePlacePost> messageOptional = service.findByMessageIdOptional(message.getMessageId());
@@ -113,12 +117,15 @@ public class AssignablePostReactionAdded implements AsyncReactionAddedListener {
}
if(!validReaction) {
log.trace("Reaction was not found in the configuration of assignable role place {}, removing reaction.", assignableRolePlace.getId());
futures.add(reactionService.removeReactionFromMessage(cachedReaction, message));
futures.add(reactionService.removeReaction(message, cachedReaction.getEmote(), serverUser));
}
Long assignableRolePlaceId = assignableRolePlace.getId();
CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).thenAccept(aVoid ->
self.updateStoredAssignableRoles(assignableRolePlaceId, serverUser, cachedReaction)
);
).exceptionally(throwable -> {
log.error("Failed to add role or remove emote for assignable role place {}.", assignableRolePlaceId, throwable);
return null;
});
}
@Transactional

View File

@@ -3,17 +3,14 @@ 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);
}

View File

@@ -4,28 +4,22 @@ 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);
}

View File

@@ -3,17 +3,14 @@ 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);
}

View File

@@ -3,21 +3,17 @@ 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);
}

View File

@@ -9,10 +9,7 @@ import dev.sheldan.abstracto.assignableroles.models.database.AssignableRolePlace
import dev.sheldan.abstracto.assignableroles.models.database.AssignableRolePlacePost;
import dev.sheldan.abstracto.assignableroles.models.database.AssignedRoleUser;
import dev.sheldan.abstracto.assignableroles.models.templates.*;
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.AssignableRolePlacePostManagementServiceBean;
import dev.sheldan.abstracto.assignableroles.service.management.*;
import dev.sheldan.abstracto.core.command.exception.AbstractoTemplatedException;
import dev.sheldan.abstracto.core.command.exception.CommandParameterKeyValueWrongTypeException;
import dev.sheldan.abstracto.core.exception.ChannelNotInGuildException;
@@ -124,11 +121,10 @@ public class AssignableRolePlaceServiceBean implements AssignableRolePlaceServic
if(!hasAssignableRolePlaceEmote(server, placeName, emote.getFakeEmote())) {
throw new AbstractoTemplatedException("Place does not have emote assigned.", "assignable_role_place_position_exists_exception");
}
Integer emoteId = emote.getFakeEmote().getId();
AssignableRolePlace assignableRolePlace = rolePlaceManagementService.findByServerAndKey(server, placeName);
log.info("Setting emote {} to position {} in assignable role place {} in server {}.",
emoteId, position, assignableRolePlace.getId(), assignableRolePlace.getServer().getId());
Optional<AssignableRole> emoteOptional = assignableRolePlace.getAssignableRoles().stream().filter(role -> role.getEmote().getId().equals(emoteId)).findFirst();
log.info("Setting emote to position {} in assignable role place {} in server {}.",
position, assignableRolePlace.getId(), assignableRolePlace.getServer().getId());
Optional<AssignableRole> emoteOptional = assignableRolePlace.getAssignableRoles().stream().filter(role -> emoteService.compareAEmote(emote.getFakeEmote(), role.getEmote())).findFirst();
if(emoteOptional.isPresent()) {
AssignableRole toChange = emoteOptional.get();
toChange.setPosition(position);
@@ -290,6 +286,8 @@ public class AssignableRolePlaceServiceBean implements AssignableRolePlaceServic
Optional<AssignableRole> roleToRemoveOptional = assignableRolePlace.getAssignableRoles().stream().filter(role -> role.getId().equals(assignableRoleId)).findAny();
roleToRemoveOptional.ifPresent(assignableRole -> {
assignableRolePlace.getAssignableRoles().remove(assignableRole);
assignableRole.getAssignedUsers().forEach(assignedRoleUser -> assignedRoleUser.getRoles().remove(assignableRole));
assignableRole.getAssignedUsers().clear();
assignableRole.setAssignablePlace(null);
});
}
@@ -319,6 +317,7 @@ public class AssignableRolePlaceServiceBean implements AssignableRolePlaceServic
AssignableRolePlace assignableRolePlace = rolePlaceManagementService.findByServerAndKey(server, name);
log.info("Setting up assignable role place {} in server {} towards channel {}.", assignableRolePlace.getId(), server.getId(), assignableRolePlace.getChannel().getId());
List<CompletableFuture<Void>> oldPostDeletionFutures = deleteExistingMessagePostsForPlace(assignableRolePlace);
assignableRolePlace.getMessagePosts().forEach(assignableRolePlacePost -> assignableRolePlacePost.setAssignablePlace(null));
assignableRolePlace.getMessagePosts().clear();
assignableRolePlace.getAssignableRoles().forEach(assignableRole ->
assignableRole.setAssignableRolePlacePost(null)
@@ -765,7 +764,11 @@ public class AssignableRolePlaceServiceBean implements AssignableRolePlaceServic
reactionFutures.add(firstMessageFuture);
}
return CompletableFuture.allOf(reactionFutures.toArray(new CompletableFuture[0])).thenCompose(aVoid -> {
self.storeCreatedAssignableRolePlacePosts(assignablePlaceId, serverId, assignablePlacePostsMessageFutures);
try {
self.storeCreatedAssignableRolePlacePosts(assignablePlaceId, serverId, assignablePlacePostsMessageFutures);
} catch (Exception e) {
log.error("Failed to persist assignable role place posts. ", e);
}
return CompletableFuture.completedFuture(null);
});
}
@@ -778,21 +781,16 @@ public class AssignableRolePlaceServiceBean implements AssignableRolePlaceServic
int usedEmotes = 0;
for (int i = 0; i < futures.size(); i++) {
CompletableFuture<Message> messageCompletableFuture = futures.get(i);
try {
Message message = messageCompletableFuture.get();
Message sentMessage = messageCompletableFuture.get();
// this uses the actual embed count as a limit, so this relies on fields to be used for description, if this changes, this needs to be changed
MessageEmbed embed = sentMessage.getEmbeds().get(0);
log.trace("Storing post {} with {} fields.", message.getId(), embed.getFields().size());
List<AssignableRole> firstRoles = rolesToAdd.subList(usedEmotes, usedEmotes + embed.getFields().size());
usedEmotes += embed.getFields().size();
AssignableRolePlacePost post = assignableRolePlacePostManagementServiceBean.createAssignableRolePlacePost(updatedPlace, message.getIdLong());
firstRoles.forEach(assignableRole ->
assignableRole.setAssignableRolePlacePost(post)
);
} catch (Exception e) {
log.error("Failed to get future.", e);
}
Message message = messageCompletableFuture.join();
// this uses the actual embed count as a limit, so this relies on fields to be used for description, if this changes, this needs to be changed
MessageEmbed embed = message.getEmbeds().get(0);
log.trace("Storing post {} with {} fields.", message.getId(), embed.getFields().size());
List<AssignableRole> firstRoles = rolesToAdd.subList(usedEmotes, usedEmotes + embed.getFields().size());
usedEmotes += embed.getFields().size();
AssignableRolePlacePost post = assignableRolePlacePostManagementServiceBean.createAssignableRolePlacePost(updatedPlace, message.getIdLong());
firstRoles.forEach(assignableRole ->
assignableRole.setAssignableRolePlacePost(post)
);
}
}

View File

@@ -34,7 +34,7 @@ public class AssignableRolePlacePostManagementServiceBean implements AssignableR
.server(updatedPlace.getServer())
.assignablePlace(updatedPlace)
.build();
repository.save(post);
updatedPlace.getMessagePosts().add(post);
return post;
}

View File

@@ -40,6 +40,10 @@ public class AssignedRoleUserManagementServiceBean implements AssignedRoleUserMa
assignableRole.getId(), aUserInAServer.getUserReference().getId(), aUserInAServer.getServerReference().getId(),
assignableRole.getAssignablePlace().getId());
AssignedRoleUser user = findByUserInServer(aUserInAServer);
removeAssignedRoleFromUser(assignableRole, user);
}
public void removeAssignedRoleFromUser(AssignableRole assignableRole, AssignedRoleUser user) {
assignableRole.getAssignedUsers().remove(user);
user.getRoles().remove(assignableRole);
}

View File

@@ -4,7 +4,6 @@ import dev.sheldan.abstracto.core.models.database.AEmote;
import dev.sheldan.abstracto.core.models.database.ARole;
import dev.sheldan.abstracto.core.models.database.AServer;
import lombok.*;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import javax.persistence.*;
import java.io.Serializable;
@@ -20,8 +19,6 @@ import java.util.List;
@Getter
@Setter
@EqualsAndHashCode
@Cacheable
@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class AssignableRole implements Serializable {
@Id
@@ -50,7 +47,6 @@ public class AssignableRole implements Serializable {
@ManyToMany(mappedBy = "roles")
@Builder.Default
@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
private List<AssignedRoleUser> assignedUsers = new ArrayList<>();
@Column(name = "description")

View File

@@ -3,7 +3,6 @@ package dev.sheldan.abstracto.assignableroles.models.database;
import dev.sheldan.abstracto.core.models.database.AChannel;
import dev.sheldan.abstracto.core.models.database.AServer;
import lombok.*;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import javax.persistence.*;
import java.io.Serializable;
@@ -19,8 +18,6 @@ import java.util.List;
@Getter
@Setter
@EqualsAndHashCode
@Cacheable
@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class AssignableRolePlace implements Serializable {
public static final Long ASSIGNABLE_PLACE_NAME_LIMIT = 255L;
@@ -49,7 +46,6 @@ public class AssignableRolePlace implements Serializable {
mappedBy = "assignablePlace"
)
@Builder.Default
@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
private List<AssignableRolePlacePost> messagePosts = new ArrayList<>();
@OneToMany(
@@ -59,7 +55,6 @@ public class AssignableRolePlace implements Serializable {
mappedBy = "assignablePlace"
)
@Builder.Default
@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
private List<AssignableRole> assignableRoles = new ArrayList<>();
@Column(name = "text")

View File

@@ -3,7 +3,6 @@ package dev.sheldan.abstracto.assignableroles.models.database;
import dev.sheldan.abstracto.core.models.database.AChannel;
import dev.sheldan.abstracto.core.models.database.AServer;
import lombok.*;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import javax.persistence.*;
import java.io.Serializable;
@@ -19,8 +18,6 @@ import java.util.List;
@Getter
@Setter
@EqualsAndHashCode
@Cacheable
@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class AssignableRolePlacePost implements Serializable {
@Id
@@ -50,7 +47,6 @@ public class AssignableRolePlacePost implements Serializable {
cascade = {CascadeType.PERSIST, CascadeType.MERGE},
mappedBy = "assignableRolePlacePost")
@Builder.Default
@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
private List<AssignableRole> assignableRoles = new ArrayList<>();
}

View File

@@ -2,7 +2,6 @@ package dev.sheldan.abstracto.assignableroles.models.database;
import dev.sheldan.abstracto.core.models.database.AUserInAServer;
import lombok.*;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import javax.persistence.*;
import java.io.Serializable;
@@ -18,8 +17,6 @@ import java.util.List;
@Getter
@Setter
@EqualsAndHashCode
@Cacheable
@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class AssignedRoleUser implements Serializable {
@Id
@@ -35,7 +32,6 @@ public class AssignedRoleUser implements Serializable {
name = "assigned_role_in_user",
joinColumns = @JoinColumn(name = "user_in_server_id"),
inverseJoinColumns = @JoinColumn(name = "assigned_role_id"))
@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
@Builder.Default
private List<AssignableRole> roles = new ArrayList<>();

View File

@@ -10,6 +10,7 @@ import java.util.Optional;
public interface AssignedRoleUserManagementService {
void addAssignedRoleToUser(AssignableRole assignableRole, AUserInAServer aUserInAServer);
void removeAssignedRoleFromUser(AssignableRole assignableRole, AUserInAServer aUserInAServer);
void removeAssignedRoleFromUser(AssignableRole assignableRole, AssignedRoleUser user);
AssignedRoleUser createAssignedRoleUser(AUserInAServer aUserInAServer);
void clearAllAssignedRolesOfUser(AUserInAServer userInAServer);
boolean doesAssignedRoleUserExist(AUserInAServer aUserInAServer);