diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 0000000..6d505ad --- /dev/null +++ b/.eslintrc @@ -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" +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a833cdc --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +node_modules +data +db diff --git a/gulpfile.js b/gulpfile.js new file mode 100644 index 0000000..390059f --- /dev/null +++ b/gulpfile.js @@ -0,0 +1,29 @@ +const gulp = require('gulp'); +const eslint = require('gulp-eslint'); +const mocha = require('gulp-mocha'); + +gulp.task('lint', () => { + gulp.src(['./*.js', './test/*.js']) + .pipe(eslint({ + env: [ + 'mocha', + 'es6' + ] + })) + .pipe(eslint.format()); +}); + +gulp.task('mocha', () => { + return gulp.src('./test/*.js', { + read: false + }) + .pipe(mocha({ + reporter: 'nyan' + })); +}); + +gulp.task('watch', () => { + gulp.watch(['./*.js', './test/*.js' ], ['mocha', 'lint']); +}); + +gulp.task('default', ['mocha', 'lint', 'watch']); diff --git a/lib/error_handling.js b/lib/error_handling.js new file mode 100644 index 0000000..b15db97 --- /dev/null +++ b/lib/error_handling.js @@ -0,0 +1,5 @@ +'use strict'; + +module.exports = function(err, req, res) { + res.status(500).json({message: err.message}); +}; diff --git a/npm-debug.log b/npm-debug.log new file mode 100644 index 0000000..5e0f2d4 --- /dev/null +++ b/npm-debug.log @@ -0,0 +1,43 @@ +0 info it worked if it ends with ok +1 verbose cli [ '/Users/drewferris/.node/bin/node', +1 verbose cli '/Users/drewferris/.node/bin/npm', +1 verbose cli 'run', +1 verbose cli 'lint' ] +2 info using npm@2.15.1 +3 info using node@v4.4.3 +4 verbose run-script [ 'prelint', 'lint', 'postlint' ] +5 info prelint man-united@1.0.0 +6 info lint man-united@1.0.0 +7 verbose unsafe-perm in lifecycle true +8 info man-united@1.0.0 Failed to exec lint script +9 verbose stack Error: man-united@1.0.0 lint: `./node_modules/eslint/bin/eslint.js *` +9 verbose stack Exit status 1 +9 verbose stack at EventEmitter. (/Users/drewferris/.node/lib/node_modules/npm/lib/utils/lifecycle.js:217:16) +9 verbose stack at emitTwo (events.js:87:13) +9 verbose stack at EventEmitter.emit (events.js:172:7) +9 verbose stack at ChildProcess. (/Users/drewferris/.node/lib/node_modules/npm/lib/utils/spawn.js:24:14) +9 verbose stack at emitTwo (events.js:87:13) +9 verbose stack at ChildProcess.emit (events.js:172:7) +9 verbose stack at maybeClose (internal/child_process.js:827:16) +9 verbose stack at Process.ChildProcess._handle.onexit (internal/child_process.js:211:5) +10 verbose pkgid man-united@1.0.0 +11 verbose cwd /Users/drewferris/401/my_assignmnents/drew_rest_api +12 error Darwin 14.5.0 +13 error argv "/Users/drewferris/.node/bin/node" "/Users/drewferris/.node/bin/npm" "run" "lint" +14 error node v4.4.3 +15 error npm v2.15.1 +16 error code ELIFECYCLE +17 error man-united@1.0.0 lint: `./node_modules/eslint/bin/eslint.js *` +17 error Exit status 1 +18 error Failed at the man-united@1.0.0 lint script './node_modules/eslint/bin/eslint.js *'. +18 error This is most likely a problem with the man-united package, +18 error not with npm itself. +18 error Tell the author that this fails on your system: +18 error ./node_modules/eslint/bin/eslint.js * +18 error You can get information on how to open an issue for this project with: +18 error npm bugs man-united +18 error Or if that isn't available, you can get their info via: +18 error +18 error npm owner ls man-united +18 error There is likely additional logging output above. +19 verbose exit [ 1, true ] diff --git a/package.json b/package.json new file mode 100644 index 0000000..9acf446 --- /dev/null +++ b/package.json @@ -0,0 +1,43 @@ +{ + "name": "man-united", + "version": "1.0.0", + "description": "Class Projest- Router", + "main": "index.js", + "directories": { + "test": "mocha" + }, + "scripts": { + "test": "./node_modules/mocha/bin/mocha", + "start": "node server.js", + "lint": "./node_modules/eslint/bin/eslint.js *" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/drewferris/man-united-router.git" + }, + "keywords": [ + "router", + "server" + ], + "author": "Drew Ferris", + "license": "ISC", + "bugs": { + "url": "https://github.com/drewferris/man-united-router/issues" + }, + "homepage": "https://github.com/drewferris/man-united-router#readme", + "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.5", + "mocha": "^2.4.5", + "mongoose": "^4.4.19", + "morgan": "^1.7.0" + }, + "dependencies": { + "body-parser": "^1.15.1", + "express": "^4.13.4" + } +} diff --git a/routes/barca_routes.js b/routes/barca_routes.js new file mode 100644 index 0000000..1342dfe --- /dev/null +++ b/routes/barca_routes.js @@ -0,0 +1,41 @@ +'use strict'; + +const express = require('express'); +const bodyParser = require('body-parser').json(); +const BarcaPlayer = require('../schema/barca_Player'); + +const router = module.exports = exports = express.Router(); + +router.get('/', (req, res) => { + BarcaPlayer.find({}, (err, data) => { + if(err) return res.json({ + message: err.message + }); + res.json(data); + }); +}); + +router.post('/', bodyParser, (req, res) => { + let newBarcaPlayer = new BarcaPlayer(req.body); + newBarcaPlayer.save((err, data) => { + if(err) return res.json({message: err.message}); + res.json(data); + }); +}); + +router.put('/', bodyParser, (req, res, next) => { + BarcaPlayer.findOneAndUpdate({_id: req.body._id}, req.body, (err) => { + if(err) return next(err); + let message = 'successfully updated'; + res.json({message}); + }); +}); + +router.delete('/:id', bodyParser, (req, res, next) => { + let _id = req.params.id; + BarcaPlayer.findOneAndRemove({_id}, null, (err) => { + if(err) return next(err); + let message = 'successfully deleted'; + res.json({message}); + }); +}); diff --git a/routes/compare_route.js b/routes/compare_route.js new file mode 100644 index 0000000..47db904 --- /dev/null +++ b/routes/compare_route.js @@ -0,0 +1,36 @@ +'use strict'; + +const express = require('express'); +const BarcaPlayer = require('../schema/barca_Player'); +const ManUnitedPlayer = require('../schema/man_United_Player'); + +const router = module.exports = exports = express.Router(); + +router.get('/mostGoals', (req, res, next) => { + let teamGoalArray = []; + + ManUnitedPlayer.find({}, (err, player)=>{ + if (err) return next(err); + let totalManUGoalsScored = player.reduce((acc, player) => { + return acc += player.goals; + }, 0); + console.log(totalManUGoalsScored); + teamGoalArray.push(totalManUGoalsScored); + }); + BarcaPlayer.find({}, (err, player)=>{ + if (err) return next(err); + let totalBarcaGoalsScored = player.reduce((acc, player) => { + return acc += player.goals; + }, 0); + teamGoalArray.push(totalBarcaGoalsScored); + + if (teamGoalArray[1] > teamGoalArray[0]) { + res.json('Barcalona players scored ' + teamGoalArray[1] + ' goals, which is more than Man United Players.'); + } else if (teamGoalArray[1] < teamGoalArray[0]) { + res.json('Man United players scored ' + teamGoalArray[0] + ' goals, which is more than Barcalona Players.'); + } else { + res.json('They scored the same amount.'); + } + }); + +}); diff --git a/routes/man_united_routes.js b/routes/man_united_routes.js new file mode 100644 index 0000000..5e470b6 --- /dev/null +++ b/routes/man_united_routes.js @@ -0,0 +1,44 @@ +'use strict'; + +const express = require('express'); +const bodyParser = require('body-parser').json(); +const ManUnitedPlayer = require('../schema/man_United_Player'); + +const router = module.exports = exports = express.Router(); + +router.get('/', (req, res) => { + ManUnitedPlayer.find({}, (err,data) => { + if(err) return res.json({ + message: err.message + }); + res.json(data); + }); +}); + +router.post('/', bodyParser, (req, res) => { + let newManUnitedPlayer = new ManUnitedPlayer(req.body); + newManUnitedPlayer.save((err, data) => { + if(err) return res.json({ + message: err.message + }); + res.json(data); + }); +}); + +router.put('/', bodyParser, (req, res, next) => { + let _id = req.body._id; + ManUnitedPlayer.findOneAndUpdate({_id}, req.body, (err) => { + if(err) return next(err); + let message = 'successfully updated'; + res.json({message}); + }); +}); + +router.delete('/:id', bodyParser, (req, res, next) => { + let _id = req.params.id; + ManUnitedPlayer.findOneAndRemove({_id}, null, (err) => { + if(err) return next(err); + let message = 'successfully deleted'; + res.json({message}); + }); +}); diff --git a/schema/barca_Player.js b/schema/barca_Player.js new file mode 100644 index 0000000..b44d552 --- /dev/null +++ b/schema/barca_Player.js @@ -0,0 +1,12 @@ +'use strict'; + +const mongoose = require('mongoose'); + +const BarcaPlayer = new mongoose.Schema({ + name: String, + position: String, + number: Number, + goals: Number +}); + +module.exports = mongoose.model('barca', BarcaPlayer); diff --git a/schema/man_United_Player.js b/schema/man_United_Player.js new file mode 100644 index 0000000..4850abb --- /dev/null +++ b/schema/man_United_Player.js @@ -0,0 +1,12 @@ +'use strict'; + +const mongoose = require('mongoose'); + +const ManUnitedPlayer = new mongoose.Schema({ + name: String, + position: String, + number: Number, + goals: Number +}); + +module.exports = mongoose.model('manUnitedPlayer', ManUnitedPlayer); diff --git a/server.js b/server.js new file mode 100644 index 0000000..eec3ea9 --- /dev/null +++ b/server.js @@ -0,0 +1,29 @@ +'use strict'; + +const express = require('express'); +const app = express(); +const mongoose = require('mongoose'); +const morgan = require('morgan'); +const errorHandler =require('./lib/error_handling'); + +const dbPort = process.env.MONGOLAB_URI || 'mongodb://localhost/dev_db'; + +app.use(morgan(dbPort)); + +mongoose.connect('mongodb://localhost/dev_db'); + +const manUnitedRouter = require('./routes/man_united_routes'); +const barcaRouter = require('./routes/barca_routes'); +const compareRouter = require('./routes/compare_route'); + +app.use('/manUnited', manUnitedRouter); +app.use('/barca', barcaRouter); +app.use('/compare', compareRouter); + +app.use((err, req, res) => { + res.status(500).json({message: err.message}); +}); + +app.use(errorHandler); + +app.listen(6969, () => console.log('up on 6969 baby, server way up')); diff --git a/test/rest_api_test.js b/test/rest_api_test.js new file mode 100644 index 0000000..44fb7dc --- /dev/null +++ b/test/rest_api_test.js @@ -0,0 +1,155 @@ +'use strict'; + +const chai = require('chai'); +const chaiHTTP = require('chai-http'); +const ManUnitedPlayer = require('../schema/man_United_Player'); +const BarcaPlayer = require('../schema/barca_Player'); +const mongoose = require('mongoose'); +chai.use(chaiHTTP); + +const expect = chai.expect; +const request = chai.request; +const dbPort = process.env.MONGOLAB_URI; +process.env.MONGOLAB_URI = 'mongodb://localhost/test_db'; +require('../server'); + +describe('Router tests', () => { + + after((done) => { + process.env.MONGOLAB_URI = dbPort; + mongoose.connection.db.dropDatabase(() => { + done(); + }); + }); + describe('Man United Tests', () => { + it('should get a list of Man United players', (done) => { + request('localhost:6969') + .get('/manUnited') + .end((err, res) => { + expect(err).to.eql(null); + expect(res).to.have.status(200); + expect(Array.isArray(res.body)).to.eql(true); + done(); + }); + }); + it('Should create a Man United player', (done) => { + request('localhost:6969') + .post('/manUnited') + .send({name: 'test player', goals: 40}) + .end((err, res) => { + expect(err).to.eql(null); + expect(res).to.have.status(200); + expect(res.body.name).to. eql('test player'); + done(); + }); + }); + + describe('Man United tests that need data', () => { + let testManUPlayer; + beforeEach((done) => { + let newManUPlayer = new ManUnitedPlayer({name: 'test', goals:20}); + newManUPlayer.save((err, player) => { + testManUPlayer = player; + done(); + }); + }); + + it('Should update a Man U player', (done) => { + testManUPlayer.name = 'updated'; + request('localhost:6969') + .put('/manUnited') + .send(testManUPlayer) + .end((err, res) => { + expect(err).to.eql(null); + expect(res).to.have.status(200); + expect(res.body.message).to.eql('successfully updated'); + done(); + }); + }); + + it('Should delete a Man U player', (done) => { + request('localhost:6969') + .delete('/manUnited/' + testManUPlayer.id) + .end((err,res) => { + expect(err).to.eql(null); + expect(res).to.have.status(200); + expect(res.body.message).to.eql('successfully deleted'); + done(); + }); + }); + }); + }); + + describe('Barca Tests', () => { + it('should get a list of Barca players', (done) => { + request('localhost:6969') + .get('/barca') + .end((err, res) => { + expect(err).to.eql(null); + expect(res).to.have.status(200); + expect(Array.isArray(res.body)).to.eql(true); + done(); + }); + }); + it('Should create a Barca player', (done) => { + request('localhost:6969') + .post('/barca') + .send({name: 'test player', goals: 100}) + .end((err, res) => { + expect(err).to.eql(null); + expect(res).to.have.status(200); + expect(res.body.name).to. eql('test player'); + done(); + }); + }); + + describe('Barca tests that need data', () => { + let testBarcaPlayer; + beforeEach((done) => { + let newBarcaPlayer = new BarcaPlayer({name: 'test', goals: 100}); + newBarcaPlayer.save((err, player) => { + testBarcaPlayer = player; + done(); + }); + }); + + it('Should update a Barca player', (done) => { + testBarcaPlayer.name = 'updated'; + request('localhost:6969') + .put('/barca') + .send(testBarcaPlayer) + .end((err, res) => { + expect(err).to.eql(null); + expect(res).to.have.status(200); + expect(res.body.message).to.eql('successfully updated'); + done(); + }); + }); + + it('Should delete a Barca player', (done) => { + request('localhost:6969') + .delete('/barca/' + testBarcaPlayer.id) + .end((err,res) => { + expect(err).to.eql(null); + expect(res).to.have.status(200); + expect(res.body.message).to.eql('successfully deleted'); + done(); + }); + }); + }); + }); + + describe('Compare tests', () => { + + it('Should compare total goals of each team', (done) => { + request('localhost:6969') + .get('/compare/mostGoals') + .end((err,res) => { + expect(err).to.eql(null); + expect(res).to.have.status(200); + expect(res.body).to.eql('Barcalona players scored 200 goals, which is more than Man United Players.'); + done(); + }); + }); + }); +});