diff --git a/src/main/java/me/bobert/netneutrality/command/admin/BlacklistCommand.java b/src/main/java/me/bobert/netneutrality/command/admin/BlacklistCommand.java index 3d57907..b457e7b 100644 --- a/src/main/java/me/bobert/netneutrality/command/admin/BlacklistCommand.java +++ b/src/main/java/me/bobert/netneutrality/command/admin/BlacklistCommand.java @@ -66,12 +66,7 @@ public class BlacklistCommand extends AbstractAdminCommand { switch (sub) { case "get" -> context.async("Retrieving list, please wait...", asyncMessage -> { - List blacklists = new ArrayList<>(); - try { - blacklists = repository.getBlacklistForGuild(context.getGuild()); - } catch (Exception e) { - LogHandler.log(e); - } + List blacklists = repository.getBlacklistForGuild(context.getGuild()); StringBuilder sb = new StringBuilder(); sb.append("List of blacklisted words for this server [").append(context.getGuild().getName()).append("]: \n"); @@ -91,12 +86,6 @@ public class BlacklistCommand extends AbstractAdminCommand { case "remove" -> { return repository.delete(context.getGuild(), word); } - case "disable" -> { - return repository.disable(context.getGuild(), word); - } - case "enable" -> { - return repository.enable(context.getGuild(), word); - } } return CommandExecutionResult.none(); diff --git a/src/main/java/me/bobert/netneutrality/core/GuildConfigManager.java b/src/main/java/me/bobert/netneutrality/core/GuildConfigManager.java index 22efa10..67a4730 100644 --- a/src/main/java/me/bobert/netneutrality/core/GuildConfigManager.java +++ b/src/main/java/me/bobert/netneutrality/core/GuildConfigManager.java @@ -6,25 +6,24 @@ package me.bobert.netneutrality.core; * https://discord.gg/qUa6zNFZsd */ -import me.bobert.netneutrality.core.db.SessionManager; import me.bobert.netneutrality.db.GSettings; import me.bobert.netneutrality.db.entities.OGuild; import me.bobert.netneutrality.db.entities.OGuildSetting; -import me.bobert.netneutrality.utils.JpaUtils; +import me.bobert.netneutrality.db.repository.GuildSettingRepository; import net.dv8tion.jda.api.entities.Guild; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import org.hibernate.Session; import java.util.HashMap; +import java.util.List; import java.util.Map; -import java.util.Set; public class GuildConfigManager { private static final Logger logger = LogManager.getLogger(GuildConfigManager.class); private final Guild guild; private final OGuild guildEntity; + private final GuildSettingRepository guildSettingRepository = new GuildSettingRepository(); private final Map settingsCache = new HashMap<>(); @@ -50,33 +49,7 @@ public class GuildConfigManager { } public void setSettingValue(GSettings setting, String value) { - Session session = SessionManager.getSessionFactory().openSession(); - JpaUtils.tryLoad(session, guildEntity, guildEntity.getGuildId()); - - OGuildSetting oGuildSetting = guildEntity.getSettingByName(setting.getName()); - - session.beginTransaction(); - if (value == null || setting.getDefaultValue().equals(value)) { - if (oGuildSetting != null) { - session.remove(oGuildSetting); - } - } else { - if (oGuildSetting == null) { - oGuildSetting = new OGuildSetting(); - oGuildSetting.setGuild(guildEntity); - oGuildSetting.setName(setting.getName()); - oGuildSetting.setValue(value); - - session.persist(oGuildSetting); - } else { - oGuildSetting.setValue(value); - - session.merge(oGuildSetting); - } - } - - session.getTransaction().commit(); - session.close(); + guildSettingRepository.setSettingValue(guildEntity, setting, value); reloadSettingsCache(); } @@ -85,13 +58,10 @@ public class GuildConfigManager { logger.debug("Reloading settings cache for guild: {}", guild.getId()); settingsCache.clear(); - JpaUtils.getWithSession(guildEntity, session -> { - Set settingSet = guildEntity.getGuildSettings(); - - for (OGuildSetting setting : settingSet) { - settingsCache.put(setting.getName(), setting.getValue()); - } - }); + List settings = guildSettingRepository.findByGuild(guild.getId()); + for (OGuildSetting setting : settings) { + settingsCache.put(setting.getName(), setting.getValue()); + } } } diff --git a/src/main/java/me/bobert/netneutrality/core/GuildManager.java b/src/main/java/me/bobert/netneutrality/core/GuildManager.java index f575962..8ad8ab3 100644 --- a/src/main/java/me/bobert/netneutrality/core/GuildManager.java +++ b/src/main/java/me/bobert/netneutrality/core/GuildManager.java @@ -6,17 +6,15 @@ package me.bobert.netneutrality.core; */ import me.bobert.netneutrality.NetNeutrality; -import me.bobert.netneutrality.core.db.SessionManager; import me.bobert.netneutrality.db.entities.OBlacklist; import me.bobert.netneutrality.db.entities.OGuild; +import me.bobert.netneutrality.db.repository.GuildRepository; import me.bobert.netneutrality.utils.JpaUtils; import net.dv8tion.jda.api.entities.Guild; import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.Role; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import org.hibernate.Session; -import org.hibernate.SessionFactory; import java.util.HashSet; import java.util.Map; @@ -27,22 +25,17 @@ public class GuildManager { private static final Logger logger = LogManager.getLogger(GuildManager.class); private static final Map managers = new ConcurrentHashMap<>(); - private static final SessionFactory sessionFactory = SessionManager.getSessionFactory(); + private final GuildRepository guildRepository = new GuildRepository(); private final Set blacklistCache = new HashSet<>(); private final GuildConfigManager guildConfigManager; private final Guild guild; private OGuild guildEntity; - private GuildManager(String guildId) { - Guild temp = NetNeutrality.getJDA().getGuildById(guildId); - if (temp == null) - throw new IllegalArgumentException("Guild does not exist in current cache"); - - this.guild = temp; - this.guildEntity = loadGuildFromDb(guild.getId()); + private GuildManager(Guild guild) { + this.guild = guild; + loadGuildFromDb(guild.getId()); this.guildConfigManager = new GuildConfigManager(guild, this.guildEntity); - managers.put(guild.getId(), this); reloadBlacklistCache(); } @@ -53,9 +46,17 @@ public class GuildManager { public static GuildManager getManager(String guildId) { if (managers.containsKey(guildId)) { return managers.get(guildId); - } else { - return new GuildManager(guildId); } + + Guild temp = NetNeutrality.getJDA().getGuildById(guildId); + if (temp == null) { + throw new IllegalArgumentException("Guild does not exist in current cache"); + } + + GuildManager manager = new GuildManager(temp); + managers.put(guildId, manager); + + return manager; } // Getter @@ -107,7 +108,7 @@ public class GuildManager { logger.debug("Reloading blacklist cache for guild: {}", guild.getId()); blacklistCache.clear(); - JpaUtils.getWithSession(guildEntity, session -> { + JpaUtils.getWithSession(guildEntity, guildEntity.getGuildId(), session -> { Set oBlacklistSet = guildEntity.getBlacklists(); for (OBlacklist bl : oBlacklistSet) { @@ -118,41 +119,33 @@ public class GuildManager { }); } - private OGuild loadGuildFromDb(String guildId) { - Session session = sessionFactory.openSession(); - OGuild entity = session.get(OGuild.class, guildId); + private void loadGuildFromDb(String guildId) { + JpaUtils.runWithTransaction(session -> { + OGuild entity = guildRepository.findById(guildId); - if (entity == null) { - logger.debug("Guild[{}] doesn't exist in DB, creating entity..", guildId); - session.beginTransaction(); - entity = new OGuild(); + if (entity == null) { + logger.debug("Guild[{}] doesn't exist in DB, creating entity..", guildId); - entity.setGuildId(guildId); + entity = new OGuild(); + entity.setGuildId(guildId); + session.persist(entity); - session.persist(entity); - session.getTransaction().commit(); + guild.getTextChannels() + .stream() + .filter(textChannel -> textChannel.getName().equals("debug") || textChannel.getName().equals("log")) + .forEach(textChannel -> textChannel.sendMessage("Error logging enabled on channel " + textChannel.getAsMention()).queue()); + } - guild.getTextChannels() - .stream() - .filter(textChannel -> textChannel.getName().equals("debug") || textChannel.getName().equals("log")) - .forEach(textChannel -> textChannel.sendMessage("Error logging enabled on channel " + textChannel.getAsMention()).queue()); - } - - session.close(); - return entity; + guildEntity = entity; + }); } public void reloadEntity() { - this.guildEntity = loadGuildFromDb(guild.getId()); + loadGuildFromDb(guild.getId()); } public void removeFromDB() { - try(Session session = sessionFactory.openSession()) { - session.beginTransaction(); - - session.remove(guildEntity); - session.getTransaction().commit(); - } + guildRepository.deleteBy(guild.getId()); managers.remove(guild.getId()); } diff --git a/src/main/java/me/bobert/netneutrality/core/tasks/TaskManager.java b/src/main/java/me/bobert/netneutrality/core/tasks/TaskManager.java index 54de4a9..57c58b2 100644 --- a/src/main/java/me/bobert/netneutrality/core/tasks/TaskManager.java +++ b/src/main/java/me/bobert/netneutrality/core/tasks/TaskManager.java @@ -188,7 +188,7 @@ public class TaskManager { } TaskRepository taskRepository = new TaskRepository(); - OTask oTask = taskRepository.findByTaskId(task.getId()); + OTask oTask = taskRepository.findById(task.getId()); if (oTask == null) { oTask = new OTask(); } diff --git a/src/main/java/me/bobert/netneutrality/db/Repository.java b/src/main/java/me/bobert/netneutrality/db/Repository.java index cd9562c..09494a6 100644 --- a/src/main/java/me/bobert/netneutrality/db/Repository.java +++ b/src/main/java/me/bobert/netneutrality/db/Repository.java @@ -19,6 +19,8 @@ public interface Repository { List findAll(); + O findById(String id); + default void save(O entity) { Transaction transaction = null; diff --git a/src/main/java/me/bobert/netneutrality/db/repository/BlacklistRepository.java b/src/main/java/me/bobert/netneutrality/db/repository/BlacklistRepository.java index 5ffc645..a0fde0d 100644 --- a/src/main/java/me/bobert/netneutrality/db/repository/BlacklistRepository.java +++ b/src/main/java/me/bobert/netneutrality/db/repository/BlacklistRepository.java @@ -17,28 +17,32 @@ import net.dv8tion.jda.api.entities.Member; import org.hibernate.Session; import org.hibernate.query.Query; +import java.util.ArrayList; import java.util.List; public class BlacklistRepository implements Repository { @Override public List findAll() { - List blacklists; + List blacklists = new ArrayList<>(); - try(Session session = SessionManager.getSessionFactory().openSession()) { + JpaUtils.runWithSession(session -> { Query query = session.createQuery("FROM OBlacklist", OBlacklist.class); - blacklists = query.list(); - } + blacklists.addAll(query.list()); + }); return blacklists; } @Override - public void deleteBy(String id) { - try(Session session = SessionManager.getSessionFactory().openSession()) { - session.beginTransaction(); + public OBlacklist findById(String id) { + return null; + } + @Override + public void deleteBy(String id) { + JpaUtils.runWithTransaction(session -> { Query query = session.createQuery("SELECT o FROM OBlacklist o WHERE o.id = :blacklistId", OBlacklist.class); query.setParameter("blacklistId", id); @@ -46,18 +50,16 @@ public class BlacklistRepository implements Repository { if (oTask != null) { session.remove(oTask); } - - session.getTransaction().commit(); - } + }); } public CommandExecutionResult add(Guild guild, Member member, String word) { GuildManager guildManager = GuildManager.getManager(guild); - OBlacklist bl = getWordFromDb(word, guild.getId()); - if (bl == null) { - try(Session session = SessionManager.getSessionFactory().openSession()) { - session.beginTransaction(); + JpaUtils.runWithTransaction(session -> { + OBlacklist bl = getWordFromDb(word, guild.getId()); + + if (bl == null) { bl = new OBlacklist(); bl.setGuild(guildManager.getGuildEntity()); bl.setCreatorId(member.getId()); @@ -65,83 +67,37 @@ public class BlacklistRepository implements Repository { bl.setEnabled(true); session.persist(bl); - session.getTransaction().commit(); + } else { + bl.setEnabled(true); + session.merge(bl); } + }); - guildManager.reloadBlacklistCache(); - return CommandExecutionResult.success("Added the word [%s] to the blacklist.", word); - } - - return CommandExecutionResult.info("Word is already blacklisted"); + guildManager.reloadBlacklistCache(); + return CommandExecutionResult.success("Added the word [%s] to the blacklist.", word); } public CommandExecutionResult delete(Guild guild, String word) { GuildManager guildManager = GuildManager.getManager(guild); - OBlacklist bl = getWordFromDb(word, guild.getId()); - if (bl != null) { - try(Session session = SessionManager.getSessionFactory().openSession()) { - session.beginTransaction(); + JpaUtils.runWithTransaction(session -> { + OBlacklist bl = getWordFromDb(word, guild.getId()); + if (bl != null) { session.remove(bl); - session.getTransaction().commit(); } - guildManager.reloadBlacklistCache(); - return CommandExecutionResult.success("Removed the word [%s] to the blacklist.", word); - } + }); - return CommandExecutionResult.info("Word is not blacklisted"); - } - - public CommandExecutionResult enable(Guild guild, String word) { - GuildManager guildManager = GuildManager.getManager(guild); - - OBlacklist bl = getWordFromDb(word, guild.getId()); - if (bl != null && !bl.getEnabled()) { - try(Session session = SessionManager.getSessionFactory().openSession()) { - session.beginTransaction(); - bl.setEnabled(true); - session.merge(bl); - session.getTransaction().commit(); - } - - guildManager.reloadBlacklistCache(); - return CommandExecutionResult.success("Enabled the word [%s] for the blacklist.", word); - } - - return CommandExecutionResult.info("Either word doesn't exist or is already enabled"); - } - - public CommandExecutionResult disable(Guild guild, String word) { - GuildManager guildManager = GuildManager.getManager(guild); - - OBlacklist bl = getWordFromDb(word, guild.getId()); - if (bl != null && bl.getEnabled()) { - try(Session session = SessionManager.getSessionFactory().openSession()) { - session.beginTransaction(); - bl.setEnabled(false); - session.merge(bl); - session.getTransaction().commit(); - } - - guildManager.reloadBlacklistCache(); - return CommandExecutionResult.success("Disabled the word [%s] for the blacklist.", word); - } - - return CommandExecutionResult.info("Either word doesn't exist or is already disabled"); + guildManager.reloadBlacklistCache(); + return CommandExecutionResult.success("Removed the word [%s] to the blacklist.", word); } public List getBlacklistForGuild(Guild guild) { - List blacklist; + GuildManager manager = GuildManager.getManager(guild); + OGuild guildEntity = manager.getGuildEntity(); + List blacklist = new ArrayList<>(); - try(Session session = SessionManager.getSessionFactory().openSession()) { - GuildManager guildManager = GuildManager.getManager(guild); - - OGuild guildEntity = guildManager.getGuildEntity(); - JpaUtils.tryLoad(session, guildEntity, guildEntity.getGuildId()); - - blacklist = guildEntity.getBlacklists().stream().toList(); - } + JpaUtils.getWithSession(guildEntity, guildEntity.getGuildId(), session -> blacklist.addAll(guildEntity.getBlacklists())); return blacklist; } diff --git a/src/main/java/me/bobert/netneutrality/db/repository/GuildRepository.java b/src/main/java/me/bobert/netneutrality/db/repository/GuildRepository.java new file mode 100644 index 0000000..dadeb3b --- /dev/null +++ b/src/main/java/me/bobert/netneutrality/db/repository/GuildRepository.java @@ -0,0 +1,53 @@ +package me.bobert.netneutrality.db.repository;/* + * Copyright (c) anthorob + * + * https://discord.gg/qUa6zNFZsd + */ + +import me.bobert.netneutrality.core.db.SessionManager; +import me.bobert.netneutrality.db.Repository; +import me.bobert.netneutrality.db.entities.OGuild; +import me.bobert.netneutrality.utils.JpaUtils; +import org.hibernate.Session; +import org.hibernate.query.Query; + +import java.util.ArrayList; +import java.util.List; + +public class GuildRepository implements Repository { + @Override + public List findAll() { + List guilds = new ArrayList<>(); + + JpaUtils.runWithSession(session -> { + Query query = session.createQuery("FROM OGuild", OGuild.class); + + guilds.addAll(query.list()); + }); + + return guilds; + } + + @Override + public OGuild findById(String id) { + try(Session session = SessionManager.getSessionFactory().openSession()) { + Query query = session.createQuery("SELECT o FROM OGuild o WHERE o.guildId = :guildId", OGuild.class); + query.setParameter("guildId", id); + + return query.uniqueResult(); + } + } + + @Override + public void deleteBy(String id) { + JpaUtils.runWithTransaction(session -> { + Query query = session.createQuery("SELECT o FROM OGuild o WHERE o.guildId = :guildId", OGuild.class); + query.setParameter("guildId", id); + + OGuild oGuild = query.uniqueResult(); + if (oGuild != null) { + session.remove(oGuild); + } + }); + } +} diff --git a/src/main/java/me/bobert/netneutrality/db/repository/GuildSettingRepository.java b/src/main/java/me/bobert/netneutrality/db/repository/GuildSettingRepository.java new file mode 100644 index 0000000..66a5a02 --- /dev/null +++ b/src/main/java/me/bobert/netneutrality/db/repository/GuildSettingRepository.java @@ -0,0 +1,93 @@ +package me.bobert.netneutrality.db.repository;/* + * Copyright (c) anthorob + * + * https://discord.gg/qUa6zNFZsd + */ + +import me.bobert.netneutrality.core.db.SessionManager; +import me.bobert.netneutrality.db.GSettings; +import me.bobert.netneutrality.db.Repository; +import me.bobert.netneutrality.db.entities.OGuild; +import me.bobert.netneutrality.db.entities.OGuildSetting; +import me.bobert.netneutrality.utils.JpaUtils; +import org.hibernate.Session; +import org.hibernate.query.Query; + +import java.util.ArrayList; +import java.util.List; + +public class GuildSettingRepository implements Repository { + @Override + public List findAll() { + List settings = new ArrayList<>(); + + JpaUtils.runWithSession(session -> { + Query query = session.createQuery("FROM OGuildSetting", OGuildSetting.class); + + settings.addAll(query.list()); + }); + + return settings; + } + + @Override + public OGuildSetting findById(String id) { + try(Session session = SessionManager.getSessionFactory().openSession()) { + Query query = session.createQuery("SELECT o FROM OGuildSetting o WHERE o.id = :id", OGuildSetting.class); + query.setParameter("id", id); + + return query.uniqueResult(); + } + } + + @Override + public void deleteBy(String id) { + JpaUtils.runWithTransaction(session -> { + Query query = session.createQuery("SELECT o FROM OGuildSetting o WHERE o.id = :id", OGuildSetting.class); + query.setParameter("id", id); + + OGuildSetting setting = query.uniqueResult(); + if (setting != null) { + session.remove(setting); + } + }); + } + + public List findByGuild(String guildId) { + List settings = new ArrayList<>(); + + JpaUtils.runWithSession(session -> { + Query query = session.createQuery("SELECT o FROM OGuildSetting o WHERE o.guild.guildId = :guildId", OGuildSetting.class); + query.setParameter("guildId", guildId); + + settings.addAll(query.list()); + }); + + return settings; + } + + public void setSettingValue(OGuild oGuild, GSettings setting, String value) { + JpaUtils.getWithSession(oGuild, oGuild.getGuildId(), session -> { + OGuildSetting oGuildSetting = oGuild.getSettingByName(setting.getName()); + + if (value == null || setting.getDefaultValue().equals(value)) { + if (oGuildSetting != null) { + session.remove(oGuildSetting); + } + } else { + if (oGuildSetting == null) { + oGuildSetting = new OGuildSetting(); + oGuildSetting.setGuild(oGuild); + oGuildSetting.setName(setting.getName()); + oGuildSetting.setValue(value); + + session.persist(oGuildSetting); + } else { + oGuildSetting.setValue(value); + + session.merge(oGuildSetting); + } + } + }); + } +} diff --git a/src/main/java/me/bobert/netneutrality/db/repository/MessageRepository.java b/src/main/java/me/bobert/netneutrality/db/repository/MessageRepository.java index a591a32..4805464 100644 --- a/src/main/java/me/bobert/netneutrality/db/repository/MessageRepository.java +++ b/src/main/java/me/bobert/netneutrality/db/repository/MessageRepository.java @@ -9,49 +9,55 @@ import me.bobert.netneutrality.core.GuildManager; import me.bobert.netneutrality.core.db.SessionManager; import me.bobert.netneutrality.db.Repository; import me.bobert.netneutrality.db.entities.OLogMessage; +import me.bobert.netneutrality.utils.JpaUtils; import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.Message; import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel; import org.hibernate.Session; import org.hibernate.query.Query; +import java.util.ArrayList; import java.util.List; public class MessageRepository implements Repository { @Override public List findAll() { - List messages; + List messages = new ArrayList<>(); - try(Session session = SessionManager.getSessionFactory().openSession()) { + JpaUtils.runWithSession(session -> { Query query = session.createQuery("FROM OLogMessage", OLogMessage.class); - messages = query.list(); - } + messages.addAll(query.list()); + }); return messages; } @Override - public void deleteBy(String id) { + public OLogMessage findById(String id) { try(Session session = SessionManager.getSessionFactory().openSession()) { - session.beginTransaction(); + Query query = session.createQuery("SELECT o FROM OLogMessage o WHERE o.messageId = :messageId", OLogMessage.class); + query.setParameter("messageId", id); - Query query = session.createQuery("SELECT o FROM OLogMessage o WHERE o.id = :messageId", OLogMessage.class); + return query.uniqueResult(); + } + } + + @Override + public void deleteBy(String id) { + JpaUtils.runWithTransaction(session -> { + Query query = session.createQuery("SELECT o FROM OLogMessage o WHERE o.messageId = :messageId", OLogMessage.class); query.setParameter("messageId", id); OLogMessage oLogMessage = query.uniqueResult(); if (oLogMessage != null) { session.remove(oLogMessage); } - - session.getTransaction().commit(); - } + }); } public void log(GuildManager guildManager, MessageChannel channel, Member author, Message message) { - try(Session session = SessionManager.getSessionFactory().openSession()) { - session.beginTransaction(); - + JpaUtils.runWithTransaction(session -> { OLogMessage logMessage = new OLogMessage(); logMessage.setGuild(guildManager.getGuildEntity()); logMessage.setMessageId(message.getId()); @@ -61,61 +67,39 @@ public class MessageRepository implements Repository { logMessage.setDateSent(message.getTimeCreated().toInstant()); session.persist(logMessage); - session.getTransaction().commit(); - } + }); } public void logEdit(String messageId, String newMessage) { - try(Session session = SessionManager.getSessionFactory().openSession()) { - Query query = session.createQuery("SELECT o FROM OLogMessage o WHERE o.id = :messageId", OLogMessage.class); + JpaUtils.runWithTransaction(session -> { + Query query = session.createQuery("SELECT o FROM OLogMessage o WHERE o.messageId = :messageId", OLogMessage.class); query.setParameter("messageId", messageId); OLogMessage message = query.uniqueResult(); if (message != null) { - session.beginTransaction(); message.setEditedMessage(newMessage); session.merge(message); - session.getTransaction().commit(); } - } - } - - public OLogMessage getMessage(String messageId) { - try(Session session = SessionManager.getSessionFactory().openSession()) { - Query query = session.createQuery("SELECT o FROM OLogMessage o WHERE o.id = :messageId", OLogMessage.class); - query.setParameter("messageId", messageId); - - return query.uniqueResult(); - } - + }); } public List getMessagesFromUser(String userId, String guildId, int max) { - try(Session session = SessionManager.getSessionFactory().openSession()) { - Query query = session.createQuery( - "SELECT o FROM OLogMessage o WHERE o.guild.guildId = :guildId AND o.userId = :userId", - OLogMessage.class - ); + List messages = new ArrayList<>(); + + JpaUtils.runWithSession(session -> { + Query query = session.createQuery("SELECT o FROM OLogMessage o WHERE o.guild.guildId = :guildId AND o.userId = :userId", OLogMessage.class); query.setParameter("guildId", guildId); query.setParameter("userId", userId); query.setMaxResults(max); - return query.getResultList(); - } + messages.addAll(query.list()); + }); + + return messages; } public String getMessageString(String messageId) { - try(Session session = SessionManager.getSessionFactory().openSession()) { - Query query = session.createQuery("SELECT o FROM OLogMessage o WHERE o.id = :messageId", OLogMessage.class); - query.setParameter("messageId", messageId); - - OLogMessage message = query.uniqueResult(); - if (message != null) { - return message.getMessage(); - } - - return null; - } + return findById(messageId).getMessage(); } } diff --git a/src/main/java/me/bobert/netneutrality/db/repository/TaskRepository.java b/src/main/java/me/bobert/netneutrality/db/repository/TaskRepository.java index 18dc4bf..78070e3 100644 --- a/src/main/java/me/bobert/netneutrality/db/repository/TaskRepository.java +++ b/src/main/java/me/bobert/netneutrality/db/repository/TaskRepository.java @@ -9,11 +9,13 @@ package me.bobert.netneutrality.db.repository; import me.bobert.netneutrality.core.db.SessionManager; import me.bobert.netneutrality.db.Repository; import me.bobert.netneutrality.db.entities.OTask; +import me.bobert.netneutrality.utils.JpaUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.hibernate.Session; import org.hibernate.query.Query; +import java.util.ArrayList; import java.util.List; public class TaskRepository implements Repository { @@ -21,18 +23,19 @@ public class TaskRepository implements Repository { @Override public List findAll() { - List tasks; + List tasks = new ArrayList<>(); - try(Session session = SessionManager.getSessionFactory().openSession()) { + JpaUtils.runWithSession(session -> { Query query = session.createQuery("FROM OTask", OTask.class); - tasks = query.list(); - } + tasks.addAll(query.list()); + }); return tasks; } - public OTask findByTaskId(String id) { + @Override + public OTask findById(String id) { try(Session session = SessionManager.getSessionFactory().openSession()) { Query query = session.createQuery("SELECT o FROM OTask o WHERE o.taskId = :taskId", OTask.class); query.setParameter("taskId", id); @@ -43,9 +46,7 @@ public class TaskRepository implements Repository { @Override public void deleteBy(String id) { - try(Session session = SessionManager.getSessionFactory().openSession()) { - session.beginTransaction(); - + JpaUtils.runWithTransaction(session -> { Query query = session.createQuery("SELECT o FROM OTask o WHERE o.taskId = :taskId", OTask.class); query.setParameter("taskId", id); @@ -53,8 +54,6 @@ public class TaskRepository implements Repository { if (oTask != null) { session.remove(oTask); } - - session.getTransaction().commit(); - } + }); } } diff --git a/src/main/java/me/bobert/netneutrality/hooks/message/EditHandler.java b/src/main/java/me/bobert/netneutrality/hooks/message/EditHandler.java index 688f5f2..82bd172 100644 --- a/src/main/java/me/bobert/netneutrality/hooks/message/EditHandler.java +++ b/src/main/java/me/bobert/netneutrality/hooks/message/EditHandler.java @@ -32,26 +32,25 @@ public class EditHandler extends ListenerAdapter { OGuild guildEntity = guildManager.getGuildEntity(); if (guildEntity.getLogChannel() != null && !guildEntity.getLogChannel().isEmpty()) { - Session session = SessionManager.getSessionFactory().openSession(); - JpaUtils.tryLoad(session, guildEntity, guildEntity.getGuildId()); + JpaUtils.getWithSession(guildEntity, guildEntity.getGuildId(), session -> { + int size = guildEntity.getLoggings() + .stream() + .filter(oLogging -> oLogging.getId().getChannelId().equals(event.getChannel().getId()) && oLogging.getEnabled()) + .collect(Collectors.toSet()) + .size(); - int size = guildEntity.getLoggings() - .stream() - .filter(oLogging -> oLogging.getId().getChannelId().equals(event.getChannel().getId()) && oLogging.getEnabled()) - .collect(Collectors.toSet()) - .size(); + if (size > 0) { + TextChannel channel = event.getGuild().getTextChannelById(guildEntity.getLogChannel()); - if (size > 0) { - TextChannel channel = event.getGuild().getTextChannelById(guildEntity.getLogChannel()); + if (channel != null) { + MessageRepository repository = new MessageRepository(); + String originalMessage = repository.getMessageString(event.getMessage().getId()); + repository.logEdit(event.getMessage().getId(), event.getMessage().getContentDisplay()); - if (channel != null) { - MessageRepository repository = new MessageRepository(); - String originalMessage = repository.getMessageString(event.getMessage().getId()); - repository.logEdit(event.getMessage().getId(), event.getMessage().getContentDisplay()); - - channel.sendMessageEmbeds(MessageFunction.buildEditMessage(event.getMember(), event.getMessage(), originalMessage)).queue(); + channel.sendMessageEmbeds(MessageFunction.buildEditMessage(event.getMember(), event.getMessage(), originalMessage)).queue(); + } } - } + }); } } } diff --git a/src/main/java/me/bobert/netneutrality/utils/JpaUtils.java b/src/main/java/me/bobert/netneutrality/utils/JpaUtils.java index c3be9bb..33f24fb 100644 --- a/src/main/java/me/bobert/netneutrality/utils/JpaUtils.java +++ b/src/main/java/me/bobert/netneutrality/utils/JpaUtils.java @@ -14,13 +14,15 @@ import org.apache.logging.log4j.Logger; import org.hibernate.HibernateException; import org.hibernate.ObjectNotFoundException; import org.hibernate.Session; +import org.hibernate.Transaction; +import org.hibernate.exception.ConstraintViolationException; import java.io.Serializable; import java.util.function.Consumer; public class JpaUtils { - private static final Logger log = LogManager.getLogger(JpaUtils.class); + private static final Logger logger = LogManager.getLogger(JpaUtils.class); /** * Tries to read the persistent state into the object. @@ -41,12 +43,12 @@ public class JpaUtils { if (exception instanceof ObjectNotFoundException) { if (object instanceof OGuild oGuild) { String cachedId = oGuild.getGuildId(); - log.error("Trying to load Guild[{}] while entity doesn't exist in database, reloading..", cachedId); + logger.error("Trying to load Guild[{}] while entity doesn't exist in database, reloading..", cachedId); GuildManager guildManager = GuildManager.getManager(cachedId); guildManager.reloadEntity(); guildManager.getBlacklistCache().clear(); - log.info("Guild[{}] reloaded", cachedId); + logger.info("Guild[{}] reloaded", cachedId); } } @@ -55,23 +57,42 @@ public class JpaUtils { } } - public static void updateWithTransaction(Object persistantEntity, Runnable runnable) { + public static void runWithSession(Consumer consumer) { + try(Session session = SessionManager.getSessionFactory().openSession()) { + consumer.accept(session); + } + } + + public static void runWithTransaction(Consumer consumer) { try(Session session = SessionManager.getSessionFactory().openSession()) { session.beginTransaction(); - - runnable.run(); - - session.merge(persistantEntity); + consumer.accept(session); session.getTransaction().commit(); } } - public static void getWithSession(OGuild oGuild, Consumer consumer) { - getWithSession(oGuild, oGuild.getGuildId(), consumer); + public static void updateWithTransaction(Object persistantEntity, Runnable runnable) { + try(Session session = SessionManager.getSessionFactory().openSession()) { + Transaction transaction = session.beginTransaction(); + + try { + runnable.run(); + + session.merge(persistantEntity); + transaction.commit(); + } catch (ConstraintViolationException e) { + logger.error(e); + throw e; + } catch (Exception e) { + logger.error(e); + transaction.rollback(); + } + } } /** - * Loads the entity and relations from the database and executes the given consumer + * Loads the entity and relations from the database and executes the given consumer. + * This will load all Lazy relationships defined in the entity. * * @param persistantEntity The entity to load * @param id The identifier for the entity