Source: mysql.js

/** @module mysql */

require("dotenv").config({
    path: process.env.NODE_ENV === "test" ? ".env.test" : ".env",
});

const mysql = require("mysql2");
const pool = mysql.createPool({
    host: process.env.MYSQL_HOST,
    database: process.env.MYSQL_DATABASE,
    user: process.env.MYSQL_USERNAME,
    password: process.env.MYSQL_PASSWORD,
    port: process.env.MYSQL_PORT || 3306,
});

/**
 * Get a connection from the pool
 * 
 * @returns {Promise<mysql.Connection>}
 */
function getConnection() {
    return new Promise((res, rej) => {
        pool.getConnection((error, connection) => {
            if (error) {
                rej(error);
            } else {
                res(connection);
            }
        });
    });
}

module.exports = {
    pool,
    getConnection,

    /**
     * Send a query to the database
     * 
     * @param {string} query
     * @param {any} ...preparedStatementValues
     * @returns {Promise<any>}
     */
    query(query, ...preparedStatementValues) {
        return new Promise(async (res, rej) => {
            // Replace undefined with null
            preparedStatementValues = preparedStatementValues.map((value) => {
                if (value === undefined) return null;
                return value;
            });
            let connection = await getConnection();
            try {
                connection.query(
                    query,
                    preparedStatementValues,
                    (error, results, _fields) => {
                        if (error) {
                            rej(error);
                        } else {
                            res(results);
                        }
                    }
                );
            } finally {
                connection.release();
            }
        });
    },
};