Last active
August 29, 2015 14:04
-
-
Save roman01la/afbec8d4ffdd9f712104 to your computer and use it in GitHub Desktop.
HTTP resource JavaScript class for consuming REST API resources
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import HttpResource from 'xhr'; | |
var items = new HttpResource('/api/items'); | |
items.query(function* (resume) { | |
yield items.create([ | |
{name: 'Item #1'}, | |
{name: 'Item #2'}, | |
{name: 'Item #3'} | |
], resume); | |
var allItems = yield items.get(resume); | |
var item = yield items.get(allItems[1]._id, resume); | |
yield items.update(item._id, {name: 'Updated Item #' + item._id}, resume); | |
yield items.remove(item._id, resume); | |
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!DOCTYPE html> | |
<html> | |
<head> | |
<meta charset="utf-8"> | |
</head> | |
<body> | |
<script src="//google.github.io/traceur-compiler/bin/traceur.js"></script> | |
<script src="//google.github.io/traceur-compiler/src/bootstrap.js"></script> | |
<script> | |
traceur.options.experimental = true; | |
</script> | |
<script src="/app.js" type="module"></script> | |
</body> | |
</html> | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"name": "es6", | |
"version": "0.0.0", | |
"description": "", | |
"main": "server.js", | |
"author": "Roman Liutikov", | |
"license": "MIT", | |
"dependencies": { | |
"body-parser": "^1.5.2", | |
"express": "^4.7.2", | |
"method-override": "^2.1.2" | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
'use strict'; | |
var express = require('express'), | |
app = express(), | |
bodyParser = require('body-parser'), | |
methodOverride = require('method-override'); | |
app.use(express.static(__dirname + '/public')); | |
app.use(bodyParser()); | |
app.use(methodOverride()); | |
{ | |
"name": "es6", | |
"version": "0.0.0", | |
"description": "", | |
"main": "server.js", | |
"author": "Roman Liutikov", | |
"license": "MIT", | |
"dependencies": { | |
"body-parser": "^1.5.2", | |
"express": "^4.7.2", | |
"method-override": "^2.1.2" | |
} | |
} | |
const PORT = process.env.PORT || 3000; | |
var router = express.Router(); | |
app.use('/api', router); | |
var items = [], | |
id = 1; | |
router.route('/items') | |
.post(function (req, res) { | |
if (req.body instanceof Array) { | |
for (let i = 0; i < req.body.length; i++) { | |
req.body[i]._id = id; | |
items.push(req.body[i]); | |
id++; | |
} | |
} else { | |
req.body._id = id; | |
items.push(req.body); | |
id++; | |
} | |
res.json({message: 'A new item has been created!'}); | |
}) | |
.get(function (req, res) { | |
res.json(items); | |
}); | |
router.route('/items/:id') | |
.get(function (req, res) { | |
if (req.params.id) { | |
for (let i = 0; i < items.length; i++) { | |
let item = items[i]; | |
if (item._id == req.params.id) { | |
res.json(item); | |
return; | |
} | |
} | |
} | |
}) | |
.put(function (req, res) { | |
if (req.params.id) { | |
for (let i = 0; i < items.length; i++) { | |
let item = items[i]; | |
if (item._id == req.params.id) { | |
for (let propertieName in req.body) { | |
item[propertieName] = req.body[propertieName]; | |
} | |
res.json({items: items, updated: item}); | |
return; | |
} | |
} | |
} | |
}) | |
.delete(function (req, res) { | |
if (req.params.id) { | |
for (let i = 0; i < items.length; i++) { | |
let item = items[i]; | |
if (item._id == req.params.id) { | |
let index = items.indexOf(item); | |
if (index > -1) { | |
items.splice(index, 1); | |
res.json(items); | |
return; | |
} | |
} | |
} | |
} | |
}); | |
app.listen(PORT); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var HttpResource = (function(){ | |
var privateMembers = new WeakMap(); | |
class HttpResource { | |
constructor (url) { | |
var _this = this, | |
privateSet = {}; | |
this.url = url; | |
var xhr = function (data, method, callback, url) { | |
var xhr = new XMLHttpRequest(); | |
xhr.open(method, url || _this.url); | |
xhr.setRequestHeader('Content-Type', 'application/json'); | |
xhr.responseType = 'json'; | |
xhr.onload = function() { | |
if (xhr.status === 200) { | |
callback(null, xhr.response); | |
} else { | |
callback({code: xhr.status, message: xhr.response}); | |
} | |
}; | |
xhr.send(data); | |
}; | |
privateSet.xhr = xhr; | |
var constructURL = function (id) { | |
return id ? _this.url + '/' + id : null; | |
}; | |
privateSet.constructURL = constructURL; | |
privateMembers.set(this, privateSet); | |
} | |
query (generator) { | |
var iterator = generator(resume); | |
function resume (err, response) { | |
iterator.next(response); | |
} | |
iterator.next(); | |
} | |
get (id, callback) { | |
if (!callback && id instanceof Function) { | |
callback = id; | |
id = null; | |
} | |
privateMembers.get(this).xhr(null, 'GET', callback, privateMembers.get(this).constructURL(id)); | |
} | |
create (data, callback) { | |
data instanceof Object ? data = JSON.stringify(data) : data = data; | |
privateMembers.get(this).xhr(data, 'POST', callback); | |
} | |
update (id, data, callback) { | |
data instanceof Object ? data = JSON.stringify(data) : data = data; | |
privateMembers.get(this).xhr(data, 'PUT', callback, privateMembers.get(this).constructURL(id)); | |
} | |
remove (id, callback) { | |
privateMembers.get(this).xhr(null, 'DELETE', callback, privateMembers.get(this).constructURL(id)); | |
} | |
} | |
return HttpResource; | |
})(); | |
export default HttpResource; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment