malkomalko
8/15/2009 - 3:33 PM

gistfile1.js

SC.RailsDataSource = SC.DataSource.extend( {    

  fetch: function(store, fetchKey, params) {
    //Todos.inspectController.inspect(fetchKey, 2);
    
    var ret = [], url;
    var action={};
    
    if (params) {
      var r = SC.Request.getUrl('tasks'+"?"+params).set('isJSON', YES);
    } else {
      var r = SC.Request.getUrl('tasks').set('isJSON', YES);
    }
  
    r.notify(this, this.fetchDidComplete,
      { 
        store: store, 
        fetchKey: fetchKey , 
        storeKeyArray: ret
      }
    ).send();
  
    return ret;
  },
  
  fetchDidComplete: function(r, params) {     

    var hashes= [], storeKeys= [], store, fetchKey, ret, primaryKey,
      response, results, lenresults, idx;

    response = r.response();
    
    if (response.rails_auth_token_name) {
      SC.RAILS_AUTH_TOKEN_NAME = response.rails_auth_token_name;
      SC.RAILS_AUTH_TOKEN = response.rails_auth_token;
    }

    if (response.kindOf ? response.kindOf(SC.Error) : false) {
      this.requestDidError(r);
    } else {
      fetchKey = params.fetchKey;
      storeKeys = params.store.loadRecords(fetchKey, response.content);
      params.storeKeyArray.replace(0,0,storeKeys);
    }

    return YES;   
  },
  
  requestDidError: function(r) {
    var pane = SC.AlertPane.error("There has been an error with your request", 
      r.get('rawResponse').toString(), '', "OK", "Cancel", this);      
    return YES;
  },
  
  retrieveRecord: function(store, storeKey) {
  
    var ret = [], url, action={},
      recordType = SC.Store.recordTypeFor(storeKey),
      id = recordType.idFor(storeKey);
  
    url='tasks'+'/'+id;
  
    var r = SC.Request.getUrl(url).set('isJSON', YES);
  
    r.notify(this, this.retrieveRecordDidComplete, 
      { store: store, storeKey: storeKey,id:id }
    ).send();
  
    this.cancelStoreKeys[storeKey]=[].push(r);
  
    return ret;
  },
  
  retrieveRecordDidComplete: function(r,params) {
    
    var response, results, storeKeys = [], hashes = [];
    response = r.response();
    
    if (response.kindOf ? response.kindOf(SC.Error) : false) {
     this.requestDidError(r);
    } else {
      results = response.content;
      storeKeys.push(params.storeKey);
      params.store.dataSourceDidComplete(params.storeKey, results, params.id);
      this.cancelStoreKeys[params.storeKey]=null;    
      params.storeKeyArray.replace(0,0,storeKeys);
    }  
  
    return YES;
  },
  
  createRecord: function(store, storeKey) {
  
    var dataHash = store.readDataHash(storeKey), 
      obj={"content":dataHash};
      
    var r = SC.Request.postUrl('tasks').set('isJSON', YES);
  
    r.notify(this, this.createRecordDidComplete, { 
      store: store, storeKey: storeKey
    }).send(obj);
  
    this.cancelStoreKeys[storeKey]=[].push(r);
  
    return YES ;
  },
  
  createRecordDidComplete: function(r, params) {
  
    var response, results, guid;
    response = r.response();
    
    if(response.kindOf ? response.kindOf(SC.Error) : false) {
      this.requestDidError(r);
    } else {
      results = response.content;
      guid=results.guid;
      params.store.dataSourceDidComplete(params.storeKey, results, guid);
      this.cancelStoreKeys[params.storeKey]=null;
    }
  
    return YES;
  },
  
  updateRecord: function(store, storeKey) {
  
    var id = store.idFor(storeKey),
      dataHash   = store.readDataHash(storeKey),
      obj={"content":dataHash};
  
    var url = 'tasks'+'/'+id;
    var r   = SC.Request.putUrl(url).set('isJSON', YES);

    r.notify(this, this.updateRecordDidComplete, { 
      store: store, storeKey: storeKey, id:id
    }).send(obj);
  
    this.cancelStoreKeys[storeKey]=[].push(r);
  
    return YES ;
  },
  
  updateRecordDidComplete: function(r, params) {
  
    var response, results;
    response = r.response();
  
    if(response.kindOf ? response.kindOf(SC.Error) : false) {
     this.requestDidError(r);
    } else {
      results = response.content;
      params.store.dataSourceDidComplete(params.storeKey, results, params.id);
      this.cancelStoreKeys[params.storeKey]=null;
    }
  
    return YES;
  },

  destroyRecord: function(store, storeKey) {
  
    var id = store.idFor(storeKey);
    var r = SC.Request.deleteUrl("").set('isJSON', YES);
  
    if(!id) return YES;
    r.set('address',id);
  
    r.notify(this, this.destroyRecordDidComplete, { 
      store: store, storeKey: storeKey 
    }).send();

    this.cancelStoreKeys[storeKey]=[].push(r);
  
    return YES ;
  },
  
  destroyRecordDidComplete: function(r, params) {
  
    var response = r.response();
  
    if(response.kindOf ? response.kindOf(SC.Error) : false) {
      this.requestDidError(r);
    } else {
      params.store.dataSourceDidDestroy(params.storeKey);
      this.cancelStoreKeys[params.storeKey]=null;
    }
  
    return YES;
  },

  cancel: function(store, storeKeys) {     
    return NO;   
  },
  
  /** @private */
  _appendQueryString: function(url, params) {
    var name, queryString = [] ;
    for (name in params) {
      if (params.hasOwnProperty(name)) {
        queryString.push("%@=%@".fmt(name,params[name]));
      }
    }
    return [url, queryString.join('&')].join('?') ;
  },
  
  _response: function(request, userData) {
    var json = request.get('response') ;
    Refresher.processJson(json, {
      query: userData.query
    });
  }

});