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..409ee95 --- /dev/null +++ b/Controllers/items-controller.js @@ -0,0 +1,72 @@ +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') +const multer = require('multer',{dest:'uploads/'}) +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, + description: req.body.description, + price: req.body.price + },function(err,result){ + res.send(result) + }) +} + +function searchCategory (req,res,next){ + Items.find({ + category: req.params.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 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 + },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,getItem +} \ No newline at end of file diff --git a/Controllers/users-controller.js b/Controllers/users-controller.js new file mode 100644 index 0000000..3560b8d --- /dev/null +++ b/Controllers/users-controller.js @@ -0,0 +1,74 @@ +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(result) + }) +} + +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(token) + } + else{ + res.send('Invalid Password!') + } + } + }) +} + +function editUser (req,res,next){ + Users.findOne({ + _id: req.params.id + },function(err,result){ + Users.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){ + 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 new file mode 100644 index 0000000..70386f7 --- /dev/null +++ b/Models/items.js @@ -0,0 +1,15 @@ +const mongoose = require ('mongoose') +const Schema = mongoose.Schema + +var itemSchema = new Schema({ + name: String, + picture: String, + stock: Number, + category: String, + price: Number, + description: 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/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 new file mode 100644 index 0000000..7a71c46 --- /dev/null +++ b/package.json @@ -0,0 +1,37 @@ +{ + "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", + "multer": "^1.3.0", + "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..5f41694 --- /dev/null +++ b/routes/index.js @@ -0,0 +1,28 @@ +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.get('/search/:category', ItemsController.searchCategory) +router.get('/getItem/:id', ItemsController.getItem) +router.post('/createItem', ItemsController.createItem) +router.post('/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