diff --git a/app.js b/app.js index 2c46f4d8ac7bb4e21206e451071fe6610aba72cd..4cf99e4531993e748ac12aae96407812efb6d8ca 100644 --- a/app.js +++ b/app.js @@ -6,7 +6,7 @@ // User Imports. const config = require('./config.js'); -const { create_message, generate_users, test_db_functions } = require('./src/database_functions.js'); +const { checkUserExist, create_message, createMessageFrom, getUsersWithMessages, generate_users, test_db_functions } = require('./src/database_functions.js'); const { userConfirmation } = require('./src/helper_functions.js'); const { Logging, testLogLevels } = require('./src/logging.js'); const MySql = require('./src/mysql.js'); @@ -23,24 +23,64 @@ async function main() { logger.info('Starting program.'); logger.log(''); + // testLogLevels(logger); + // Create MySql helper class. - var debug = false; + var debug = true; const mysql = await new MySql(config['mysql'], debug); // Connect to database. await mysql.open_conn(); - // Reset database by emptying all tables. - await mysql.reset_db(true); + // // Reset database by emptying all tables. + // await mysql.reset_db(true); + // + // // Generate database users. + // generate_users(mysql); + // + // // Generate 100,0000 messages. + // for (let index = 0; index < 100000; index++) { + // create_message(mysql); + // } - // Generate database users. - generate_users(mysql); + // Theoretical addUser function. + try { + addUser(); + } catch (err) { - // Generate 100,0000 messages. - for (let index = 0; index < 100000; index++) { - create_message(mysql); } + // Check for users with an expected name. + await checkUserExist(mysql, 'Bob', debug); + + // Check for users with an unexpected name. + await checkUserExist(mysql, 'Potato', debug); + + // Add a duplicate expected name and check results again. + let query = 'INSERT INTO user (name) VALUES (?);'; + let parameters = ['Bob']; + await mysql.query(query, parameters); + await checkUserExist(mysql, 'Bob', debug); + + // Now we want to check what users have created messages. + // First clear messages. + await mysql.reset_db(true); + await generate_users(mysql); + + // Check with no messages created. + await getUsersWithMessages(mysql, debug); + + // Create messages from Johnny and Sarah. + createMessageFrom(mysql, 2); + createMessageFrom(mysql, 2); + createMessageFrom(mysql, 4); + createMessageFrom(mysql, 4); + createMessageFrom(mysql, 4); + createMessageFrom(mysql, 4); + + // Check again, now that 6 messages have been made. + await getUsersWithMessages(mysql, debug); + // Close existing database connections. await mysql.close_conn(); diff --git a/src/database_functions.js b/src/database_functions.js index b39cfbd901e18c008bc06bef757daac50e629213..8812e6ca967db87d76564b4ba012ebc0dc29e72a 100644 --- a/src/database_functions.js +++ b/src/database_functions.js @@ -75,7 +75,7 @@ async function generate_users(mysql, debug) { async function create_message(mysql, debug) { if (debug) { logger.log(''); - logger.debug('Executing `generate_users()` function:'); + logger.debug('Executing `create_message()` function:'); } // Get pk of sender. Sender is chosen at random. @@ -90,8 +90,101 @@ async function create_message(mysql, debug) { } +/** + * Creates a single message from a given user. + * :param mysql: Instance of MySQL connector class. + * :param debug: Bool indicating if debug mode or not. + */ +async function createMessageFrom(mysql, senderId, debug) { + if (debug) { + logger.log(''); + logger.debug('Executing `createMessageFrom()` function:'); + logger.debug(' senderId: {}'.format(senderId)); + } + + // Here, we would normally generate a message too. But we're lazy. + message = 'Test Message.'; + + // Add message to database. + mysql.query('INSERT INTO message (user_id, message) VALUES (?, ?)', [senderId, message]); +} + + +/** + * Checks if user exist for given username. If so, returns user id. + * :param mysql: Instance of MySQL connector class. + * :param userName: Username to check for. + * :param debug: Bool indicating if debug mode or not. + */ +async function checkUserExist(mysql, userName, debug) { + if (debug) { + logger.log(''); + logger.debug('Executing `checkUserExist()` function:'); + logger.debug(' mysql: {}'.format(mysql)); + logger.debug(' userName: {}'.format(userName)); + logger.debug(' debug: {}'.format(debug)); + } + + // Execute query. + let query = 'SELECT COUNT(name) AS userCount FROM user WHERE name = ?;'; + let parameters = [userName]; + logger.sql_q(query, parameters); + let results = await mysql.query(query, parameters); + + // Check results. + if (results.length < 1) { + // No results found. + logger.info('User with name "{}" not found.'.format(userName)); + return []; + } else { + // One or more results found. + let userCount = results[0]['userCount']; + logger.info('Found {} users with name "{}".'.format(userCount, userName)); + return userCount; + } +} + +/** + * Returns all users that have sent a message. + * :param mysql: Instance of MySQL connector class. + * :param debug: Bool indicating if debug mode or not. + */ +async function getUsersWithMessages(mysql, debug) { + if (debug) { + logger.log(''); + logger.debug('Executing `getUsersWithMessages()` function:'); + logger.debug(' mysql: {}'.format(mysql)); + logger.debug(' debug: {}'.format(debug)); + } + + // Get list of all messages. + // let query = 'SELECT UNIQUE user_id FROM message;'; + let query = 'SELECT UNIQUE user.name AS name, message.user_id AS user_id FROM message INNER JOIN user ON message.user_id = user.id;'; + logger.sql_q(query); + let results = await mysql.query(query); + + // Check results. + if (results.length < 1) { + logger.info('No users have sent messages yet.'); + return []; + } else { + // Get user names in list. + let user_list = [] + for (let index = 0; index < results.length; index++) { + user_list.push(results[index]['name']); + } + logger.info('Users have sent messages: {}'.format(user_list)); + return user_list; + } + +} + + module.exports = { + checkUserExist, create_message, + createMessageFrom, + getUsersWithMessages, generate_users, test_db_functions, }; diff --git a/src/mysql.js b/src/mysql.js index b37a963b375bd27409e16302e1485ee401920428..a8c515108712a1d3770f72f3d40d35677b0b2352 100644 --- a/src/mysql.js +++ b/src/mysql.js @@ -75,6 +75,9 @@ class MySql { logger.debug('Closing MySql connection...'); } + // Wait 2 seconds before trying anything. Helps ensure queries can at least queue up before closing. + await sleep(2000); + // Check if connection pool is currently open. if (this.connection_pool != null) { // Connection pool currently exists. Check if associated connections are still running.