Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions dan-stineback/.eslintignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
**/node_modules/*
**/vendor/*
**/*.min.js
/*.md
/package.json
/npm-debug.log
41 changes: 41 additions & 0 deletions dan-stineback/.eslintrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
{
"rules": {
"no-console": 0,
"indent": [
2,
2
],
"quotes": [
2,
"single"
],
"linebreak-style": [
2,
"unix"
],
"semi": [
2,
"always"
]
},
"env": {
"es6": true,
"node": true,
"browser": true,
"mocha": true
},
"globals": {
"describe": false,
"it": false,
"beforeEach": false,
"afterEach": false,
"before": false,
"after": false
},
"ecmaFeatures": {
"modules": true,
"experimentalObjectRestSpread": true,
"impliedStrict": true
},
"extends": "eslint:recommended"
}
3 changes: 2 additions & 1 deletion dan-stineback/.gitignore
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
node_modules
/node_modules
/db
1 change: 0 additions & 1 deletion dan-stineback/gulpfile.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
const gulp = require('gulp');
const eslint = require('gulp-eslint');
const mocha = require('gulp-mocha');
const watch = require('gulp-watch');

gulp.task('default', ['lint', 'test'], () => {
console.log('started');
Expand Down
3 changes: 0 additions & 3 deletions dan-stineback/index.js

This file was deleted.

18 changes: 18 additions & 0 deletions dan-stineback/lib/basic-http.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
'use strict';

module.exports = function(req, res, next) {
let basicAuth = req.headers.authorization;
let authString = basicAuth.split(' ').pop();
let authBuff = new Buffer(authString, 'base64');
let asciiAuth = authBuff.toString();
let authArray = asciiAuth.split(':');
authBuff.fill(0);
req.auth = {
username: authArray[0],
password: authArray[1]
};
if(!req.auth.username || !req.auth.password) {
return next(new Error('Username or Password missing'));
}
next();
};
27 changes: 27 additions & 0 deletions dan-stineback/lib/jwt_auth.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
'use strict';

const jwt = require('jsonwebtoken');
const User = require('../model/user');
const secret = process.env.SECRET || 'changeme';

module.exports = function(req, res, next) {


let token = req.headers.token || req.body.token;
let tokenErr = new Error('Authorization Failure');
let decodedToken;

if (!token) return next(tokenErr);

try {
decodedToken = jwt.verify(token, secret);
} catch(e) {
return next(tokenErr);
}

User.findOne({_id: decodedToken._id}, (err, user) => {
if (!user || err) return next(tokenErr);
req.user = user;
next();
});
};
46 changes: 0 additions & 46 deletions dan-stineback/lib/server.js

This file was deleted.

10 changes: 10 additions & 0 deletions dan-stineback/model/cats.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
'use strict';

const mongoose = require('mongoose');

const Cat = new mongoose.Schema({
name: String,
age: Number
});

module.exports = mongoose.model('cat', Cat);
10 changes: 10 additions & 0 deletions dan-stineback/model/dogs.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
'use strict';

const mongoose = require('mongoose');

const Dog = new mongoose.Schema({
name: String,
age: Number
});

module.exports = mongoose.model('dog', Dog);
25 changes: 25 additions & 0 deletions dan-stineback/model/user.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
'use strict';

const mongoose = require('mongoose');
const bcrypt = require('bcrypt');
const secret = process.env.SECRET || 'changeme';
const jwt = require('jsonwebtoken');

const User = new mongoose.Schema({
username: {type: String, required: true},
password: {type: String, required: true}
});

User.methods.hashedPassword = function() {
return bcrypt.hashSync(this.password, 8);
};

User.methods.comparePassword = function(password) {
return bcrypt.compareSync(password, this.password);
};

User.methods.generateToken = function() {
return jwt.sign({_id: this._id}, secret);
};

module.exports = mongoose.model('user', User);
17 changes: 12 additions & 5 deletions dan-stineback/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,14 @@
"name": "dan-stineback",
"version": "1.0.0",
"description": "rest api project",
"main": "index.js",
"main": "server.js",
"directories": {
"test": "test"
},
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
"test": "./node_modules/mocha/bin/mocha",
"start": "node server.js",
"lint": "./node_modules/eslint/bin/eslint.js *"
},
"repository": {
"type": "git",
Expand All @@ -20,15 +22,20 @@
},
"homepage": "https://github.com/dstineback/rest_api#readme",
"dependencies": {
"body-parser": "^1.15.1"
"bcrypt": "^0.8.6",
"body-parser": "^1.15.1",
"cors": "^2.7.1",
"eslint": "^2.11.1",
"jsonwebtoken": "^7.0.0",
"morgan": "^1.7.0"
},
"devDependencies": {
"chai": "^3.5.0",
"chai-http": "^2.0.1",
"gulp": "^3.9.1",
"gulp-eslint": "^2.0.0",
"gulp-mocha": "^2.2.0",
"gulp-watch": "^4.3.6",
"mocha": "^2.5.1"
"mocha": "^2.5.1",
"mongoose": "^4.4.19"
}
}
40 changes: 40 additions & 0 deletions dan-stineback/routes/cat-route.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
'use strict';
const express = require('express');
const Cat = require('../model/cats');
const bodyParser = require('body-parser').json();
const jwtAuth = require('../lib/jwt_auth');


const catRouter = module.exports = exports = express.Router();


catRouter.get('/', (req, res, next) => {
Cat.find({}, (err, cat) => {
if(err) return next(err);
res.json(cat);
});
});

catRouter.post('/', bodyParser, jwtAuth, (req, res, next) => {
let newCat = new Cat(req.body);
newCat.save((err, cat)=> {
if (err) return next(err);
res.json(cat);
});
});

catRouter.put('/', bodyParser, jwtAuth, (req, res, next) => {
let _id = req.body._id;
Cat.findOneAndUpdate({_id}, req.body, (err, cat) =>{
if (err) return next(err);
res.json({message:'successfully updated', data: cat});
});
});

catRouter.delete('/:id', jwtAuth, (req, res, next) => {
let _id = req.params.id;
Cat.findOneAndRemove({_id}, null, (err, cat) => {
if (err) return next(err);
res.json({message: 'successfully deleted', data: cat});
});
});
39 changes: 39 additions & 0 deletions dan-stineback/routes/dog-route.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
'use strict';
const express = require('express');
const Dog = require('../model/dogs');
const bodyParser = require('body-parser').json();
const jwtAuth = require('../lib/jwt_auth');

const dogRouter = module.exports = exports = express.Router();


dogRouter.get('/', (req, res, next) => {
Dog.find({}, (err, dog) => {
if(err) return next(err);
res.json(dog);
});
});

dogRouter.post('/', bodyParser, jwtAuth, (req, res, next) => {
let newDog = new Dog(req.body);
newDog.save((err, dog)=> {
if (err) return next(err);
res.json(dog);
});
});

dogRouter.put('/', bodyParser, jwtAuth, (req, res, next) => {
let _id = req.body._id;
Dog.findOneAndUpdate({_id}, req.body, (err, dog) =>{
if (err) return next(err);
res.json({message: 'successfully updated', data: dog});
});
});

dogRouter.delete('/:id', jwtAuth, (req, res, next) => {
let _id = req.params.id;
Dog.findOneAndRemove({_id}, null, (err, dog) => {
if (err) return next(err);
res.json({message: 'successfully deleted', data: dog});
});
});
30 changes: 30 additions & 0 deletions dan-stineback/routes/router.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
'use strict';
const express = require('express');
const bodyParser = require('body-parser').json();
const User = require('../model/user');
const basicHTTP = require('../lib/basic-http');

const router = module.exports = exports = express.Router();

router.post('/signup', bodyParser, (req, res, next) => {
let newUser = new User(req.body);
let hashedPassword = newUser.hashedPassword();
newUser.password = hashedPassword;
req.body.password = null;
User.findOne({username: req.body.username}, (err, user) => {
if (err || user) return next(new Error('User name already used'));
newUser.save((err, user) => {
if (err) return next(new Error('Could not save user'));
res.json({message: req.body.username + ' We mad a token for you', token: user.generateToken()});

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We made a token..

});
});
});

router.post('/signin', basicHTTP, (req, res, next) => {
User.findOne({username: req.auth.username}, (err, user) => {
if (err || !user) return next(new Error('Could not sign in'));
if (!user.comparePassword(req.auth.password)) return next(new Error('wrong password'));

res.json({message: req.auth.username + ' Here is your token', token: user.generateToken()});
});
});
31 changes: 31 additions & 0 deletions dan-stineback/server.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
'use strict';

const express = require('express');
const app = express();
const mongoose = require('mongoose');
const morgan = require('morgan');
const cors = require('cors');


const dbPort = process.env.MONGODB_URI || 'mongodb://localhost/dev_db';
mongoose.connect(dbPort);

const dogRouter = require(__dirname + '/routes/dog-route');
const catRouter = require(__dirname + '/routes/cat-route');
const authRouter = require(__dirname + '/routes/router');

app.use(cors());
app.use(morgan('dev'));
app.use('/dogs', dogRouter);
app.use('/cats', catRouter);
app.use('/', authRouter);

app.use((err, req, res, next) => {
res.status(500).json({message: err.message});
next(err);
});

app.use((req, res)=> {
res.status(404).json({message: 'not found'});
});
app.listen(3000, () => console.log('server is up on 3000'));
Loading