Skip to content

Instantly share code, notes, and snippets.

@roman01la
Last active August 29, 2015 14:04
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save roman01la/afbec8d4ffdd9f712104 to your computer and use it in GitHub Desktop.
Save roman01la/afbec8d4ffdd9f712104 to your computer and use it in GitHub Desktop.
HTTP resource JavaScript class for consuming REST API resources
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);
});
<!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>
{
"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"
}
}
'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);
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