From b7de4d96141eb761fa3f06bcb1323d94defd19b8 Mon Sep 17 00:00:00 2001 From: Jo Date: Tue, 9 Jan 2024 08:28:18 +0100 Subject: [PATCH] feat: new DatabaseInstance class for universal database management, W.I.P --- Dockerfile | 7 ++-- Structures/Classes/DatabaseInstance.js | 49 +++++++++++++++++++++++++ app.js | 18 ++++----- bun.lockb | Bin 0 -> 81566 bytes entrypoint.sh | 2 +- 5 files changed, 61 insertions(+), 15 deletions(-) create mode 100644 Structures/Classes/DatabaseInstance.js create mode 100755 bun.lockb diff --git a/Dockerfile b/Dockerfile index 8496da5..8bd562b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM node:21 +FROM oven/bun:latest # Install netcat RUN apt-get update && apt-get install -y netcat-traditional @@ -6,9 +6,10 @@ RUN apt-get update && apt-get install -y netcat-traditional WORKDIR /usr/src/app # Copy package.json and package-lock.json to the working directory -COPY package*.json ./ +COPY package.json ./ +copy bun.lockb ./ -RUN npm install +RUN bun install COPY . . diff --git a/Structures/Classes/DatabaseInstance.js b/Structures/Classes/DatabaseInstance.js new file mode 100644 index 0000000..313e2e2 --- /dev/null +++ b/Structures/Classes/DatabaseInstance.js @@ -0,0 +1,49 @@ +const mysql = require("mysql2"); +const { readdir } = require("fs"); +const path = require("path"); + +/** + * Universal database instance to be used for any database operations + */ +class DatabaseInstance { + /** + * Construct the DatabaseInstance using the database credentials + * + * @param {Object} credentials The database credentils in a standard mysql format + */ + constructor(credentials) { + this.pool = mysql.createPool({ + database: credentials.database, + user: credentials.user, + password: credentials.password, + host: credentials.host, + port: credentials.port, + enableKeepAlive: true, + waitForConnections: true, + connectionLimit: 10 + }); + + console.log("[JET » DatabaseInstance] Successfully initialized database connection") + + this.pool.on("connection", (err) => { + if (err) console.log("[JET » DatabaseInstance] Error occurred during connection"); + else console.log("[JET » DatabaseInstance » client] Successfully created new connection"); + }); + } + + /** + * + * @param {String} query + * @param {Array} values + * @returns + */ + async execute(query, values, callback) { + this.pool.execute(query, values, callback); + } + + async query(query, callback) { + this.pool.query(query, callback); + } +} + +module.exports = { DatabaseInstance }; \ No newline at end of file diff --git a/app.js b/app.js index f76d2f7..792469f 100644 --- a/app.js +++ b/app.js @@ -12,12 +12,17 @@ // Imports //------------------------------------------------> +// Packages const express = require("express"); const bodyParser = require("body-parser"); const cookieParser = require("cookie-parser"); const mysql = require("mysql2"); const path = require("path"); +// Classes +const { DatabaseInstance } = require("./Structures/Classes/DatabaseInstance"); + +// Load environment variables when not using docker if (!process.env.DOCKER) { const dotenv = require("dotenv"); dotenv.config(); @@ -43,11 +48,10 @@ app.use(bodyParser.urlencoded({ extended: false })); app.use(cookieParser()); //------------------------------------------------> -// MySQL connection +// Initialize database //------------------------------------------------> -//! Make extra sure these values are loaded correctly, if you experience any connection issues. -const db = mysql.createConnection({ +const db = new DatabaseInstance({ database: process.env.DB_NAME, user: process.env.DB_USER, password: process.env.DB_PASSWORD, @@ -55,14 +59,6 @@ const db = mysql.createConnection({ port: process.env.DB_PORT }); -db.connect((error) => { - if (error) { - console.error("[JET] Error connecting to MySQL database:", error); - } else { - console.log("[JET] Database connected successfully"); - } -}); - //------------------------------------------------> // Routing //------------------------------------------------> diff --git a/bun.lockb b/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..5575077defdcdc9fc64923d102aa0036485215d1 GIT binary patch literal 81566 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 JnEwy{`9BUC1&jay literal 0 HcmV?d00001 diff --git a/entrypoint.sh b/entrypoint.sh index 2f46014..2b76ede 100755 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -14,4 +14,4 @@ check_database() { check_database # Start the Express app -exec npm run start +exec bun run start