From 45b2f8e49cf158d9200ea18ae00153d8e581bedf Mon Sep 17 00:00:00 2001 From: Edwin Del Rio Date: Thu, 27 Jul 2017 13:26:28 -0700 Subject: [PATCH 01/15] Copied over lab 08 --- lab-eddie/.gitignore | 127 +++++++++++++++++++++++++++++ lab-eddie/README.md | 1 + lab-eddie/lib/errorHandle.js | 12 +++ 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 | 45 +++++++++++ lab-eddie/model/car.js | 15 ++++ lab-eddie/model/dog.js | 14 ++++ lab-eddie/model/person.js | 14 ++++ lab-eddie/package.json | 21 +++++ lab-eddie/server.js | 147 ++++++++++++++++++++++++++++++++++ lab-eddie/test/car-test.js | 58 ++++++++++++++ lab-eddie/test/person-test.js | 80 ++++++++++++++++++ 14 files changed, 639 insertions(+) create mode 100644 lab-eddie/.gitignore create mode 100644 lab-eddie/README.md create mode 100644 lab-eddie/lib/errorHandle.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/dog.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..fbd29bb --- /dev/null +++ b/lab-eddie/.gitignore @@ -0,0 +1,127 @@ + +# 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 diff --git a/lab-eddie/README.md b/lab-eddie/README.md new file mode 100644 index 0000000..4689fee --- /dev/null +++ b/lab-eddie/README.md @@ -0,0 +1 @@ +My first Vanilla API :D 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/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..608fce3 --- /dev/null +++ b/lab-eddie/lib/storage.js @@ -0,0 +1,45 @@ +'use strict'; + +const 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')); + if(!storage[category]) storage[category] = {}; + + storage[category][item.id] = item; + return Promise.resolve(item); +} + +exports.fetchItem = function(category, id) { + return new Promise((resolve, reject) => { + if(!category) return Promise.reject(new Error(`Expecte category`)); + + var cat = storage[category]; + if(!cat) return reject(new Error('Category not found')); + if(!id) return resolve(Object.keys(cat)) + + var item = cat[id] + if(!item) return reject(new Error('Item not found.')) + + resolve(item); + }); +}; + +exports.deleteItem = function(category, id) { + return new Promise((resolve, reject) => { + if(!category) return Promise.reject(new Error(`Expecte category`)); + + var cat = storage[category]; + if(!cat) return reject(new Error('Category not found')); + if(!id) return reject(new Error('ID not found')); + + var item = cat[id] + if(!item) return reject(new Error('Item not found.')) + delete storage[category][id]; + + resolve({}); + }); +}; \ 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/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/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..f10aeae --- /dev/null +++ b/lab-eddie/package.json @@ -0,0 +1,21 @@ +{ + "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": { + "uuid": "^3.1.0" + } +} diff --git a/lab-eddie/server.js b/lab-eddie/server.js new file mode 100644 index 0000000..e7dfa0c --- /dev/null +++ b/lab-eddie/server.js @@ -0,0 +1,147 @@ +'use strict' + +const http = require('http'); +const Router = require('./lib/router.js'); +const storage = require('./lib/storage.js'); +const Person = require('./model/person.js'); +const Car = require('./model/car.js'); +const Dog = require('./model/dog.js') +const PORT = process.env.PORT || 5000; +const router = new Router(); + + +const models = { + person : Person, + car: Car, + dog: Dog +} +const modelRoutes = {}; + +modelRoutes.allRoutes = function(model) { + modelRoutes.modelGet(model); + modelRoutes.modelDelete(model); + modelRoutes.modelPost(model); +} + + +modelRoutes.modelGet = function(model) { + router.get(`/api/${model}`, function(req, res) { + if (req.url.query.id) { + storage.fetchItem(`${model}`, req.url.query.id) + .then( person => { + res.writeHead(200, { + 'Content-Type': 'application/json' + }); + + res.write(JSON.stringify(person)); + res.end(); + }) + .catch( err => { + console.error(err); + res.writeHead(404, { + 'Content-Type': 'text/plain' + }); + res.write(`${model} not found`); + res.end(); + }); + + return; + } else if (req.url.query) { + storage.fetchItem(`${model}`) + .then( person => { + res.writeHead(200, { + 'Content-Type': 'application/json' + }); + + res.write(JSON.stringify(person)); + res.end(); + }) + .catch( err => { + console.error(err); + res.writeHead(404, { + 'Content-Type': 'text/plain' + }); + res.write(`${model} not found`); + res.end(); + }); + + return; + }; + + res.writeHead(400, { + 'Content-Type': 'text/plain' + }); + res.write('bad request'); + res.end(); + }); +}; + +modelRoutes.modelPost = function(model) { + router.post(`/api/${model}`, function(req, res) { + try { + let params = []; + for(let key in req.body) { + params.push(req.body[key]); + } + var newObj = new models[model](...params); + console.log(newObj) + storage.createItem(`${model}`, newObj); + res.writeHead(200, { + 'Content-Type' : 'application/json' + }); + res.write(JSON.stringify(newObj)); + res.end(); + } catch (err) { + console.error(err); + res.writeHead(400, { + 'Content-Type' : 'text/plain' + }); + res.write('bad request'); + res.end(); + } + }); +} + +modelRoutes.modelDelete = function(model) { + + router.delete(`/api/${model}`, function(req, res) { + if (req.url.query.id) { + storage.deleteItem(`${model}`, req.url.query.id) + .then( person => { + res.writeHead(202, { + 'Content-Type': 'application/json' + }); + + res.write(JSON.stringify(person)); + res.end(); + }) + .catch( err => { + console.error(err); + res.writeHead(404, { + 'Content-Type': 'text/plain' + }); + res.write(`${model} not found`); + res.end(); + }); + + return; + }; + + res.writeHead(400, { + 'Content-Type': 'text/plain' + }); + res.write('bad request'); + res.end(); + }); + +} + +modelRoutes.allRoutes('person'); +modelRoutes.allRoutes('car'); +modelRoutes.allRoutes('dog') + +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..8cb6880 --- /dev/null +++ b/lab-eddie/test/person-test.js @@ -0,0 +1,80 @@ +'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.post('localhost:3000/api/person') + .send({ first: 'John', last: 'Doe', age: 69, job: 'ninja' }) + .end((err) => { + if (err) return done(err); + }); + request.post('localhost:3000/api/person') + .send({ first: 'Jane', last: 'Doe', age: 99, job: 'wizard' }) + .end((err) => { + if (err) return done(err); + }); + 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 e4b0f2254467f1354e7fa2bbace320da79c46b27 Mon Sep 17 00:00:00 2001 From: Edwin Del Rio Date: Thu, 27 Jul 2017 13:35:32 -0700 Subject: [PATCH 02/15] Created module that generates response headers --- lab-eddie/lib/header.js | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 lab-eddie/lib/header.js diff --git a/lab-eddie/lib/header.js b/lab-eddie/lib/header.js new file mode 100644 index 0000000..4956753 --- /dev/null +++ b/lab-eddie/lib/header.js @@ -0,0 +1,20 @@ +'use strict' + +const exports = module.exports = {}; + +exports.textHeader = function(res, code, msg) { + res.writeHeader(code, { + 'Content-Type': 'text/plain' + }); + res.write(msg); + res.end(); +} + +exports.appHeader = function(res, code, json) { + res.writeHeader(code, { + 'Content-Type': 'application/json' + }); + res.write(JSON.parse(json.toString())); + res.end(); +} + From b52eeb259837c4a5ef253fbbe67794820f130a3c Mon Sep 17 00:00:00 2001 From: Edwin Del Rio Date: Thu, 27 Jul 2017 13:50:31 -0700 Subject: [PATCH 03/15] Refactored server by moving path routing functions to a module --- lab-eddie/lib/model-paths.js | 135 +++++++++++++++++++++++++++++++++++ lab-eddie/server.js | 133 ++-------------------------------- 2 files changed, 140 insertions(+), 128 deletions(-) create mode 100644 lab-eddie/lib/model-paths.js diff --git a/lab-eddie/lib/model-paths.js b/lab-eddie/lib/model-paths.js new file mode 100644 index 0000000..4de6aa8 --- /dev/null +++ b/lab-eddie/lib/model-paths.js @@ -0,0 +1,135 @@ +'use strict'; + +const storage = require('./storage.js'); +const Person = require('../model/person.js'); +const Car = require('../model/car.js'); +const Dog = require('../model/dog.js') + + +const modelRoutes = module.exports = {}; + +modelRoutes.models = { + person : Person, + car: Car, + dog: Dog +} + + +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( person => { + res.writeHead(200, { + 'Content-Type': 'application/json' + }); + + res.write(JSON.stringify(person)); + res.end(); + }) + .catch( err => { + console.error(err); + res.writeHead(404, { + 'Content-Type': 'text/plain' + }); + res.write(`${model} not found`); + res.end(); + }); + + return; + } else if (req.url.query) { + storage.fetchItem(`${model}`) + .then( person => { + res.writeHead(200, { + 'Content-Type': 'application/json' + }); + + res.write(JSON.stringify(person)); + res.end(); + }) + .catch( err => { + console.error(err); + res.writeHead(404, { + 'Content-Type': 'text/plain' + }); + res.write(`${model} not found`); + res.end(); + }); + + return; + }; + + res.writeHead(400, { + 'Content-Type': 'text/plain' + }); + res.write('bad request'); + res.end(); + }); +}; + +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); + console.log('New Object: ', newObj) + storage.createItem(`${model}`, newObj); + res.writeHead(200, { + 'Content-Type' : 'application/json' + }); + res.write(JSON.stringify(newObj)); + res.end(); + } catch (err) { + console.error(err); + res.writeHead(400, { + 'Content-Type' : 'text/plain' + }); + res.write('bad request'); + res.end(); + } + }); +} + +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( person => { + res.writeHead(202, { + 'Content-Type': 'application/json' + }); + + res.write(JSON.stringify(person)); + res.end(); + }) + .catch( err => { + console.error(err); + res.writeHead(404, { + 'Content-Type': 'text/plain' + }); + res.write(`${model} not found`); + res.end(); + }); + + return; + }; + + res.writeHead(400, { + 'Content-Type': 'text/plain' + }); + res.write('bad request'); + res.end(); + }); + +} \ No newline at end of file diff --git a/lab-eddie/server.js b/lab-eddie/server.js index e7dfa0c..2cfa8d3 100644 --- a/lab-eddie/server.js +++ b/lab-eddie/server.js @@ -3,142 +3,19 @@ const http = require('http'); const Router = require('./lib/router.js'); const storage = require('./lib/storage.js'); -const Person = require('./model/person.js'); -const Car = require('./model/car.js'); -const Dog = require('./model/dog.js') const PORT = process.env.PORT || 5000; +const modelPaths = require('./lib/model-paths.js') const router = new Router(); -const models = { - person : Person, - car: Car, - dog: Dog -} -const modelRoutes = {}; -modelRoutes.allRoutes = function(model) { - modelRoutes.modelGet(model); - modelRoutes.modelDelete(model); - modelRoutes.modelPost(model); -} +console.log(router.post); +modelPaths.allRoutes('person', router); +modelPaths.allRoutes('car', router); +modelPaths.allRoutes('dog', router); -modelRoutes.modelGet = function(model) { - router.get(`/api/${model}`, function(req, res) { - if (req.url.query.id) { - storage.fetchItem(`${model}`, req.url.query.id) - .then( person => { - res.writeHead(200, { - 'Content-Type': 'application/json' - }); - res.write(JSON.stringify(person)); - res.end(); - }) - .catch( err => { - console.error(err); - res.writeHead(404, { - 'Content-Type': 'text/plain' - }); - res.write(`${model} not found`); - res.end(); - }); - - return; - } else if (req.url.query) { - storage.fetchItem(`${model}`) - .then( person => { - res.writeHead(200, { - 'Content-Type': 'application/json' - }); - - res.write(JSON.stringify(person)); - res.end(); - }) - .catch( err => { - console.error(err); - res.writeHead(404, { - 'Content-Type': 'text/plain' - }); - res.write(`${model} not found`); - res.end(); - }); - - return; - }; - - res.writeHead(400, { - 'Content-Type': 'text/plain' - }); - res.write('bad request'); - res.end(); - }); -}; - -modelRoutes.modelPost = function(model) { - router.post(`/api/${model}`, function(req, res) { - try { - let params = []; - for(let key in req.body) { - params.push(req.body[key]); - } - var newObj = new models[model](...params); - console.log(newObj) - storage.createItem(`${model}`, newObj); - res.writeHead(200, { - 'Content-Type' : 'application/json' - }); - res.write(JSON.stringify(newObj)); - res.end(); - } catch (err) { - console.error(err); - res.writeHead(400, { - 'Content-Type' : 'text/plain' - }); - res.write('bad request'); - res.end(); - } - }); -} - -modelRoutes.modelDelete = function(model) { - - router.delete(`/api/${model}`, function(req, res) { - if (req.url.query.id) { - storage.deleteItem(`${model}`, req.url.query.id) - .then( person => { - res.writeHead(202, { - 'Content-Type': 'application/json' - }); - - res.write(JSON.stringify(person)); - res.end(); - }) - .catch( err => { - console.error(err); - res.writeHead(404, { - 'Content-Type': 'text/plain' - }); - res.write(`${model} not found`); - res.end(); - }); - - return; - }; - - res.writeHead(400, { - 'Content-Type': 'text/plain' - }); - res.write('bad request'); - res.end(); - }); - -} - -modelRoutes.allRoutes('person'); -modelRoutes.allRoutes('car'); -modelRoutes.allRoutes('dog') const server = http.createServer(router.route()); From cf9f0fe66edef99c9c3d93edcc935f77d9e40cb8 Mon Sep 17 00:00:00 2001 From: Edwin Del Rio Date: Thu, 27 Jul 2017 14:02:08 -0700 Subject: [PATCH 04/15] Refactored server and removed router paths --- lab-eddie/lib/header.js | 8 ++-- lab-eddie/lib/model-paths.js | 72 ++++++++---------------------------- lab-eddie/server.js | 7 ---- 3 files changed, 19 insertions(+), 68 deletions(-) diff --git a/lab-eddie/lib/header.js b/lab-eddie/lib/header.js index 4956753..ab482d9 100644 --- a/lab-eddie/lib/header.js +++ b/lab-eddie/lib/header.js @@ -1,8 +1,8 @@ 'use strict' -const exports = module.exports = {}; +const header = module.exports = {}; -exports.textHeader = function(res, code, msg) { +header.textHeader = function(res, code, msg) { res.writeHeader(code, { 'Content-Type': 'text/plain' }); @@ -10,11 +10,11 @@ exports.textHeader = function(res, code, msg) { res.end(); } -exports.appHeader = function(res, code, json) { +header.appHeader = function(res, code, json) { res.writeHeader(code, { 'Content-Type': 'application/json' }); - res.write(JSON.parse(json.toString())); + res.write(JSON.stringify(json)); res.end(); } diff --git a/lab-eddie/lib/model-paths.js b/lab-eddie/lib/model-paths.js index 4de6aa8..f631796 100644 --- a/lab-eddie/lib/model-paths.js +++ b/lab-eddie/lib/model-paths.js @@ -1,6 +1,7 @@ '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') @@ -26,51 +27,29 @@ 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( person => { - res.writeHead(200, { - 'Content-Type': 'application/json' - }); - - res.write(JSON.stringify(person)); - res.end(); + .then( item => { + header.appHeader(res, 200, item); }) .catch( err => { console.error(err); - res.writeHead(404, { - 'Content-Type': 'text/plain' - }); - res.write(`${model} not found`); - res.end(); + header.textHeader(res, 404, `${model} not found!`) }); return; } else if (req.url.query) { storage.fetchItem(`${model}`) - .then( person => { - res.writeHead(200, { - 'Content-Type': 'application/json' - }); - - res.write(JSON.stringify(person)); - res.end(); + .then( item => { + header.appHeader(res, 200, item); }) .catch( err => { console.error(err); - res.writeHead(404, { - 'Content-Type': 'text/plain' - }); - res.write(`${model} not found`); - res.end(); + header.textHeader(res, 400, 'Bad request!') }); return; }; - res.writeHead(400, { - 'Content-Type': 'text/plain' - }); - res.write('bad request'); - res.end(); + header.textHeader(res, 400, 'Bad request!') }); }; @@ -82,20 +61,12 @@ modelRoutes.modelPost = function(model, router) { params.push(req.body[key]); } var newObj = new modelRoutes.models[model](...params); - console.log('New Object: ', newObj) + storage.createItem(`${model}`, newObj); - res.writeHead(200, { - 'Content-Type' : 'application/json' - }); - res.write(JSON.stringify(newObj)); - res.end(); + header.appHeader(res, 200, newObj); } catch (err) { console.error(err); - res.writeHead(400, { - 'Content-Type' : 'text/plain' - }); - res.write('bad request'); - res.end(); + header.textHeader(res, 400, 'Bad request!') } }); } @@ -105,31 +76,18 @@ 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( person => { - res.writeHead(202, { - 'Content-Type': 'application/json' - }); - - res.write(JSON.stringify(person)); - res.end(); + .then( item => { + header.appHeader(res, 200, item); }) .catch( err => { console.error(err); - res.writeHead(404, { - 'Content-Type': 'text/plain' - }); - res.write(`${model} not found`); - res.end(); + header.textHeader(res, 404, `${model} not found!`) }); return; }; - res.writeHead(400, { - 'Content-Type': 'text/plain' - }); - res.write('bad request'); - res.end(); + header.textHeader(res, 400, 'Bad request!') }); } \ No newline at end of file diff --git a/lab-eddie/server.js b/lab-eddie/server.js index 2cfa8d3..b5f089f 100644 --- a/lab-eddie/server.js +++ b/lab-eddie/server.js @@ -2,21 +2,14 @@ const http = require('http'); const Router = require('./lib/router.js'); -const storage = require('./lib/storage.js'); const PORT = process.env.PORT || 5000; const modelPaths = require('./lib/model-paths.js') const router = new Router(); - - -console.log(router.post); - modelPaths.allRoutes('person', router); modelPaths.allRoutes('car', router); modelPaths.allRoutes('dog', router); - - const server = http.createServer(router.route()); server.listen(PORT, () => { From ec7dba45998cf1301e8e14396c4bb4573a9c0fca Mon Sep 17 00:00:00 2001 From: Edwin Del Rio Date: Thu, 27 Jul 2017 14:04:48 -0700 Subject: [PATCH 05/15] Added file scaffolding for persistence --- lab-eddie/lib/model-paths.js | 1 + 1 file changed, 1 insertion(+) diff --git a/lab-eddie/lib/model-paths.js b/lab-eddie/lib/model-paths.js index f631796..86239cd 100644 --- a/lab-eddie/lib/model-paths.js +++ b/lab-eddie/lib/model-paths.js @@ -64,6 +64,7 @@ modelRoutes.modelPost = function(model, router) { storage.createItem(`${model}`, newObj); header.appHeader(res, 200, newObj); + } catch (err) { console.error(err); header.textHeader(res, 400, 'Bad request!') From d8c23aa54a2ec0dbdab4525d0343022ed5c3896f Mon Sep 17 00:00:00 2001 From: Edwin Del Rio Date: Thu, 27 Jul 2017 14:08:06 -0700 Subject: [PATCH 06/15] Installed bluebird as a dependancy --- lab-eddie/lib/storage.js | 3 ++- lab-eddie/package.json | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/lab-eddie/lib/storage.js b/lab-eddie/lib/storage.js index 608fce3..0cc59bb 100644 --- a/lab-eddie/lib/storage.js +++ b/lab-eddie/lib/storage.js @@ -1,6 +1,7 @@ 'use strict'; -const storage = {}; +const Promise = require('bluebird'); +const fs = Promise.promisifyAll(required('fs'), {suffix: 'Prom'}); module.exports = exports = {}; diff --git a/lab-eddie/package.json b/lab-eddie/package.json index f10aeae..6fda210 100644 --- a/lab-eddie/package.json +++ b/lab-eddie/package.json @@ -16,6 +16,7 @@ "superagent": "^3.5.2" }, "dependencies": { + "bluebird": "^3.5.0", "uuid": "^3.1.0" } } From 8cb618fd788323968028a8004fffbda3e40353ad Mon Sep 17 00:00:00 2001 From: Edwin Del Rio Date: Thu, 27 Jul 2017 17:17:40 -0700 Subject: [PATCH 07/15] Refactored storage to use file system persistence. --- lab-eddie/lib/model-paths.js | 5 ++-- lab-eddie/lib/storage.js | 53 ++++++++++++++++-------------------- lab-eddie/server.js | 7 +++-- 3 files changed, 31 insertions(+), 34 deletions(-) diff --git a/lab-eddie/lib/model-paths.js b/lab-eddie/lib/model-paths.js index 86239cd..157b053 100644 --- a/lab-eddie/lib/model-paths.js +++ b/lab-eddie/lib/model-paths.js @@ -28,6 +28,7 @@ modelRoutes.modelGet = function(model,router) { if (req.url.query.id) { storage.fetchItem(`${model}`, req.url.query.id) .then( item => { + console.log('Item xxxxxx: ', item) header.appHeader(res, 200, item); }) .catch( err => { @@ -64,7 +65,7 @@ modelRoutes.modelPost = function(model, router) { storage.createItem(`${model}`, newObj); header.appHeader(res, 200, newObj); - + } catch (err) { console.error(err); header.textHeader(res, 400, 'Bad request!') @@ -78,7 +79,7 @@ modelRoutes.modelDelete = function(model, router) { if (req.url.query.id) { storage.deleteItem(`${model}`, req.url.query.id) .then( item => { - header.appHeader(res, 200, item); + header.appHeader(res, 202, item); }) .catch( err => { console.error(err); diff --git a/lab-eddie/lib/storage.js b/lab-eddie/lib/storage.js index 0cc59bb..0b3e660 100644 --- a/lab-eddie/lib/storage.js +++ b/lab-eddie/lib/storage.js @@ -1,46 +1,41 @@ 'use strict'; const Promise = require('bluebird'); -const fs = Promise.promisifyAll(required('fs'), {suffix: 'Prom'}); +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')); - if(!storage[category]) storage[category] = {}; - - storage[category][item.id] = item; - return Promise.resolve(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) { - return new Promise((resolve, reject) => { - if(!category) return Promise.reject(new Error(`Expecte category`)); - - var cat = storage[category]; - if(!cat) return reject(new Error('Category not found')); - if(!id) return resolve(Object.keys(cat)) - - var item = cat[id] - if(!item) return reject(new Error('Item not found.')) - - resolve(item); - }); + if(!category) return Promise.reject(new Error(`Expecte category`)); + if(!id) return Promise.reject(new Error('Expected item')); + + 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) { - return new Promise((resolve, reject) => { - if(!category) return Promise.reject(new Error(`Expecte category`)); - - var cat = storage[category]; - if(!cat) return reject(new Error('Category not found')); - if(!id) return reject(new Error('ID not found')); - - var item = cat[id] - if(!item) return reject(new Error('Item not found.')) - delete storage[category][id]; + if(!category) return Promise.reject(new Error(`Expecte category`)); + if(!id) return Promise.reject(new Error('Expected item')); + console.log(fs.unlinkProm) + return fs.unlinkProm(`${__dirname}/../data/${category}/${id}.json`) + .then(() => '') + .catch(err => Promise.reject(err)); - resolve({}); - }); }; \ No newline at end of file diff --git a/lab-eddie/server.js b/lab-eddie/server.js index b5f089f..80770f0 100644 --- a/lab-eddie/server.js +++ b/lab-eddie/server.js @@ -6,9 +6,10 @@ const PORT = process.env.PORT || 5000; const modelPaths = require('./lib/model-paths.js') const router = new Router(); -modelPaths.allRoutes('person', router); -modelPaths.allRoutes('car', router); -modelPaths.allRoutes('dog', router); +const modelKeys = Object.keys(modelPaths.models); +modelKeys.forEach(key => { + modelPaths.allRoutes(key, router); +}) const server = http.createServer(router.route()); From deedb7df60c29786d9a785be5d471eb4c317da7c Mon Sep 17 00:00:00 2001 From: Edwin Del Rio Date: Thu, 27 Jul 2017 17:34:12 -0700 Subject: [PATCH 08/15] Refactored and passed all test using file system persistence --- .../015c46e0-1c4a-4ef0-9296-17e0b7e97426.json | 1 + .../08d7edd5-893b-491b-ab82-a015dd22d0a5.json | 1 + .../333b4430-3d88-4f5d-b15c-a10253b2860a.json | 1 + .../47aab581-5ae4-4a74-ab43-255de6fe9ac6.json | 1 + .../60ef3606-f2d1-4c06-a6a5-f8c7278a2029.json | 1 + .../6bde9030-5e5b-401c-8416-dfe3a26ce8d3.json | 1 + .../76b0f3f8-e0d0-4229-8e61-da769baa2803.json | 1 + .../9ecdedde-d485-4018-b552-a731eaa30e63.json | 1 + lab-eddie/lib/model-paths.js | 1 + lab-eddie/lib/storage.js | 18 +++++++++++++++--- 10 files changed, 24 insertions(+), 3 deletions(-) create mode 100644 lab-eddie/data/person/015c46e0-1c4a-4ef0-9296-17e0b7e97426.json create mode 100644 lab-eddie/data/person/08d7edd5-893b-491b-ab82-a015dd22d0a5.json create mode 100644 lab-eddie/data/person/333b4430-3d88-4f5d-b15c-a10253b2860a.json create mode 100644 lab-eddie/data/person/47aab581-5ae4-4a74-ab43-255de6fe9ac6.json create mode 100644 lab-eddie/data/person/60ef3606-f2d1-4c06-a6a5-f8c7278a2029.json create mode 100644 lab-eddie/data/person/6bde9030-5e5b-401c-8416-dfe3a26ce8d3.json create mode 100644 lab-eddie/data/person/76b0f3f8-e0d0-4229-8e61-da769baa2803.json create mode 100644 lab-eddie/data/person/9ecdedde-d485-4018-b552-a731eaa30e63.json diff --git a/lab-eddie/data/person/015c46e0-1c4a-4ef0-9296-17e0b7e97426.json b/lab-eddie/data/person/015c46e0-1c4a-4ef0-9296-17e0b7e97426.json new file mode 100644 index 0000000..7784d5e --- /dev/null +++ b/lab-eddie/data/person/015c46e0-1c4a-4ef0-9296-17e0b7e97426.json @@ -0,0 +1 @@ +{"id":"015c46e0-1c4a-4ef0-9296-17e0b7e97426","first":"Jane","last":"Doe","age":99,"job":"wizard"} \ No newline at end of file diff --git a/lab-eddie/data/person/08d7edd5-893b-491b-ab82-a015dd22d0a5.json b/lab-eddie/data/person/08d7edd5-893b-491b-ab82-a015dd22d0a5.json new file mode 100644 index 0000000..f6bce81 --- /dev/null +++ b/lab-eddie/data/person/08d7edd5-893b-491b-ab82-a015dd22d0a5.json @@ -0,0 +1 @@ +{"id":"08d7edd5-893b-491b-ab82-a015dd22d0a5","first":"John","last":"Doe","age":69,"job":"ninja"} \ No newline at end of file diff --git a/lab-eddie/data/person/333b4430-3d88-4f5d-b15c-a10253b2860a.json b/lab-eddie/data/person/333b4430-3d88-4f5d-b15c-a10253b2860a.json new file mode 100644 index 0000000..0468bf1 --- /dev/null +++ b/lab-eddie/data/person/333b4430-3d88-4f5d-b15c-a10253b2860a.json @@ -0,0 +1 @@ +{"id":"333b4430-3d88-4f5d-b15c-a10253b2860a","first":"Jane","last":"Doe","age":99,"job":"wizard"} \ No newline at end of file diff --git a/lab-eddie/data/person/47aab581-5ae4-4a74-ab43-255de6fe9ac6.json b/lab-eddie/data/person/47aab581-5ae4-4a74-ab43-255de6fe9ac6.json new file mode 100644 index 0000000..e556fa8 --- /dev/null +++ b/lab-eddie/data/person/47aab581-5ae4-4a74-ab43-255de6fe9ac6.json @@ -0,0 +1 @@ +{"id":"47aab581-5ae4-4a74-ab43-255de6fe9ac6","first":"John","last":"Doe","age":69,"job":"ninja"} \ No newline at end of file diff --git a/lab-eddie/data/person/60ef3606-f2d1-4c06-a6a5-f8c7278a2029.json b/lab-eddie/data/person/60ef3606-f2d1-4c06-a6a5-f8c7278a2029.json new file mode 100644 index 0000000..e595ad0 --- /dev/null +++ b/lab-eddie/data/person/60ef3606-f2d1-4c06-a6a5-f8c7278a2029.json @@ -0,0 +1 @@ +{"id":"60ef3606-f2d1-4c06-a6a5-f8c7278a2029","first":"Jane","last":"Doe","age":99,"job":"wizard"} \ No newline at end of file diff --git a/lab-eddie/data/person/6bde9030-5e5b-401c-8416-dfe3a26ce8d3.json b/lab-eddie/data/person/6bde9030-5e5b-401c-8416-dfe3a26ce8d3.json new file mode 100644 index 0000000..0c3eb54 --- /dev/null +++ b/lab-eddie/data/person/6bde9030-5e5b-401c-8416-dfe3a26ce8d3.json @@ -0,0 +1 @@ +{"id":"6bde9030-5e5b-401c-8416-dfe3a26ce8d3","first":"John","last":"Doe","age":69,"job":"ninja"} \ No newline at end of file diff --git a/lab-eddie/data/person/76b0f3f8-e0d0-4229-8e61-da769baa2803.json b/lab-eddie/data/person/76b0f3f8-e0d0-4229-8e61-da769baa2803.json new file mode 100644 index 0000000..654c4ec --- /dev/null +++ b/lab-eddie/data/person/76b0f3f8-e0d0-4229-8e61-da769baa2803.json @@ -0,0 +1 @@ +{"id":"76b0f3f8-e0d0-4229-8e61-da769baa2803","first":"Jane","last":"Doe","age":99,"job":"wizard"} \ No newline at end of file diff --git a/lab-eddie/data/person/9ecdedde-d485-4018-b552-a731eaa30e63.json b/lab-eddie/data/person/9ecdedde-d485-4018-b552-a731eaa30e63.json new file mode 100644 index 0000000..9527ebb --- /dev/null +++ b/lab-eddie/data/person/9ecdedde-d485-4018-b552-a731eaa30e63.json @@ -0,0 +1 @@ +{"id":"9ecdedde-d485-4018-b552-a731eaa30e63","first":"John","last":"Doe","age":69,"job":"ninja"} \ No newline at end of file diff --git a/lab-eddie/lib/model-paths.js b/lab-eddie/lib/model-paths.js index 157b053..a2527fb 100644 --- a/lab-eddie/lib/model-paths.js +++ b/lab-eddie/lib/model-paths.js @@ -40,6 +40,7 @@ modelRoutes.modelGet = function(model,router) { } else if (req.url.query) { storage.fetchItem(`${model}`) .then( item => { + console.log('final product: ', item) header.appHeader(res, 200, item); }) .catch( err => { diff --git a/lab-eddie/lib/storage.js b/lab-eddie/lib/storage.js index 0b3e660..1f723e3 100644 --- a/lab-eddie/lib/storage.js +++ b/lab-eddie/lib/storage.js @@ -17,7 +17,8 @@ exports.createItem = function(category, item) { exports.fetchItem = function(category, id) { if(!category) return Promise.reject(new Error(`Expecte category`)); - if(!id) return Promise.reject(new Error('Expected item')); + if(!id) return exports.fetchCategory(category); + return fs.readFileProm(`${__dirname}/../data/${category}/${id}.json`) .then(data => { @@ -33,9 +34,20 @@ 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')); - console.log(fs.unlinkProm) + return fs.unlinkProm(`${__dirname}/../data/${category}/${id}.json`) .then(() => '') .catch(err => Promise.reject(err)); -}; \ No newline at end of file +}; + +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 From 0735393b834990a87973fa66214852a75cca77f4 Mon Sep 17 00:00:00 2001 From: Edwin Del Rio Date: Thu, 27 Jul 2017 17:37:50 -0700 Subject: [PATCH 09/15] Refactored test to clean up files --- .../person/015c46e0-1c4a-4ef0-9296-17e0b7e97426.json | 1 - .../person/08d7edd5-893b-491b-ab82-a015dd22d0a5.json | 1 - .../person/333b4430-3d88-4f5d-b15c-a10253b2860a.json | 1 - .../person/47aab581-5ae4-4a74-ab43-255de6fe9ac6.json | 1 - .../person/60ef3606-f2d1-4c06-a6a5-f8c7278a2029.json | 1 - .../person/6bde9030-5e5b-401c-8416-dfe3a26ce8d3.json | 1 - .../person/76b0f3f8-e0d0-4229-8e61-da769baa2803.json | 1 - .../person/9ecdedde-d485-4018-b552-a731eaa30e63.json | 1 - lab-eddie/lib/model-paths.js | 2 -- lab-eddie/test/person-test.js | 10 ---------- 10 files changed, 20 deletions(-) delete mode 100644 lab-eddie/data/person/015c46e0-1c4a-4ef0-9296-17e0b7e97426.json delete mode 100644 lab-eddie/data/person/08d7edd5-893b-491b-ab82-a015dd22d0a5.json delete mode 100644 lab-eddie/data/person/333b4430-3d88-4f5d-b15c-a10253b2860a.json delete mode 100644 lab-eddie/data/person/47aab581-5ae4-4a74-ab43-255de6fe9ac6.json delete mode 100644 lab-eddie/data/person/60ef3606-f2d1-4c06-a6a5-f8c7278a2029.json delete mode 100644 lab-eddie/data/person/6bde9030-5e5b-401c-8416-dfe3a26ce8d3.json delete mode 100644 lab-eddie/data/person/76b0f3f8-e0d0-4229-8e61-da769baa2803.json delete mode 100644 lab-eddie/data/person/9ecdedde-d485-4018-b552-a731eaa30e63.json diff --git a/lab-eddie/data/person/015c46e0-1c4a-4ef0-9296-17e0b7e97426.json b/lab-eddie/data/person/015c46e0-1c4a-4ef0-9296-17e0b7e97426.json deleted file mode 100644 index 7784d5e..0000000 --- a/lab-eddie/data/person/015c46e0-1c4a-4ef0-9296-17e0b7e97426.json +++ /dev/null @@ -1 +0,0 @@ -{"id":"015c46e0-1c4a-4ef0-9296-17e0b7e97426","first":"Jane","last":"Doe","age":99,"job":"wizard"} \ No newline at end of file diff --git a/lab-eddie/data/person/08d7edd5-893b-491b-ab82-a015dd22d0a5.json b/lab-eddie/data/person/08d7edd5-893b-491b-ab82-a015dd22d0a5.json deleted file mode 100644 index f6bce81..0000000 --- a/lab-eddie/data/person/08d7edd5-893b-491b-ab82-a015dd22d0a5.json +++ /dev/null @@ -1 +0,0 @@ -{"id":"08d7edd5-893b-491b-ab82-a015dd22d0a5","first":"John","last":"Doe","age":69,"job":"ninja"} \ No newline at end of file diff --git a/lab-eddie/data/person/333b4430-3d88-4f5d-b15c-a10253b2860a.json b/lab-eddie/data/person/333b4430-3d88-4f5d-b15c-a10253b2860a.json deleted file mode 100644 index 0468bf1..0000000 --- a/lab-eddie/data/person/333b4430-3d88-4f5d-b15c-a10253b2860a.json +++ /dev/null @@ -1 +0,0 @@ -{"id":"333b4430-3d88-4f5d-b15c-a10253b2860a","first":"Jane","last":"Doe","age":99,"job":"wizard"} \ No newline at end of file diff --git a/lab-eddie/data/person/47aab581-5ae4-4a74-ab43-255de6fe9ac6.json b/lab-eddie/data/person/47aab581-5ae4-4a74-ab43-255de6fe9ac6.json deleted file mode 100644 index e556fa8..0000000 --- a/lab-eddie/data/person/47aab581-5ae4-4a74-ab43-255de6fe9ac6.json +++ /dev/null @@ -1 +0,0 @@ -{"id":"47aab581-5ae4-4a74-ab43-255de6fe9ac6","first":"John","last":"Doe","age":69,"job":"ninja"} \ No newline at end of file diff --git a/lab-eddie/data/person/60ef3606-f2d1-4c06-a6a5-f8c7278a2029.json b/lab-eddie/data/person/60ef3606-f2d1-4c06-a6a5-f8c7278a2029.json deleted file mode 100644 index e595ad0..0000000 --- a/lab-eddie/data/person/60ef3606-f2d1-4c06-a6a5-f8c7278a2029.json +++ /dev/null @@ -1 +0,0 @@ -{"id":"60ef3606-f2d1-4c06-a6a5-f8c7278a2029","first":"Jane","last":"Doe","age":99,"job":"wizard"} \ No newline at end of file diff --git a/lab-eddie/data/person/6bde9030-5e5b-401c-8416-dfe3a26ce8d3.json b/lab-eddie/data/person/6bde9030-5e5b-401c-8416-dfe3a26ce8d3.json deleted file mode 100644 index 0c3eb54..0000000 --- a/lab-eddie/data/person/6bde9030-5e5b-401c-8416-dfe3a26ce8d3.json +++ /dev/null @@ -1 +0,0 @@ -{"id":"6bde9030-5e5b-401c-8416-dfe3a26ce8d3","first":"John","last":"Doe","age":69,"job":"ninja"} \ No newline at end of file diff --git a/lab-eddie/data/person/76b0f3f8-e0d0-4229-8e61-da769baa2803.json b/lab-eddie/data/person/76b0f3f8-e0d0-4229-8e61-da769baa2803.json deleted file mode 100644 index 654c4ec..0000000 --- a/lab-eddie/data/person/76b0f3f8-e0d0-4229-8e61-da769baa2803.json +++ /dev/null @@ -1 +0,0 @@ -{"id":"76b0f3f8-e0d0-4229-8e61-da769baa2803","first":"Jane","last":"Doe","age":99,"job":"wizard"} \ No newline at end of file diff --git a/lab-eddie/data/person/9ecdedde-d485-4018-b552-a731eaa30e63.json b/lab-eddie/data/person/9ecdedde-d485-4018-b552-a731eaa30e63.json deleted file mode 100644 index 9527ebb..0000000 --- a/lab-eddie/data/person/9ecdedde-d485-4018-b552-a731eaa30e63.json +++ /dev/null @@ -1 +0,0 @@ -{"id":"9ecdedde-d485-4018-b552-a731eaa30e63","first":"John","last":"Doe","age":69,"job":"ninja"} \ No newline at end of file diff --git a/lab-eddie/lib/model-paths.js b/lab-eddie/lib/model-paths.js index a2527fb..464b885 100644 --- a/lab-eddie/lib/model-paths.js +++ b/lab-eddie/lib/model-paths.js @@ -28,7 +28,6 @@ modelRoutes.modelGet = function(model,router) { if (req.url.query.id) { storage.fetchItem(`${model}`, req.url.query.id) .then( item => { - console.log('Item xxxxxx: ', item) header.appHeader(res, 200, item); }) .catch( err => { @@ -40,7 +39,6 @@ modelRoutes.modelGet = function(model,router) { } else if (req.url.query) { storage.fetchItem(`${model}`) .then( item => { - console.log('final product: ', item) header.appHeader(res, 200, item); }) .catch( err => { diff --git a/lab-eddie/test/person-test.js b/lab-eddie/test/person-test.js index 8cb6880..a835e02 100644 --- a/lab-eddie/test/person-test.js +++ b/lab-eddie/test/person-test.js @@ -27,16 +27,6 @@ describe('person Routes', function() { }); describe('GET: /api/person (No IDs)', function() { it('should return an array of IDs', function(done) { - request.post('localhost:3000/api/person') - .send({ first: 'John', last: 'Doe', age: 69, job: 'ninja' }) - .end((err) => { - if (err) return done(err); - }); - request.post('localhost:3000/api/person') - .send({ first: 'Jane', last: 'Doe', age: 99, job: 'wizard' }) - .end((err) => { - if (err) return done(err); - }); request.get('localhost:3000/api/person') .end((err, res) => { if(err) return done(err); From 504ffb8f2083129bb974480b55a728c45b11b8d0 Mon Sep 17 00:00:00 2001 From: Edwin Del Rio Date: Thu, 27 Jul 2017 21:16:55 -0700 Subject: [PATCH 10/15] Removed data files and added data directory to gititnore --- lab-eddie/lib/model-paths.js | 6 +++++- lab-eddie/model/character.js | 15 +++++++++++++++ lab-eddie/model/employee.js | 15 +++++++++++++++ 3 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 lab-eddie/model/character.js create mode 100644 lab-eddie/model/employee.js diff --git a/lab-eddie/lib/model-paths.js b/lab-eddie/lib/model-paths.js index 464b885..66be828 100644 --- a/lab-eddie/lib/model-paths.js +++ b/lab-eddie/lib/model-paths.js @@ -5,6 +5,8 @@ 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 = {}; @@ -12,7 +14,9 @@ const modelRoutes = module.exports = {}; modelRoutes.models = { person : Person, car: Car, - dog: Dog + dog: Dog, + employee: Employee, + character: Character } 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/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 From 20200b9b32e6884e797dec174ca97da4236b0f1c Mon Sep 17 00:00:00 2001 From: Edwin Del Rio Date: Thu, 27 Jul 2017 21:17:35 -0700 Subject: [PATCH 11/15] Deleted default read me --- README.md | 32 -------------------------------- 1 file changed, 32 deletions(-) delete mode 100644 README.md diff --git a/README.md b/README.md deleted file mode 100644 index 0aaf9f2..0000000 --- a/README.md +++ /dev/null @@ -1,32 +0,0 @@ -![cf](https://i.imgur.com/7v5ASc8.png) Lab 09: Vanilla REST API w/ Persistence -====== - -## Submission Instructions - * fork this repository & create a new branch for your work - * write all of your code in a directory named `lab-` + `` **e.g.** `lab-susan` - * push to your repository - * submit a pull request to this repository - * submit a link to your PR in canvas - * write a question and observation on canvas - -## Learning Objectives -* students will learn how to save resource data to the file system for a layer of data persistence -* students will learn how to refactor commonly used coding constructs into custom helper modules - -## Requirements - -#### Configuration -* `package.json` -* `.eslintrc` -* `.gitignore` -* `README.md` - * your `README.md` should include detailed instructions on how to use your API - * this should include documentation on how to access your API endpoints - -#### Feature Tasks -* continue working on your vanilla REST API -* refactor your routes to be contained in a separate module (ex: `route/resource-route.js`) -* refactor your `res` messages & status codes to be contained in a separate module (ex: `response.js`) -* refactor the `storage.js` module to use file system persistence - * use the `fs` module to create and read the associated data files - * the name of the file should contain the related resource id From ab0702327739126bbfc5edba2e343a7df33bc301 Mon Sep 17 00:00:00 2001 From: Edwin Del Rio Date: Thu, 27 Jul 2017 21:40:51 -0700 Subject: [PATCH 12/15] Added module that auto generates data direcotry and sub directories --- lab-eddie/.gitignore | 1 + lab-eddie/lib/auto-direct.js | 14 ++++++++++++++ lab-eddie/lib/model-paths.js | 4 ++-- 3 files changed, 17 insertions(+), 2 deletions(-) create mode 100644 lab-eddie/lib/auto-direct.js diff --git a/lab-eddie/.gitignore b/lab-eddie/.gitignore index fbd29bb..e19c8ab 100644 --- a/lab-eddie/.gitignore +++ b/lab-eddie/.gitignore @@ -125,3 +125,4 @@ $RECYCLE.BIN/ *.lnk # End of https://www.gitignore.io/api/osx,vim,node,windows +data \ 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..c4c92a1 --- /dev/null +++ b/lab-eddie/lib/auto-direct.js @@ -0,0 +1,14 @@ +'use strict' + +const fs = require('fs') + +const autoDataDir = module.exports = function(models) { + let labDir = fs.readdirSync('..'); + if (!labDir.includes('data')) fs.mkdirSync('../data'); + if (fs.readdirSync('../data').length === 0) autoModelDir(models); +}; + +const autoModelDir = function(models) { + let modelKeys = Object.keys(models); + modelKeys.forEach(key => fs.mkdirSync(`../data/${key}`)); +} diff --git a/lab-eddie/lib/model-paths.js b/lab-eddie/lib/model-paths.js index 66be828..bb3bc25 100644 --- a/lab-eddie/lib/model-paths.js +++ b/lab-eddie/lib/model-paths.js @@ -8,7 +8,6 @@ const Dog = require('../model/dog.js') const Employee = require('../model/employee.js') const Character = require('../model/character.js') - const modelRoutes = module.exports = {}; modelRoutes.models = { @@ -94,5 +93,6 @@ modelRoutes.modelDelete = function(model, router) { header.textHeader(res, 400, 'Bad request!') }); +} -} \ No newline at end of file +require('./auto-direct.js')(modelRoutes.models); \ No newline at end of file From e339d0338aa37e54b3745b89c4c7c5c8ae2b516e Mon Sep 17 00:00:00 2001 From: Edwin Del Rio Date: Thu, 27 Jul 2017 21:51:08 -0700 Subject: [PATCH 13/15] Fiexed bug that caused data directory to generate outside of lab dir --- lab-eddie/lib/auto-direct.js | 9 +++++---- lab-eddie/lib/model-paths.js | 10 ++++------ 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/lab-eddie/lib/auto-direct.js b/lab-eddie/lib/auto-direct.js index c4c92a1..8b82367 100644 --- a/lab-eddie/lib/auto-direct.js +++ b/lab-eddie/lib/auto-direct.js @@ -3,12 +3,13 @@ const fs = require('fs') const autoDataDir = module.exports = function(models) { - let labDir = fs.readdirSync('..'); - if (!labDir.includes('data')) fs.mkdirSync('../data'); - if (fs.readdirSync('../data').length === 0) autoModelDir(models); + let labDir = fs.readdirSync('.'); + console.log(labDir.includes('data')) + if (!labDir.includes('data')) fs.mkdirSync('./data'); + if (fs.readdirSync('./data').length === 0) autoModelDir(models); }; const autoModelDir = function(models) { let modelKeys = Object.keys(models); - modelKeys.forEach(key => fs.mkdirSync(`../data/${key}`)); + modelKeys.forEach(key => fs.mkdirSync(`./data/${key}`)); } diff --git a/lab-eddie/lib/model-paths.js b/lab-eddie/lib/model-paths.js index bb3bc25..11f0a4f 100644 --- a/lab-eddie/lib/model-paths.js +++ b/lab-eddie/lib/model-paths.js @@ -5,17 +5,14 @@ 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 + dog: Dog } @@ -93,6 +90,7 @@ modelRoutes.modelDelete = function(model, router) { header.textHeader(res, 400, 'Bad request!') }); + } -require('./auto-direct.js')(modelRoutes.models); \ No newline at end of file +require('./auto-direct.js')(modelRoutes.models) \ No newline at end of file From 7e95f62ca09cd5ce65b68a4ebc4f7f7c2d22b9e6 Mon Sep 17 00:00:00 2001 From: Edwin Del Rio Date: Thu, 27 Jul 2017 22:06:48 -0700 Subject: [PATCH 14/15] refactored auto-direct --- lab-eddie/README.md | 20 +++++++++++++++++++- lab-eddie/lib/auto-direct.js | 9 ++++++--- lab-eddie/lib/model-paths.js | 6 +++++- 3 files changed, 30 insertions(+), 5 deletions(-) diff --git a/lab-eddie/README.md b/lab-eddie/README.md index 4689fee..e5be1b5 100644 --- a/lab-eddie/README.md +++ b/lab-eddie/README.md @@ -1 +1,19 @@ -My first Vanilla API :D +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. \ No newline at end of file diff --git a/lab-eddie/lib/auto-direct.js b/lab-eddie/lib/auto-direct.js index 8b82367..795a7cb 100644 --- a/lab-eddie/lib/auto-direct.js +++ b/lab-eddie/lib/auto-direct.js @@ -4,12 +4,15 @@ const fs = require('fs') const autoDataDir = module.exports = function(models) { let labDir = fs.readdirSync('.'); - console.log(labDir.includes('data')) + console.log(Object.keys(models).length) if (!labDir.includes('data')) fs.mkdirSync('./data'); - if (fs.readdirSync('./data').length === 0) autoModelDir(models); + autoModelDir(models); }; const autoModelDir = function(models) { let modelKeys = Object.keys(models); - modelKeys.forEach(key => fs.mkdirSync(`./data/${key}`)); + let dataDir = fs.readdirSync('./data'); + modelKeys.forEach(key => { + if(!dataDir.includes(key)) fs.mkdirSync(`./data/${key}`) + }); } diff --git a/lab-eddie/lib/model-paths.js b/lab-eddie/lib/model-paths.js index 11f0a4f..1273c8d 100644 --- a/lab-eddie/lib/model-paths.js +++ b/lab-eddie/lib/model-paths.js @@ -5,6 +5,8 @@ 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 = {}; @@ -12,7 +14,9 @@ const modelRoutes = module.exports = {}; modelRoutes.models = { person : Person, car: Car, - dog: Dog + dog: Dog, + employee: Employee, + character: Character } From e600c8ee7c618d236e5da2801677b907d743b5e0 Mon Sep 17 00:00:00 2001 From: Edwin Del Rio Date: Thu, 27 Jul 2017 22:17:19 -0700 Subject: [PATCH 15/15] Created readme file --- lab-eddie/README.md | 47 +++++++++++++++++++++++++++++++++++- lab-eddie/lib/auto-direct.js | 5 ++-- 2 files changed, 49 insertions(+), 3 deletions(-) diff --git a/lab-eddie/README.md b/lab-eddie/README.md index e5be1b5..9573976 100644 --- a/lab-eddie/README.md +++ b/lab-eddie/README.md @@ -16,4 +16,49 @@ This API is seperated into 6 major components: -----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. \ No newline at end of file +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 index 795a7cb..058aa97 100644 --- a/lab-eddie/lib/auto-direct.js +++ b/lab-eddie/lib/auto-direct.js @@ -2,7 +2,9 @@ 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'); @@ -13,6 +15,5 @@ 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}`) - }); + if(!dataDir.includes(key)) fs.mkdirSync(`./data/${key}`)}); }