167 lines
5.1 KiB
JavaScript
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);
|
|
});
|
|
});
|
|
});
|