Fully implemented API
This commit is contained in:
@@ -0,0 +1,166 @@
|
||||
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);
|
||||
});
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user