From da30c665d2ebdc2bcffd12753568d31967e33492 Mon Sep 17 00:00:00 2001 From: yikth Date: Mon, 7 Sep 2020 21:04:16 +0800 Subject: [PATCH] server side documentation --- README.md | 4 +- server-side.md | 310 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 313 insertions(+), 1 deletion(-) create mode 100644 server-side.md diff --git a/README.md b/README.md index 95545d2..7b4ad55 100644 --- a/README.md +++ b/README.md @@ -377,4 +377,6 @@ MySQL localhost:3306 ssl SQL> select * from store_test; // change to MySQL binary folder C:\> "C:\Program Files\MySQL\MySQL Server 8.0\bin\mysqldump.exe" -u root -p nusbank > d:/nusbank.sql -``` \ No newline at end of file +``` + +[Next](./server-side.md) \ No newline at end of file diff --git a/server-side.md b/server-side.md new file mode 100644 index 0000000..9ae5842 --- /dev/null +++ b/server-side.md @@ -0,0 +1,310 @@ +# Server Side + +## Tools +* VSCode +* Node JS +* [Postman](https://www.postman.com/downloads/) + + For Ubuntu 20.04 installation + ``` + $ sudo snap install postman + ``` +* Packages + + mysql : MySql database CRUD + + express : REST framework + + body-parser : for parsing html body json content + +## Prepare Project +* Create a new project folder + +```bash +// init new Node project. create package.json file +$ npm init + +// install packages +$ npm install --save mysql +$ npm install --save express body-parser +``` + +### Quick Fix for MySQL8 +* node js packages still do not support new password scheme of MySQL8. +* thus switch to old native scheme for node JS support. (Note : The native scheme is less secure) +* Update MySql root password to native + +```sql +mysql> ALTER USER 'root'@'localhost' +IDENTIFIED WITH mysql_native_password +BY 'password'; +``` + +## Accessing database from nodejs + +* CRUD operation - CREATE, READ, UPDATE, DELETE (For database operation) +* database.js +```javascript +const mysql = require("mysql"); + +parameters = { + host: "localhost", + user: "root", + password: "7572137", + database: "nusbank", + multipleStatements: true, +}; + +let connection = mysql.createConnection(parameters); +connection.connect((error) => { + if (error){ + console.log(error); + } else { + console.log("Connection was successfull"); + } +}); + +connection.query(`SELECT * FROM users LIMIT 5`, (err, result) => { + if (err){ + console.log(err); + }else{ + console.log(result); + } +}); + +let newuser = { id: 599, + name: "Harry Lim", + mail: "harrylim@abc.com", + mobile: "99887788", + nric: "S223311A" +}; + +connection.query(`DELETE FROM users WHERE user_id = ${newuser.id}`, (err, result) =>{ + if (err){ + console.log(err); + }else{ + console.log(result); + } +}); + +connection.query( + `INSERT INTO users(user_id, name, mail, mobile, nric) + VALUES (${newuser.id},'${newuser.name}', '${newuser.mail}', ${newuser.mobile}, '${newuser.nric}')`, + (err, results) => { + if (err){ + console.log(err); + } else { + if (results["affectedRows"] != 0) { + console.log("Added", results); + } + } + }); + +// +connection.query(`DELETE FROM users WHERE user_id = ${newuser.id}`, (err, result) =>{ + if (err){ + console.log(err); + }else{ + console.log(result); + } +}); + +// query highest monthly transaction +connection.query(`SELECT a.user_id, u.name, a.acct_number, t.date, COUNT(a.user_id) as cmonth +FROM transactions AS t +INNER JOIN accounts AS a +ON a.acct_number = t.acct_number +INNER JOIN users AS u +ON u.user_id = a.user_id +GROUP BY a.user_id, MONTH(t.date), YEAR(t.date) +ORDER BY cmonth DESC +LIMIT 1`, +(err, results) => { + if (err){ + console.log(err); + } else { + if (results["affectedRows"] != 0) { + console.log("Highest Montly", results); + } + } +}); +``` + +## API +* Application Programming Interface +* Purpose : contract defining how different systems will communicate +* Styles + + REST + + RPC : SOAP (xml format) + + GraphQL : By Facebook. For databases + + Event-Driven : For streaming services. Require realtime update. +* REST API to expose data from MySQL + +### REST +* http +* POST, GET, PUT, DELETE +* Components + + URI + + headers + + key + + method + +Component | Description +----|----- +API name | +Description | +Method | GET, POST, PUT, DELETE +URI | Location, port (example:/user/id) +Headers, Parameters, Body | +Authentication & Authorisation | Key, bearer token +Response | Status Code, body + +* ExpressJS : Framework for implementing REST server +* apis.js +```javascript +const express = require('express'); +const bodyParser = require('body-parser'); + +var app = express(); + +// parse body formatted in JSON +app.use(bodyParser.json()); + +app.get('/', (req, res) => { + res.send('Hello Express'); +}); + +app.get('/squared', (req, res) => { + // JSON format + // { "number": 2} + number = req.body.number; + squared = number * number; + + res.send(`Squared : ${squared}`); + + // from POSTMAN.. set Body raw content as JSON data + // { "number": 3 } +}); + +app.listen(process.env.PORT || 3000); + +``` +* Powershell Environment Variable + +```Powershell +// create variable PORT=3001 +PS> $Env:PORT = 3001 + +// return PORT value +PS> $Env:PORT + +```` + + +## API & database integration + +* server.js + +```javascript +const mysql = require("mysql"); +const express = require("express"); +const bodyParser = require("body-parser"); + +parameters = { + host: "localhost", + user: "root", + password: "7572137", + database: "nusbank", + multipleStatements: true, +}; + +let connection = mysql.createConnection(parameters); +connection.connect((error) => { + if (error){ + console.log(error); + } else { + console.log("Connection was successfull"); + } +}); + +/// Connected +let app = express(); + +app.use(bodyParser.json()); + +// GET route for /user query +app.get("/user", (request, response) => { + connection.query("SELECT * FROM users LIMIT 10", (err, result) => { + if (err) { + response.send("Some error occur"); + } + else { + response.send(result); + } + }); +}); + +// GET route for /user/id query +// with body = { "id": 2 } +app.get("/user/id", (request, response) => { + console.log(request.body); + // + connection.query(`SELECT * FROM users WHERE user_id = ${request.body.id}`, + (err, result) => { + if (err) { + response.send("Some id error occur"); + } + else { + response.send(result); + } + }); +}); + +/* + POST route for /user add + with body = { + "id":598, + "name": "John Heng", + "mail": "johnheng@xyz.com", + "mobile": 91191100, + "nric" : "S1234765F" +} +*/ +app.post("/user", (request, response) => { + console.log(request.body); + // + connection.query(`INSERT INTO users(user_id, name, mail, mobile, nric) + VALUES (${request.body.id},'${request.body.name}', '${request.body.mail}', ${request.body.mobile}, '${request.body.nric}')`, + (err, result) => { + if (err) { + response.send("Some record error occur"); + } + else { + response.send("Record saved successfully"); + } + }); +}); + +// listen port 3000 +app.listen(3000); + +``` + +## REST and CRUD co-relation + +REST | CRUD | Description +----|-----|---- +GET | READ | Read record from database table +POST | CREATE | Create record into database table +PUT | UPDATE | Update record into database table +DELETE | DELETE | Delete record from database table + +## Homework 2 +* API express js code and validate using Postman +* API documentation + +Component | Description +----|----- +API name | getUserId +Description | Get User by ID +Method | GET +URI | /user/id +Headers, Parameters, Body | body { "id" : 2 } +Response | { "user_id" : "599", "name" : "John Heng", ...} +