Files
2018-06-25 21:41:46 -07:00

167 lines
5.1 KiB
JavaScript

const express = require('express');
const app = express();
const mysql = require('mysql');
const bodyParser = require('body-parser');
const PORT = 8080;
// to read request's body object/dict
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: true}));
// DB configuration
const con = mysql.createConnection({
host: 'localhost',
user: 'root',
password: 'mysql',
database: 'bank'
});
// establish connection
con.connect(function(err) {
if (err) throw err;
console.log("DB Connected!");
});
app.get('/', function (req, res) {
console.log('default route');
});
app.listen(PORT, function () {
console.log('Server running on port: ' + PORT);
});
function makeResObj(message, result=null, success=false) {
var responseObj = {
error: success,
message: message,
result: result
};
return responseObj;
}
/* **BONUS : use this function to verify that the balance is within the limits. The permissions table would hold
* the limits for that user. Also second helper is for checking if the deposit or withdraw is valid.
*/
function verifyBalance(balance, userId) {
con.query("SELECT balance from account where map_id=?", [userId], function (err, result, fields) {
if (err) throw err;
var balance = result[0];
con.query("SELECT * from permissions where map_id=?", [userId], function (err, result, fields) {
if (err) throw err;
if (balance < result[0].lower_limit || balance > result[0].upper_limit) {
return res.status(500).send(makeResObj("Current balance is not valid"));
}
});
});
}
function verifyTransactions(amount, userId, deposit=true) {
con.query("SELECT * from permissions where map_id=?", [userId], function (err, result, fields) {
if (err) throw err;
if (deposit) {
if (amount > result[0].deposit_limit) {
return res.status(600).send(makeResObj("Depositing too much!"));
}
} else {
if (amount > result[0].withdraw_limit) {
return res.status(500).send(makeResObj("Withdrawing too much!"));
}
}
});
}
// Adding a user
app.post('/users', function (req, res) {
let name = req.body.name;
// check if user in DB
con.query("SELECT * FROM users WHERE name=?;",[name], function (err, result, fields) {
if (err) throw err;
if (result.length > 0) {
var responseObj = makeResObj('Name already exists, ask customer if they have already made an account');
return res.status(400).send(responseObj);
}
});
let address = req.body.address;
let city = req.body.city;
let state = req.body.state;
let email = req.body.email;
let initBalance = req.body.initBalance;
// check if given data not enough/invalid
if (!address || !city || !state || !email) {
return res.status(400).send(makeResObj('Invalid or null input'));
}
// insert into users and info as sort of a transaction
con.query("INSERT INTO users (name) VALUES (?)", [name], function (error, results, fields) {
if (error) throw error;
const map_id = results.insertId;
con.query("INSERT INTO info (map_id, address, city, state, email) VALUES (?,?,?,?,?)", [map_id, address, city, state, email], function (error, results, fields) {
if (error) throw error;
});
con.query("INSERT INTO accounts (map_id, balance) VALUES (?,?)", [map_id, initBalance], function (error, results, fields) {
if (error) throw error;
});
return res.status(500).send(makeResObj("Created User", true));
});
});
// Retrieve info for particular account for a user
// If the endpoint gives user id, then can search through all accounts for a user (design choice of API)
app.get('/user/:id', function (req, res) {
let user_id = req.params.id;
if (!account_id) {
return res.status(400).send(makeResObj('No given account id'));
}
con.query('SELECT * FROM accounts where map_id=?', [user_id], function (error, results, fields) {
if (error) throw error;
return res.status(200).send(makeResObj('Account info returned.', results, true));
});
});
// Deposit or withdraw money dynamically
app.put('/user/action/:id', function (req, res) {
let user_id = req.params.id;
let deposit = req.body.isDeposit;
let amount = req.body.amount;
if (!amount) {
return res.status(400).send(makeResObj('No amount specified'));
}
con.query('SELECT balance FROM accounts where map_id=?', [user_id], function (error, results, fields) {
if (error) throw error;
var balance = results[0];
// example for bonus, call verifyTransactions hereeee!!
var query = "UPDATE accounts SET balance=? WHERE map_id=?";
var items = [];
if (deposit) {
items = [balance + amount, user_id];
} else {
items = [balance - amount, user_id];
}
con.query(query, items, function (error, results, fields) {
if (error) throw error;
// perhaps call verifyBalance hereee!!
return res.status(200).send('Account balance has been updated successfully.', results, true);
});
});
});