CartoDB/cartodb20

View on GitHub
lib/assets/javascripts/builder/data/query-row-model.js

Summary

Maintainability
A
2 hrs
Test Coverage
var Backbone = require('backbone');
var _ = require('underscore');

module.exports = Backbone.Model.extend({

  // In case that there is already an id attribute
  idAttribute: '__id',

  url: function () {
    if (this._tableName && this._configModel) {
      var baseUrl = this._configModel.get('base_url');
      var version = this._configModel.urlVersion('record');
      var url = baseUrl + '/api/' + version + '/tables/';

      if (this.hasWriteAccess(this._userModel) && !this.isOwner(this._userModel)) {
        var owner = this._permissionModel.getOwner();
        var ownerUsername = owner.get('username');

        url += ownerUsername + '.' + this._tableName + '/records';
      } else {
        url += this._tableName + '/records';
      }

      if (!this.isNew()) {
        url += '/' + this.get('cartodb_id');
      }

      return url;
    }

    return false;
  },

  initialize: function (attrs, opts) {
    this.collection = this.collection || {};

    this._tableName = opts.tableName || this.collection._tableName;
    this._configModel = opts.configModel || this.collection._configModel;
    this._permissionModel = opts.permissionModel || this.collection._permissionModel;
    this._userModel = opts.userModel || this.collection._userModel;

    this._initBinds();
  },

  _initBinds: function () {
    this.bind('error', this._onError, this);
  },

  hasWriteAccess: function (userModel) {
    if (!userModel || !this._permissionModel) {
      return false;
    }
    return this._permissionModel.hasWriteAccess(userModel);
  },

  isOwner: function (userModel) {
    if (!userModel || !this._permissionModel) {
      return false;
    }
    return this._permissionModel.isOwner(userModel);
  },

  isNew: function () {
    return !this.has('cartodb_id');
  },

  isGeomLoaded: function () {
    try {
      JSON.parse(this.get('the_geom'));
      return true;
    } catch (e) {
      return false;
    }
  },

  fetchRowIfGeomIsNotLoaded: function (callback) {
    if (this.isGeomLoaded()) {
      callback();
      return;
    }

    this.fetch({
      success: callback
    });
  },

  _onError: function () {
    this.set(this.previousAttributes());
  },

  sync: function () {
    this.trigger('loading', this);
    Backbone.Model.prototype.sync.apply(this, arguments);
  },

  parse: function (attrs) {
    if (!attrs.__id) {
      attrs.__id = _.uniqueId();
    }
    return attrs;
  },

  toJSON: function () {
    return _.omit(
      this.attributes,
      '__id',
      'the_geom_webmercator'
    );
  }

});