From 6331d6cb3ef612e2399d547e3441eba5aa556c1e Mon Sep 17 00:00:00 2001 From: Bhirawa Mbani Date: Tue, 25 Apr 2017 13:54:59 +0700 Subject: [PATCH] crud test all done --- .gitignore | 2 + README.md | 1 - app.js | 18 ++++++++ config/config.json | 13 ++++++ controllers/users.js | 56 ++++++++++++++++++++++++ migrations/20170424044304-create-user.js | 30 +++++++++++++ models/index.js | 36 +++++++++++++++ models/user.js | 14 ++++++ package.json | 18 ++++++++ readme.MD | 41 +++++++++++++++++ routes/users.js | 11 +++++ seeders/20170424055904-users.js | 45 +++++++++++++++++++ 12 files changed, 284 insertions(+), 1 deletion(-) create mode 100644 .gitignore delete mode 100644 README.md create mode 100644 app.js create mode 100644 config/config.json create mode 100644 controllers/users.js create mode 100644 migrations/20170424044304-create-user.js create mode 100644 models/index.js create mode 100644 models/user.js create mode 100644 package.json create mode 100644 readme.MD create mode 100644 routes/users.js create mode 100644 seeders/20170424055904-users.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9daa824 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.DS_Store +node_modules diff --git a/README.md b/README.md deleted file mode 100644 index 6379a41..0000000 --- a/README.md +++ /dev/null @@ -1 +0,0 @@ -# api-basic \ No newline at end of file diff --git a/app.js b/app.js new file mode 100644 index 0000000..170ce3a --- /dev/null +++ b/app.js @@ -0,0 +1,18 @@ +const express = require('express'); +const app = express(); +const bodyParser = require('body-parser'); +const port = process.env.PORT || 3000 + +// route +const users = require('./routes/users'); + +app.use(bodyParser.urlencoded({extended: false})); + +// use the route +app.use('/api/users', users); + +app.listen(port, function() { + console.log('app listening on port 3000!'); +}); + +module.exports = app; \ No newline at end of file diff --git a/config/config.json b/config/config.json new file mode 100644 index 0000000..d8a9b0c --- /dev/null +++ b/config/config.json @@ -0,0 +1,13 @@ +{ + "development": { + "username": "postgres", + "password": "12345", + "database": "api-basic", + "host": "127.0.0.1", + "port": 5432, + "dialect": "postgres" + }, + "production": { + "use_env_variable":"DATABASE_URL" + } +} diff --git a/controllers/users.js b/controllers/users.js new file mode 100644 index 0000000..bf2b6bb --- /dev/null +++ b/controllers/users.js @@ -0,0 +1,56 @@ +const db = require('../models'); +const methods = {}; + +methods.getAll = (req, res) => { + db.User.findAll() + .then(users => { + res.send(users); + }) + .catch(err => { + res.send(err); + }) +} + +methods.findId = (req, res) => { + db.User.findById(req.params.id) + .then(user => { + res.send(user); + }) + .catch(err => { + res.send(err); + }) +} + +methods.create = (req, res) => { + db.User.create({ + fullname: req.body.fullname, + email: req.body.email + }) + .then(() => { + res.send(`success create new user`); + }) +} + +methods.delete = (req, res) => { + db.User.destroy({where: {id: req.params.id}}) + .then(() => { + res.send('success delete user with id ' + req.params.id) + }) + .catch(err => { + res.send(err); + }) +} + +methods.update = (req, res) => { + // res.send(req.body) + db.User.update({fullname: req.body.fullname, email: req.body.email}, {where: {id: req.params.id}}) + .then(user => { + res.send(`success update user with id ${req.params.id}`); + }) + .catch(err => { + res.send(err); + }) +} + + +module.exports = methods; \ No newline at end of file diff --git a/migrations/20170424044304-create-user.js b/migrations/20170424044304-create-user.js new file mode 100644 index 0000000..2b6b836 --- /dev/null +++ b/migrations/20170424044304-create-user.js @@ -0,0 +1,30 @@ +'use strict'; +module.exports = { + up: function(queryInterface, Sequelize) { + return queryInterface.createTable('Users', { + id: { + allowNull: false, + autoIncrement: true, + primaryKey: true, + type: Sequelize.INTEGER + }, + fullname: { + type: Sequelize.STRING + }, + email: { + type: Sequelize.STRING + }, + createdAt: { + allowNull: false, + type: Sequelize.DATE + }, + updatedAt: { + allowNull: false, + type: Sequelize.DATE + } + }); + }, + down: function(queryInterface, Sequelize) { + return queryInterface.dropTable('Users'); + } +}; \ No newline at end of file diff --git a/models/index.js b/models/index.js new file mode 100644 index 0000000..7540dba --- /dev/null +++ b/models/index.js @@ -0,0 +1,36 @@ +'use strict'; + +var fs = require('fs'); +var path = require('path'); +var Sequelize = require('sequelize'); +var basename = path.basename(module.filename); +var env = process.env.NODE_ENV || 'development'; +var config = require(__dirname + '/../config/config.json')[env]; +var db = {}; + +if (config.use_env_variable) { + var sequelize = new Sequelize(process.env[config.use_env_variable]); +} else { + var sequelize = new Sequelize(config.database, config.username, config.password, config); +} + +fs + .readdirSync(__dirname) + .filter(function(file) { + return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js'); + }) + .forEach(function(file) { + var model = sequelize['import'](path.join(__dirname, file)); + db[model.name] = model; + }); + +Object.keys(db).forEach(function(modelName) { + if (db[modelName].associate) { + db[modelName].associate(db); + } +}); + +db.sequelize = sequelize; +db.Sequelize = Sequelize; + +module.exports = db; diff --git a/models/user.js b/models/user.js new file mode 100644 index 0000000..5242bd7 --- /dev/null +++ b/models/user.js @@ -0,0 +1,14 @@ +'use strict'; +module.exports = function(sequelize, DataTypes) { + var User = sequelize.define('User', { + fullname: DataTypes.STRING, + email: DataTypes.STRING + }, { + classMethods: { + associate: function(models) { + // associations can be defined here + } + } + }); + return User; +}; \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000..434c6e6 --- /dev/null +++ b/package.json @@ -0,0 +1,18 @@ +{ + "name": "api-basic", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "start": "node app.js" + }, + "author": "", + "license": "ISC", + "dependencies": { + "body-parser": "^1.17.1", + "express": "^4.15.2", + "pg": "^6.1.5", + "sequelize": "^3.30.4", + "sequelize-cli": "^2.7.0" + } +} diff --git a/readme.MD b/readme.MD new file mode 100644 index 0000000..287cf2c --- /dev/null +++ b/readme.MD @@ -0,0 +1,41 @@ +# Demo API BASIC +A simple demonstration of REST API BASIC using Express.JS + +### Installation +In folder config, create config.json file and insert this: + +```javascript +{ + "development": { + "username": "postgres", + "password": "12345", + "database": "api-basic", + "host": "127.0.0.1", + "port": 5432, + "dialect": "postgres" + } +} +``` + +Then: + +```javascript +npm install +npm start +``` + +### REST API +Access the API from http://localhost:3000/api/users +OR +https://afternoon-forest-87920.herokuapp.com/api/users + +List of users routes: + +Route | HTTP | Description +----- | ---- | ----------- +/api/users | GET | Get all the users +/api/users/:id | GET | Get a single user +/api/users | POST | create a user +/api/users/:id | DELETE | Delete a user +/api/users/:id | PUT | Update a user with new info + diff --git a/routes/users.js b/routes/users.js new file mode 100644 index 0000000..f50ccef --- /dev/null +++ b/routes/users.js @@ -0,0 +1,11 @@ +const express = require('express'); +const router = express.Router(); +const User = require('../controllers/users'); + +router.get('/', User.getAll); +router.get('/:id', User.findId); +router.post('/', User.create); +router.delete('/:id', User.delete); +router.put('/:id', User.update); + +module.exports = router; \ No newline at end of file diff --git a/seeders/20170424055904-users.js b/seeders/20170424055904-users.js new file mode 100644 index 0000000..e4e0b34 --- /dev/null +++ b/seeders/20170424055904-users.js @@ -0,0 +1,45 @@ +'use strict'; + +module.exports = { + up: function (queryInterface, Sequelize) { + /* + Add altering commands here. + Return a promise to correctly handle asynchronicity. + + Example: + return queryInterface.bulkInsert('Person', [{ + name: 'John Doe', + isBetaMember: false + }], {}); + */ + return queryInterface.bulkInsert('Users', [{ + fullname: 'John Wick', + email: 'wick@mail.com', + createdAt: new Date(), + updatedAt: new Date() + }, + { + fullname: 'John Doe', + email: 'doe@mail.com', + createdAt: new Date(), + updatedAt: new Date() + }, + { + fullname: 'John Bro', + email: 'bro@mail.com', + createdAt: new Date(), + updatedAt: new Date() + }], {}); + }, + + down: function (queryInterface, Sequelize) { + /* + Add reverting commands here. + Return a promise to correctly handle asynchronicity. + + Example: + return queryInterface.bulkDelete('Person', null, {}); + */ + return queryInterface.bulkDelete('Users', null, {}); + } +};