CartoDB/cartodb20

View on GitHub
lib/assets/javascripts/builder/data/tables-collection.js

Summary

Maintainability
A
2 hrs
Test Coverage
var _ = require('underscore');
var Backbone = require('backbone');
var TableModel = require('./table-model');

var DEFAULT_FETCH_OPTIONS = {
  type: 'table',
  order: 'updated_at',
  page: 1,
  per_page: 20,
  exclude_shared: false,
  exclude_raster: true,
  tags: '',
  q: ''
};

/**
 * A collection that holds Table models
 */
module.exports = Backbone.Collection.extend({

  model: function (d, opts) {
    var configModel = opts.collection._configModel;
    return new TableModel(d, {
      configModel: configModel,
      parse: true
    });
  },

  modelId: function (attrs) {
    return attrs.name;
  },

  initialize: function (models, opts) {
    if (!opts.configModel) throw new Error('configModel is required');
    this._configModel = opts.configModel;
    this._stats = {};
  },

  url: function () {
    var version = this._configModel.urlVersion('visualization');
    var baseUrl = this._configModel.get('base_url');
    return baseUrl + '/api/' + version + '/viz';
  },

  // Overrides the default fetch, to use the internal methods to construct parmas
  fetch: function (opts) {
    opts = opts || {
      data: {
        // If reaches this code path it's because there were no opts given, i.e. should do a 'full fetch'
        // Since there is no current way to really do a full fetch let's just set a really high number to get all…
        // TODO this is obviously bad for organization users, how can we do this differently
        per_page: 1000
      }
    };
    opts.data = _.extend({}, DEFAULT_FETCH_OPTIONS, opts.data);
    return Backbone.Collection.prototype.fetch.call(this, opts);
  },

  getTotalStat: function (attribute) {
    return this._stats[attribute] || 0;
  },

  getDefaultParam: function (param) {
    return DEFAULT_FETCH_OPTIONS[param];
  },

  parse: function (res) {
    this._stats = _.omit(res, 'visualizations');

    var visualizations = res.visualizations;

    if (visualizations.length && visualizations[0].table) {
      return this._getVisualizationTableParams(visualizations);
    } else {
      return this._getVisualizationParams(visualizations);
    }
  },

  _getVisualizationTableParams: function (visualizations) {
    return _.map(visualizations, function (viz) {
      var table = viz.table;

      return {
        id: table.id,
        geometry_types: table.geometry_types,
        name: table.name,
        privacy: table.privacy,
        rows_counted: table.row_count,
        table_size: table.size,
        table_type: viz.type
      };
    }, this);
  },

  _getVisualizationParams: function (visualizations) {
    return _.map(visualizations, function (viz) {
      return {
        id: viz.id,
        name: viz.name,
        privacy: viz.privacy,
        table_type: viz.type
      };
    }, this);
  }
});