---
tags: devtools2022
---
# REST-API Demo
This demo is tested to work on Ubuntu 22. Original tutorial can be found [here](https://www.bezkoder.com/node-js-rest-api-express-mysql/). Clone the repository:
```bash
git clone https://github.com/natalieagus/devtools-rest
```
You need to have `mysql`, `node`, and `npm` **installed**.
```bash
sudo apt update
sudo apt upgrade
sudo apt install npm
sudo apt install nodejs
sudo apt install mysql-server
mysql --version # check installation
```
## `mysql` setup
Start `mysql` service and login as root for the first time:
```bash
sudo service mysql start
sudo mysql -u root # no passwd by default
```
Ensure that mysql is running:
```bash
sudo systemctl status mysql
```
In mysql, set root **password**:
```bash
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '[YOUR_SQL_PASSWORD]';
exit
```
Then start **secure** installation and **follow** the instructions. You will need to enter the password `[YOUR_SQL_PASSWORD]` you set in the previous step.
> It will then ask you if you'd like to set a **new** password. It's up to you to keep the `[YOUR_SQL_PASSWORD]` or a set a new one. We recommend you keep it the same for simplicity sake.
```bash
sudo mysql_secure_installation
```
Now login to your database (and key in the prompted password `YOUR_SQL_PASSWORD`):
```bash
mysql -u root -p
```
Then create the database `rest_api_js` required for this demo:
```bash
CREATE DATABASE rest_api_js;
USE rest_api_js;
CREATE TABLE IF NOT EXISTS `tutorials` (
id int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
title varchar(255) NOT NULL,
description varchar(255),
published BOOLEAN DEFAULT false
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
exit
```
## Install `node` packages
Then install node packages, type the following command in the directory where `package.json` is:
```bash
npm install
```
## Run the REST Server
Now open `/app/config/db.config.js` and write your password there:
```bash
module.exports = {
HOST: "localhost",
USER: "root",
PASSWORD: "[YOUR_SQL_PASSWORD]",
DB: "rest_api_js",
};
```
Finally, run the server,
```bash
node server.js
```
## API Calls
### Simple `GET`
Simple hello welcome message.
```bash
curl -X GET \
'54.169.155.69:8080/' \
--header 'Accept: */*'
```

### `GET` from `api/tutorials`
Get a list of `tutorials` from the server.
```bash
curl -X GET \
'54.169.155.69:8080/api/tutorials' \
--header 'Accept: */*'
```

### `POST` to `api/tutorials`
Post a new tutorial to the server's database:
```bash=
curl -X POST \
'54.169.155.69:8080/api/tutorials' \
--header 'Accept: */*' \
--header 'Content-Type: application/json' \
--data-raw '{
"title": "nodejs rest api",
"description": "some description lorem ipsum"
}'
```

### `GET` by `id`
```bash=
curl -X GET \
'54.169.155.69:8080/api/tutorials/1' \
--header 'Accept: */*'
```

### `GET` by `title`
```bash
curl -X GET \
'54.169.155.69:8080/api/tutorials?title=node' \
--header 'Accept: */*'
```

### `DELETE` by `id`
```bash
curl -X DELETE \
'54.169.155.69:8080/api/tutorials/1' \
--header 'Accept: */*'
```

### `PUT` by `id`
Updates an entry:
```bash
curl -X PUT \
'154.169.155.69:8080/api/tutorials/3' \
--header 'Accept: */*' \
--header 'Content-Type: application/json' \
--data-raw '{
"title": "python rest API",
"description": "some description lorem ipsum UPDATE"
}'
```

### Routes
The following table shows overview of the Rest APIs that are **supported**:
| METHOD | URL | Action |
| ---- | ---- | ---- |
| GET | api/tutorials | get all Tutorials |
| GET | api/tutorials/:id | get Tutorial by id |
| POST | api/tutorials | add new Tutorial |
| PUT | api/tutorials/:id | update Tutorial by id |
| DELETE | api/tutorials/:id | remove Tutorial by id |
| DELETE | api/tutorials | remove all Tutorials |
| GET | api/tutorials/published | find all published Tutorials |
| GET | api/tutorials?title=[kw] | find all Tutorials which title contains 'kw' |
You can use [postman](https://www.postman.com) to make these calls more easily.
The implementation of these routes can be seen at `/app/routes/tutorials.routes.js`
```javascript
module.exports = app => {
const tutorials = require("../controllers/tutorial.controller.js");
var router = require("express").Router();
// Create a new Tutorial
router.post("/", tutorials.create);
// Retrieve all Tutorials
router.get("/", tutorials.findAll);
// Retrieve all published Tutorials
router.get("/published", tutorials.findAllPublished);
// Retrieve a single Tutorial with id
router.get("/:id", tutorials.findOne);
// Update a Tutorial with id
router.put("/:id", tutorials.update);
// Delete a Tutorial with id
router.delete("/:id", tutorials.delete);
// Delete all Tutorials
router.delete("/", tutorials.deleteAll);
app.use('/api/tutorials', router);
};
```