diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3c3629e --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +node_modules diff --git a/README.md b/README.md index 6379a41..682ab0f 100644 --- a/README.md +++ b/README.md @@ -1 +1,10 @@ -# api-basic \ No newline at end of file +# api-basic +### basic users crud + +**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 \ No newline at end of file diff --git a/app.js b/app.js new file mode 100644 index 0000000..c4eadbe --- /dev/null +++ b/app.js @@ -0,0 +1,46 @@ +var express = require('express'); +var path = require('path'); +var favicon = require('serve-favicon'); +var logger = require('morgan'); +var cookieParser = require('cookie-parser'); +var bodyParser = require('body-parser'); + +var index = require('./routes/index'); +var users = require('./routes/users'); + +var app = express(); + +// view engine setup +app.set('views', path.join(__dirname, 'views')); +app.set('view engine', 'ejs'); + +// uncomment after placing your favicon in /public +//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico'))); +app.use(logger('dev')); +app.use(bodyParser.json()); +app.use(bodyParser.urlencoded({ extended: false })); +app.use(cookieParser()); +app.use(express.static(path.join(__dirname, 'public'))); + +app.use('/', index); +app.use('/api/users', users); + +// catch 404 and forward to error handler +app.use(function(req, res, next) { + var err = new Error('Not Found'); + err.status = 404; + next(err); +}); + +// error handler +app.use(function(err, req, res, next) { + // set locals, only providing error in development + res.locals.message = err.message; + res.locals.error = req.app.get('env') === 'development' ? err : {}; + + // render the error page + res.status(err.status || 500); + res.render('error'); +}); + +module.exports = app; diff --git a/bin/www b/bin/www new file mode 100755 index 0000000..e49e193 --- /dev/null +++ b/bin/www @@ -0,0 +1,90 @@ +#!/usr/bin/env node + +/** + * Module dependencies. + */ + +var app = require('../app'); +var debug = require('debug')('api-basic:server'); +var http = require('http'); + +/** + * Get port from environment and store in Express. + */ + +var port = normalizePort(process.env.PORT || '3000'); +app.set('port', port); + +/** + * Create HTTP server. + */ + +var server = http.createServer(app); + +/** + * Listen on provided port, on all network interfaces. + */ + +server.listen(port); +server.on('error', onError); +server.on('listening', onListening); + +/** + * Normalize a port into a number, string, or false. + */ + +function normalizePort(val) { + var port = parseInt(val, 10); + + if (isNaN(port)) { + // named pipe + return val; + } + + if (port >= 0) { + // port number + return port; + } + + return false; +} + +/** + * Event listener for HTTP server "error" event. + */ + +function onError(error) { + if (error.syscall !== 'listen') { + throw error; + } + + var bind = typeof port === 'string' + ? 'Pipe ' + port + : 'Port ' + port; + + // handle specific listen errors with friendly messages + switch (error.code) { + case 'EACCES': + console.error(bind + ' requires elevated privileges'); + process.exit(1); + break; + case 'EADDRINUSE': + console.error(bind + ' is already in use'); + process.exit(1); + break; + default: + throw error; + } +} + +/** + * Event listener for HTTP server "listening" event. + */ + +function onListening() { + var addr = server.address(); + var bind = typeof addr === 'string' + ? 'pipe ' + addr + : 'port ' + addr.port; + debug('Listening on ' + bind); +} diff --git a/config/config.json b/config/config.json new file mode 100644 index 0000000..6531a80 --- /dev/null +++ b/config/config.json @@ -0,0 +1,24 @@ +{ + "development": { + "username": "bill", + "password": "bill", + "database": "api_basic", + "host": "127.0.0.1", + "dialect": "postgres", + "port": "5432" + }, + "test": { + "username": "root", + "password": null, + "database": "database_test", + "host": "127.0.0.1", + "dialect": "mysql" + }, + "production": { + "username": "root", + "password": null, + "database": "database_production", + "host": "127.0.0.1", + "dialect": "mysql" + } +} diff --git a/controllers/userController.js b/controllers/userController.js new file mode 100644 index 0000000..2c78e72 --- /dev/null +++ b/controllers/userController.js @@ -0,0 +1,47 @@ +const db = require('../models'); +let getAllUser = function (req, res){ + db.User.findAll({order: '"id" ASC'}).then((users)=>{ + res.send(users) + }) +} +let getUser = function(req, res){ + db.User.findOne({where: {id : req.params.id}}) + .then((user)=>{ + res.send(user) + }) +} +let createUser = function(req,res){ + let n = req.body.name + let a = req.body.age + db.User.create({ + name: n, + age: a + }) + .then((newuser)=>{ + res.send(newuser) + }) +} +let deleteUser= function(req,res){ + db.User.destroy({where: {id: req.params.id}}).then(()=>{ + db.User.findAll({order: '"id" ASC'}).then((users)=>{ + res.send(users) + }) + }) +} +let updateUser= function(req,res){ + let n = req.body.name + let a = req.body.age + db.User.findOne({where:{id: req.params.id}}) + .then((user)=>{ + user.updateAttributes({ + name: n, + age: a + }) + .then((user)=>{ + res.send(user) + }) + }) +} +module.exports={ + getAllUser, getUser, createUser, deleteUser, updateUser +} \ No newline at end of file diff --git a/migrations/20170425042719-create-user.js b/migrations/20170425042719-create-user.js new file mode 100644 index 0000000..4ea106b --- /dev/null +++ b/migrations/20170425042719-create-user.js @@ -0,0 +1,32 @@ +'use strict'; +module.exports = { + up: function(queryInterface, Sequelize) { + return queryInterface.createTable('Users', { + id: { + allowNull: false, + autoIncrement: true, + primaryKey: true, + type: Sequelize.INTEGER + }, + name: { + type: Sequelize.STRING + }, + age: { + type: Sequelize.INTEGER + }, + createdAt: { + allowNull: false, + type: Sequelize.DATE, + defaultValue: new Date() + }, + updatedAt: { + allowNull: false, + type: Sequelize.DATE, + defaultValue: new 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..cb327fe --- /dev/null +++ b/models/user.js @@ -0,0 +1,14 @@ +'use strict'; +module.exports = function(sequelize, DataTypes) { + var User = sequelize.define('User', { + name: DataTypes.STRING, + age: DataTypes.INTEGER + }, { + 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..8dfa923 --- /dev/null +++ b/package.json @@ -0,0 +1,24 @@ +{ + "name": "api-basic", + "version": "0.0.0", + "private": true, + "scripts": { + "start": "nodemon ./bin/www" + }, + "dependencies": { + "body-parser": "~1.17.1", + "cookie-parser": "~1.4.3", + "debug": "~2.6.3", + "ejs": "~2.5.6", + "express": "~4.15.2", + "morgan": "~1.8.1", + "pg": "^6.1.5", + "sequelize": "^3.30.4", + "sequelize-cli": "^2.7.0", + "serve-favicon": "~2.4.2", + "sqlite3": "^3.1.8" + }, + "devDependencies": { + "nodemon": "^1.11.0" + } +} diff --git a/public/stylesheets/style.css b/public/stylesheets/style.css new file mode 100644 index 0000000..9453385 --- /dev/null +++ b/public/stylesheets/style.css @@ -0,0 +1,8 @@ +body { + padding: 50px; + font: 14px "Lucida Grande", Helvetica, Arial, sans-serif; +} + +a { + color: #00B7FF; +} diff --git a/routes/index.js b/routes/index.js new file mode 100644 index 0000000..ecca96a --- /dev/null +++ b/routes/index.js @@ -0,0 +1,9 @@ +var express = require('express'); +var router = express.Router(); + +/* GET home page. */ +router.get('/', function(req, res, next) { + res.render('index', { title: 'Express' }); +}); + +module.exports = router; diff --git a/routes/users.js b/routes/users.js new file mode 100644 index 0000000..cb5f7f0 --- /dev/null +++ b/routes/users.js @@ -0,0 +1,12 @@ +var express = require('express'); +var api = require('../controllers/userController') +var router = express.Router(); + +/* GET users listing. */ +router.get('/', api.getAllUser) +router.get('/:id', api.getUser) +router.post('/', api.createUser) +router.delete('/:id', api.deleteUser) +router.put('/:id', api.updateUser) + +module.exports = router; diff --git a/views/error.ejs b/views/error.ejs new file mode 100644 index 0000000..7cf94ed --- /dev/null +++ b/views/error.ejs @@ -0,0 +1,3 @@ +
<%= error.stack %>diff --git a/views/index.ejs b/views/index.ejs new file mode 100644 index 0000000..7b7a1d6 --- /dev/null +++ b/views/index.ejs @@ -0,0 +1,11 @@ + + + +
Welcome to <%= title %>
+ +