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 38e49cd..9034460 100644 --- a/README.md +++ b/README.md @@ -1 +1,31 @@ -# mongodb-crud \ No newline at end of file +# mongodb-crud + +# MongoDB-CRUD App + +## Demo app mongoDB with REST API + +# REST API + +## List of basic routes: + + +| Routes | HTTP | Description | +| --------------- | ------------- | --------------------------- | +| /api/books | GET | Get all the books | +| /api/books/:id | GET | Get a single book | +| /api/books | POST | Create a book | +| /api/books/:id | DELETE | Delete a book | +| /api/books/:id | PUT | Update a book 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/app.js b/app.js new file mode 100644 index 0000000..616a10f --- /dev/null +++ b/app.js @@ -0,0 +1,48 @@ +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('/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; \ No newline at end of file diff --git a/bin/www b/bin/www new file mode 100644 index 0000000..1efba33 --- /dev/null +++ b/bin/www @@ -0,0 +1,90 @@ +#!/usr/bin/env node + +/** + * Module dependencies. + */ + +var app = require('../app'); +var debug = require('debug')('mongodb-crud: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/controllers/bookController.js b/controllers/bookController.js new file mode 100644 index 0000000..cca5dc6 --- /dev/null +++ b/controllers/bookController.js @@ -0,0 +1,107 @@ +var methods = {} +var mongo = require('mongodb') +var MongoClient = require('mongodb').MongoClient +var url = 'mongodb://localhost/mongodbcrud' + +methods.insert = function(req, res, next) { + MongoClient.connect(url, function(err, db) { + var collection = db.collection('books') + collection.insertOne((req.body), (err, record) => { + if (err) { + // console.log('Masuk'); + res.json({ + err + }) + } else { + res.json(record) + } + db.close() + }) + }); +} + +methods.update = function(req, res, next) { + MongoClient.connect(url, function(err, db) { + var collection = db.collection('books') + collection.updateOne({ + "_id": new mongo.ObjectID(req.params.id) + }, { + $set: { + "isbn": req.body.isbn, + "title": req.body.title, + "author": req.body.author, + "category": req.body.category, + "stock": req.body.stock + } + }, function(err, record) { + // console.log(record); + if (err) { + // console.log('Masuk'); + res.json({ + err + }) + } else { + res.json(record) + } + db.close() + }); + }); +} + +methods.getAll = function(req, res, next) { + MongoClient.connect(url, function(err, db) { + var collection = db.collection('books') + collection.find({}).toArray(function(err, records) { + console.log("Found the following records"); + if (err) { + res.json({ + err + }) + } else { + res.json(records) + } + db.close() + }); + }); +} + +methods.getById = function(req, res, next) { + MongoClient.connect(url, function(err, db) { + var collection = db.collection('books') + collection.find({ + "_id": new mongo.ObjectID(req.params.id) + }).toArray(function(err, records) { + console.log("Found the following records"); + if (err) { + res.json({ + err + }) + } else { + res.json(records) + } + db.close() + }); + }); +} + +methods.delete = function(req, res, next) { + MongoClient.connect(url, function(err, db) { + var collection = db.collection('books') + collection.deleteOne({ + "_id": new mongo.ObjectID(req.params.id) + }, function(err, record) { + // console.log(record); + if (err) { + // console.log('Masuk'); + res.json({ + err + }) + } else { + res.json(record) + } + db.close() + }); + }); +} + +module.exports = methods \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000..2cfa163 --- /dev/null +++ b/package.json @@ -0,0 +1,18 @@ +{ + "name": "mongodb-crud", + "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", + "mongodb": "^2.2.26", + "morgan": "~1.8.1", + "serve-favicon": "~2.4.2" + } +} 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..02dcb4f --- /dev/null +++ b/routes/index.js @@ -0,0 +1,12 @@ +var express = require('express'); +var router = express.Router(); +const bookController = require('../controllers/bookController') + +/* GET home page. */ +router.post('/api/books', bookController.insert) +router.put('/api/book/:id', bookController.update) +router.get('/api/book/:id', bookController.getById) +router.get('/api/books', bookController.getAll) +router.delete('/api/book/:id', bookController.delete) + +module.exports = router; \ No newline at end of file diff --git a/routes/users.js b/routes/users.js new file mode 100644 index 0000000..623e430 --- /dev/null +++ b/routes/users.js @@ -0,0 +1,9 @@ +var express = require('express'); +var router = express.Router(); + +/* GET users listing. */ +router.get('/', function(req, res, next) { + res.send('respond with a resource'); +}); + +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 @@ +

<%= message %>

+

<%= error.status %>

+
<%= 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 @@ + + + + <%= title %> + + + +

<%= title %>

+

Welcome to <%= title %>

+ +