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
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
17 changes: 15 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,17 @@
![cf](https://i.imgur.com/7v5ASc8.png) Lab 09: Vanilla REST API w/ Persistence
This application is a presistant database for cataloging your cars and there make you can preform:
---
-GET
-POST
-PUT
-Delete
---
Methods to minipulate this data to do so I made the default port 3000 for id you have a designated PORT it will use that. Start the server and lof in with another terminal and use http to preform requests.





<!-- ![cf](https://i.imgur.com/7v5ASc8.png) Lab 09: Vanilla REST API w/ Persistence
======

## Submission Instructions
Expand Down Expand Up @@ -29,4 +42,4 @@
* 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
* the name of the file should contain the related resource id -->
1 change: 1 addition & 0 deletions data/car/03bb7278-d85e-474c-9e27-565a9e6c425f.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"id":"03bb7278-d85e-474c-9e27-565a9e6c425f","name":"Miata","brand":"Mazda"}
1 change: 1 addition & 0 deletions data/car/131f2405-4589-4c34-8fcf-02bdbe6530c4.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"id":"131f2405-4589-4c34-8fcf-02bdbe6530c4","name":"Miata","brand":"Mazda"}
1 change: 1 addition & 0 deletions data/car/18f8bb5b-de6c-4ebf-8be6-49f644845e54.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"id":"18f8bb5b-de6c-4ebf-8be6-49f644845e54","name":"Miata","brand":"Mazda"}
1 change: 1 addition & 0 deletions data/car/1a7fec69-fe76-4e5e-a93b-96e3d8b6e812.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"id":"1a7fec69-fe76-4e5e-a93b-96e3d8b6e812","name":"Miata","brand":"Mazda"}
1 change: 1 addition & 0 deletions data/car/1d80ac8f-f6d2-46f8-95a1-b8fb4a91f44e.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"id":"1d80ac8f-f6d2-46f8-95a1-b8fb4a91f44e","name":"Miata","brand":"Mazda"}
1 change: 1 addition & 0 deletions data/car/1dd66b6e-e32b-48e6-9087-9d900702c31c.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"id":"1dd66b6e-e32b-48e6-9087-9d900702c31c","name":"Miata","brand":"Mazda"}
1 change: 1 addition & 0 deletions data/car/20c90a97-d0a2-4b30-9651-a428c381a608.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"id":"20c90a97-d0a2-4b30-9651-a428c381a608","name":"Miata","brand":"Mazda"}
1 change: 1 addition & 0 deletions data/car/38bf1909-148d-4c88-afe5-463767498ca2.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"id":"38bf1909-148d-4c88-afe5-463767498ca2","name":"Miata","brand":"Mazda"}
1 change: 1 addition & 0 deletions data/car/3aba906b-eb96-45d3-81d5-872613799283.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"id":"3aba906b-eb96-45d3-81d5-872613799283","name":"Miata","brand":"Mazda"}
1 change: 1 addition & 0 deletions data/car/46e3ccfd-c620-4762-899e-13287040ff87.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"id":"46e3ccfd-c620-4762-899e-13287040ff87","name":"Miata","brand":"Mazda"}
1 change: 1 addition & 0 deletions data/car/4cd8d386-1ad6-495f-9411-582aff9d512c.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"id":"4cd8d386-1ad6-495f-9411-582aff9d512c","name":"Miata","brand":"Mazda"}
1 change: 1 addition & 0 deletions data/car/629b7e16-6a3a-4c82-aa67-ee224838c827.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"id":"629b7e16-6a3a-4c82-aa67-ee224838c827","name":"Miata","brand":"Mazda"}
1 change: 1 addition & 0 deletions data/car/6680aeec-5fac-455e-b806-b5a7ba274fe2.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"id":"6680aeec-5fac-455e-b806-b5a7ba274fe2","name":"Miata","brand":"Mazda"}
1 change: 1 addition & 0 deletions data/car/81061b1b-01cc-4884-a239-bbe58bf4fb37.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"id":"81061b1b-01cc-4884-a239-bbe58bf4fb37","name":"Miata","brand":"Mazda"}
1 change: 1 addition & 0 deletions data/car/876555ca-b44c-4d56-b904-c60981312c10.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"id":"876555ca-b44c-4d56-b904-c60981312c10","name":"Miata","brand":"Mazda"}
1 change: 1 addition & 0 deletions data/car/90849579-c071-4aff-b37e-f68843d2a20c.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"id":"90849579-c071-4aff-b37e-f68843d2a20c","name":"Miata","brand":"Mazda"}
1 change: 1 addition & 0 deletions data/car/c5b1baba-30b5-4f51-b9f3-197896670b12.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"id":"c5b1baba-30b5-4f51-b9f3-197896670b12","name":"Miata","brand":"Mazda"}
1 change: 1 addition & 0 deletions data/car/c761e0a8-000c-4226-aa7e-679cd4e8774d.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"id":"c761e0a8-000c-4226-aa7e-679cd4e8774d","name":"Miata","brand":"Mazda"}
1 change: 1 addition & 0 deletions data/car/f16369cd-f252-4609-bda5-d5a60181f5f3.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"id":"f16369cd-f252-4609-bda5-d5a60181f5f3","name":"Miata","brand":"Mazda"}
1 change: 1 addition & 0 deletions data/car/f5d750d8-cfe1-43cf-bf4f-4e6967393edd.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"id":"f5d750d8-cfe1-43cf-bf4f-4e6967393edd","name":"Miata","brand":"Mazda"}
1 change: 1 addition & 0 deletions data/car/fda59da0-3d05-42c5-a5e3-9d6828a143b6.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"id":"fda59da0-3d05-42c5-a5e3-9d6828a143b6","name":"Miata","brand":"Mazda"}
33 changes: 33 additions & 0 deletions lib/parse-json.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
'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();
});
}

