diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..91dfed8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.DS_Store +node_modules \ No newline at end of file diff --git a/README.md b/README.md index 6379a41..2770734 100644 --- a/README.md +++ b/README.md @@ -1 +1,31 @@ -# api-basic \ No newline at end of file +# api-basic + +# User App + +## Demo app with basic REST API + +# REST API + +## List of basic routes: + + +| Routes | 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 | + + +# Usage: + +## with only npm: + +npm install + +npm start + +npm run dev + +Access the website via http://localhost:3000 or API via http://localhost:3000/api diff --git a/config/config.json b/config/config.json new file mode 100644 index 0000000..b5f6afe --- /dev/null +++ b/config/config.json @@ -0,0 +1,10 @@ +{ + "development": { + "username": "arahito", + "password": "arahito", + "database": "senin", + "host": "127.0.0.1", + "port": "5432", + "dialect": "postgres" + } +} diff --git a/controllers/userController.js b/controllers/userController.js new file mode 100644 index 0000000..98635f6 --- /dev/null +++ b/controllers/userController.js @@ -0,0 +1,77 @@ +var db = require('../models') +var methods = {} + +methods.insertOne = (req, res, next) => { + db.User.create(req.body) + .then(record => { + res.json(record) + }) + .catch(err => { + res.json({ + err, + message: 'Error waktu createOne' + }) + }) +} + +methods.getAll = (req, res, next) => { + db.User.findAll() + .then(records => { + res.json(records) + }) + .catch(err => { + res.json({ + err, + message: 'Error waktu getAll' + }) + }) +} + +methods.getById = (req, res, next) => { + db.User.findById(req.params.id) + .then(record => { + res.json(record) + }) + .catch(err => { + res.json({ + err, + message: 'Error waktu getById' + }) + }) +} + +methods.updateById = (req, res, next) => { + db.User.update(req.body, { + where: { + id: req.params.id + } + }) + .then((record) => { + res.json(record) + }) + .catch(err => { + res.json({ + err, + message: 'Error waktu updateById' + }) + }) +} //updateById + +methods.deleteById = (req, res, next) => { + db.User.destroy({ + where: { + id: req.params.id + } + }) + .then((record) => { + res.json(record) + }) + .catch(err => { + res.json({ + err, + message: 'Error waktu deleteById' + }) + }) +} + +module.exports = methods \ No newline at end of file diff --git a/migrations/20170425044416-create-user.js b/migrations/20170425044416-create-user.js new file mode 100644 index 0000000..7055bac --- /dev/null +++ b/migrations/20170425044416-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 + }, + username: { + type: Sequelize.STRING + }, + password: { + 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..7789681 --- /dev/null +++ b/models/user.js @@ -0,0 +1,14 @@ +'use strict'; +module.exports = function(sequelize, DataTypes) { + var User = sequelize.define('User', { + username: DataTypes.STRING, + password: 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..7bb76e6 --- /dev/null +++ b/package.json @@ -0,0 +1,28 @@ +{ + "name": "api-basic", + "version": "1.0.0", + "description": "User App Demo app with baic REST API", + "main": "index.js", + "scripts": { + "start": "node server.js", + "dev": "nodemon server.js", + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/uciarahito/api-basic.git" + }, + "author": "", + "license": "ISC", + "bugs": { + "url": "https://github.com/uciarahito/api-basic/issues" + }, + "homepage": "https://github.com/uciarahito/api-basic#readme", + "dependencies": { + "body-parser": "^1.17.1", + "express": "^4.15.2", + "morgan": "^1.8.1", + "pg": "^6.1.5", + "sequelize": "^3.30.4" + } +} diff --git a/routes/index.js b/routes/index.js new file mode 100644 index 0000000..5f311d8 --- /dev/null +++ b/routes/index.js @@ -0,0 +1,14 @@ +'use strict'; +const router = require('express').Router() +const userController = require('../controllers/userController') + +// NOTE: routes user +router.post('/api/users', userController.insertOne) +router.get('/api/users', userController.getAll) +router.get('/api/user/:id', userController.getById) +router.put('/api/users/:id', userController.updateById) +router.delete('/api/users/:id', userController.deleteById) + + + +module.exports = router \ No newline at end of file diff --git a/server.js b/server.js new file mode 100644 index 0000000..348e851 --- /dev/null +++ b/server.js @@ -0,0 +1,18 @@ +const express = require('express') +const app = express() + +// NOTE: set +app.set('port', process.env.PORT || 3000) + +// NOTE: use +app.use(require('morgan')('dev')) +app.use(require('body-parser').urlencoded({ + extended: false +})); +app.use(require('body-parser').json()); +app.use('/', require('./routes/index')) + +// NOTE: run +app.listen(app.get('port'), () => { + console.log('Listening on port ' + app.get('port')); +}) \ No newline at end of file