From c21847dbfb9594a0de46844a0bd94fcd46c92517 Mon Sep 17 00:00:00 2001 From: Edwin Del Rio Date: Mon, 31 Jul 2017 18:51:15 -0700 Subject: [PATCH 01/11] Copied over lab from day 9 --- lab-eddie/.gitignore | 128 ++++++++++++++++++++++++++++++++++ lab-eddie/README.md | 64 +++++++++++++++++ lab-eddie/lib/auto-direct.js | 19 +++++ lab-eddie/lib/errorHandle.js | 12 ++++ lab-eddie/lib/header.js | 20 ++++++ lab-eddie/lib/model-paths.js | 101 +++++++++++++++++++++++++++ lab-eddie/lib/parse-json.js | 34 +++++++++ lab-eddie/lib/parse-url.js | 10 +++ lab-eddie/lib/router.js | 61 ++++++++++++++++ lab-eddie/lib/storage.js | 53 ++++++++++++++ lab-eddie/model/car.js | 15 ++++ lab-eddie/model/character.js | 15 ++++ lab-eddie/model/dog.js | 14 ++++ lab-eddie/model/employee.js | 15 ++++ lab-eddie/model/person.js | 14 ++++ lab-eddie/package.json | 22 ++++++ lab-eddie/server.js | 18 +++++ lab-eddie/test/car-test.js | 58 +++++++++++++++ lab-eddie/test/person-test.js | 70 +++++++++++++++++++ 19 files changed, 743 insertions(+) create mode 100644 lab-eddie/.gitignore create mode 100644 lab-eddie/README.md create mode 100644 lab-eddie/lib/auto-direct.js create mode 100644 lab-eddie/lib/errorHandle.js create mode 100644 lab-eddie/lib/header.js create mode 100644 lab-eddie/lib/model-paths.js create mode 100644 lab-eddie/lib/parse-json.js create mode 100644 lab-eddie/lib/parse-url.js create mode 100644 lab-eddie/lib/router.js create mode 100644 lab-eddie/lib/storage.js create mode 100644 lab-eddie/model/car.js create mode 100644 lab-eddie/model/character.js create mode 100644 lab-eddie/model/dog.js create mode 100644 lab-eddie/model/employee.js create mode 100644 lab-eddie/model/person.js create mode 100644 lab-eddie/package.json create mode 100644 lab-eddie/server.js create mode 100644 lab-eddie/test/car-test.js create mode 100644 lab-eddie/test/person-test.js diff --git a/lab-eddie/.gitignore b/lab-eddie/.gitignore new file mode 100644 index 0000000..e19c8ab --- /dev/null +++ b/lab-eddie/.gitignore @@ -0,0 +1,128 @@ + +# Created by https://www.gitignore.io/api/osx,vim,node,windows + +### Node ### +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (http://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Typescript v1 declaration files +typings/ + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env + + +### OSX ### +*.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +### Vim ### +# swap +[._]*.s[a-v][a-z] +[._]*.sw[a-p] +[._]s[a-v][a-z] +[._]sw[a-p] +# session +Session.vim +# temporary +.netrwhist +*~ +# auto-generated tag files +tags + +### Windows ### +# Windows thumbnail cache files +Thumbs.db +ehthumbs.db +ehthumbs_vista.db + +# Folder config file +Desktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msm +*.msp + +# Windows shortcuts +*.lnk + +# End of https://www.gitignore.io/api/osx,vim,node,windows +data \ No newline at end of file diff --git a/lab-eddie/README.md b/lab-eddie/README.md new file mode 100644 index 0000000..9573976 --- /dev/null +++ b/lab-eddie/README.md @@ -0,0 +1,64 @@ +Vanilla REST API wth file system persistance :D + +This API is seperated into 6 major components: + +1.) The server + +2.) lib driectory + +3.) model directory + +4.) test directory + +5.) data directory + +6.) node_modules + +-----Component Overview----- + +1. The server. This is the meat and potatoes of it all. It uses the http module to host a server. It requires various modules for establishing routes, endponts and file scaffolding. + +2. lib directory houses all of our home made modules and other goodies. + +3. model directory houses all object constructors. + +4. test directory houses all of our tests >:( + +5. data driectory is used for file system persistent storage. It has a sub-directory for each model. + +6. node_modules houses all of our dependancies + +----Instructions---- + +Using httpie is probably the easiest way to go about this whole process. + +-Start off by running the server. Make sure you're in the lab directory and type the following : + +node server.js + +This should return a prompt telling you the sever is up. Also, if you don't have a data folder, it'll create one automatically for you and fill it with folders for each model. + +-Open another terminal tab. + +*To do a GET request type the following: +http GET :3000/api/(whatever model you pick) id==324235345234 + +this should return an object + +*To do a POST request, it's a bit harder. We have to know what our model looks like. We'll have to include more parameters in the request like this: + +http POST :3000/api/dog name==rover breed==pug age==7 + +This should return an object that looks like this: + +{ + name: 'rover', + breed: 'pug', + age: '7' +} + +*To do a DELETE request, it's identical to the GET request. Except it shouldn't return anything. It'll look like this: + +http DELETE :3000/api/car id==324235345234 + +All done! \ No newline at end of file diff --git a/lab-eddie/lib/auto-direct.js b/lab-eddie/lib/auto-direct.js new file mode 100644 index 0000000..058aa97 --- /dev/null +++ b/lab-eddie/lib/auto-direct.js @@ -0,0 +1,19 @@ +'use strict' + +const fs = require('fs') + +//Automatically creates a data directory and folders for each model +const autoDataDir = module.exports = function(models) { + + let labDir = fs.readdirSync('.'); + console.log(Object.keys(models).length) + if (!labDir.includes('data')) fs.mkdirSync('./data'); + autoModelDir(models); +}; + +const autoModelDir = function(models) { + let modelKeys = Object.keys(models); + let dataDir = fs.readdirSync('./data'); + modelKeys.forEach(key => { + if(!dataDir.includes(key)) fs.mkdirSync(`./data/${key}`)}); +} diff --git a/lab-eddie/lib/errorHandle.js b/lab-eddie/lib/errorHandle.js new file mode 100644 index 0000000..8f88ca1 --- /dev/null +++ b/lab-eddie/lib/errorHandle.js @@ -0,0 +1,12 @@ +'use strict' + +const errHandle = module.exports = {}; + +errHandle.normal = function(paramNames, params) { + let args = params.length; + if (paramNames.length !== args) throw new Error(`Expected ${paramNames[args]}`); +} + +errHandle.promiseErr = function(paramNames, params) { + +} \ No newline at end of file diff --git a/lab-eddie/lib/header.js b/lab-eddie/lib/header.js new file mode 100644 index 0000000..ab482d9 --- /dev/null +++ b/lab-eddie/lib/header.js @@ -0,0 +1,20 @@ +'use strict' + +const header = module.exports = {}; + +header.textHeader = function(res, code, msg) { + res.writeHeader(code, { + 'Content-Type': 'text/plain' + }); + res.write(msg); + res.end(); +} + +header.appHeader = function(res, code, json) { + res.writeHeader(code, { + 'Content-Type': 'application/json' + }); + res.write(JSON.stringify(json)); + res.end(); +} + diff --git a/lab-eddie/lib/model-paths.js b/lab-eddie/lib/model-paths.js new file mode 100644 index 0000000..7321321 --- /dev/null +++ b/lab-eddie/lib/model-paths.js @@ -0,0 +1,101 @@ +'use strict'; + +const storage = require('./storage.js'); +const header = require('./header.js') +const Person = require('../model/person.js'); +const Car = require('../model/car.js'); +const Dog = require('../model/dog.js') +const Employee = require('../model/employee.js') +const Character = require('../model/character.js') + + +const modelRoutes = module.exports = {}; + +modelRoutes.models = { + person : Person, + car: Car, + dog: Dog, + employee: Employee, + character: Character +} + + +modelRoutes.allRoutes = function(model, router) { + modelRoutes.modelGet(model, router); + modelRoutes.modelDelete(model, router); + modelRoutes.modelPost(model, router); +} + + +modelRoutes.modelGet = function(model,router) { + router.get(`/api/${model}`, function(req, res) { + if (req.url.query.id) { + storage.fetchItem(`${model}`, req.url.query.id) + .then( item => { + header.appHeader(res, 200, item); + }) + .catch( err => { + console.error(err); + header.textHeader(res, 404, `${model} not found!`) + }); + + return; + } else if (req.url.query) { + storage.fetchItem(`${model}`) + .then( item => { + header.appHeader(res, 200, item); + }) + .catch( err => { + console.error(err); + header.textHeader(res, 400, 'Bad request!') + }); + + return; + }; + + header.textHeader(res, 400, 'Bad request!') + }); +}; + +modelRoutes.modelPost = function(model, router) { + router.post(`/api/${model}`, function(req, res) { + try { + let params = []; + for(let key in req.body) { + params.push(req.body[key]); + } + var newObj = new modelRoutes.models[model](...params); + + storage.createItem(`${model}`, newObj); + header.appHeader(res, 200, newObj); + + } catch (err) { + console.error(err); + header.textHeader(res, 400, 'Bad request!') + } + }); +} + +modelRoutes.modelDelete = function(model, router) { + + router.delete(`/api/${model}`, function(req, res) { + if (req.url.query.id) { + storage.deleteItem(`${model}`, req.url.query.id) + .then( item => { + header.appHeader(res, 202, item); + }) + .catch( err => { + console.error(err); + header.textHeader(res, 404, `${model} not found!`) + }); + + return; + }; + + header.textHeader(res, 400, 'Bad request!') + }); + +} + + +require('./auto-direct.js')(modelRoutes.models) \ No newline at end of file diff --git a/lab-eddie/lib/parse-json.js b/lab-eddie/lib/parse-json.js new file mode 100644 index 0000000..6b9ad88 --- /dev/null +++ b/lab-eddie/lib/parse-json.js @@ -0,0 +1,34 @@ +'use strict'; + +module.exports = function(req) { + return new Promise((resolve, reject) => { + if (req.method === 'POST' || req.method === 'PUT') { + var body = ''; + + req.on('data', data => { + body += data.toString(); + }); + + req.on('end', () => { + try { + req.body = JSON.parse(body); + resolve(req); + } catch (err) { + console.error(err); + reject(err); + } + }); + + req.on('error', err => { + console.error(err); + reject(err); + }); + + return; + }; + + resolve(); + }); +} + + diff --git a/lab-eddie/lib/parse-url.js b/lab-eddie/lib/parse-url.js new file mode 100644 index 0000000..a718e7f --- /dev/null +++ b/lab-eddie/lib/parse-url.js @@ -0,0 +1,10 @@ +'use strict'; + +const parseUrl = require('url').parse; +const parseQuery = require('querystring').parse; + +module.exports = function(req) { + req.url = parseUrl(req.url); + req.url.query = parseQuery(req.url.query); + return Promise.resolve(req); +} diff --git a/lab-eddie/lib/router.js b/lab-eddie/lib/router.js new file mode 100644 index 0000000..068548a --- /dev/null +++ b/lab-eddie/lib/router.js @@ -0,0 +1,61 @@ +'use strict'; + +const parseUrl = require('./parse-url.js'); +const parseJSON = require('./parse-json.js'); + +const Router = module.exports = function() { + this.routes = { + GET: {}, + POST: {}, + PUT: {}, + DELETE: {} + } +} + +Router.prototype.get = function(endpoint, callback) { + this.routes.GET[endpoint] = callback; +}; + +Router.prototype.post = function(endpoint, callback) { + this.routes.POST[endpoint] = callback; +}; + +Router.prototype.delete = function(endpoint, callback) { + this.routes.DELETE[endpoint] = callback; +}; + +Router.prototype.put = function(endpoint, callback) { + this.routes.PUT[endpoint] = callback; +}; + +Router.prototype.route = function() { + return (req, res) => { + Promise.all([ + parseUrl(req), + parseJSON(req) + ]) + .then(() => { + let reqMethod = this.routes[req.method]; + if(typeof reqMethod[req.url.pathname] === 'function') { + reqMethod[req.url.pathname](req, res); + return + } + console.error('route not found'); + res.writeHead(404, { + 'Content-Type' : 'text/plain' + }); + + res.write('route not found'); + res.end(); + }) + .catch(err => { + + res.writeHead(400, { + 'Content-Type' : 'text/plain' + }) + + res.write('bad request'); + res.end(); + }); + } +}; \ No newline at end of file diff --git a/lab-eddie/lib/storage.js b/lab-eddie/lib/storage.js new file mode 100644 index 0000000..1f723e3 --- /dev/null +++ b/lab-eddie/lib/storage.js @@ -0,0 +1,53 @@ +'use strict'; + +const Promise = require('bluebird'); +const fs = Promise.promisifyAll(require('fs'), { suffix: 'Prom' }); + +module.exports = exports = {}; + +exports.createItem = function(category, item) { + if(!category) return Promise.reject(new Error(`Expecte category`)); + if(!item) return Promise.reject(new Error('Expected item')); + + let stringObj = JSON.stringify(item); + return fs.writeFileProm(`${__dirname}/../data/${category}/${item.id}.json`, stringObj) + .then(() => item) + .catch(err => Promise.reject(err)); +} + +exports.fetchItem = function(category, id) { + if(!category) return Promise.reject(new Error(`Expecte category`)); + if(!id) return exports.fetchCategory(category); + + + return fs.readFileProm(`${__dirname}/../data/${category}/${id}.json`) + .then(data => { + try { + let item = JSON.parse(data.toString()); + return item; + } catch (err) { + return Promise.reject(err); + } + }) +}; + +exports.deleteItem = function(category, id) { + if(!category) return Promise.reject(new Error(`Expecte category`)); + if(!id) return Promise.reject(new Error('Expected item')); + + return fs.unlinkProm(`${__dirname}/../data/${category}/${id}.json`) + .then(() => '') + .catch(err => Promise.reject(err)); + +}; + +exports.fetchCategory= function(category) { + if(!category) return Promise.reject(new Error(`Expecte category`)); + + return fs.readdirProm(`${__dirname}/../data/${category}`) + .then(data => { + data = data.map(id => id.split('.json')[0]) + return data; + }) + .catch(err => Promise.reject(err)) +} \ No newline at end of file diff --git a/lab-eddie/model/car.js b/lab-eddie/model/car.js new file mode 100644 index 0000000..fb64c89 --- /dev/null +++ b/lab-eddie/model/car.js @@ -0,0 +1,15 @@ +'use strict'; + +const uuidv4 = require('uuid/v4'); +const errHandle = require('../lib/errorHandle.js'); + +module.exports = function(make, model, year, color) { + errHandle.normal(['make', 'model', 'year', 'color'], arguments); + + this.id = uuidv4(); + this.make = make; + this.model = model; + this.year = year; + this.color = color; + +}; \ No newline at end of file diff --git a/lab-eddie/model/character.js b/lab-eddie/model/character.js new file mode 100644 index 0000000..8432229 --- /dev/null +++ b/lab-eddie/model/character.js @@ -0,0 +1,15 @@ +'use strict'; + +const uuidv4 = require('uuid/v4'); +const errHandle = require('../lib/errorHandle.js'); + +module.exports = function(name, healthPoints, experience, level) { + errHandle.normal(['name', 'healthPoints', 'experience', 'level'], arguments); + + this.id = uuidv4(); + this.name = name; + this.healthPoints = healthPoints; + this.experience = experience; + this.level = level + +}; \ No newline at end of file diff --git a/lab-eddie/model/dog.js b/lab-eddie/model/dog.js new file mode 100644 index 0000000..7ff8839 --- /dev/null +++ b/lab-eddie/model/dog.js @@ -0,0 +1,14 @@ +'use strict'; + +const uuidv4 = require('uuid/v4'); +const errHandle = require('../lib/errorHandle.js'); + +module.exports = function(name, breed, age) { + errHandle.normal(['name', 'breed', 'age'], arguments); + + this.id = uuidv4(); + this.name = name; + this.breed = breed; + this.age = age; + +}; \ No newline at end of file diff --git a/lab-eddie/model/employee.js b/lab-eddie/model/employee.js new file mode 100644 index 0000000..12f0593 --- /dev/null +++ b/lab-eddie/model/employee.js @@ -0,0 +1,15 @@ +'use strict'; + +const uuidv4 = require('uuid/v4'); +const errHandle = require('../lib/errorHandle.js'); + +module.exports = function(name, position, pay) { + errHandle.normal(['name', 'position', 'pay'], arguments); + + this.id = uuidv4(); + this.name = name; + this.position = position; + this.pay = pay; + this.fired = false + +}; \ No newline at end of file diff --git a/lab-eddie/model/person.js b/lab-eddie/model/person.js new file mode 100644 index 0000000..7a07b79 --- /dev/null +++ b/lab-eddie/model/person.js @@ -0,0 +1,14 @@ +'use strict'; + +const uuidv4 = require('uuid/v4'); +const errHandle = require('../lib/errorHandle.js'); + +module.exports = function(first, last, age, job) { + errHandle.normal(['first', 'last', 'age', 'job'], arguments); + + this.id = uuidv4(); + this.first = first; + this.last = last + this.age = age; + this.job = job; +}; \ No newline at end of file diff --git a/lab-eddie/package.json b/lab-eddie/package.json new file mode 100644 index 0000000..6fda210 --- /dev/null +++ b/lab-eddie/package.json @@ -0,0 +1,22 @@ +{ + "name": "lab-eddie", + "version": "1.0.0", + "description": "", + "main": "server.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "start": "node server.js" + }, + "keywords": [], + "author": "", + "license": "ISC", + "devDependencies": { + "chai": "^4.1.0", + "mocha": "^3.4.2", + "superagent": "^3.5.2" + }, + "dependencies": { + "bluebird": "^3.5.0", + "uuid": "^3.1.0" + } +} diff --git a/lab-eddie/server.js b/lab-eddie/server.js new file mode 100644 index 0000000..80770f0 --- /dev/null +++ b/lab-eddie/server.js @@ -0,0 +1,18 @@ +'use strict' + +const http = require('http'); +const Router = require('./lib/router.js'); +const PORT = process.env.PORT || 5000; +const modelPaths = require('./lib/model-paths.js') +const router = new Router(); + +const modelKeys = Object.keys(modelPaths.models); +modelKeys.forEach(key => { + modelPaths.allRoutes(key, router); +}) + +const server = http.createServer(router.route()); + +server.listen(PORT, () => { + console.log('server on at port:', PORT); +}); \ No newline at end of file diff --git a/lab-eddie/test/car-test.js b/lab-eddie/test/car-test.js new file mode 100644 index 0000000..1e58e47 --- /dev/null +++ b/lab-eddie/test/car-test.js @@ -0,0 +1,58 @@ +'use strict'; + +const request = require('superagent'); +const expect = require('chai').expect; + +require('../server.js'); + +describe('car Routes', function() { + var car = null; + + describe('POST: /api/car', function() { + it('should return a car', function(done) { + request.post('localhost:3000/api/car') + .send({ make: 'Toyota', model: '4runner', year: 1987, color: 'black' }) + .end((err, res) => { + if (err) return done(err); + expect(res.status).to.equal(200); + expect(res.body.make).to.equal('Toyota'); + expect(res.body.model).to.equal('4runner'); + expect(res.body.color).to.equal('black'); + expect(res.body.year).to.equal(1987); + console.log('POST request car:', res.body); + car = res.body; + done(); + }); + }); + }); + describe('GET: /api/car', function() { + it('should return a car', function(done) { + request.get(`localhost:3000/api/car?id=${car.id}`) + .end((err, res) => { + if (err) return done(err); + expect(res.status).to.equal(200); + expect(res.body.make).to.equal('Toyota'); + expect(res.body.model).to.equal('4runner'); + expect(res.body.year).to.equal(1987); + expect(res.body.color).to.equal('black'); + console.log('GET request car:', res.body); + done(); + }); + }); + }); + describe('DELETE: /api/car', function() { + it('should return a an empty object', function(done) { + request.delete(`localhost:3000/api/car?id=${car.id}`) + .end((err, res) => { + if (err) return done(err); + expect(res.status).to.equal(202); + expect(res.body.make).to.equal(undefined); + expect(res.body.model).to.equal(undefined); + expect(res.body.year).to.equal(undefined); + expect(res.body.color).to.equal(undefined); + console.log('DELETE request car:', res.body); + done(); + }); + }); + }); +}); diff --git a/lab-eddie/test/person-test.js b/lab-eddie/test/person-test.js new file mode 100644 index 0000000..a835e02 --- /dev/null +++ b/lab-eddie/test/person-test.js @@ -0,0 +1,70 @@ +'use strict'; + +const request = require('superagent'); +const expect = require('chai').expect; + +require('../server.js'); + +describe('person Routes', function() { + var person = null; + + describe('POST: /api/person', function() { + it('should return a person', function(done) { + request.post('localhost:3000/api/person') + .send({ first: 'eddie', last: 'del rio', age: 28, job: 'bum' }) + .end((err, res) => { + if (err) return done(err); + expect(res.status).to.equal(200); + expect(res.body.first).to.equal('eddie'); + expect(res.body.last).to.equal('del rio'); + expect(res.body.age).to.equal(28); + expect(res.body.job).to.equal('bum'); + console.log('POST request person:', res.body); + person = res.body; + done(); + }); + }); + }); + describe('GET: /api/person (No IDs)', function() { + it('should return an array of IDs', function(done) { + request.get('localhost:3000/api/person') + .end((err, res) => { + if(err) return done(err); + expect(Array.isArray(res.body)).to.equal(true); + expect(res.body.includes(person.id)).to.equal(true); + console.log('Array of IDs for person: ', res.body) + done() + }) + }) + }) + describe('GET: /api/person', function() { + it('should return a person', function(done) { + request.get(`localhost:3000/api/person?id=${person.id}`) + .end((err, res) => { + if (err) return done(err); + expect(res.status).to.equal(200); + expect(res.body.first).to.equal('eddie'); + expect(res.body.last).to.equal('del rio'); + expect(res.body.age).to.equal(28); + expect(res.body.job).to.equal('bum'); + console.log('GET request person:', res.body); + done(); + }); + }); + }); + describe('DELETE: /api/person', function() { + it('should return a an empty object', function(done) { + request.delete(`localhost:3000/api/person?id=${person.id}`) + .end((err, res) => { + if (err) return done(err); + expect(res.status).to.equal(202); + expect(res.body.first).to.equal(undefined); + expect(res.body.last).to.equal(undefined); + expect(res.body.age).to.equal(undefined); + expect(res.body.job).to.equal(undefined); + console.log('DELETE request person:', res.body); + done(); + }); + }); + }); +}); From 1e47e241ec5af6c0826d93923f99501f034de6a0 Mon Sep 17 00:00:00 2001 From: Edwin Del Rio Date: Mon, 31 Jul 2017 19:36:13 -0700 Subject: [PATCH 02/11] Configured server.js to use express --- lab-eddie/lib/header.js | 20 -------------------- lab-eddie/package.json | 4 ++++ lab-eddie/server.js | 26 +++++++++++++------------- 3 files changed, 17 insertions(+), 33 deletions(-) delete mode 100644 lab-eddie/lib/header.js diff --git a/lab-eddie/lib/header.js b/lab-eddie/lib/header.js deleted file mode 100644 index ab482d9..0000000 --- a/lab-eddie/lib/header.js +++ /dev/null @@ -1,20 +0,0 @@ -'use strict' - -const header = module.exports = {}; - -header.textHeader = function(res, code, msg) { - res.writeHeader(code, { - 'Content-Type': 'text/plain' - }); - res.write(msg); - res.end(); -} - -header.appHeader = function(res, code, json) { - res.writeHeader(code, { - 'Content-Type': 'application/json' - }); - res.write(JSON.stringify(json)); - res.end(); -} - diff --git a/lab-eddie/package.json b/lab-eddie/package.json index 6fda210..1c797ab 100644 --- a/lab-eddie/package.json +++ b/lab-eddie/package.json @@ -17,6 +17,10 @@ }, "dependencies": { "bluebird": "^3.5.0", + "body-parser": "^1.17.2", + "debug": "^2.6.8", + "express": "^4.15.3", + "morgan": "^1.8.2", "uuid": "^3.1.0" } } diff --git a/lab-eddie/server.js b/lab-eddie/server.js index 80770f0..67ffda6 100644 --- a/lab-eddie/server.js +++ b/lab-eddie/server.js @@ -1,18 +1,18 @@ -'use strict' +'use strict'; -const http = require('http'); -const Router = require('./lib/router.js'); -const PORT = process.env.PORT || 5000; -const modelPaths = require('./lib/model-paths.js') -const router = new Router(); +const express = require('express'); +const morgan = require('morgan'); +const createError = require('http-errors'); +const jasonParser = require('body-parser').json(); +const debug = require('debug')('note:server') +const PORT = process.env.PORT || 3000; + +const app = express(); + +app.use(morgan('dev')); -const modelKeys = Object.keys(modelPaths.models); -modelKeys.forEach(key => { - modelPaths.allRoutes(key, router); -}) -const server = http.createServer(router.route()); -server.listen(PORT, () => { - console.log('server on at port:', PORT); +app.listen(PORT, () => { + debug(console.log('server on at port:', PORT)); }); \ No newline at end of file From 97de351bd0fb3f7385dc6e661b3bfcf65f13fc41 Mon Sep 17 00:00:00 2001 From: Edwin Del Rio Date: Mon, 31 Jul 2017 20:45:14 -0700 Subject: [PATCH 03/11] refactored model-paths to use debug and express's native methods --- lab-eddie/lib/model-paths.js | 81 ++++++++++++++---------------------- lab-eddie/server.js | 5 +++ 2 files changed, 37 insertions(+), 49 deletions(-) diff --git a/lab-eddie/lib/model-paths.js b/lab-eddie/lib/model-paths.js index 7321321..8ef5deb 100644 --- a/lab-eddie/lib/model-paths.js +++ b/lab-eddie/lib/model-paths.js @@ -1,12 +1,14 @@ 'use strict'; +const debug = require('debug')('app:model-paths'); +const jsonParser = require('body-parser').json(); const storage = require('./storage.js'); -const header = require('./header.js') const Person = require('../model/person.js'); const Car = require('../model/car.js'); -const Dog = require('../model/dog.js') -const Employee = require('../model/employee.js') -const Character = require('../model/character.js') +const Dog = require('../model/dog.js'); +const Employee = require('../model/employee.js'); +const Character = require('../model/character.js'); + const modelRoutes = module.exports = {}; @@ -17,85 +19,66 @@ modelRoutes.models = { dog: Dog, employee: Employee, character: Character -} +}; modelRoutes.allRoutes = function(model, router) { modelRoutes.modelGet(model, router); modelRoutes.modelDelete(model, router); modelRoutes.modelPost(model, router); -} +}; modelRoutes.modelGet = function(model,router) { - router.get(`/api/${model}`, function(req, res) { + router.get(`/api/${model}`,jsonParser, function(req, res, next) { + debug(`GET: api/${model}`); if (req.url.query.id) { storage.fetchItem(`${model}`, req.url.query.id) - .then( item => { - header.appHeader(res, 200, item); - }) - .catch( err => { - console.error(err); - header.textHeader(res, 404, `${model} not found!`) - }); + .then(item => res.JSON(item)) + .catch(err => next(err)); return; + } else if (req.url.query) { storage.fetchItem(`${model}`) - .then( item => { - header.appHeader(res, 200, item); - }) - .catch( err => { - console.error(err); - header.textHeader(res, 400, 'Bad request!') - }); + .then(item => res.JSON(item)) + .catch(err => next(err)); return; }; - - header.textHeader(res, 400, 'Bad request!') }); }; modelRoutes.modelPost = function(model, router) { - router.post(`/api/${model}`, function(req, res) { - try { - let params = []; - for(let key in req.body) { - params.push(req.body[key]); - } - var newObj = new modelRoutes.models[model](...params); - - storage.createItem(`${model}`, newObj); - header.appHeader(res, 200, newObj); - - } catch (err) { - console.error(err); - header.textHeader(res, 400, 'Bad request!') + router.post(`/api/${model}`,jsonParser, function(req, res, next) { + debug(`POST: api/${model}`); + + let params = []; + for(let key in req.body) { + params.push(req.body[key]); } + + var newObj = new modelRoutes.models[model](...params); + + storage.createItem(`${model}`, newObj) + .then(item => res.JSON(item)) + .catch(err => next(err)); }); } modelRoutes.modelDelete = function(model, router) { - router.delete(`/api/${model}`, function(req, res) { + router.delete(`/api/${model}`,jsonParser, function(req, res, next) { + debug(`DELETE: api/${model}`); if (req.url.query.id) { + storage.deleteItem(`${model}`, req.url.query.id) - .then( item => { - header.appHeader(res, 202, item); - }) - .catch( err => { - console.error(err); - header.textHeader(res, 404, `${model} not found!`) - }); + .then(item => res.JSON(item)) + .catch( err => next(err)); return; }; - - header.textHeader(res, 400, 'Bad request!') }); - } - require('./auto-direct.js')(modelRoutes.models) \ No newline at end of file diff --git a/lab-eddie/server.js b/lab-eddie/server.js index 67ffda6..287ce17 100644 --- a/lab-eddie/server.js +++ b/lab-eddie/server.js @@ -4,6 +4,7 @@ const express = require('express'); const morgan = require('morgan'); const createError = require('http-errors'); const jasonParser = require('body-parser').json(); +const modelPaths = require('./lib/model-paths.js') const debug = require('debug')('note:server') const PORT = process.env.PORT || 3000; @@ -11,6 +12,10 @@ const app = express(); app.use(morgan('dev')); +const modelKeys = Object.keys(modelPaths.models); +modelKeys.forEach(key => { + modelPaths.allRoutes(key, app); +}) app.listen(PORT, () => { From 7a059eac1a431f23f95c4ff0ea97950fe4fc3775 Mon Sep 17 00:00:00 2001 From: Edwin Del Rio Date: Mon, 31 Jul 2017 21:36:14 -0700 Subject: [PATCH 04/11] passed all tests except delete code test :( --- lab-eddie/lib/model-paths.js | 22 +++++++------ lab-eddie/lib/parse-json.js | 34 -------------------- lab-eddie/lib/parse-url.js | 10 ------ lab-eddie/lib/router.js | 61 ------------------------------------ lab-eddie/model/dog.js | 1 + lab-eddie/package.json | 4 +-- 6 files changed, 15 insertions(+), 117 deletions(-) delete mode 100644 lab-eddie/lib/parse-json.js delete mode 100644 lab-eddie/lib/parse-url.js delete mode 100644 lab-eddie/lib/router.js diff --git a/lab-eddie/lib/model-paths.js b/lab-eddie/lib/model-paths.js index 8ef5deb..3ec0394 100644 --- a/lab-eddie/lib/model-paths.js +++ b/lab-eddie/lib/model-paths.js @@ -32,16 +32,17 @@ modelRoutes.allRoutes = function(model, router) { modelRoutes.modelGet = function(model,router) { router.get(`/api/${model}`,jsonParser, function(req, res, next) { debug(`GET: api/${model}`); - if (req.url.query.id) { - storage.fetchItem(`${model}`, req.url.query.id) - .then(item => res.JSON(item)) + if (req.query) { + storage.fetchItem(`${model}`, req.query.id) + .then(item => res.json(item)) .catch(err => next(err)); return; - } else if (req.url.query) { + } else if (!req.query.id) { + storage.fetchItem(`${model}`) - .then(item => res.JSON(item)) + .then(item => res.json(item)) .catch(err => next(err)); return; @@ -52,16 +53,17 @@ modelRoutes.modelGet = function(model,router) { modelRoutes.modelPost = function(model, router) { router.post(`/api/${model}`,jsonParser, function(req, res, next) { debug(`POST: api/${model}`); - + let params = []; for(let key in req.body) { + params.push(req.body[key]); } var newObj = new modelRoutes.models[model](...params); storage.createItem(`${model}`, newObj) - .then(item => res.JSON(item)) + .then(item => res.json(item)) .catch(err => next(err)); }); } @@ -70,10 +72,10 @@ modelRoutes.modelDelete = function(model, router) { router.delete(`/api/${model}`,jsonParser, function(req, res, next) { debug(`DELETE: api/${model}`); - if (req.url.query.id) { + if (req.query.id) { - storage.deleteItem(`${model}`, req.url.query.id) - .then(item => res.JSON(item)) + storage.deleteItem(`${model}`, req.query.id) + .then(item => res.json(item)) .catch( err => next(err)); return; diff --git a/lab-eddie/lib/parse-json.js b/lab-eddie/lib/parse-json.js deleted file mode 100644 index 6b9ad88..0000000 --- a/lab-eddie/lib/parse-json.js +++ /dev/null @@ -1,34 +0,0 @@ -'use strict'; - -module.exports = function(req) { - return new Promise((resolve, reject) => { - if (req.method === 'POST' || req.method === 'PUT') { - var body = ''; - - req.on('data', data => { - body += data.toString(); - }); - - req.on('end', () => { - try { - req.body = JSON.parse(body); - resolve(req); - } catch (err) { - console.error(err); - reject(err); - } - }); - - req.on('error', err => { - console.error(err); - reject(err); - }); - - return; - }; - - resolve(); - }); -} - - diff --git a/lab-eddie/lib/parse-url.js b/lab-eddie/lib/parse-url.js deleted file mode 100644 index a718e7f..0000000 --- a/lab-eddie/lib/parse-url.js +++ /dev/null @@ -1,10 +0,0 @@ -'use strict'; - -const parseUrl = require('url').parse; -const parseQuery = require('querystring').parse; - -module.exports = function(req) { - req.url = parseUrl(req.url); - req.url.query = parseQuery(req.url.query); - return Promise.resolve(req); -} diff --git a/lab-eddie/lib/router.js b/lab-eddie/lib/router.js deleted file mode 100644 index 068548a..0000000 --- a/lab-eddie/lib/router.js +++ /dev/null @@ -1,61 +0,0 @@ -'use strict'; - -const parseUrl = require('./parse-url.js'); -const parseJSON = require('./parse-json.js'); - -const Router = module.exports = function() { - this.routes = { - GET: {}, - POST: {}, - PUT: {}, - DELETE: {} - } -} - -Router.prototype.get = function(endpoint, callback) { - this.routes.GET[endpoint] = callback; -}; - -Router.prototype.post = function(endpoint, callback) { - this.routes.POST[endpoint] = callback; -}; - -Router.prototype.delete = function(endpoint, callback) { - this.routes.DELETE[endpoint] = callback; -}; - -Router.prototype.put = function(endpoint, callback) { - this.routes.PUT[endpoint] = callback; -}; - -Router.prototype.route = function() { - return (req, res) => { - Promise.all([ - parseUrl(req), - parseJSON(req) - ]) - .then(() => { - let reqMethod = this.routes[req.method]; - if(typeof reqMethod[req.url.pathname] === 'function') { - reqMethod[req.url.pathname](req, res); - return - } - console.error('route not found'); - res.writeHead(404, { - 'Content-Type' : 'text/plain' - }); - - res.write('route not found'); - res.end(); - }) - .catch(err => { - - res.writeHead(400, { - 'Content-Type' : 'text/plain' - }) - - res.write('bad request'); - res.end(); - }); - } -}; \ No newline at end of file diff --git a/lab-eddie/model/dog.js b/lab-eddie/model/dog.js index 7ff8839..53cde1c 100644 --- a/lab-eddie/model/dog.js +++ b/lab-eddie/model/dog.js @@ -4,6 +4,7 @@ const uuidv4 = require('uuid/v4'); const errHandle = require('../lib/errorHandle.js'); module.exports = function(name, breed, age) { + console.log(name, breed, age) errHandle.normal(['name', 'breed', 'age'], arguments); this.id = uuidv4(); diff --git a/lab-eddie/package.json b/lab-eddie/package.json index 1c797ab..65b86b7 100644 --- a/lab-eddie/package.json +++ b/lab-eddie/package.json @@ -4,8 +4,8 @@ "description": "", "main": "server.js", "scripts": { - "test": "echo \"Error: no test specified\" && exit 1", - "start": "node server.js" + "test": "mocha", + "start": "DEBUG='note*' node server.js" }, "keywords": [], "author": "", From cf7468dbd2541bbccf388374025bd9dbb73e47a8 Mon Sep 17 00:00:00 2001 From: Edwin Del Rio Date: Mon, 31 Jul 2017 21:41:49 -0700 Subject: [PATCH 05/11] Added 204 status code for deleted item --- lab-eddie/lib/model-paths.js | 2 ++ lab-eddie/test/car-test.js | 2 +- lab-eddie/test/person-test.js | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/lab-eddie/lib/model-paths.js b/lab-eddie/lib/model-paths.js index 3ec0394..e53a896 100644 --- a/lab-eddie/lib/model-paths.js +++ b/lab-eddie/lib/model-paths.js @@ -78,6 +78,8 @@ modelRoutes.modelDelete = function(model, router) { .then(item => res.json(item)) .catch( err => next(err)); + res.status(204) + return; }; }); diff --git a/lab-eddie/test/car-test.js b/lab-eddie/test/car-test.js index 1e58e47..5102470 100644 --- a/lab-eddie/test/car-test.js +++ b/lab-eddie/test/car-test.js @@ -45,7 +45,7 @@ describe('car Routes', function() { request.delete(`localhost:3000/api/car?id=${car.id}`) .end((err, res) => { if (err) return done(err); - expect(res.status).to.equal(202); + expect(res.status).to.equal(204); expect(res.body.make).to.equal(undefined); expect(res.body.model).to.equal(undefined); expect(res.body.year).to.equal(undefined); diff --git a/lab-eddie/test/person-test.js b/lab-eddie/test/person-test.js index a835e02..28329da 100644 --- a/lab-eddie/test/person-test.js +++ b/lab-eddie/test/person-test.js @@ -57,7 +57,7 @@ describe('person Routes', function() { request.delete(`localhost:3000/api/person?id=${person.id}`) .end((err, res) => { if (err) return done(err); - expect(res.status).to.equal(202); + expect(res.status).to.equal(204); expect(res.body.first).to.equal(undefined); expect(res.body.last).to.equal(undefined); expect(res.body.age).to.equal(undefined); From 580f56b9a42ff9356d5a11016927c14868d7ec80 Mon Sep 17 00:00:00 2001 From: Edwin Del Rio Date: Mon, 31 Jul 2017 22:19:42 -0700 Subject: [PATCH 06/11] Added test for bad request and not found --- lab-eddie/lib/model-paths.js | 28 +++++++++++++++++++++------- lab-eddie/lib/storage.js | 19 +++++++++++++------ lab-eddie/test/person-test.js | 25 ++++++++++++++++++++++++- 3 files changed, 58 insertions(+), 14 deletions(-) diff --git a/lab-eddie/lib/model-paths.js b/lab-eddie/lib/model-paths.js index e53a896..e9ada1f 100644 --- a/lab-eddie/lib/model-paths.js +++ b/lab-eddie/lib/model-paths.js @@ -1,6 +1,7 @@ 'use strict'; const debug = require('debug')('app:model-paths'); +const createError = require('http-errors'); const jsonParser = require('body-parser').json(); const storage = require('./storage.js'); const Person = require('../model/person.js'); @@ -30,12 +31,15 @@ modelRoutes.allRoutes = function(model, router) { modelRoutes.modelGet = function(model,router) { - router.get(`/api/${model}`,jsonParser, function(req, res, next) { + router.get(`/api/${model}`, function(req, res, next) { debug(`GET: api/${model}`); if (req.query) { storage.fetchItem(`${model}`, req.query.id) .then(item => res.json(item)) - .catch(err => next(err)); + .catch(err => { + err = createError(404, err.message); + next(err); + }); return; @@ -43,10 +47,13 @@ modelRoutes.modelGet = function(model,router) { storage.fetchItem(`${model}`) .then(item => res.json(item)) - .catch(err => next(err)); - + .catch(err => { + err = createError(404, err.message); + next(err); + }); return; }; + }); }; @@ -59,12 +66,19 @@ modelRoutes.modelPost = function(model, router) { params.push(req.body[key]); } - - var newObj = new modelRoutes.models[model](...params); + try { + var newObj = new modelRoutes.models[model](...params); + } catch(err) { + err = createError(400, err.message); + next(err); + } storage.createItem(`${model}`, newObj) .then(item => res.json(item)) - .catch(err => next(err)); + .catch(err => { + err = createError(400, err.message); + next(err); + }); }); } diff --git a/lab-eddie/lib/storage.js b/lab-eddie/lib/storage.js index 1f723e3..692c44e 100644 --- a/lab-eddie/lib/storage.js +++ b/lab-eddie/lib/storage.js @@ -2,12 +2,15 @@ const Promise = require('bluebird'); const fs = Promise.promisifyAll(require('fs'), { suffix: 'Prom' }); +const createError = require('http-errors'); +const debug = require('debug')('note:storage') module.exports = exports = {}; exports.createItem = function(category, item) { - if(!category) return Promise.reject(new Error(`Expecte category`)); - if(!item) return Promise.reject(new Error('Expected item')); + debug('createItem'); + if(!category) return Promise.reject(createError(400, 'expected category')); + if(!item) return Promise.reject(createError(400, 'expected item')); let stringObj = JSON.stringify(item); return fs.writeFileProm(`${__dirname}/../data/${category}/${item.id}.json`, stringObj) @@ -15,8 +18,10 @@ exports.createItem = function(category, item) { .catch(err => Promise.reject(err)); } + exports.fetchItem = function(category, id) { - if(!category) return Promise.reject(new Error(`Expecte category`)); + debug('fetchItem'); + if(!category) return Promise.reject(createError(400, 'expected category')); if(!id) return exports.fetchCategory(category); @@ -32,8 +37,9 @@ exports.fetchItem = function(category, id) { }; exports.deleteItem = function(category, id) { - if(!category) return Promise.reject(new Error(`Expecte category`)); - if(!id) return Promise.reject(new Error('Expected item')); + debug('deleteItem'); + if(!category) return Promise.reject(createError(400, 'expected category')); + if(!id) return Promise.reject(createError(400, 'expected id')); return fs.unlinkProm(`${__dirname}/../data/${category}/${id}.json`) .then(() => '') @@ -42,7 +48,8 @@ exports.deleteItem = function(category, id) { }; exports.fetchCategory= function(category) { - if(!category) return Promise.reject(new Error(`Expecte category`)); + debug('fetchCategory'); + if(!category) return Promise.reject(createError(400, 'expected category')); return fs.readdirProm(`${__dirname}/../data/${category}`) .then(data => { diff --git a/lab-eddie/test/person-test.js b/lab-eddie/test/person-test.js index 28329da..040dbb0 100644 --- a/lab-eddie/test/person-test.js +++ b/lab-eddie/test/person-test.js @@ -7,7 +7,29 @@ require('../server.js'); describe('person Routes', function() { var person = null; - + describe('POST: /api/person(no params)', function() { + it('should return a 400 code', function(done) { + request.post('localhost:3000/api/person') + .send({}) + .end((err, res) => { + if (err) { + expect(err.status).to.equal(400); + done(); + } + }); + }); + }); + describe('GET: /api/person (Invalid id)', function() { + it('should return a a 404 code', function(done) { + request.get(`localhost:3000/api/person?id=2123321423`) + .end((err, res) => { + if (err) { + expect(err.status).to.equal(404); + done() + } + }); + }); + }); describe('POST: /api/person', function() { it('should return a person', function(done) { request.post('localhost:3000/api/person') @@ -52,6 +74,7 @@ describe('person Routes', function() { }); }); }); + describe('DELETE: /api/person', function() { it('should return a an empty object', function(done) { request.delete(`localhost:3000/api/person?id=${person.id}`) From 329116dd8916c8f209911af970a5d4644bf8d4b3 Mon Sep 17 00:00:00 2001 From: Edwin Del Rio Date: Mon, 31 Jul 2017 22:22:01 -0700 Subject: [PATCH 07/11] refactored model-paths --- lab-eddie/lib/model-paths.js | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/lab-eddie/lib/model-paths.js b/lab-eddie/lib/model-paths.js index e9ada1f..c4829ec 100644 --- a/lab-eddie/lib/model-paths.js +++ b/lab-eddie/lib/model-paths.js @@ -75,10 +75,7 @@ modelRoutes.modelPost = function(model, router) { storage.createItem(`${model}`, newObj) .then(item => res.json(item)) - .catch(err => { - err = createError(400, err.message); - next(err); - }); + .catch(err => next(err)); }); } @@ -90,7 +87,7 @@ modelRoutes.modelDelete = function(model, router) { storage.deleteItem(`${model}`, req.query.id) .then(item => res.json(item)) - .catch( err => next(err)); + .catch(err => next(err)); res.status(204) From 85916586048916e3a3224e686a9861dddd986520 Mon Sep 17 00:00:00 2001 From: Edwin Del Rio Date: Mon, 31 Jul 2017 22:27:36 -0700 Subject: [PATCH 08/11] Refactored model-paths.js --- lab-eddie/lib/model-paths.js | 1 - 1 file changed, 1 deletion(-) diff --git a/lab-eddie/lib/model-paths.js b/lab-eddie/lib/model-paths.js index c4829ec..1747a1f 100644 --- a/lab-eddie/lib/model-paths.js +++ b/lab-eddie/lib/model-paths.js @@ -63,7 +63,6 @@ modelRoutes.modelPost = function(model, router) { let params = []; for(let key in req.body) { - params.push(req.body[key]); } try { From cd4ee3e432a065897889fdf931b6e1c5285b8263 Mon Sep 17 00:00:00 2001 From: Edwin Del Rio Date: Tue, 1 Aug 2017 11:17:52 -0700 Subject: [PATCH 09/11] Added eslintrc --- lab-eddie/.eslintrc | 21 +++++++++++++++++++++ lab-eddie/lib/auto-direct.js | 1 - lab-eddie/lib/model-paths.js | 10 ++++++---- lab-eddie/lib/storage.js | 8 ++++---- lab-eddie/server.js | 7 +++---- 5 files changed, 34 insertions(+), 13 deletions(-) create mode 100644 lab-eddie/.eslintrc diff --git a/lab-eddie/.eslintrc b/lab-eddie/.eslintrc new file mode 100644 index 0000000..8dc6807 --- /dev/null +++ b/lab-eddie/.eslintrc @@ -0,0 +1,21 @@ +{ + "rules": { + "no-console": "off", + "indent": [ "error", 2 ], + "quotes": [ "error", "single" ], + "semi": ["error", "always"], + "linebreak-style": [ "error", "unix" ] + }, + "env": { + "es6": true, + "node": true, + "mocha": true, + "jasmine": true + }, + "ecmaFeatures": { + "modules": true, + "experimentalObjectRestSpread": true, + "impliedStrict": true + }, + "extends": "eslint:recommended" +} diff --git a/lab-eddie/lib/auto-direct.js b/lab-eddie/lib/auto-direct.js index 058aa97..b7b1859 100644 --- a/lab-eddie/lib/auto-direct.js +++ b/lab-eddie/lib/auto-direct.js @@ -6,7 +6,6 @@ const fs = require('fs') const autoDataDir = module.exports = function(models) { let labDir = fs.readdirSync('.'); - console.log(Object.keys(models).length) if (!labDir.includes('data')) fs.mkdirSync('./data'); autoModelDir(models); }; diff --git a/lab-eddie/lib/model-paths.js b/lab-eddie/lib/model-paths.js index 1747a1f..ab7b9dd 100644 --- a/lab-eddie/lib/model-paths.js +++ b/lab-eddie/lib/model-paths.js @@ -45,6 +45,7 @@ modelRoutes.modelGet = function(model,router) { } else if (!req.query.id) { + storage.fetchItem(`${model}`) .then(item => res.json(item)) .catch(err => { @@ -65,16 +66,17 @@ modelRoutes.modelPost = function(model, router) { for(let key in req.body) { params.push(req.body[key]); } + try { var newObj = new modelRoutes.models[model](...params); + storage.createItem(`${model}`, newObj) + .then(item => res.json(item)) + .catch(err => next(err)); + } catch(err) { err = createError(400, err.message); next(err); } - - storage.createItem(`${model}`, newObj) - .then(item => res.json(item)) - .catch(err => next(err)); }); } diff --git a/lab-eddie/lib/storage.js b/lab-eddie/lib/storage.js index 692c44e..32c074a 100644 --- a/lab-eddie/lib/storage.js +++ b/lab-eddie/lib/storage.js @@ -15,7 +15,7 @@ exports.createItem = function(category, item) { let stringObj = JSON.stringify(item); return fs.writeFileProm(`${__dirname}/../data/${category}/${item.id}.json`, stringObj) .then(() => item) - .catch(err => Promise.reject(err)); + .catch(err => Promise.reject(createError(404, err.message))); } @@ -31,7 +31,7 @@ exports.fetchItem = function(category, id) { let item = JSON.parse(data.toString()); return item; } catch (err) { - return Promise.reject(err); + return Promise.reject(createError(404, err.message)); } }) }; @@ -43,7 +43,7 @@ exports.deleteItem = function(category, id) { return fs.unlinkProm(`${__dirname}/../data/${category}/${id}.json`) .then(() => '') - .catch(err => Promise.reject(err)); + .catch(err => Promise.reject(createError(404, err.message))); }; @@ -56,5 +56,5 @@ exports.fetchCategory= function(category) { data = data.map(id => id.split('.json')[0]) return data; }) - .catch(err => Promise.reject(err)) + .catch(err => Promise.reject(createError(404, err.message))) } \ No newline at end of file diff --git a/lab-eddie/server.js b/lab-eddie/server.js index 287ce17..5568f29 100644 --- a/lab-eddie/server.js +++ b/lab-eddie/server.js @@ -12,12 +12,11 @@ const app = express(); app.use(morgan('dev')); -const modelKeys = Object.keys(modelPaths.models); -modelKeys.forEach(key => { + +for(let key in modelPaths.models) { modelPaths.allRoutes(key, app); -}) +} - app.listen(PORT, () => { debug(console.log('server on at port:', PORT)); }); \ No newline at end of file From a7da7224c373e57163765a989fccf4ee1872a7c0 Mon Sep 17 00:00:00 2001 From: Edwin Del Rio Date: Tue, 1 Aug 2017 11:28:20 -0700 Subject: [PATCH 10/11] Added error middleware and removed console.logs --- lab-eddie/lib/model-paths.js | 4 ++-- lab-eddie/server.js | 15 +++++++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/lab-eddie/lib/model-paths.js b/lab-eddie/lib/model-paths.js index ab7b9dd..00b5b74 100644 --- a/lab-eddie/lib/model-paths.js +++ b/lab-eddie/lib/model-paths.js @@ -37,7 +37,7 @@ modelRoutes.modelGet = function(model,router) { storage.fetchItem(`${model}`, req.query.id) .then(item => res.json(item)) .catch(err => { - err = createError(404, err.message); + err = createError(404, 'Resource not found'); next(err); }); @@ -49,7 +49,7 @@ modelRoutes.modelGet = function(model,router) { storage.fetchItem(`${model}`) .then(item => res.json(item)) .catch(err => { - err = createError(404, err.message); + err = createError(404, 'Resource not found'); next(err); }); return; diff --git a/lab-eddie/server.js b/lab-eddie/server.js index 5568f29..87019d3 100644 --- a/lab-eddie/server.js +++ b/lab-eddie/server.js @@ -17,6 +17,21 @@ for(let key in modelPaths.models) { modelPaths.allRoutes(key, app); } + +app.use(function(err, req, res, next) { + debug('error stuff'); + console.error(err.message); + + if (err.status) { + res.status(err.status).send(err.name); + return; + } + + err = createError(500, err.message); + res.status(err.status).send(err.name); +}); + + app.listen(PORT, () => { debug(console.log('server on at port:', PORT)); }); \ No newline at end of file From ed536dc9f9ac4bf8733b405c4fbeef4eea52e56d Mon Sep 17 00:00:00 2001 From: Edwin Del Rio Date: Tue, 1 Aug 2017 11:29:14 -0700 Subject: [PATCH 11/11] Added eslintignore --- lab-eddie/.eslintignore | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 lab-eddie/.eslintignore diff --git a/lab-eddie/.eslintignore b/lab-eddie/.eslintignore new file mode 100644 index 0000000..ae8da71 --- /dev/null +++ b/lab-eddie/.eslintignore @@ -0,0 +1,6 @@ + +**/node_modules/* +**/vendor/* +**/*.min.js +**/coverage/* +**/build/*