diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 0000000..881053e --- /dev/null +++ b/.eslintrc @@ -0,0 +1,33 @@ +{ +"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/.gitignore b/.gitignore new file mode 100644 index 0000000..3c3629e --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +node_modules diff --git a/data/house/14e0178a-59f2-4075-abe8-a7a3389fc993.json b/data/house/14e0178a-59f2-4075-abe8-a7a3389fc993.json new file mode 100644 index 0000000..2fa9221 --- /dev/null +++ b/data/house/14e0178a-59f2-4075-abe8-a7a3389fc993.json @@ -0,0 +1 @@ +{"id":"14e0178a-59f2-4075-abe8-a7a3389fc993","name":"Royce","seat":"Runestone","region":"The Vale of Arryn","words":"We Remember"} \ No newline at end of file diff --git a/data/house/29487796-44f5-460e-a8f4-03b1759be79a.json b/data/house/29487796-44f5-460e-a8f4-03b1759be79a.json new file mode 100644 index 0000000..887d375 --- /dev/null +++ b/data/house/29487796-44f5-460e-a8f4-03b1759be79a.json @@ -0,0 +1 @@ +{"id":"29487796-44f5-460e-a8f4-03b1759be79a","name":"Greyjoy","seat":"Pyke","region":"The Iron Islands","words":"We Do Not Sow"} \ No newline at end of file diff --git a/data/house/29cf2d74-06a7-4844-832c-ee038118b044.json b/data/house/29cf2d74-06a7-4844-832c-ee038118b044.json new file mode 100644 index 0000000..b2be787 --- /dev/null +++ b/data/house/29cf2d74-06a7-4844-832c-ee038118b044.json @@ -0,0 +1 @@ +{"id":"29cf2d74-06a7-4844-832c-ee038118b044","name":"Arryn","seat":"The Eyrie","region":"The Vale of Arryn","words":"As High as Honor"} \ No newline at end of file diff --git a/data/house/30dfab51-4854-4bc4-b1f5-f39ac54a5b1e.json b/data/house/30dfab51-4854-4bc4-b1f5-f39ac54a5b1e.json new file mode 100644 index 0000000..4b4cf98 --- /dev/null +++ b/data/house/30dfab51-4854-4bc4-b1f5-f39ac54a5b1e.json @@ -0,0 +1 @@ +{"id":"30dfab51-4854-4bc4-b1f5-f39ac54a5b1e","name":"Targaryen","seat":"Dragonstone","region":"The Crownlands","words":"Fire and Blood"} \ No newline at end of file diff --git a/data/house/3e6bf8d7-4e0c-44f7-a1c2-37c83c925269.json b/data/house/3e6bf8d7-4e0c-44f7-a1c2-37c83c925269.json new file mode 100644 index 0000000..bce28b5 --- /dev/null +++ b/data/house/3e6bf8d7-4e0c-44f7-a1c2-37c83c925269.json @@ -0,0 +1 @@ +{"id":"3e6bf8d7-4e0c-44f7-a1c2-37c83c925269","name":"Baratheon","seat":"Storm's End","region":"The Stormlands","words":"Ours is the Fury"} \ No newline at end of file diff --git a/data/house/54e56114-37fe-4421-bbea-16b41eefba07.json b/data/house/54e56114-37fe-4421-bbea-16b41eefba07.json new file mode 100644 index 0000000..b3529c6 --- /dev/null +++ b/data/house/54e56114-37fe-4421-bbea-16b41eefba07.json @@ -0,0 +1 @@ +{"id":"54e56114-37fe-4421-bbea-16b41eefba07","name":"Cerwyn","seat":"Castle Cerwyn","region":"The North","words":"Honed and Ready"} \ No newline at end of file diff --git a/data/house/5fe38d3f-1c86-4cfe-8a44-4e4963adebdc.json b/data/house/5fe38d3f-1c86-4cfe-8a44-4e4963adebdc.json new file mode 100644 index 0000000..5b629d8 --- /dev/null +++ b/data/house/5fe38d3f-1c86-4cfe-8a44-4e4963adebdc.json @@ -0,0 +1 @@ +{"id":"5fe38d3f-1c86-4cfe-8a44-4e4963adebdc","name":"Hornwood","seat":"Hornwood","region":"The North","words":"Righteous in Wrath"} \ No newline at end of file diff --git a/data/house/80870533-a0aa-4633-ac66-5722f22805e8.json b/data/house/80870533-a0aa-4633-ac66-5722f22805e8.json new file mode 100644 index 0000000..a584e62 --- /dev/null +++ b/data/house/80870533-a0aa-4633-ac66-5722f22805e8.json @@ -0,0 +1 @@ +{"id":"80870533-a0aa-4633-ac66-5722f22805e8","name":"Lannister","seat":"Casterly Rock","region":"The Westerlands","words":"Hear Me Roar"} \ No newline at end of file diff --git a/data/house/902bd209-35d1-46b8-9a6e-0fe52d1c4245.json b/data/house/902bd209-35d1-46b8-9a6e-0fe52d1c4245.json new file mode 100644 index 0000000..fe0c038 --- /dev/null +++ b/data/house/902bd209-35d1-46b8-9a6e-0fe52d1c4245.json @@ -0,0 +1 @@ +{"id":"902bd209-35d1-46b8-9a6e-0fe52d1c4245","name":"Karstark","seat":"Karhold","region":"The North","words":"The Sun of Winter"} \ No newline at end of file diff --git a/data/house/94aa22e8-d220-4afa-b05e-db683b2a6bae.json b/data/house/94aa22e8-d220-4afa-b05e-db683b2a6bae.json new file mode 100644 index 0000000..4d684df --- /dev/null +++ b/data/house/94aa22e8-d220-4afa-b05e-db683b2a6bae.json @@ -0,0 +1 @@ +{"id":"94aa22e8-d220-4afa-b05e-db683b2a6bae","name":"Bolton","seat":"The Dreadfort","region":"The North","words":"Our Blades are Sharp"} \ No newline at end of file diff --git a/data/house/9c1927d8-3fe0-4437-be9d-4a6ef43cc134.json b/data/house/9c1927d8-3fe0-4437-be9d-4a6ef43cc134.json new file mode 100644 index 0000000..ff95a3a --- /dev/null +++ b/data/house/9c1927d8-3fe0-4437-be9d-4a6ef43cc134.json @@ -0,0 +1 @@ +{"id":"9c1927d8-3fe0-4437-be9d-4a6ef43cc134","name":"Mallister","seat":"Seagard","region":"The Riverlands","words":"Above the Rest"} \ No newline at end of file diff --git a/data/house/9dd53213-ddfc-41c5-a4b1-2f0f977676c8.json b/data/house/9dd53213-ddfc-41c5-a4b1-2f0f977676c8.json new file mode 100644 index 0000000..50f4bdf --- /dev/null +++ b/data/house/9dd53213-ddfc-41c5-a4b1-2f0f977676c8.json @@ -0,0 +1 @@ +{"id":"9dd53213-ddfc-41c5-a4b1-2f0f977676c8","name":"Tyrell","seat":"Highgarden","region":"The Reach","words":"Growing Strong"} \ No newline at end of file diff --git a/data/house/a08d0863-64f9-4b9e-8c4c-011f23f58a80.json b/data/house/a08d0863-64f9-4b9e-8c4c-011f23f58a80.json new file mode 100644 index 0000000..10f94da --- /dev/null +++ b/data/house/a08d0863-64f9-4b9e-8c4c-011f23f58a80.json @@ -0,0 +1 @@ +{"id":"a08d0863-64f9-4b9e-8c4c-011f23f58a80","name":"Stark","seat":"Winterfell","region":"The North","words":"Winter is Coming"} \ No newline at end of file diff --git a/data/house/a0dec095-2e28-4afc-aa79-c18478328074.json b/data/house/a0dec095-2e28-4afc-aa79-c18478328074.json new file mode 100644 index 0000000..b914121 --- /dev/null +++ b/data/house/a0dec095-2e28-4afc-aa79-c18478328074.json @@ -0,0 +1 @@ +{"id":"a0dec095-2e28-4afc-aa79-c18478328074","name":"Mormont","seat":"Bear Island","region":"The North","words":"Here We Stand"} \ No newline at end of file diff --git a/data/house/a659cc81-bad0-4f25-b877-a25d2cde79f3.json b/data/house/a659cc81-bad0-4f25-b877-a25d2cde79f3.json new file mode 100644 index 0000000..ba61188 --- /dev/null +++ b/data/house/a659cc81-bad0-4f25-b877-a25d2cde79f3.json @@ -0,0 +1 @@ +{"id":"a659cc81-bad0-4f25-b877-a25d2cde79f3","name":"Hightower","seat":"The Hightower","region":"The Reach","words":"We Light the Way"} \ No newline at end of file diff --git a/data/house/afa015eb-3ba1-4b03-bcf7-049ebe2c77fb.json b/data/house/afa015eb-3ba1-4b03-bcf7-049ebe2c77fb.json new file mode 100644 index 0000000..bd4c9e0 --- /dev/null +++ b/data/house/afa015eb-3ba1-4b03-bcf7-049ebe2c77fb.json @@ -0,0 +1 @@ +{"id":"afa015eb-3ba1-4b03-bcf7-049ebe2c77fb","name":"Frey","seat":"The Twins","region":"The Riverlands","words":"We Stand Together"} \ No newline at end of file diff --git a/data/house/b7dab937-9b02-4453-86da-0d5dd2e38f1e.json b/data/house/b7dab937-9b02-4453-86da-0d5dd2e38f1e.json new file mode 100644 index 0000000..e4d7cfb --- /dev/null +++ b/data/house/b7dab937-9b02-4453-86da-0d5dd2e38f1e.json @@ -0,0 +1 @@ +{"id":"b7dab937-9b02-4453-86da-0d5dd2e38f1e","name":"Tully","seat":"Riverrun","region":"The Riverlands","words":"Family Duty Honor"} \ No newline at end of file diff --git a/data/house/c5dbd7b2-7b4a-4434-aedd-630f686fb5f9.json b/data/house/c5dbd7b2-7b4a-4434-aedd-630f686fb5f9.json new file mode 100644 index 0000000..d1668f8 --- /dev/null +++ b/data/house/c5dbd7b2-7b4a-4434-aedd-630f686fb5f9.json @@ -0,0 +1 @@ +{"id":"c5dbd7b2-7b4a-4434-aedd-630f686fb5f9","name":"Martell","seat":"Sunspear","region":"Dorne","words":"Unbowed Unbent Unbroken"} \ No newline at end of file diff --git a/data/house/c95be38c-1ba9-4475-87af-f492e381f69c.json b/data/house/c95be38c-1ba9-4475-87af-f492e381f69c.json new file mode 100644 index 0000000..6458489 --- /dev/null +++ b/data/house/c95be38c-1ba9-4475-87af-f492e381f69c.json @@ -0,0 +1 @@ +{"id":"c95be38c-1ba9-4475-87af-f492e381f69c","name":"Stokeworth","seat":"Castle Stokeworth","region":"The Crownlands","words":"Proud to Be Faithful"} \ No newline at end of file diff --git a/data/house/fab76973-7a1a-4dae-88c9-754fe90e4f85.json b/data/house/fab76973-7a1a-4dae-88c9-754fe90e4f85.json new file mode 100644 index 0000000..e5b0be9 --- /dev/null +++ b/data/house/fab76973-7a1a-4dae-88c9-754fe90e4f85.json @@ -0,0 +1 @@ +{"id":"fab76973-7a1a-4dae-88c9-754fe90e4f85","name":"Tarly","seat":"Horn Hill","region":"The Reach","words":"First in Battle"} \ No newline at end of file diff --git a/lib/cors-middleware.js b/lib/cors-middleware.js new file mode 100644 index 0000000..5dcf9d1 --- /dev/null +++ b/lib/cors-middleware.js @@ -0,0 +1,7 @@ +'use strict'; + +module.exports = function(req, res, next) { + res.append('Access-Control-Allow-Origin', '*'); + res.append('Access-Control-Allow-Headers', '*'); + next(); +} diff --git a/lib/error-middleware.js b/lib/error-middleware.js new file mode 100644 index 0000000..05fe9a7 --- /dev/null +++ b/lib/error-middleware.js @@ -0,0 +1,21 @@ +'use strict'; + +const createError = require('http-errors'); +const debug = require('debug')('house:error-middleware'); + +module.exports = function(err, req, res, next) { + console.error(err.message); + + if(err.status) { + debug('user error'); + + res.status(err.status).send(err.name); + next(); + return; + } + + debug('server error'); + err = createError(500, err.message); + res.status(err.status).send(err.name); + next(); +}; diff --git a/lib/storage.js b/lib/storage.js new file mode 100644 index 0000000..6fbe1cc --- /dev/null +++ b/lib/storage.js @@ -0,0 +1,55 @@ +'use strict'; + +const Promise = require('bluebird'); +const fs = Promise.promisifyAll(require('fs'), { suffix: 'Prom' }); +const createError = require('http-errors'); +const debug = require('debug')('house:storage'); + +module.exports = exports = {}; + +exports.createItem = function(schemaName, item) { + debug('createItem'); + + if(!schemaName) return Promise.reject(createError(400, 'expected schema name')); + if(!item) return Promise.reject(createError(400, 'expected item')); + + let json = JSON.stringify(item); + return fs.writeFileProm(`${__dirname}/../data/${schemaName}/${item.id}.json`, json) + .then(() => item) + .catch(err => Promise.reject(createError(500, err.message))); +}; + +exports.fetchItem = function(schemaName, id) { + debug('fetchItem'); + + if(!schemaName) return Promise.reject(createError(400, 'expected schema name')); + if(!id) return Promise.reject(createError(400, 'expected id')); + + return fs.readFileProm(`${__dirname}/../data/${schemaName}/${id}.json`) + .then(data => { + try { + let item = JSON.parse(data.toString()); + return item; + } catch(err) { + return Promise.reject(createError(500, err.message)); + } + }) + .catch(err => Promise.reject(createError(404, err.message))); +}; + +exports.deleteItem = function(schemaName, id) { + debug('deleteItem'); + + if(!schemaName) return Promise.reject(createError(400, 'expected schema name')); + if(!id) return Promise.reject(createError(400, 'expected id')); + + return fs.unlinkProm(`${__dirname}/../data/${schemaName}/${id}.json`) + .then(() => console.log('item deleted')) + .catch(err => Promise.reject(createError(404, err.message))); +}; + +exports.availIDs = function(schemaName) { + return fs.readdirProm(`${__dirname}/../data/${schemaName}`) + .then(files => files.map(name => name.split('json')[0])) + .catch(err => Promise.reject(createError(404, err.message))); +}; diff --git a/model/house.js b/model/house.js new file mode 100644 index 0000000..2278279 --- /dev/null +++ b/model/house.js @@ -0,0 +1,62 @@ +'use strict'; + +const uuidv4 = require('uuid/v4'); +const createError = require('http-errors'); +const debug = require ('debug')('house:house'); +const storage = require('../lib/storage.js'); + +const House = module.exports = function(name, seat, region, words) { + debug('house constructor'); + + if(!name) throw new Error('expected name'); + if(!seat) throw new Error('expected seat'); + if(!region) throw new Error('expected region'); + if(!words) throw new Error('expected words'); + + this.id = uuidv4(); + this.name = name; + this.seat = seat; + this.region = region; + this.words = words; +}; + +House.createHouse = function(_house) { + debug('createHouse'); + + try { + let house = new House(_house.name, _house.seat, _house.region, _house.words); + return storage.createItem('house', house); + } catch(err) { + return Promise.reject(err); + } +}; + +House.fetchHouse = function(id) { + debug('fetchHouse'); + return storage.fetchItem('house', id); +}; + +House.updateHouse = function(id, _house) { + debug('updateHouse'); + + return storage.fetchItem('house', id) + .catch(err => Promise.reject(createError(404, err.message))) + .then(house => { + for(var prop in house) { + if(prop === 'id') continue; + if(_house[prop]) house[prop] = _house[prop]; + } + return storage.createItem('house', house); + }); +}; + +House.deleteHouse = function(id) { + debug('deleteHouse'); + + return storage.deleteItem('house', id); +}; + +House.fetchIDs = function() { + debug('fetchIDs'); + return storage.availIDs('house'); +}; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..ff5dcf5 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,629 @@ +{ + "name": "12-express-middleware", + "version": "1.0.0", + "lockfileVersion": 1, + "dependencies": { + "accepts": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz", + "integrity": "sha1-w8p0NJOGSMPg2cHjKN1otiLChMo=" + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "assertion-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.2.tgz", + "integrity": "sha1-E8pRXYYgbaC6xm6DTdOX2HWBCUw=", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "basic-auth": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-1.1.0.tgz", + "integrity": "sha1-RSIe5Cn37h5QNb4/UVM/HN/SmIQ=" + }, + "bluebird": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz", + "integrity": "sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw=" + }, + "body-parser": { + "version": "1.17.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.17.2.tgz", + "integrity": "sha1-+IkqvI+eYn1Crtr7yma/WrmRBO4=", + "dependencies": { + "debug": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.7.tgz", + "integrity": "sha1-krrR9tBbu2u6Isyoi80OyJTChh4=" + } + } + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "dev": true + }, + "browser-stdout": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", + "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", + "dev": true + }, + "bytes": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.4.0.tgz", + "integrity": "sha1-fZcZb51br39pNeJZhVSe3SpsIzk=" + }, + "chai": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.0.tgz", + "integrity": "sha1-MxoDkbVcOvh0CunDt0WLwcOAXm0=", + "dev": true + }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "dev": true + }, + "combined-stream": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "dev": true + }, + "commander": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", + "dev": true + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" + }, + "content-type": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.2.tgz", + "integrity": "sha1-t9ETrueo3Se9IRM8TcJSnfFyHu0=" + }, + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "cookiejar": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.1.tgz", + "integrity": "sha1-Qa1XsbVVlR7BcUEqgZQrHoIA00o=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "debug": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=" + }, + "deep-eql": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-2.0.2.tgz", + "integrity": "sha1-sbrAblbwp2d3aG1Qyf63XC7XZ5o=", + "dev": true, + "dependencies": { + "type-detect": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-3.0.0.tgz", + "integrity": "sha1-RtDMhVOrt7E6NSsNbeov1Y8tm1U=", + "dev": true + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "depd": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", + "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "diff": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", + "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=", + "dev": true + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "encodeurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", + "integrity": "sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA=" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "etag": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.0.tgz", + "integrity": "sha1-b2Ma7zNtbEY2K1F2QETOIWvjwFE=" + }, + "express": { + "version": "4.15.3", + "resolved": "https://registry.npmjs.org/express/-/express-4.15.3.tgz", + "integrity": "sha1-urZdDwOqgMNYQIly/HAPkWlEtmI=", + "dependencies": { + "debug": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.7.tgz", + "integrity": "sha1-krrR9tBbu2u6Isyoi80OyJTChh4=" + } + } + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "dev": true + }, + "finalhandler": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.0.3.tgz", + "integrity": "sha1-70fneVDpmXgOhgIqVg4yF+DQzIk=", + "dependencies": { + "debug": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.7.tgz", + "integrity": "sha1-krrR9tBbu2u6Isyoi80OyJTChh4=" + } + } + }, + "form-data": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.2.0.tgz", + "integrity": "sha1-ml47kpX5gLJiPPZPojixTOvKcHs=", + "dev": true + }, + "formidable": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.1.1.tgz", + "integrity": "sha1-lriIb3w8NQi5Mta9cMTTqI818ak=", + "dev": true + }, + "forwarded": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.0.tgz", + "integrity": "sha1-Ge+YdMSuHCl7zweP3mOgm2aoQ2M=" + }, + "fresh": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.0.tgz", + "integrity": "sha1-9HTKXmqSRtb9jglTz6m5yAWvp44=" + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "dev": true + }, + "glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", + "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", + "dev": true + }, + "graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", + "dev": true + }, + "growl": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", + "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", + "dev": true + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "http-errors": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.1.tgz", + "integrity": "sha1-X4uO2YrKVFZWv1cplzh/kEpyIlc=", + "dependencies": { + "depd": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.0.tgz", + "integrity": "sha1-4b2Cxqq2ztlluXuIsX7T5SjKGMM=" + } + } + }, + "iconv-lite": { + "version": "0.4.15", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.15.tgz", + "integrity": "sha1-/iZaIYrGpXz+hUkn6dBMGYJe3es=" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ipaddr.js": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.4.0.tgz", + "integrity": "sha1-KWrKh4qCGBbluF0KKFqZvP9FgvA=" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "json3": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", + "dev": true + }, + "lodash._baseassign": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", + "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", + "dev": true + }, + "lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", + "dev": true + }, + "lodash._basecreate": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz", + "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=", + "dev": true + }, + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", + "dev": true + }, + "lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", + "dev": true + }, + "lodash.create": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", + "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=", + "dev": true + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", + "dev": true + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", + "dev": true + }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "dev": true + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "mime": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", + "integrity": "sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM=" + }, + "mime-db": { + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.29.0.tgz", + "integrity": "sha1-SNJtI1WJZRcErFkWygYAGRQmaHg=" + }, + "mime-types": { + "version": "2.1.16", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.16.tgz", + "integrity": "sha1-K4WKUuXs1RbbiXrCvodIeDBpjiM=" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true + }, + "mocha": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.5.0.tgz", + "integrity": "sha512-pIU2PJjrPYvYRqVpjXzj76qltO9uBYI7woYAMoxbSefsa+vqAfptjoeevd6bUgwD0mPIO+hv9f7ltvsNreL2PA==", + "dev": true + }, + "morgan": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.8.2.tgz", + "integrity": "sha1-eErHc05KRTqcbm6GgKkyknXItoc=" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=" + }, + "on-headers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", + "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true + }, + "parseurl": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz", + "integrity": "sha1-yKuMkiO6NIiKpkopeyiFO+wY2lY=" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "pathval": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", + "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", + "dev": true + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true + }, + "proxy-addr": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.1.5.tgz", + "integrity": "sha1-ccDuOxAt4/IC87ZPYI0XP8uhqRg=" + }, + "qs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", + "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=" + }, + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" + }, + "raw-body": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.2.0.tgz", + "integrity": "sha1-mUl2z2pQlqQRYoQEkvC9xdbn+5Y=" + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "dev": true + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "dev": true + }, + "send": { + "version": "0.15.3", + "resolved": "https://registry.npmjs.org/send/-/send-0.15.3.tgz", + "integrity": "sha1-UBP5+ZAj31DRvZiSwZ4979HVMwk=", + "dependencies": { + "debug": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.7.tgz", + "integrity": "sha1-krrR9tBbu2u6Isyoi80OyJTChh4=" + } + } + }, + "serve-static": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.12.3.tgz", + "integrity": "sha1-n0uhni8wMMVH+K+ZEHg47DjVseI=" + }, + "setprototypeof": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" + }, + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dev": true + }, + "superagent": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.5.2.tgz", + "integrity": "sha1-M2GjlxVnUEw1EGOr6q4PqiPb8/g=", + "dev": true + }, + "supports-color": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", + "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", + "dev": true + }, + "type-detect": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.3.tgz", + "integrity": "sha1-Dj8mcLRAmbC0bChNE2p+9Jx0wuo=", + "dev": true + }, + "type-is": { + "version": "1.6.15", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", + "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=" + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "utils-merge": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", + "integrity": "sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg=" + }, + "uuid": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", + "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==" + }, + "vary": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.1.tgz", + "integrity": "sha1-Z1Neu2lMHVIldFeYRmUyP1h+jTc=" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..ebbc43c --- /dev/null +++ b/package.json @@ -0,0 +1,35 @@ +{ + "name": "12-express-middleware", + "version": "1.0.0", + "description": "![cf](https://i.imgur.com/7v5ASc8.png) 12: Express Middleware ======", + "main": "server.js", + "scripts": { + "test": "DEBUG='house*' ./node_modules/mocha/bin/mocha", + "start": "DEBUG='house*' node server.js" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/ragnaroksedge/12-express-middleware.git" + }, + "keywords": [], + "author": "", + "license": "ISC", + "bugs": { + "url": "https://github.com/ragnaroksedge/12-express-middleware/issues" + }, + "homepage": "https://github.com/ragnaroksedge/12-express-middleware#readme", + "dependencies": { + "bluebird": "^3.5.0", + "body-parser": "^1.17.2", + "debug": "^2.6.8", + "express": "^4.15.3", + "http-errors": "^1.6.1", + "morgan": "^1.8.2", + "uuid": "^3.1.0" + }, + "devDependencies": { + "chai": "^4.1.0", + "mocha": "^3.5.0", + "superagent": "^3.5.2" + } +} diff --git a/route/house-router.js b/route/house-router.js new file mode 100644 index 0000000..5c7f036 --- /dev/null +++ b/route/house-router.js @@ -0,0 +1,51 @@ +'use strict'; + +const Router = require('express').Router; +const jsonParser = require('body-parser').json(); +const debug = require('debug')('house:house-router'); +const House = require('../model/house.js'); +const houseRouter = new Router(); + +houseRouter.post('/api/house', jsonParser, function(req, res, next) { + debug('POST: /api/house'); + + House.createHouse(req.body) + .then(house => res.json(house)) + .catch(err => next(err)); +}); + +houseRouter.get('/api/house/:id', function(req, res, next) { + debug('GET: /api/house/:id'); + + House.fetchHouse(req.params.id) + .then(house => res.json(house)) + .catch(err => next(err)); +}); + +houseRouter.get('/api/house', function(req, res, next) { + debug('GET: /api/house'); + + House.fetchIDs() + .then(ids => res.json(ids)) + .catch(err => next(err)); +}); + +houseRouter.put('/api/house', jsonParser, function(req, res, next) { + debug('PUT: /api/house'); + + House.updateHouse(req.query.id, req.body) + .then(house => res.json(house)) + .catch(err => next(err)); +}); + +houseRouter.delete('/api/house', function(req, res, next) { + debug('DELETE: /api/house'); + + House.deleteHouse(req.query.id) + .then(() => { + res.status(204).end(); + }) + .catch(err => next(err)); +}); + +module.exports = houseRouter; diff --git a/server.js b/server.js new file mode 100644 index 0000000..1d78217 --- /dev/null +++ b/server.js @@ -0,0 +1,22 @@ +'use strict'; + +const morgan = require('morgan'); +const express = require('express'); +const createError = require('http-errors'); +const debug = require('debug')('house:server'); + +const houseRouter = require('./route/house-router.js'); +const cors = require('./lib/cors-middleware.js'); +const errors = require('./lib/error-middleware.js'); + +const PORT = process.env.PORT || 3000; +const app = express(); + +app.use(morgan('dev')); +app.use(cors); +app.use(houseRouter); +app.use(errors); + +app.listen(PORT, () => { + console.log(`server: ${PORT}`); +}); diff --git a/test/house-route-test.js b/test/house-route-test.js new file mode 100644 index 0000000..8e5175b --- /dev/null +++ b/test/house-route-test.js @@ -0,0 +1,124 @@ +'use strict'; + +const expect = require('chai').expect; +const request = require('superagent'); +const House = require('../model/house.js'); +const url = 'http://localhost:8000'; + +require('../server.js'); + +const exampleHouse = { + name: 'hodor', + seat: 'hodor', + region: 'hodor', + words: 'hodor' +}; + +describe('House Routes', function() { + + describe('GET: /api/house', function() { + describe('with a valid id', function() { + before(done => { + House.createHouse(exampleHouse) + .then(house => { + this.tempHouse = house; + done(); + }) + .catch(err => done(err)); + }); + + after(done => { + House.deleteHouse(this.tempHouse.id) + .then(() => done()) + .catch(err => done(err)); + }); + + it('should return a house', done => { + request.get(`${url}/api/house/${this.tempHouse.id}`) + .end((err, res) => { + if(err) return done(err); + expect(res.status).to.equal(200); + expect(res.body.id).to.equal(this.tempHouse.id); + expect(res.body.name).to.equal(this.tempHouse.name); + expect(res.body.seat).to.equal(this.tempHouse.seat); + expect(res.body.region).to.equal(this.tempHouse.region); + expect(res.body.words).to.equal(this.tempHouse.words); + done(); + }); + }); + + describe('with an invalid id', function() { + it('should return 404 status', done => { + request.get(`${url}/api/house/123456789`) + .end((err, res) => { + expect(res.status).to.equal(404); + done(); + }); + }); + }); + }); + }); + + describe('POST: /api/house', function() { + describe('with a valid body', function() { + after(done => { + if(this.tempHouse) { + House.deleteHouse(this.tempHouse.id) + .then(() => done()) + .catch(err => done(err)); + } + }); + + it('should return a house', done => { + request.post(`${url}/api/house`) + .send(exampleHouse) + .end((err, res) => { + if(err) return done(err); + expect(res.status).to.equal(200); + expect(res.body.name).to.equal(exampleHouse.name); + expect(res.body.seat).to.equal(exampleHouse.seat); + expect(res.body.region).to.equal(exampleHouse.region); + expect(res.body.words).to.equal(exampleHouse.words); + this.tempHouse = res.body; + done(); + }); + }); + }); + }); + + describe('PUT: /api/house', function() { + describe('with a valid id and body', function() { + before(done => { + House.createHouse(exampleHouse) + .then(house => { + this.tempHouse = house; + done(); + }) + .catch(err => done(err)); + }); + + after(done => { + if(this.tempHouse) { + House.deleteHouse(this.tempHouse.id) + .then(() => done()) + .catch(done); + } + }); + + it('should return a house', done => { + let updateHouse = { name: 'Atreides', seat: 'Arrakeen', region: 'Arrakis', words: 'Fear is the Mind-killer'}; + request.put(`${url}/api/house?id=${this.tempHouse.id}`) + .send(updateHouse) + .end((err, res) => { + if(err) return done(err); + expect(res.status).to.equal(200); + expect(res.body.id).to.equal(this.tempHouse.id); + for(var prop in updateHouse) { + expect(res.body[prop]).to.equal(updateHouse[prop]); + } + done(); + }); + }); + }); + }); +});