Skip to content

Add isolated MySQL persistence feature module with HikariCP#2

Merged
HugoSilvaF merged 3 commits intofeature/mysql-persistencefrom
copilot/add-mysql-persistence-module
Nov 26, 2025
Merged

Add isolated MySQL persistence feature module with HikariCP#2
HugoSilvaF merged 3 commits intofeature/mysql-persistencefrom
copilot/add-mysql-persistence-module

Conversation

Copy link
Contributor

Copilot AI commented Nov 26, 2025

Adds a standalone feature module for MySQL persistence supporting chest limits, sharing, and audit logging. Module is isolated—no modifications to MainPlugin required.

Structure

  • DAO interfaces (dao/LimitDao, ShareDao, AuditDao) — contracts for persistence operations
  • MySQL implementations (feature/dao/*MySQL) — prepared statements, UUIDs as CHAR(36)
  • Services (feature/service/*) — business logic layer with log sanitization
  • Example commandsAdminSetLimitCommand, UserShareCommand as CommandExecutor
  • Schema (resources/sql/schema.sql) — tables: chest_limits, chest_shares, chest_audit, chest_backups

Integration

// In onEnable()
DatabaseManager dbManager = new DatabaseManager(this);
dbManager.initialize();
// Optional: dbManager.runEmbeddedSchemaIfPresent();

LimitDaoMySQL limitDao = new LimitDaoMySQL(dbManager.getDataSource(), getLogger());
ChestLimitService limitService = new ChestLimitService(limitDao, getConfig());
getCommand("setlimit").setExecutor(new AdminSetLimitCommand(limitService, auditService));

Dependencies (document in pom.xml)

<dependency>
    <groupId>com.zaxxer</groupId>
    <artifactId>HikariCP</artifactId>
    <version>4.0.3</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.28</version>
</dependency>

Notes

  • runEmbeddedSchemaIfPresent() is explicit opt-in, not automatic
  • Schema splits on ; with SQL comment filtering—complex schemas should be run manually
  • Full integration guide in README-feature.md

Warning

Firewall rules blocked me from connecting to one or more addresses (expand for details)

I tried to connect to the following addresses, but was blocked by firewall rules:

  • hub.spigotmc.org
    • Triggering command: /usr/lib/jvm/temurin-17-jdk-amd64/bin/java /usr/lib/jvm/temurin-17-jdk-amd64/bin/java --enable-native-access=ALL-UNNAMED -classpath /usr/share/apache-maven-3.9.11/boot/plexus-classworlds-2.9.0.jar -Dclassworlds.conf=/usr/share/apache-maven-3.9.11/bin/m2.conf -Dmaven.home=/usr/share/apache-maven-3.9.11 -Dlibrary.jansi.path=/usr/share/apache-maven-3.9.11/lib/jansi-native -Dmaven.multiModuleProjectDirectory=/home/REDACTED/work/MyChest/MyChest/mychest org.codehaus.plexus.classworlds.launcher.Launcher compile (dns block)
    • Triggering command: /usr/lib/jvm/temurin-17-jdk-amd64/bin/java /usr/lib/jvm/temurin-17-jdk-amd64/bin/java --enable-native-access=ALL-UNNAMED -classpath /usr/share/apache-maven-3.9.11/boot/plexus-classworlds-2.9.0.jar -Dclassworlds.conf=/usr/share/apache-maven-3.9.11/bin/m2.conf -Dmaven.home=/usr/share/apache-maven-3.9.11 -Dlibrary.jansi.path=/usr/share/apache-maven-3.9.11/lib/jansi-native -Dmaven.multiModuleProjectDirectory=/home/REDACTED/work/MyChest/MyChest/mychest org.codehaus.plexus.classworlds.launcher.Launcher -f pom.xml -B -V -e -Dfindbugs.skip -Dcheckstyle.skip -Dpmd.skip=true -Dspotbugs.skip -Denforcer.skip -Dmaven.javadoc.skip (dns block)
  • jitpack.io
    • Triggering command: /usr/lib/jvm/temurin-17-jdk-amd64/bin/java /usr/lib/jvm/temurin-17-jdk-amd64/bin/java --enable-native-access=ALL-UNNAMED -classpath /usr/share/apache-maven-3.9.11/boot/plexus-classworlds-2.9.0.jar -Dclassworlds.conf=/usr/share/apache-maven-3.9.11/bin/m2.conf -Dmaven.home=/usr/share/apache-maven-3.9.11 -Dlibrary.jansi.path=/usr/share/apache-maven-3.9.11/lib/jansi-native -Dmaven.multiModuleProjectDirectory=/home/REDACTED/work/MyChest/MyChest/mychest org.codehaus.plexus.classworlds.launcher.Launcher compile (dns block)
    • Triggering command: /usr/lib/jvm/temurin-17-jdk-amd64/bin/java /usr/lib/jvm/temurin-17-jdk-amd64/bin/java --enable-native-access=ALL-UNNAMED -classpath /usr/share/apache-maven-3.9.11/boot/plexus-classworlds-2.9.0.jar -Dclassworlds.conf=/usr/share/apache-maven-3.9.11/bin/m2.conf -Dmaven.home=/usr/share/apache-maven-3.9.11 -Dlibrary.jansi.path=/usr/share/apache-maven-3.9.11/lib/jansi-native -Dmaven.multiModuleProjectDirectory=/home/REDACTED/work/MyChest/MyChest/mychest org.codehaus.plexus.classworlds.launcher.Launcher -f pom.xml -B -V -e -Dfindbugs.skip -Dcheckstyle.skip -Dpmd.skip=true -Dspotbugs.skip -Denforcer.skip -Dmaven.javadoc.skip (dns block)
  • maven.husk.pro
    • Triggering command: /usr/lib/jvm/temurin-17-jdk-amd64/bin/java /usr/lib/jvm/temurin-17-jdk-amd64/bin/java --enable-native-access=ALL-UNNAMED -classpath /usr/share/apache-maven-3.9.11/boot/plexus-classworlds-2.9.0.jar -Dclassworlds.conf=/usr/share/apache-maven-3.9.11/bin/m2.conf -Dmaven.home=/usr/share/apache-maven-3.9.11 -Dlibrary.jansi.path=/usr/share/apache-maven-3.9.11/lib/jansi-native -Dmaven.multiModuleProjectDirectory=/home/REDACTED/work/MyChest/MyChest/mychest org.codehaus.plexus.classworlds.launcher.Launcher compile (dns block)
    • Triggering command: /usr/lib/jvm/temurin-17-jdk-amd64/bin/java /usr/lib/jvm/temurin-17-jdk-amd64/bin/java --enable-native-access=ALL-UNNAMED -classpath /usr/share/apache-maven-3.9.11/boot/plexus-classworlds-2.9.0.jar -Dclassworlds.conf=/usr/share/apache-maven-3.9.11/bin/m2.conf -Dmaven.home=/usr/share/apache-maven-3.9.11 -Dlibrary.jansi.path=/usr/share/apache-maven-3.9.11/lib/jansi-native -Dmaven.multiModuleProjectDirectory=/home/REDACTED/work/MyChest/MyChest/mychest org.codehaus.plexus.classworlds.launcher.Launcher -f pom.xml -B -V -e -Dfindbugs.skip -Dcheckstyle.skip -Dpmd.skip=true -Dspotbugs.skip -Denforcer.skip -Dmaven.javadoc.skip (dns block)
  • repo.aikar.co
    • Triggering command: /usr/lib/jvm/temurin-17-jdk-amd64/bin/java /usr/lib/jvm/temurin-17-jdk-amd64/bin/java --enable-native-access=ALL-UNNAMED -classpath /usr/share/apache-maven-3.9.11/boot/plexus-classworlds-2.9.0.jar -Dclassworlds.conf=/usr/share/apache-maven-3.9.11/bin/m2.conf -Dmaven.home=/usr/share/apache-maven-3.9.11 -Dlibrary.jansi.path=/usr/share/apache-maven-3.9.11/lib/jansi-native -Dmaven.multiModuleProjectDirectory=/home/REDACTED/work/MyChest/MyChest/mychest org.codehaus.plexus.classworlds.launcher.Launcher compile (dns block)
    • Triggering command: /usr/lib/jvm/temurin-17-jdk-amd64/bin/java /usr/lib/jvm/temurin-17-jdk-amd64/bin/java --enable-native-access=ALL-UNNAMED -classpath /usr/share/apache-maven-3.9.11/boot/plexus-classworlds-2.9.0.jar -Dclassworlds.conf=/usr/share/apache-maven-3.9.11/bin/m2.conf -Dmaven.home=/usr/share/apache-maven-3.9.11 -Dlibrary.jansi.path=/usr/share/apache-maven-3.9.11/lib/jansi-native -Dmaven.multiModuleProjectDirectory=/home/REDACTED/work/MyChest/MyChest/mychest org.codehaus.plexus.classworlds.launcher.Launcher -f pom.xml -B -V -e -Dfindbugs.skip -Dcheckstyle.skip -Dpmd.skip=true -Dspotbugs.skip -Denforcer.skip -Dmaven.javadoc.skip (dns block)

If you need me to access, download, or install something from one of these locations, you can either:

Original prompt

Adicionar um módulo feature isolado para persistência MySQL no plugin MyChest. O módulo deve ser colocado sob mychest/src/main/java/com/github/yannicklampers/mychest/feature e deve incluir DAOs MySQL, serviços e comandos de exemplo, assim como arquivos de recurso (config.yml e sql/schema.sql). Também incluir interfaces DAO em mychest/src/main/java/com/github/yannicklampers/mychest/dao para compatibilidade.

Arquivos a adicionar (conteúdo já especificado):

  • mychest/src/main/java/com/github/yannicklampers/mychest/dao/LimitDao.java
  • mychest/src/main/java/com/github/yannicklampers/mychest/dao/ShareDao.java
  • mychest/src/main/java/com/github/yannicklampers/mychest/dao/AuditDao.java
  • mychest/src/main/java/com/github/yannicklampers/mychest/feature/database/DatabaseManager.java
  • mychest/src/main/java/com/github/yannicklampers/mychest/feature/dao/LimitDaoMySQL.java
  • mychest/src/main/java/com/github/yannicklampers/mychest/feature/dao/ShareDaoMySQL.java
  • mychest/src/main/java/com/github/yannicklampers/mychest/feature/dao/AuditDaoMySQL.java
  • mychest/src/main/java/com/github/yannicklampers/mychest/feature/service/ChestLimitService.java
  • mychest/src/main/java/com/github/yannicklampers/mychest/feature/service/ShareService.java
  • mychest/src/main/java/com/github/yannicklampers/mychest/feature/service/AuditLoggerService.java
  • mychest/src/main/java/com/github/yannicklampers/mychest/feature/commands/AdminSetLimitCommand.java
  • mychest/src/main/java/com/github/yannicklampers/mychest/feature/commands/UserShareCommand.java
  • mychest/src/main/resources/config.yml
  • mychest/src/main/resources/sql/schema.sql
  • mychest/README-feature.md

Requisitos e comportamento esperado:

  1. DatabaseManager deve inicializar HikariCP a partir de config.yml e expor DataSource. Deve ter método opcional runEmbeddedSchemaIfPresent() que executa resources/sql/schema.sql (dividindo por ';') caso o administrador permita execução automática.
  2. DAOs MySQL devem usar DataSource e consultas preparadas. Use UUIDs como strings (CHAR(36)).
  3. Serviços encapsulam lógica e delegam para DAOs.
  4. Comandos de exemplo: AdminSetLimitCommand e UserShareCommand como CommandExecutor. Eles devem escrever logs de auditoria via AuditLoggerService.
  5. Incluir config.yml com parâmetros mysql (host, port, database, user, password, poolSize, useSSL) e settings.default_slots e settings.audit_retention_days.
  6. Incluir schema SQL para criar tabelas chest_limits, chest_shares, chest_audit, chest_backups (JSON).
  7. Não modificar MainPlugin diretamente — o módulo é isolado. No README-feature.md incluir instruções de integração (instanciar DatabaseManager, criar DAOs e serviços, registrar comandos e opcionalmente executar schema no onEnable).
  8. Atualizar pom.xml não será feito automaticamente — documentar dependências necessárias (HikariCP e mysql-connector-java) no README-feature.md.

Critérios de aceitação:

  • Todos os arquivos listados são adicionados ao branch feature/mysql-persistence com código compilável (sem dependências externas além do plugin padrão e as dependências mencionadas).
  • README-feature.md descreve claramente como integrar o módulo ao plugin existente e como executar o schema.
  • DatabaseManager.runEmbeddedSchemaIfPresent não executa automaticamente por padrão — deve ser chamado explicitamente no onEnable() se desejado.

Commit message sugerida: "feat: add mysql feature module (limits, shares, audit) with HikariCP"

Por favor, crie um PR da branch feature/mysql-persistence para master contendo esses arquivos e use o título do PR igual ao problem_title. Descreva no corpo do PR um resumo das mudanças, instruções rápidas de integração e observações sobre execução do schema e dependências.

This pull request was created as a result of the following prompt from Copilot chat.

Adicionar um módulo feature isolado para persistência MySQL no plugin MyChest. O módulo deve ser colocado sob mychest/src/main/java/com/github/yannicklampers/mychest/feature e deve incluir DAOs MySQL, serviços e comandos de exemplo, assim como arquivos de recurso (config.yml e sql/schema.sql). Também incluir interfaces DAO em mychest/src/main/java/com/github/yannicklampers/mychest/dao para compatibilidade.

Arquivos a adicionar (conteúdo já especificado):

  • mychest/src/main/java/com/github/yannicklampers/mychest/dao/LimitDao.java
  • mychest/src/main/java/com/github/yannicklampers/mychest/dao/ShareDao.java
  • mychest/src/main/java/com/github/yannicklampers/mychest/dao/AuditDao.java
  • mychest/src/main/java/com/github/yannicklampers/mychest/feature/database/DatabaseManager.java
  • mychest/src/main/java/com/github/yannicklampers/mychest/feature/dao/LimitDaoMySQL.java
  • mychest/src/main/java/com/github/yannicklampers/mychest/feature/dao/ShareDaoMySQL.java
  • mychest/src/main/java/com/github/yannicklampers/mychest/feature/dao/AuditDaoMySQL.java
  • mychest/src/main/java/com/github/yannicklampers/mychest/feature/service/ChestLimitService.java
  • mychest/src/main/java/com/github/yannicklampers/mychest/feature/service/ShareService.java
  • mychest/src/main/java/com/github/yannicklampers/mychest/feature/service/AuditLoggerService.java
  • mychest/src/main/java/com/github/yannicklampers/mychest/feature/commands/AdminSetLimitCommand.java
  • mychest/src/main/java/com/github/yannicklampers/mychest/feature/commands/UserShareCommand.java
  • mychest/src/main/resources/config.yml
  • mychest/src/main/resources/sql/schema.sql
  • mychest/README-feature.md

Requisitos e comportamento esperado:

  1. DatabaseManager deve inicializar HikariCP a partir de config.yml e expor DataSource. Deve ter método opcional runEmbeddedSchemaIfPresent() que executa resources/sql/schema.sql (dividindo por ';') caso o administrador permita execução automática.
  2. DAOs MySQL devem usar DataSource e consultas preparadas. Use UUIDs como strings (CHAR(36)).
  3. Serviços encapsulam lógica e delegam para DAOs.
  4. Comandos de exemplo: AdminSetLimitCommand e UserShareCommand como CommandExecutor. Eles devem escrever logs de auditoria via AuditLoggerService.
  5. Incluir config.yml com parâmetros mysql (host, port, database, user, password, poolSize, useSSL) e settings.default_slots e settings.audit_retention_days.
  6. Incluir schema SQL para criar tabelas chest_limits, chest_shares, chest_audit, chest_backups (JSON).
  7. Não modificar MainPlugin diretamente — o módulo é isolado. No README-feature.md incluir instruções de integração (instanciar DatabaseManager, criar DAOs e serviços, registrar comandos e opcionalmente executar schema no onEnable).
  8. Atualizar pom.xml não será feito automaticamente — documentar dependências necessárias (HikariCP e mysql-connector-java) no README-feature.md.

Critérios de aceitação:

  • Todos os arquivos listados são adicionados ao branch feature/mysql-persistence com código compilável (sem dependências externas além do plugin padrão e as dependências mencionadas).
  • README-feature.md descreve claramente como integrar o módulo ao plugin existente e como executar o schema.
  • DatabaseManager.runEmbeddedSchemaIfPresent não executa automaticamente por padrão — deve ser chamado explicitamente no onEnable() se desejado.

Commit message sugerida: "feat: add mysql feature module (limits, shares, audit) with HikariCP"

Por favor, crie um PR da branch feature/mysql-persistence para master contendo esses arquivos e use o título do PR igual ao problem_title. Descreva no corpo do PR um resumo das mudanças, instruções rápidas de integração e observações sobre execução do schema e dependências.


💬 We'd love your input! Share your thoughts on Copilot coding agent in our 2 minute survey.

Co-authored-by: HugoSilvaF <8800040+HugoSilvaF@users.noreply.github.com>
@HugoSilvaF
Copy link
Owner

finalize o pr @copilot

…mprove SQL parsing

Co-authored-by: HugoSilvaF <8800040+HugoSilvaF@users.noreply.github.com>
Copilot AI changed the title [WIP] Add isolated feature module for MySQL persistence in MyChest Add isolated MySQL persistence feature module with HikariCP Nov 26, 2025
Copilot AI requested a review from HugoSilvaF November 26, 2025 18:44
Copy link
Contributor Author

Copilot AI commented Nov 26, 2025

finalize o pr @copilot

PR is complete and ready to merge. All 14 files have been created including DAO interfaces, MySQL implementations, services, commands, schema, and documentation. Code review feedback has been addressed (commit 91538a4) and CodeQL security scan passed with no issues.

@HugoSilvaF HugoSilvaF marked this pull request as ready for review November 26, 2025 19:35
@HugoSilvaF HugoSilvaF merged commit b51cbfc into feature/mysql-persistence Nov 26, 2025
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants