diff --git a/dustin/.eslintrc.js b/dustin/.eslintrc.js new file mode 100644 index 0000000..ed2ec67 --- /dev/null +++ b/dustin/.eslintrc.js @@ -0,0 +1,29 @@ +module.exports = { + "env": { + "es6": true, + "node": true, + "mocha": true + }, + "extends": "eslint:recommended", + "parserOptions": { + "sourceType": "module" + }, + "rules": { + "indent": [ + "error", + 2 + ], + "linebreak-style": [ + "error", + "unix" + ], + "quotes": [ + "error", + "single" + ], + "semi": [ + "error", + "always" + ] + } +}; diff --git a/dustin/.gitignore b/dustin/.gitignore new file mode 100644 index 0000000..4c497d6 --- /dev/null +++ b/dustin/.gitignore @@ -0,0 +1,2 @@ +/node_modules +/db diff --git a/dustin/gulpfile.js b/dustin/gulpfile.js new file mode 100644 index 0000000..fc90c44 --- /dev/null +++ b/dustin/gulpfile.js @@ -0,0 +1,22 @@ +const gulp = require('gulp'); +const mocha = require('gulp-mocha'); +const lint = require('gulp-eslint'); + +gulp.task('linter' , () => { + return gulp.src(['./*.js', './test/*.js', './lib/*.js']) + .pipe(lint()) + .pipe(lint.format()); +}); + +gulp.task('tests', () => { + return gulp.src(['./*.js', './test/*.js', './lib/*.js'], {read: false}) + .pipe(mocha({reporter: 'nyan'})); +}); + +gulp.task('watch', () => { + gulp.watch(['./*.js', './test/*.js', './lib/*.js'], ['linter', 'tests']); +}); + +gulp.task('default', ['linter', 'tests', 'watch'], () => { + +}); diff --git a/dustin/lib/errorhandler.js b/dustin/lib/errorhandler.js new file mode 100644 index 0000000..5e09b43 --- /dev/null +++ b/dustin/lib/errorhandler.js @@ -0,0 +1,5 @@ +module.exports = function (err, req, res, next) { + res.status(500).json({ + message: err.message + }); +}; diff --git a/dustin/package.json b/dustin/package.json new file mode 100644 index 0000000..6990956 --- /dev/null +++ b/dustin/package.json @@ -0,0 +1,31 @@ +{ + "name": "SharkTankAPI", + "version": "0.0.1", + "description": "", + "main": "server.js", + "directories": { + "test": "test" + }, + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "start": "node server.js" + }, + "keywords": [], + "author": "", + "license": "ISC", + "devDependencies": { + "chai": "^3.5.0", + "chai-http": "^2.0.1", + "gulp": "^3.9.1", + "gulp-eslint": "^2.0.0", + "gulp-mocha": "^2.2.0", + "mocha": "^2.4.5", + "morgan": "^1.7.0" + }, + "dependencies": { + "body-parser": "^1.15.1", + "express": "^4.13.4", + "json-fs-store": "^1.0.0", + "mongoose": "^4.4.19" + } +} diff --git a/dustin/routes/companies.js b/dustin/routes/companies.js new file mode 100644 index 0000000..0e18325 --- /dev/null +++ b/dustin/routes/companies.js @@ -0,0 +1,70 @@ +'use strict'; +var express = require('express'); +var router = express.Router(); +const bodyParser = require('body-parser').json(); +const Company = require('../schema/companies'); + +//index companies +router.get('/', (req, res, next) => { + Company.find({}, (err, companies) => { + if (err) return next(err); + res.json(companies); + }); +}); + +router.get('/dealstats', (req, res, next) => { + + //get tvDealValuation amount + Company.find({ + tvDealValuation: { + $ne: true + } + }, (err, companies) => { + if (err) return next(err); + let count = 0; + let total = (companies.reduce((a,b)=> { + if (b.tvDealValuation) ++count; + return a + b.tvDealValuation; + },0)); + res.send({averageTvDealValuation: total/count, totalTvDealValuation: total }); + }); +}); + +//create companies +router.post('/', bodyParser, (req, res, next) => { + let newCompany = new Company(req.body); + newCompany.save((err, company) => { + if (err) return next(err); + res.json(company); + }); +}); + +//put company +router.put('/', bodyParser, (req, res, next) => { + let _id = req.body._id; + Company.findOneAndUpdate({ + _id + }, req.body, (err) => { + if (err) return next(err); + let message = 'successfully update'; + res.json({ + message + }); + }); +}); + +//delete companies +router.delete('/:id', (req, res, next) => { + let _id = req.params.id; + Company.findOneAndRemove({ + _id + }, (err) => { + if (err) return next(err); + let message = 'sucessfully deleted'; + res.json({ + message + }); + }); +}); + +module.exports = router; diff --git a/dustin/routes/index.js b/dustin/routes/index.js new file mode 100644 index 0000000..530f1fa --- /dev/null +++ b/dustin/routes/index.js @@ -0,0 +1,9 @@ +var express = require('express'); +var router = express.Router(); + + +router.get('/', function(req, res) { + res.send('shark tank api'); +}); + +module.exports = router; diff --git a/dustin/routes/sharks.js b/dustin/routes/sharks.js new file mode 100644 index 0000000..bb5a0a9 --- /dev/null +++ b/dustin/routes/sharks.js @@ -0,0 +1,50 @@ +'use strict'; +var express = require('express'); +var router = express.Router(); +const bodyParser = require('body-parser').json(); +const Shark = require('../schema/companies'); + +//index companies +router.get('/', (req, res, next) => { + Shark.find({}, (err, companies) => { + if (err) return next(err); + res.json(companies); + }); +}); + +//create companies +router.post('/', bodyParser, (req, res, next) => { + let newShark = new Shark(req.body); + newShark.save((err, shark) => { + if (err) return next(err); + res.json(shark); + }); +}); + +//put shark +router.put('/', bodyParser, (req, res, next) => { + let _id = req.body._id; + Shark.findOneAndUpdate({_id}, req.body, (err) => { + if (err) return next(err); + let message = 'successfully update'; + res.json({ + message + }); + }); +}); + +//delete companies +router.delete('/:id', (req, res, next) => { + let _id = req.params.id; + Shark.findOneAndRemove({ + _id + }, (err) => { + if (err) return next(err); + let message = 'sucessfully deleted'; + res.json({ + message + }); + }); +}); + +module.exports = router; diff --git a/dustin/schema/companies.js b/dustin/schema/companies.js new file mode 100644 index 0000000..1497e6b --- /dev/null +++ b/dustin/schema/companies.js @@ -0,0 +1,23 @@ +'use strict'; +const mongoose = require('mongoose'); + +const Company = new mongoose.Schema({ + name: String, + tvDealReached: Boolean, + seekAmount: Number, + seekEquity: Number, + seekValuation: Number, + tvDealAmount: Number, + tvDealEquity: Number, + tvDealValuation: Number, + actualDealReached: Boolean, + actualDealAmount: Number, + actualDealEquity: Number, + actualDealValuation: Number, + season: Number, + episode: Number + //sharks: Schema.Types.sharks; + //{type: Number, default: 0} +}); + +module.exports = mongoose.model('companies', Company); diff --git a/dustin/schema/db_seeds/company_seeds.js b/dustin/schema/db_seeds/company_seeds.js new file mode 100644 index 0000000..9023817 --- /dev/null +++ b/dustin/schema/db_seeds/company_seeds.js @@ -0,0 +1,85 @@ +'use strict'; + +const mongoose = require('mongoose'); +const Company = require('../../schema/companies'); + +process.env.NODE_ENV = 'DEV'; +if (process.env.NODE_ENV === 'TEST') mongoose.connect('mongodb://localhost/test_db'); +if (process.env.NODE_ENV === 'DEV') mongoose.connect('mongodb://localhost/dev_db'); + +mongoose.connection.collections['companies'].drop(function () { + console.log('collection dropped'); +}); + +new Company({ + name: 'Scrub Daddy', + tvDealReached: true, + tvDealAmount: 300000, + tvDealEquity: .33, + tvDealValuation: 1000000, + actualDealReached: true, + season: 4, + episode: 7 +}).save((err, data) => { + if (err) console.log(err); + if (data) console.log('Company ' + data.name + ' created'); +}); + +new Company({ + name: 'Squatty Potty', + tvDealReached: true, + tvDealAmount: 350000, + tvDealEquity: .1, + tvDealValuation: 3500000, + actualDealReached: true, + season: 6, + episode: 9 +}).save((err, data) => { + if (err) console.log(err); + if (data) console.log('Company ' + data.name + ' created'); +}); + +new Company({ + name: 'Cousins Maine Lobster', + tvDealReached: true, + tvDealAmount: 55000, + tvDealEquity: .15, + tvDealValuation: 366667, + actualDealReached: true, + season: 4, + episode: 6 +}).save((err, data) => { + if (err) console.log(err); + if (data) console.log('Company ' + data.name + ' created'); +}); + +new Company({ + name: 'Tower Paddle Boards', + tvDealReached: true, + tvDealAmount: 150000, + tvDealEquity: .3, + tvDealValuation: 500000, + actualDealReached: true, + season: 3, + episode: 9 +}).save((err, data) => { + if (err) console.log(err); + if (data) console.log('Company ' + data.name + ' created'); +}); + +new Company({ + name: 'Bantam Bagels', + tvDealReached: true, + tvDealAmount: 275000, + tvDealEquity: .25, + tvDealValuation: 1100000, + actualDealReached: true, + season: 6, + episode: 13 +}).save((err, data) => { + if (err) console.log(err); + if (data) console.log('Company ' + data.name + ' created'); + mongoose.connection.close(function (data) { + //if (cb) cb(); + }); +}) diff --git a/dustin/schema/db_seeds/shark_seeds.js b/dustin/schema/db_seeds/shark_seeds.js new file mode 100644 index 0000000..2cebe76 --- /dev/null +++ b/dustin/schema/db_seeds/shark_seeds.js @@ -0,0 +1,60 @@ +'use strict'; + +const mongoose = require('mongoose'); +const Shark = require('../../schema/sharks'); + + + process.env.NODE_ENV='DEV' + if (process.env.NODE_ENV === 'TEST') mongoose.connect('mongodb://localhost/test_db'); + if (process.env.NODE_ENV === 'DEV') mongoose.connect('mongodb://localhost/dev_db'); + + mongoose.connection.collections['sharks'].drop(function () { + console.log('collection dropped'); + + new Shark({ + name: 'Kevin O\'Leary' + }).save((err, data) => { + if (err) console.log(err); + if (data) console.log('Shark ' + data.name + ' created'); + }); + + new Shark({ + name: 'Barbara Corcoran' + }).save((err, data) => { + if (err) console.log(err); + if (data) console.log('Shark ' + data.name + ' created'); + }); + + new Shark({ + name: 'Daymond John' + }).save((err, data) => { + if (err) console.log(err); + if (data) console.log('Shark ' + data.name + ' created'); + }); + + new Shark({ + name: 'Robert Herjavec' + }).save((err, data) => { + if (err) console.log(err); + if (data) console.log('Shark ' + data.name + ' created'); + }); + + new Shark({ + name: 'Lori Greiner' + }).save((err, data) => { + if (err) console.log(err); + if (data) console.log('Shark ' + data.name + ' created'); + }); + + new Shark({ + name: 'Mark Cuban' + }).save((err, data) => { + if (err) console.log(err); + if (data) { + console.log('Shark ' + data.name + ' created'); + mongoose.connection.close(function (data) { + //if (cb) cb(); + }); + } + }); + }); diff --git a/dustin/schema/sharks.js b/dustin/schema/sharks.js new file mode 100644 index 0000000..a32b00a --- /dev/null +++ b/dustin/schema/sharks.js @@ -0,0 +1,8 @@ +'use strict'; +const mongoose = require('mongoose'); + +const Shark = new mongoose.Schema({ + name: String, +}); + +module.exports = mongoose.model('sharks', Shark); diff --git a/dustin/server.js b/dustin/server.js new file mode 100644 index 0000000..a6f16b9 --- /dev/null +++ b/dustin/server.js @@ -0,0 +1,35 @@ +'use strict'; +const express = require('express'); +const bodyParser = require('body-parser'); +const jsonPaser = bodyParser.json(); +const routes = require('./routes/index'); +const companies = require('./routes/companies'); +const sharks = require('./routes/sharks'); +const app = express(); +const mongoose = require('mongoose'); +const morgan = require('morgan'); +const errorHandler = require('./lib/errorhandler'); + +const dbPort = process.env.MONGOLAB_URI || 'mongodb://localhost/dev_db'; + +mongoose.connect(dbPort); + +if (!(process.env.NODE_ENV === 'TEST')) app.use(morgan('dev')); + +app.use(jsonPaser); + +app.use('/', routes); +app.use('/companies', companies); +app.use('/sharks', sharks); + +app.get('/*', (req, res) => { + res.status(404).json({ + Error: 'Not Found' + }); +}); + +app.use(errorHandler); + +app.listen(3000, () => { + if (!(process.env.NODE_ENV === 'TEST')) console.log('up on 3000'); +}); diff --git a/dustin/test/company_test.js b/dustin/test/company_test.js new file mode 100644 index 0000000..3edbe93 --- /dev/null +++ b/dustin/test/company_test.js @@ -0,0 +1,152 @@ +'use strict'; + +const chai = require('chai'); +const chaiHTTP = require('chai-http'); +const Company = require('../schema/companies'); +const mongoose = require('mongoose'); +chai.use(chaiHTTP); +const expect = chai.expect; +const request = chai.request; + +const dbPort = process.env.MONGOLAB_URI; +process.env.NODE_ENV = 'TEST'; +process.env.MONGOLAB_URI = 'mongodb://localhost/test_db'; + +require('../server'); + +describe('The /company route', () => { + let testCompany; + beforeEach((done) => { + new Company({ + name: 'Scrub Daddy', + tvDealReached: true, + tvDealAmount: 300000, + tvDealEquity: .33, + tvDealValuation: 1000000, + actualDealReached: true, + season: 4, + episode: 7 + }).save((err, data) => { + if (data) testCompany = data; + if (err) throw err; + }); + + new Company({ + name: 'Squatty Potty', + tvDealReached: true, + tvDealAmount: 350000, + tvDealEquity: .1, + tvDealValuation: 3500000, + actualDealReached: true, + season: 6, + episode: 9 + }).save((err) => { + if (err) throw err; + }); + + new Company({ + name: 'Cousins Maine Lobster', + tvDealReached: true, + tvDealAmount: 55000, + tvDealEquity: .15, + tvDealValuation: 366667, + actualDealReached: true, + season: 4, + episode: 6 + }).save((err) => { + if (err) throw err; + }); + + new Company({ + name: 'Tower Paddle Boards', + tvDealReached: true, + tvDealAmount: 150000, + tvDealEquity: .3, + tvDealValuation: 500000, + actualDealReached: true, + season: 3, + episode: 9 + }).save((err) => { + if (err) throw err; + }); + + new Company({ + name: 'Bantam Bagels', + tvDealReached: true, + tvDealAmount: 275000, + tvDealEquity: .25, + tvDealValuation: 1100000, + actualDealReached: true, + season: 6, + episode: 13 + }).save((err,data) => { + if (err) throw err; + if (data) done(); + }); + }); + afterEach((done) => { + process.env.MONGOLAB_URI = dbPort; + mongoose.connection.db.dropDatabase(() => { + done(); + }); + }); + + it('GET should return a list of companies', () => { + request('localhost:3000') + .get('/companies/') + .end((err, res) => { + expect(err).to.eql(null); + expect(Array.isArray(res.body)).to.eql(true); + }); + }); + + it('POST should accept a post and create a new company', (done) => { + request('localhost:3000') + .post('/companies/') + .send({ + name: 'posty' + }) + .end((err, res) => { + expect(err).to.eql(null); + expect(res).to.have.status(200); + expect(res.body.name).to.have.eql('posty'); + expect(res.body).to.have.property('_id'); + done(); + }); + }); + + it('PUT should update a company', (done) => { + testCompany.name = 'updated'; + request('localhost:3000') + .put('/companies/') + .send(testCompany) + .end((err, res) => { + expect(err).to.eql(null); + expect(res).to.have.status(200); + expect(res.body.message).to.eql('successfully update'); + done(); + }); + }); + + it('DELETE should remove a company', (done) => { + request('localhost:3000') + .delete('/companies/' + testCompany._id) + .end((err, res) => { + expect(err).to.eql(null); + expect(res).to.have.status(200); + expect(res.body.message).to.eql('sucessfully deleted'); + done(); + }); + }); + + it('/dealstats return deal stats', (done) => { + request('localhost:3000') + .get('/companies/dealstats') + .end((err, res) => { + expect(err).to.eql(null); + expect(res).to.have.status(200); + expect(res.body).to.eql({averageTvDealValuation:1293333.4, totalTvDealValuation:6466667}); + done(); + }); + }); +}); diff --git a/dustin/test/db_seeds/shark_seeds.js b/dustin/test/db_seeds/shark_seeds.js new file mode 100644 index 0000000..1572bbe --- /dev/null +++ b/dustin/test/db_seeds/shark_seeds.js @@ -0,0 +1,50 @@ +'use strict'; + +const mongoose = require('mongoose'); +const Shark = require('../../schema/sharks'); + +process.env.NODE_ENV = 'DEV'; +if (process.env.NODE_ENV === 'TEST') mongoose.connect('mongodb://localhost/test_db'); +if (process.env.NODE_ENV === 'DEV') mongoose.connect('mongodb://localhost/dev_db'); +console.log("ger"); +new Shark({ + name: 'Kevin O\'Leary' +}).save((err, data) => { + if (err) console.log(err); + if (data) console.log('Shark ' + data.name + ' created'); +}); + +new Shark({ + name: 'Barbara Corcoran' +}).save((err, data) => { + if (err) console.log(err); + if (data) console.log('Shark ' + data.name + ' created'); +}); + +new Shark({ + name: 'Daymond John' +}).save((err, data) => { + if (err) console.log(err); + if (data) console.log('Shark ' + data.name + ' created'); +}); + +new Shark({ + name: 'Robert Herjavec' +}).save((err, data) => { + if (err) console.log(err); + if (data) console.log('Shark ' + data.name + ' created'); +}); + +new Shark({ + name: 'Lori Greiner' +}).save((err, data) => { + if (err) console.log(err); + if (data) console.log('Shark ' + data.name + ' created'); +}); + +new Shark({ + name: 'Mark Cuban' +}).save((err, data) => { + if (err) console.log(err); + if (data) console.log('Shark ' + data.name + ' created'); +}); diff --git a/dustin/test/shark_test.js b/dustin/test/shark_test.js new file mode 100644 index 0000000..a296683 --- /dev/null +++ b/dustin/test/shark_test.js @@ -0,0 +1,82 @@ +'use strict'; + +const chai = require('chai'); +const chaiHTTP = require('chai-http'); +const Shark = require('../schema/sharks'); +const mongoose = require('mongoose'); +chai.use(chaiHTTP); +const expect = chai.expect; +const request = chai.request; + +const dbPort = process.env.MONGOLAB_URI; +process.env.NODE_ENV = 'TEST'; +process.env.MONGOLAB_URI = 'mongodb://localhost/test_db'; + +require('../server'); + +describe('The /shark route', () => { + let testShark; + beforeEach((done) => { + let newShark = new Shark({ + name: 'test' + }); + newShark.save((err, shark) => { + testShark = shark; + done(); + }); + }); + after((done) => { + process.env.MONGOLAB_URI = dbPort; + mongoose.connection.db.dropDatabase(() => { + done(); + }); + }); + + it('GET should return a list of sharks', () => { + request('localhost:3000') + .get('/sharks/') + .end((err, res) => { + expect(err).to.eql(null); + expect(Array.isArray(res.body)).to.eql(true); + }); + }); + + it('POST should accept a post and create a new shark', (done) => { + request('localhost:3000') + .post('/sharks/') + .send({ + name: 'posty' + }) + .end((err, res) => { + expect(err).to.eql(null); + expect(res).to.have.status(200); + expect(res.body.name).to.have.eql('posty'); + expect(res.body).to.have.property('_id'); + done(); + }); + }); + + it('PUT should update a shark', (done) => { + testShark.name = 'updated'; + request('localhost:3000') + .put('/sharks/') + .send(testShark) + .end((err, res) => { + expect(err).to.eql(null); + expect(res).to.have.status(200); + expect(res.body.message).to.eql('successfully update'); + done(); + }); + }); + + it('DELETE should remove a shark', (done) => { + request('localhost:3000') + .delete('/sharks/' + testShark._id) + .end((err, res) => { + expect(err).to.eql(null); + expect(res).to.have.status(200); + expect(res.body.message).to.eql('sucessfully deleted'); + done(); + }); + }); +}); diff --git a/dustin/test/test.js b/dustin/test/test.js new file mode 100644 index 0000000..7c812aa --- /dev/null +++ b/dustin/test/test.js @@ -0,0 +1,110 @@ +// 'use strict'; +// +// const chai = require('chai'); +// const expect = require('chai').expect; +// const chaiHTTP = require('chai-http'); +// var fs = require('fs'); +// chai.use(chaiHTTP); +// const request = chai.request; +// require('../server'); +// +// var dbEntries = fs.readdirSync('./data').length; +// var payload = { +// company: 'Tanktest', +// seek_dollar: '200000', +// seek_equity: '.2', +// id: (dbEntries + 1) +// }; +// +// describe('Shark tank API should', function () { +// it('accept a POST request to /companies', function (done) { +// request('localhost:3000') +// .post('/companies') +// .send(payload) +// .end(function (err, res) { +// expect(err).to.eql(null); +// expect(res).to.have.status(200); +// expect(res.text).to.eql('{"Message":"POST received"}'); +// done(); +// }); +// }); +// +// it('list all companies in the "database"', function (done) { +// request('localhost:3000') +// .get('/companies') +// .end(function (err, res) { +// expect(err).to.eql(null); +// expect(res).to.have.status(200); +// expect(res.body.length).to.eql(dbEntries + 1); +// done(); +// }); +// }); +// +// it('list a company by id', function (done) { +// request('localhost:3000') +// .get('/companies/' + (dbEntries + 1)) +// .end(function (err, res) { +// expect(err).to.eql(null); +// expect(res).to.have.status(200); +// expect(res.body).to.eql(payload); +// done(); +// }); +// }); +// +// // it('respond to a PUT request on default route /', function (done) { +// // request('localhost:3000') +// // .put('/') +// // .end(function (err, res) { +// // expect(err).to.eql(null); +// // expect(res).to.have.status(200); +// // expect(res.text).to.eql('{"Message":"PUT request to homepage received"}'); +// // done(); +// // }); +// // }); +// +// it('properly DELETE', function (done) { +// request('localhost:3000') +// .delete('/companies/' + (dbEntries + 1)) +// .end(function (err, res) { +// expect(err).to.eql(null); +// expect(res).to.have.status(200); +// expect(res.text).to.eql('{"Message":"Entry DELETED"}'); +// done(); +// }); +// }); +// +// // +// +// // +// // it('respond to a PATCH request on default route /', function (done) { +// // request('localhost:3000') +// // .patch('/') +// // .end(function (err, res) { +// // expect(err).to.eql(null); +// // expect(res).to.have.status(200); +// // expect(res.text).to.eql('{"Message":"PATCH request to homepage received"}'); +// // done(); +// // }); +// // }); +// // +// it('respond with 404 to an invalid route', function (done) { +// request('localhost:3000') +// .get('/companies/' + (dbEntries + 1)) +// .end(function (err, res) { +// expect(res).to.have.status(404); +// expect(res.text).to.eql('{"Error":"Not Found"}'); +// done(); +// }); +// }); +// // +// // it('respond with 400 if an invalid request is made', function (done) { +// // request('localhost:3000') +// // .copy('/') +// // .end(function (err, res) { +// // expect(res).to.have.status(400); +// // expect(res.text).to.eql('{"Error":"Bad Request"}'); +// // done(); +// // }); +// // }); +// +// });