Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 33 additions & 0 deletions .eslintrc
Original file line number Diff line number Diff line change
@@ -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"
}
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
node_modules
1 change: 1 addition & 0 deletions data/house/14e0178a-59f2-4075-abe8-a7a3389fc993.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"id":"14e0178a-59f2-4075-abe8-a7a3389fc993","name":"Royce","seat":"Runestone","region":"The Vale of Arryn","words":"We Remember"}
1 change: 1 addition & 0 deletions data/house/29487796-44f5-460e-a8f4-03b1759be79a.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"id":"29487796-44f5-460e-a8f4-03b1759be79a","name":"Greyjoy","seat":"Pyke","region":"The Iron Islands","words":"We Do Not Sow"}
1 change: 1 addition & 0 deletions data/house/29cf2d74-06a7-4844-832c-ee038118b044.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"id":"29cf2d74-06a7-4844-832c-ee038118b044","name":"Arryn","seat":"The Eyrie","region":"The Vale of Arryn","words":"As High as Honor"}
1 change: 1 addition & 0 deletions data/house/30dfab51-4854-4bc4-b1f5-f39ac54a5b1e.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"id":"30dfab51-4854-4bc4-b1f5-f39ac54a5b1e","name":"Targaryen","seat":"Dragonstone","region":"The Crownlands","words":"Fire and Blood"}
1 change: 1 addition & 0 deletions data/house/3e6bf8d7-4e0c-44f7-a1c2-37c83c925269.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"id":"3e6bf8d7-4e0c-44f7-a1c2-37c83c925269","name":"Baratheon","seat":"Storm's End","region":"The Stormlands","words":"Ours is the Fury"}
1 change: 1 addition & 0 deletions data/house/54e56114-37fe-4421-bbea-16b41eefba07.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"id":"54e56114-37fe-4421-bbea-16b41eefba07","name":"Cerwyn","seat":"Castle Cerwyn","region":"The North","words":"Honed and Ready"}
1 change: 1 addition & 0 deletions data/house/5fe38d3f-1c86-4cfe-8a44-4e4963adebdc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"id":"5fe38d3f-1c86-4cfe-8a44-4e4963adebdc","name":"Hornwood","seat":"Hornwood","region":"The North","words":"Righteous in Wrath"}
1 change: 1 addition & 0 deletions data/house/80870533-a0aa-4633-ac66-5722f22805e8.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"id":"80870533-a0aa-4633-ac66-5722f22805e8","name":"Lannister","seat":"Casterly Rock","region":"The Westerlands","words":"Hear Me Roar"}
1 change: 1 addition & 0 deletions data/house/902bd209-35d1-46b8-9a6e-0fe52d1c4245.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"id":"902bd209-35d1-46b8-9a6e-0fe52d1c4245","name":"Karstark","seat":"Karhold","region":"The North","words":"The Sun of Winter"}
1 change: 1 addition & 0 deletions data/house/94aa22e8-d220-4afa-b05e-db683b2a6bae.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"id":"94aa22e8-d220-4afa-b05e-db683b2a6bae","name":"Bolton","seat":"The Dreadfort","region":"The North","words":"Our Blades are Sharp"}
1 change: 1 addition & 0 deletions data/house/9c1927d8-3fe0-4437-be9d-4a6ef43cc134.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"id":"9c1927d8-3fe0-4437-be9d-4a6ef43cc134","name":"Mallister","seat":"Seagard","region":"The Riverlands","words":"Above the Rest"}
1 change: 1 addition & 0 deletions data/house/9dd53213-ddfc-41c5-a4b1-2f0f977676c8.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"id":"9dd53213-ddfc-41c5-a4b1-2f0f977676c8","name":"Tyrell","seat":"Highgarden","region":"The Reach","words":"Growing Strong"}
1 change: 1 addition & 0 deletions data/house/a08d0863-64f9-4b9e-8c4c-011f23f58a80.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"id":"a08d0863-64f9-4b9e-8c4c-011f23f58a80","name":"Stark","seat":"Winterfell","region":"The North","words":"Winter is Coming"}
1 change: 1 addition & 0 deletions data/house/a0dec095-2e28-4afc-aa79-c18478328074.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"id":"a0dec095-2e28-4afc-aa79-c18478328074","name":"Mormont","seat":"Bear Island","region":"The North","words":"Here We Stand"}
1 change: 1 addition & 0 deletions data/house/a659cc81-bad0-4f25-b877-a25d2cde79f3.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"id":"a659cc81-bad0-4f25-b877-a25d2cde79f3","name":"Hightower","seat":"The Hightower","region":"The Reach","words":"We Light the Way"}
1 change: 1 addition & 0 deletions data/house/afa015eb-3ba1-4b03-bcf7-049ebe2c77fb.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"id":"afa015eb-3ba1-4b03-bcf7-049ebe2c77fb","name":"Frey","seat":"The Twins","region":"The Riverlands","words":"We Stand Together"}
1 change: 1 addition & 0 deletions data/house/b7dab937-9b02-4453-86da-0d5dd2e38f1e.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"id":"b7dab937-9b02-4453-86da-0d5dd2e38f1e","name":"Tully","seat":"Riverrun","region":"The Riverlands","words":"Family Duty Honor"}
1 change: 1 addition & 0 deletions data/house/c5dbd7b2-7b4a-4434-aedd-630f686fb5f9.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"id":"c5dbd7b2-7b4a-4434-aedd-630f686fb5f9","name":"Martell","seat":"Sunspear","region":"Dorne","words":"Unbowed Unbent Unbroken"}
1 change: 1 addition & 0 deletions data/house/c95be38c-1ba9-4475-87af-f492e381f69c.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"id":"c95be38c-1ba9-4475-87af-f492e381f69c","name":"Stokeworth","seat":"Castle Stokeworth","region":"The Crownlands","words":"Proud to Be Faithful"}
1 change: 1 addition & 0 deletions data/house/fab76973-7a1a-4dae-88c9-754fe90e4f85.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"id":"fab76973-7a1a-4dae-88c9-754fe90e4f85","name":"Tarly","seat":"Horn Hill","region":"The Reach","words":"First in Battle"}
7 changes: 7 additions & 0 deletions lib/cors-middleware.js
Original file line number Diff line number Diff line change
@@ -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();
}
21 changes: 21 additions & 0 deletions lib/error-middleware.js
Original file line number Diff line number Diff line change
@@ -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();
};
55 changes: 55 additions & 0 deletions lib/storage.js
Original file line number Diff line number Diff line change
@@ -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)));
};
62 changes: 62 additions & 0 deletions model/house.js
Original file line number Diff line number Diff line change
@@ -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');
};
Loading