CartoDB/cartodb20

View on GitHub
lib/assets/javascripts/cartodb/models/geocodings.js

Summary

Maintainability
A
2 hrs
Test Coverage

  /**
   *  Geocoding endpoint by id
   *
   *  - State property could be:
   *
   *    · null -> it haven't started
   *    · started -> it has just started
   *    · submitted -> it has sent to the geocoder service
   *    · completed -> geocoder service has finished
   *    · finished -> Our database has finished, process completed
   *
   */


  cdb.admin.Geocoding = cdb.core.Model.extend({

    _POLLTIMER: 2000,

    defaults: {
      kind: '',
      formatter: '',
      table_name: ''
    },

    idAttribute: 'id',

    url: function(method) {
      var version = cdb.config.urlVersion('geocoding', method);

      var base = '/api/' + version + '/geocodings/';
      if (this.isNew()) {
        return base;
      }
      return base + this.id;
    },

    initialize: function() {
      this.bind('change', this._checkFinish, this);
    },

    setUrlRoot: function(urlRoot) {
      this.urlRoot = urlRoot;
    },

    /**
     * checks for poll to finish
     */
    pollCheck: function(i) {
      var self = this;
      var tries = 0;
      this.pollTimer = setInterval(function() {
        self.fetch({
          error: function(e) {
            self.trigger("change");
          }
        });
        ++tries;
      }, i || this._POLLTIMER);
    },

    destroyCheck: function() {
      clearInterval(this.pollTimer);
    },

    _checkFinish: function() {
      var state = this.get('state');
      var error = this.get('error');

      var attributes = _.clone(this.attributes);

      if (state === null) {
        this.trigger('geocodingStarted', this);
      } else if (state === "finished") {
        this.destroyCheck();
        this.clear({ silent: true });
        this.trigger('geocodingComplete', attributes, this);
      } else if (state === "failed") {
        this.destroyCheck();
        this.clear({ silent: true });
        this.trigger('geocodingError', error, this);
      } else if (state === "reset" || state === "cancelled") {
        this.clear({ silent: true });
      } else {
        this.trigger('geocodingChange', this);
      }
    },

    cancelGeocoding: function() {
      this.destroyCheck();
      this.trigger('geocodingCanceled', this);
      this.save({ state:'cancelled' }, { wait:true });
    },

    resetGeocoding: function() {
      this.destroyCheck();
      this.trigger('geocodingReset', this);
      this.set('state', 'reset');
    },

    isGeocoding: function() {
      return this.get('id') && this.get('table_name') && (this.get('formatter') || this.get('kind'))
    }

  });


  /**
   *  Geocoding endpoint to get all running geocodings
   */
  cdb.admin.Geocodings = cdb.core.Model.extend({

    url: function(method) {
      var version = cdb.config.urlVersion('geocoding', method);

      return '/api/' + version + '/geocodings';
    }

  });

  /**
   * Model to get available geometries from a location (column_name from table or free_text)
   */
  cdb.admin.Geocodings.AvailableGeometries = cdb.core.Model.extend({

    url: function(method) {
      var version = cdb.config.urlVersion('geocoding', method);
      return '/api/' + version + '/geocodings/available_geometries';
    },

    parse: function(r) {
      return { available_geometries: r }
    }

  });

  /**
   *  Geocoding estimation for a table
   *
   *  - It will show the estimate price of geocoding that table.
   *
   */
  cdb.admin.Geocodings.Estimation = cdb.core.Model.extend({

    // defaults: {
    //   rows:       0,
    //   estimation: 0 - actually the cost (in credits)
    // },

    urlRoot: function() {
      var version = cdb.config.urlVersion('geocoding', 'read');
      return "/api/" + version + "/geocodings/estimation_for/";
    },

    reset: function() {
      this.unset('rows');
      this.unset('estimation');
    },

    costInCredits: function() {
      return this.get('estimation');
    },

    mayHaveCost: function() {
      // also includes undefined, for the case when the price is unknown)
      return this.costInCredits() !== 0;
    },

    costInDollars: function() {
      return Math.ceil(this.costInCredits() / 100);
    }

  });