Home Reference Source Repository

js/urls.js

/**
 * Build external URLs
 */
define(['jquery'], function($) {
    'use strict';

    var URLS = {
        'organization.datasets_csv': '/organizations/{org}/datasets.csv',
        'organization.datasets_resources_csv': '/organizations/{org}/datasets-resources.csv',
        'organizations.show': '/organizations/{org}/',
        'users.show': '/users/{user}/'
    };

    function UrlBuildError(msg) {
        this.msg = msg;
    }

    /**
     * Replace objects by their ID if present
     */
    function urlize(obj) {
        if (obj && obj instanceof Object) {
            // Gives priority to slug, might be fragile.
            if (obj.hasOwnProperty('slug')) {
                return obj.slug;
            } else if (obj.hasOwnProperty('id')) {
                return obj.id;
            }
        }
        return obj;
    }

    return {
        build: function(endpoint, options) {
            if (!URLS.hasOwnProperty(endpoint)) {
                throw new UrlBuildError('Endpoint "' + endpoint + '" not found');
            }
            var url = URLS[endpoint],
                args = {};
            for (var name in options) {
                if (options.hasOwnProperty(name)) {
                    var token = '{' + name + '}',
                        value = urlize(options[name]);

                    if (url.indexOf(token) >= 0) {
                        url = url.replace(token, value);
                    } else {
                        args[name] = value;
                    }
                }
            }
            if (args && args.length > 0) {
                url += '?' + $.param(args);
            }
            return url;
        }
    };
});