Home Reference Source Repository

js/api.light.js

/**
 * Common stack, plugins and helpers
 */
define(['jquery'], function($) {
    'use strict';

    var API_ROOT = $('link[rel=api-root]').attr('href');

    if (API_ROOT[API_ROOT.length - 1] == '/') {
        // Remove trailing slash
        API_ROOT = API_ROOT.substr(0, API_ROOT.length - 1);
    }

    function build_url(url) {
        if (url.substring(0, 4) == 'http') {
            // Absolute url
            return url;
        } else {
            var path = url[0] === '/' ? url: '/' + url,
                api_url;

            if (path.substring(0, API_ROOT.length) == API_ROOT) {
                api_url = path;
            } else {
                api_url = API_ROOT + path;
            }
            return api_url;
        }
    }

    function call(method, url, data, callback) {
        if (method.toLowerCase() != 'get') {
            data = JSON.stringify(data||{});
        }

        return $.ajax({
            type: method,
            url: build_url(url),
            contentType: 'application/json',
            data: data,
            dataType: 'json',
            success: callback
        });
    }

    function synchronous_call(method, url, data) {
        var result,
            options = {
                type: method,
                url: build_url(url),
                contentType: 'application/json',
                dataType: 'json',
                async: false,
                success: function(data) {
                    result = data;
                }
            };

        if (method.toLowerCase() != 'get') {
            options.data = JSON.stringify(data||{});
        } else {
            options.data = data;
        }
        $.ajax(options);
        return result;
    }

    var API = {
        root: API_ROOT,
        build_url: build_url,
        get: function(url, data, callback) {
            if (callback) {
                return call('get', url, data, callback);
            } else {
                return call('get', url, null, data);
            }
        },
        post: function(url, data, callback) {
            return call('post', url, data, callback);
        },
        put: function(url, data, callback) {
            return call('put', url, data, callback);
        },
        'delete': function(url, data, callback) {
            return call('delete', url, data, callback);
        },
        refs: function(url, callback) {
            if (callback) {
                return call('get', '/references/' + url, null, callback);
            } else {
                return call('get', url);
            }
        },
        sync: {
            get: function(url, data) {
                return synchronous_call('get', url, data);
            },
            post: function(url, data) {
                return synchronous_call('post', url, data);
            },
            put: function(url, data) {
                return synchronous_call('put', url, data);
            },
            'delete': function(url, data) {
                return synchronous_call('delete', url, data);
            }
        }
    };

    return API;

});