From 1bb0dfdfc95147941507bd33ffaa53ede9650f4e Mon Sep 17 00:00:00 2001 From: stedyyulius Date: Wed, 31 May 2017 14:33:53 +0700 Subject: [PATCH 1/2] database done --- .gitignore | 2 + Controllers/items-controller.js | 61 ++++++++++++++++++++++ Controllers/users-controller.js | 73 ++++++++++++++++++++++++++ Models/items.js | 14 +++++ Models/users.js | 12 +++++ app.js | 28 ++++++++++ bin/www | 90 +++++++++++++++++++++++++++++++++ package.json | 36 +++++++++++++ public/stylesheets/style.css | 8 +++ routes/index.js | 26 ++++++++++ views/error.jade | 6 +++ views/index.jade | 5 ++ views/layout.jade | 7 +++ 13 files changed, 368 insertions(+) create mode 100644 .gitignore create mode 100644 Controllers/items-controller.js create mode 100644 Controllers/users-controller.js create mode 100644 Models/items.js create mode 100644 Models/users.js create mode 100644 app.js create mode 100755 bin/www create mode 100644 package.json create mode 100644 public/stylesheets/style.css create mode 100644 routes/index.js create mode 100644 views/error.jade create mode 100644 views/index.jade create mode 100644 views/layout.jade diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1dcef2d --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +node_modules +.env \ No newline at end of file diff --git a/Controllers/items-controller.js b/Controllers/items-controller.js new file mode 100644 index 0000000..88d574e --- /dev/null +++ b/Controllers/items-controller.js @@ -0,0 +1,61 @@ +const Items = require('../Models/items.js') +const jwt = require('jsonwebtoken') +const Storage = require('dom-storage') +const localStorage = new Storage('./db.json', {strict:false,ws:' '}) +const Token = localStorage.getItem('myKey') +require('dotenv').config() + +function list (req,res,next){ + Items.find({},function(err,result){ + res.send(result) + }) + } + +function createItem(req,res,next){ + Items.create({ + name: req.body.name, + picture: req.body.picture, + stock: req.body.stock, + category: req.body.category + },function(err,result){ + res.send(`${req.body.name} Created!`) + }) +} + +function searchCategory (req,res,next){ + Items.find({ + category: req.body.category + },function(err,result){ + res.send(result) + }) + } + +function deleteItem (req,res,next){ + Items.remove({ + _id: req.params.id + },function(err,result){ + res.send('Delete Success!') + }) +} + +function editItem (req,res,next){ + Items.findOne({ + _id: req.params.id + },function(err,result){ + Items.updateOne({ + _id: req.params.id + },{ + name: req.body.name || result.name, + picture: req.body.picture || result.picture, + stock: req.body.stock || result.stock, + category: req.body.category || result.category, + price: req.body.price || result.price + },function(err,result){ + res.send('Update Success!') + }) + }) +} + +module.exports = { + list,searchCategory,deleteItem,editItem,createItem +} \ No newline at end of file diff --git a/Controllers/users-controller.js b/Controllers/users-controller.js new file mode 100644 index 0000000..cdb238d --- /dev/null +++ b/Controllers/users-controller.js @@ -0,0 +1,73 @@ +const Users = require('../Models/users.js') +const bcrypt = require('bcrypt') +const saltRounds = 10 +const jwt = require('jsonwebtoken') +const Storage = require('dom-storage') +const localStorage = new Storage('./db.json', {strict:false,ws:' '}) +const Token = localStorage.getItem('myKey') +require('dotenv').config() + +function UserList (req,res,next){ + Users.find({},function(err,result){ + res.send(result) + }) +} + +function signup (req,res,next){ + let salt = bcrypt.genSaltSync(saltRounds) + let hash = bcrypt.hashSync(req.body.password,salt) + Users.create({ + username: req.body.username, + password: hash, + email: req.body.email + },function(err,result){ + res.send('Sign Up Success!') + }) +} + +function login (req,res,next){ + Users.findOne({ + username: req.body.username + },function(err,result){ + if(result === null){ + res.send('Invalid Username!') + } + else{ + if(bcrypt.compare(req.body.password,result.password)){ + let token = jwt.sign({_id: result.id, username: result.username, email: result.email},process.env.SECRET) + localStorage.setItem('myKey',token) + res.send('login Success!') + } + else{ + res.send('Invalid Password!') + } + } + }) +} + +function editUser (req,res,next){ + User.findOne({ + _id: req.params.id + },function(err,result){ + User.updateOne({ + _id: req.params.id + },{ + username: req.body.username || result.username, + email: req.body.email || result.email + },function(err,result){ + res.send('Update User Sucess!') + }) + }) +} + +function deleteUser (req,res,next){ + User.remove({ + _id: req.params.id + },function(err,result){ + res.send('Delete Success!') + }) +} + +module.exports = { + signup,login,editUser,deleteUser,UserList +} \ No newline at end of file diff --git a/Models/items.js b/Models/items.js new file mode 100644 index 0000000..da050aa --- /dev/null +++ b/Models/items.js @@ -0,0 +1,14 @@ +const mongoose = require ('mongoose') +const Schema = mongoose.Schema + +var itemSchema = new Schema({ + name: String, + picture: String, + stock: Number, + category: String, + price: String +}) + +var Item = mongoose.model('Item',itemSchema) + +module.exports = Item diff --git a/Models/users.js b/Models/users.js new file mode 100644 index 0000000..f711c28 --- /dev/null +++ b/Models/users.js @@ -0,0 +1,12 @@ +const mongoose = require ('mongoose') +const Schema = mongoose.Schema + +var userSchema = new Schema({ + username: String, + password: String, + email: String +}) + +var User = mongoose.model('User',userSchema) + +module.exports = User \ No newline at end of file diff --git a/app.js b/app.js new file mode 100644 index 0000000..5f24ded --- /dev/null +++ b/app.js @@ -0,0 +1,28 @@ +var express = require('express'); +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 cors = require ('cors') +const mongoose = require('mongoose') +const uri = 'mongodb://medieval:medieval@ds157641.mlab.com:57641/ecommerce' +mongoose.connect(uri) +var db = mongoose.createConnection(uri) + +var app = express(); + +// view engine setup + +// 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(cors()) + +app.use('/', index); + +// catch 404 and forward to error handler +module.exports = app; diff --git a/bin/www b/bin/www new file mode 100755 index 0000000..be87da0 --- /dev/null +++ b/bin/www @@ -0,0 +1,90 @@ +#!/usr/bin/env node + +/** + * Module dependencies. + */ + +var app = require('../app'); +var debug = require('debug')('ecommerce: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/package.json b/package.json new file mode 100644 index 0000000..9abadb0 --- /dev/null +++ b/package.json @@ -0,0 +1,36 @@ +{ + "name": "ecommerce", + "version": "0.0.0", + "private": true, + "scripts": { + "start": "nodemon ./bin/www" + }, + "dependencies": { + "bcrypt": "^1.0.2", + "body-parser": "~1.17.1", + "cookie-parser": "~1.4.3", + "cors": "^2.8.3", + "debug": "~2.6.3", + "dom-storage": "^2.0.2", + "dotenv": "^4.0.0", + "express": "^4.15.3", + "express-generator": "^4.15.0", + "jade": "~1.11.0", + "jsonwebtoken": "^7.4.1", + "mongoose": "^4.10.4", + "morgan": "~1.8.1", + "serve-favicon": "~2.4.2" + }, + "description": "", + "main": "app.js", + "repository": { + "type": "git", + "url": "git+https://github.com/stedyyulius/ecommerce.git" + }, + "author": "", + "license": "ISC", + "bugs": { + "url": "https://github.com/stedyyulius/ecommerce/issues" + }, + "homepage": "https://github.com/stedyyulius/ecommerce#readme" +} 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..5722ed7 --- /dev/null +++ b/routes/index.js @@ -0,0 +1,26 @@ +var express = require('express'); +var router = express.Router(); +const ItemsController = require('../Controllers/items-controller.js') +const UsersController = require('../Controllers/users-controller.js') + +router.get('/', UsersController.UserList) +router.post('/signup', UsersController.signup) +router.post('/login', UsersController.login) +router.put('/editUser/:id', UsersController.editUser) +router.delete('/deleteUser/:id', UsersController.deleteUser) + +router.get('/items', ItemsController.list) +router.post('/search', ItemsController.searchCategory) +router.post('/createItem', ItemsController.createItem) +router.put('/editItem/:id', ItemsController.editItem) +router.delete('/deleteItem/:id', ItemsController.deleteItem) + +module.exports = router; + +// module.exports = { +// list,searchCategory,deleteItem,editItem +// } +// +// module.exports = { +// signup,login,editUser,deleteUser,UserList +// } \ No newline at end of file diff --git a/views/error.jade b/views/error.jade new file mode 100644 index 0000000..51ec12c --- /dev/null +++ b/views/error.jade @@ -0,0 +1,6 @@ +extends layout + +block content + h1= message + h2= error.status + pre #{error.stack} diff --git a/views/index.jade b/views/index.jade new file mode 100644 index 0000000..3d63b9a --- /dev/null +++ b/views/index.jade @@ -0,0 +1,5 @@ +extends layout + +block content + h1= title + p Welcome to #{title} diff --git a/views/layout.jade b/views/layout.jade new file mode 100644 index 0000000..15af079 --- /dev/null +++ b/views/layout.jade @@ -0,0 +1,7 @@ +doctype html +html + head + title= title + link(rel='stylesheet', href='/stylesheets/style.css') + body + block content From 5bf5241b186c138fda1c39f6af2f528205920d23 Mon Sep 17 00:00:00 2001 From: stedyyulius Date: Mon, 5 Jun 2017 07:40:25 +0700 Subject: [PATCH 2/2] seems to be done --- Controllers/items-controller.js | 19 +++++++++++++++---- Controllers/users-controller.js | 11 ++++++----- Models/items.js | 3 ++- db.json | 3 +++ package.json | 1 + routes/index.js | 6 ++++-- 6 files changed, 31 insertions(+), 12 deletions(-) create mode 100644 db.json diff --git a/Controllers/items-controller.js b/Controllers/items-controller.js index 88d574e..409ee95 100644 --- a/Controllers/items-controller.js +++ b/Controllers/items-controller.js @@ -3,6 +3,7 @@ const jwt = require('jsonwebtoken') const Storage = require('dom-storage') const localStorage = new Storage('./db.json', {strict:false,ws:' '}) const Token = localStorage.getItem('myKey') +const multer = require('multer',{dest:'uploads/'}) require('dotenv').config() function list (req,res,next){ @@ -16,15 +17,17 @@ function createItem(req,res,next){ name: req.body.name, picture: req.body.picture, stock: req.body.stock, - category: req.body.category + category: req.body.category, + description: req.body.description, + price: req.body.price },function(err,result){ - res.send(`${req.body.name} Created!`) + res.send(result) }) } function searchCategory (req,res,next){ Items.find({ - category: req.body.category + category: req.params.category },function(err,result){ res.send(result) }) @@ -38,6 +41,14 @@ function deleteItem (req,res,next){ }) } +function getItem (req,res,next){ + Items.findOne({ + _id: req.params.id + },function(err,result){ + res.send(result) + }) +} + function editItem (req,res,next){ Items.findOne({ _id: req.params.id @@ -57,5 +68,5 @@ function editItem (req,res,next){ } module.exports = { - list,searchCategory,deleteItem,editItem,createItem + list,searchCategory,deleteItem,editItem,createItem,getItem } \ No newline at end of file diff --git a/Controllers/users-controller.js b/Controllers/users-controller.js index cdb238d..3560b8d 100644 --- a/Controllers/users-controller.js +++ b/Controllers/users-controller.js @@ -21,7 +21,7 @@ function signup (req,res,next){ password: hash, email: req.body.email },function(err,result){ - res.send('Sign Up Success!') + res.send(result) }) } @@ -36,7 +36,7 @@ function login (req,res,next){ if(bcrypt.compare(req.body.password,result.password)){ let token = jwt.sign({_id: result.id, username: result.username, email: result.email},process.env.SECRET) localStorage.setItem('myKey',token) - res.send('login Success!') + res.send(token) } else{ res.send('Invalid Password!') @@ -46,10 +46,10 @@ function login (req,res,next){ } function editUser (req,res,next){ - User.findOne({ + Users.findOne({ _id: req.params.id },function(err,result){ - User.updateOne({ + Users.updateOne({ _id: req.params.id },{ username: req.body.username || result.username, @@ -61,13 +61,14 @@ function editUser (req,res,next){ } function deleteUser (req,res,next){ - User.remove({ + Users.remove({ _id: req.params.id },function(err,result){ res.send('Delete Success!') }) } + module.exports = { signup,login,editUser,deleteUser,UserList } \ No newline at end of file diff --git a/Models/items.js b/Models/items.js index da050aa..70386f7 100644 --- a/Models/items.js +++ b/Models/items.js @@ -6,7 +6,8 @@ var itemSchema = new Schema({ picture: String, stock: Number, category: String, - price: String + price: Number, + description: String }) var Item = mongoose.model('Item',itemSchema) diff --git a/db.json b/db.json new file mode 100644 index 0000000..d3d65bd --- /dev/null +++ b/db.json @@ -0,0 +1,3 @@ +{ + "myKey": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI1OTJmYWNlMzM3YTA3NTE1ZDI1YzUwY2IiLCJ1c2VybmFtZSI6InN0ZWR5IiwiZW1haWwiOiJzdGVkeUBnbWFpbC5jb20iLCJpYXQiOjE0OTY0NjQ4MzB9.ypmLLXApaq4XtxWD5ptA6nH8LkFvjUvlkG9pcmB3ZKs" +} \ No newline at end of file diff --git a/package.json b/package.json index 9abadb0..7a71c46 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,7 @@ "jsonwebtoken": "^7.4.1", "mongoose": "^4.10.4", "morgan": "~1.8.1", + "multer": "^1.3.0", "serve-favicon": "~2.4.2" }, "description": "", diff --git a/routes/index.js b/routes/index.js index 5722ed7..5f41694 100644 --- a/routes/index.js +++ b/routes/index.js @@ -10,11 +10,13 @@ router.put('/editUser/:id', UsersController.editUser) router.delete('/deleteUser/:id', UsersController.deleteUser) router.get('/items', ItemsController.list) -router.post('/search', ItemsController.searchCategory) +router.get('/search/:category', ItemsController.searchCategory) +router.get('/getItem/:id', ItemsController.getItem) router.post('/createItem', ItemsController.createItem) -router.put('/editItem/:id', ItemsController.editItem) +router.post('/editItem/:id', ItemsController.editItem) router.delete('/deleteItem/:id', ItemsController.deleteItem) + module.exports = router; // module.exports = {