10 changes: 10 additions & 0 deletions lib/parse-url.js
Original file line number Diff line number Diff line change
@@ -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);
}
21 changes: 21 additions & 0 deletions lib/response.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
'use strict';

module.exports = exports = {};

exports.sendJSON = function(res, status, data) {
res.writeHead(status, {
'Content-Type': 'application/json'
});

res.write(JSON.stringify(data));
res.end();
}

exports.sendText = function(res, status, msg) {
res.writeHead(status, {
'Content-Type': 'plain/text'
})

res.write(msg);
res.end();
}
63 changes: 63 additions & 0 deletions lib/router.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
'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.put = function (endpoint, callback) {
this.routes.PUT[endpoint] = callback;
}

Router.prototype.delete = function (endpoint, callback) {
this.routes.DELETE[endpoint] = callback;
}

Router.prototype.route = function () {
return (req, res) => {
Promise.all([
parseUrl(req),
parseJSON(req)
])
.then(() => {
if (typeof this.routes[req.method][req.url.pathname] === 'function') {
this.routes[req.method][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 => {
console.error(err);

res.writeHead(400, {
'Content-Type': 'text/plain'
});

res.write('bad request');
res.end();
});
}
}
42 changes: 42 additions & 0 deletions lib/storage.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
'use strict';

const Promise = require('bluebird');
const fs = Promise.promisifyAll(require('fs'), { suffix: 'Prom' });

module.exports = exports = {};

exports.createItem = function (schemaName, item) {
if (!schemaName) return Promise.reject(new Error('expected schema name'));
if (!item) return Promise.reject(new Error('expected item'));

let json = JSON.stringify(item);
return fs.writeFileProm(`${__dirname}/../data/${schemaName}/${item.id}.json`, json)
.then(() => item)
.catch(err => Promise.reject(err))
}

exports.fetchItem = function (schemaName, id) {
if (!schemaName) return Promise.reject(new Error('expected schema name'));
if (!id) return Promise.reject(new Error('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(err);
}
})
.catch(err => Promise.reject(err));
}

exports.deleteItem = function (schemaName, item) {
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

delete item should have property to fetch item by id; the whole item object is not supposed to pass in the request.

if (!schemaName) return Promise.reject(new Error('expected schema name'));
if (!item) return Promise.reject(new Error('expected item'));

let json = JSON.stringify(item);
return fs.unlinkProm(`${__dirname}/../data/${schemaName}/${item.id}.json`, json)
.then(() => item)
.catch(err => Promise.reject(err))
}
11 changes: 11 additions & 0 deletions model/car.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
'use strict';
const uuidv4 = require('uuid/v4');

module.exports = function(name, brand) {
if(!name) throw new Error('expected name');
if(!brand) throw new Error('expected brand');

this.id = uuidv4();
this.name = name;
this.brand = brand;
};
1 change: 1 addition & 0 deletions node_modules/.bin/_mocha

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions node_modules/.bin/mime

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions node_modules/.bin/mkdirp

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions node_modules/.bin/mocha

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions node_modules/.bin/uuid

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

11 changes: 11 additions & 0 deletions node_modules/assertion-error/.npmignore

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

19 changes: 19 additions & 0 deletions node_modules/assertion-error/History.md

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

41 changes: 41 additions & 0 deletions node_modules/assertion-error/README.md

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading