8000 GitHub - lincolnloop/amygdala at 0.4.1
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content
This repository was archived by the owner on Jun 19, 2019. It is now read-only.

lincolnloop/amygdala

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Amygdala

Amygdala is a RESTful HTTP library for JavaScript powered web applications. Simply configure it once with your API schema, and easily do GET, POST, PUT and DELETE requests with minimal effort and a consistent API.

Examples:

// GET
store.get('users').done(function() { ... });

// POST
store.add('teams', {'name': 'Lincoln Loop', 'active': true}).done(function() { ... });

browser support

How it works

1. INSTALL

NPM/Browserify

npm install amygdala.

Bower

bower install amygdala

Browser

Download the latest amygdala.js file. Minified/build version coming soon.

Dependencies:

2. SETUP

To create a new store, define the few possible settings listed below and your API schema.

var store = new Amygdala({
  'config': {
    'apiUrl': 'http://localhost:8000',
    'idAttribute': 'url',
    'headers': {
      'X-CSRFToken': getCookie('csrftoken')
    },
    'localStorage': true
  },
  'schema': {
    'users': {
      'url': '/api/v2/user/'
    },
    'teams': {
      'url': '/api/v2/team/',
      'orderBy': 'name',
      'oneToMany': {
        'members': 'members'
      },
      parse: function(data) {
        return data.results ? data.results : data;
      },
    },
    'members': {
      'foreignKey': {
        'user': 'users'
      }
    }
  }
});

Configuration options:

  • apiUrl - Full path to your base API url (required).
  • idAttribute - global primary key attribute (required).
  • headers - Any headers that you need to pass on each API request.
  • localStorage - enable/disable the persistent localStorage cache.

Schema options:

  • url - relative path for each "table" (required)
  • orderBy - order by which you want to retrieve local cached data. eg (name, -name (for reverse))
  • parse - Accepts a parse method for cases when your API also returns extra meta data.

Schema relations:

When you want to include related data under a single request, for example, to minimize HTTP requests, having schema relations allows you to still have a clean separation when interacting with the data locally.

Consider the following schema, that defines discussions that have messages, and messages that have votes:

var store = new Amygdala({
    'config': {
      'apiUrl': 'http://localhost:8000',
      'idAttribute': 'url'
    },
    'schema': {
      'discussions': {
        'url': '/api/v2/discussion/',
        'oneToMany': {
          'children': 'messages'
        }
      },
      'messages': {
        'url': '/api/v2/message/',
        'oneToMany': {
          'votes': 'votes'
        },
        'foreignKey': {
          'discussion': 'discussions'
        }
      },
      'votes': {
        'url': '/api/v2/vote/'
      }
    }
  }
);

In this scenario, doing a query on a discussion will retrieve all messages and votes for that discussion:

store.get('discussions', {'url': '/api/v2/discussion/85273/'}).then(function(){ ... });

Since we def 8000 ined relations on our schema, the message and vote data won't be stored on the discussion "table", but on it's own "table" instead.

OneToMany:
'oneToMany': {
  'children': 'messages'
}

OneToMany relations are the most common, and should be used when you have related data in form of an array. In this case, children is the attribute name on the response, and messages is the destination "table" for the array data.

foreignKey:
'foreignKey': {
  'discussion': 'discussions'
}

foreignKey relations are basically for one to one relations. In this case Amygdala will look for an object as value of discussion and move it over to the discussions "table" if one is found.

3. USAGE

The methods below, allow you to make remote calls to your API server.

// GET
store.get('users').done(function() { ... });

// POST
store.add('teams', {'name': 'Lincoln Loop', 'active': true}).done(function() { ... });

// PUT
store.update('users', {'url': '/api/v2/user/32/', 'username': 'amy82', 'active': true}).done(function() { ... });

// DELETE
store.remove('users', {'url': '/api/v2/user/32/'}).done(function() { ... });

On top of this, Amygdala also stores a copy of your data locally, which you can access through a couple different methods:

// Get the list of active users from the local cache
var users = store.findAll('users', {'active': true});

// Get a single user from the local cache
var user = store.find('users', {'username': 'amy82'});

If you enable localStorage, the data is kept persistently. Because of this, once you instantiate Amygdala, your cached data will be loaded, and you can use it right away without having to wait for the remote calls.

Events

Amygdala uses Wolfy87/EventEmitter under the hood to trigger some very basic events. Right now it only triggers two different events:

  • change
  • change:type

To listen to these events, you can use any of Event Emitter's binding methods or the aliases, the most common one being on:

// Listen to any change in the store
store.on('change', function() { ... });

// Listen to any change of a specific type
store.on('change:users', function() { ... });

About

RESTful HTTP client for JavaScript powered web applications

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Contributors 6

0