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
6 changes: 6 additions & 0 deletions lab-eddie/.eslintignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@

**/node_modules/*
**/vendor/*
**/*.min.js
**/coverage/*
**/build/*
21 changes: 21 additions & 0 deletions lab-eddie/.eslintrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
{
"rules": {
"no-console": "off",
"indent": [ "error", 2 ],
"quotes": [ "error", "single" ],
"semi": ["error", "always"],
"linebreak-style": [ "error", "unix" ]
},
"env": {
"es6": true,
"node": true,
"mocha": true,
"jasmine": true
},
"ecmaFeatures": {
"modules": true,
"experimentalObjectRestSpread": true,
"impliedStrict": true
},
"extends": "eslint:recommended"
}
128 changes: 128 additions & 0 deletions lab-eddie/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@

# Created by https://www.gitignore.io/api/osx,vim,node,windows

### Node ###
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*

# Runtime data
pids
*.pid
*.seed
*.pid.lock

# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov

# Coverage directory used by tools like istanbul
coverage

# nyc test coverage
.nyc_output

# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
.grunt

# Bower dependency directory (https://bower.io/)
bower_components

# node-waf configuration
.lock-wscript

# Compiled binary addons (http://nodejs.org/api/addons.html)
build/Release

# Dependency directories
node_modules/
jspm_packages/

# Typescript v1 declaration files
typings/

# Optional npm cache directory
.npm

# Optional eslint cache
.eslintcache

# Optional REPL history
.node_repl_history

# Output of 'npm pack'
*.tgz

# Yarn Integrity file
.yarn-integrity

# dotenv environment variables file
.env


### OSX ###
*.DS_Store
.AppleDouble
.LSOverride

# Icon must end with two \r
Icon

# Thumbnails
._*

# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
.com.apple.timemachine.donotpresent

# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk

### Vim ###
# swap
[._]*.s[a-v][a-z]
[._]*.sw[a-p]
[._]s[a-v][a-z]
[._]sw[a-p]
# session
Session.vim
# temporary
.netrwhist
*~
# auto-generated tag files
tags

### Windows ###
# Windows thumbnail cache files
Thumbs.db
ehthumbs.db
ehthumbs_vista.db

# Folder config file
Desktop.ini

# Recycle Bin used on file shares
$RECYCLE.BIN/

# Windows Installer files
*.cab
*.msi
*.msm
*.msp

# Windows shortcuts
*.lnk

# End of https://www.gitignore.io/api/osx,vim,node,windows
data
64 changes: 64 additions & 0 deletions lab-eddie/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
Vanilla REST API wth file system persistance :D

This API is seperated into 6 major components:

1.) The server

2.) lib driectory

3.) model directory

4.) test directory

5.) data directory

6.) node_modules

-----Component Overview-----

1. The server. This is the meat and potatoes of it all. It uses the http module to host a server. It requires various modules for establishing routes, endponts and file scaffolding.

2. lib directory houses all of our home made modules and other goodies.

3. model directory houses all object constructors.

4. test directory houses all of our tests >:(

5. data driectory is used for file system persistent storage. It has a sub-directory for each model.

6. node_modules houses all of our dependancies

----Instructions----

Using httpie is probably the easiest way to go about this whole process.

-Start off by running the server. Make sure you're in the lab directory and type the following :

node server.js

This should return a prompt telling you the sever is up. Also, if you don't have a data folder, it'll create one automatically for you and fill it with folders for each model.

-Open another terminal tab.

*To do a GET request type the following:
http GET :3000/api/(whatever model you pick) id==324235345234

this should return an object

*To do a POST request, it's a bit harder. We have to know what our model looks like. We'll have to include more parameters in the request like this:

http POST :3000/api/dog name==rover breed==pug age==7

This should return an object that looks like this:

{
name: 'rover',
breed: 'pug',
age: '7'
}

*To do a DELETE request, it's identical to the GET request. Except it shouldn't return anything. It'll look like this:

http DELETE :3000/api/car id==324235345234

All done!
18 changes: 18 additions & 0 deletions lab-eddie/lib/auto-direct.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
'use strict'

const fs = require('fs')

//Automatically creates a data directory and folders for each model
const autoDataDir = module.exports = function(models) {

let labDir = fs.readdirSync('.');
if (!labDir.includes('data')) fs.mkdirSync('./data');
autoModelDir(models);
};

const autoModelDir = function(models) {
let modelKeys = Object.keys(models);
let dataDir = fs.readdirSync('./data');
modelKeys.forEach(key => {
if(!dataDir.includes(key)) fs.mkdirSync(`./data/${key}`)});
}
12 changes: 12 additions & 0 deletions lab-eddie/lib/errorHandle.js
Original file line number Diff line number Diff line change
@@ -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) {

}
100 changes: 100 additions & 0 deletions lab-eddie/lib/model-paths.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
'use strict';

const debug = require('debug')('app:model-paths');
const createError = require('http-errors');
const jsonParser = require('body-parser').json();
const storage = require('./storage.js');
const Person = require('../model/person.js');
const Car = require('../model/car.js');
const Dog = require('../model/dog.js');
const Employee = require('../model/employee.js');
const Character = require('../model/character.js');



const modelRoutes = module.exports = {};

modelRoutes.models = {
person : Person,
car: Car,
dog: Dog,
employee: Employee,
character: Character
};


modelRoutes.allRoutes = function(model, router) {
modelRoutes.modelGet(model, router);
modelRoutes.modelDelete(model, router);
modelRoutes.modelPost(model, router);
};


modelRoutes.modelGet = function(model,router) {
router.get(`/api/${model}`, function(req, res, next) {
debug(`GET: api/${model}`);
if (req.query) {
storage.fetchItem(`${model}`, req.query.id)
.then(item => res.json(item))
.catch(err => {
err = createError(404, 'Resource not found');
next(err);
});

return;

} else if (!req.query.id) {


storage.fetchItem(`${model}`)
.then(item => res.json(item))
.catch(err => {
err = createError(404, 'Resource not found');
next(err);
});
return;
};

});
};

modelRoutes.modelPost = function(model, router) {
router.post(`/api/${model}`,jsonParser, function(req, res, next) {
debug(`POST: api/${model}`);

let params = [];
for(let key in req.body) {
params.push(req.body[key]);
}

try {
var newObj = new modelRoutes.models[model](...params);
storage.createItem(`${model}`, newObj)
.then(item => res.json(item))
.catch(err => next(err));

} catch(err) {
err = createError(400, err.message);
next(err);
}
});
}

modelRoutes.modelDelete = function(model, router) {

router.delete(`/api/${model}`,jsonParser, function(req, res, next) {
debug(`DELETE: api/${model}`);
if (req.query.id) {

storage.deleteItem(`${model}`, req.query.id)
.then(item => res.json(item))
.catch(err => next(err));

res.status(204)

return;
};
});
}

require('./auto-direct.js')(modelRoutes.models)
Loading