Source: dev/transactionGenerator.js

/**
	@namespace dev
	@since 23/10/2020
	@version 1.0
	@author Brennan Wilkes
*/

//Includes
const path = require("path");
const fs = require('fs');
const axios = require('axios');

//Argument validation
if(process.argv.length < 6){
	console.error("Invalid arguments");
	process.exit(1);
}

//Number of random transactions to generate
const numTransactions = parseInt(process.argv[2]);

//Number of users to scrape
const numUsers = parseInt(process.argv[3]);

//Output file to write to
const outputFile = process.argv[4];

//Path to sample data json.
const drinksListFile = path.join("..", "..", process.argv[5]);

//List of cocktails to pull from
const drinks = require(drinksListFile).drinkRecipe.data;

//User generation API
const randomUserUrl = `https://randomuser.me/api/?inc=name,dob&noinfo&nat=us,au,ca,gb&results=${numUsers}`;

/**
	Converts a date object into a formatted string
	@param {date} dateObj JS Date object to format
	@returns {string} Date in the format YYYY/MM/DD
	@memberof dev
*/
const dateYMD = dateObj => `${dateObj.getFullYear()}/${dateObj.getMonth()+1}/${dateObj.getDate()}`;

/**
	Wraps a date sting with the SQL date() function
	@param {string} dateStr Date string to wrap
	@returns {string} Date wrapped in date() function
	@memberof dev
*/
const dateWrap = dateStr => `date("${dateStr}")`;

/**
	Generates a random date between two dates
	@param {date} start Initial date
	@param {date} end Max date
	@returns {date} Random date btween start and end
	@memberof dev
*/
const randomDate = (start, end) => dateYMD(new Date(start.getTime() + Math.random() * (end.getTime() - start.getTime())));

//Date to generate random transactions from.
const earliestDate = new Date(2020, 8, 1);

//Todays date.
const todaysDate = new Date();

//JSON data to output.
//Contains customers and transitions.
//Intended to be passed to a SQL converter
const jsonOutput = {
	database: "everyLastDrop",
	customer: {
		order: 0,
		data: []
	},
	transaction: {
		order: 1,
		data : []
	}
};

//Get random users from API
axios.get(randomUserUrl).then(res => {
	const users = res.data.results;

	//Add each user as a customer to be added to the database
	users.forEach((usr, i) => {
		jsonOutput.customer.data.push({
			fullName: `${usr.name.first} ${usr.name.last}`,
			dateOfBirth: dateWrap(dateYMD(new Date(usr.dob.date)))
		});
	});

	//Iterate over number of transactions requested
	let user, drink, date;
	for(let t=0;t<numTransactions;t++){

		//Pick a random user
		user = users[parseInt(Math.random() * numUsers)];

		//Pick a random drink
		drink = drinks[parseInt(Math.random() * drinks.length)];

		//Generate a random date
		date = randomDate(earliestDate, todaysDate);

		//Record transaction to json output
		jsonOutput.transaction.data.push({
			date: dateWrap(date),
			drinkId: drink.id,
			customerName: `${user.name.first} ${user.name.last}`
		});
	}

	//Write data to output file
	fs.writeFile(outputFile, JSON.stringify(jsonOutput,null,4), function (err) {
		if (err) throw err;
	});
}).catch(err => console.error(err));