restinga
v1.0.0
Published
REST API abstraction layer to easily consume data. Based on artesaos/restinga
Downloads
1
Readme
restinga-node
REST API abstraction layer to easily consume data. Based on artesaos/restinga.
Contents
Usage
npm install -S restingaOverview
digital-ocean-descriptor.js
import {Descriptor} from 'restinga';
import {Bearer} from 'restinga/lib/auth';
export default class DigitalOceanDescriptor extends Descriptor {
constructor() {
super({
service: 'digital-ocean',
prefix: 'https://api.digitalocean.com/v2',
// Optional User-Agent for requests:
agent: 'restinga-node/1.0.0 (https://github.com/jay-ess/restinga-node)'
});
}
// Optional auth setup
get authorization() {
return new Bearer('YourToken');
}
}container.js
import {Container} from 'restinga';
import DigitalOceanDescriptor from './digital-ocean-descriptor';
Container.register(new DigitalOceanDescriptor());droplet.js
import {Resource} from 'restinga';
import {receiveJson, sendJson} from 'restinga/lib/format';
export default class Droplet extends receiveJson(sendJson(Resource)) {
setup() {
super.setup({
service: 'digital-ocean', // match a descriptor service name
name: 'droplets',
identifier: 'id',
collectionRoot: 'droplets',
itemRoot: 'droplet'
});
}
}usage.js
import Droplet from './droplet';
const droplet = new Droplet({
name: 'server.restinga.dev',
region: 'nyc3',
size: '512mb',
image: 'ubuntu-14-04-x64'
});
// Resources methods return Promises
droplet.save()
.then(droplet => console.log(droplet.get('id'))) // Returns itself
.catch(err => console.log(err));
// Wanna some async-await?
try {
await droplet.save();
console.log(droplet.get('id'));
} catch (err) {
console.log(err);
}See a working example: test/resource.test.js.
Debug
Wanna know what's happening behind the scenes? This module uses visionmedia/debug, so you can just run DEBUG=restinga:* node your-file.js and get a pretty output of how restinga is working.
Docs
Resource methods
Method | Return Type | Description
--- | --- | ---
hasParentResource() | Boolean | True if you're using a nested resource
childResource(resource) | Resource | Make a resource your child
getIdentifier() | ?string | Return the identifier value
get(key) | * | Return key from attributes
set(key, value) | self | Change a key from attributes
set(obj) | self | Change multiple attributes
unset(key) | self | Delete key from attributes
static all(query) | Promise => Resource[] | Static search resources
getAll(query) | Promise => Resource[] | Search resources
static find(identifier) | Promise => Resource | Static search for an resource with identifier = identifier
doFind(identifier) | Promise => Resource | Search for an resource with identifier = identifier
save() | Promise => Resource | Save this resource
update() | Promise => Resource | Update this resource
destroy() | Promise | Delete this resource
Make Your Auth System
For you to make your own authorization class, just make a class with a setupAuth() method that takes no params and returns an object like this:
class MyAuthSystem {
setupRequest() {
return {
opts: {},
headers: {}
};
}
}opts follow http.request since we use got for requests. And headers are plain HTTP headers.
Make Your Format
Formats are High Order Classes that work as mixins and take care of understand what comes from your REST API responses.
To make a format, you must build receiveSomething() and sendSomething() mixins. See src/format/ for examples.
Receiver Methods:
Method | Return Type | Description
--- | --- | ---
getAcceptHeader() | string | Value to the Accept HTTP header
factory(rawResponse) | Resource | Parse a resource and return it's instance
factoryCollection(rawResponse) | Resource[] | Parse multiple resources and returns an array of instances
Sender Methods:
Method | Return Type | Description
--- | --- | ---
getContentTypeHeader() | string | Value to the Content-Type HTTP header
encode() | * | Do whatever you need with this.attributes before sendind it
