/** * Base proxy for accessing **[Google API](https://developers.google.com/apis-explorer/#p/)** resources. */Ext.define('Ext.google.data.AbstractProxy', { extend: 'Ext.data.proxy.Server', mixins: [ 'Ext.google.ux.Client' ], // TODO: Batch actions // https://developers.google.com/api-client-library/javascript/features/batch /** * @cfg batchActions * @inheritdoc */ batchActions: false, /** * @cfg reader * @inheritdoc */ reader: { type: 'json', rootProperty: 'items', messageProperty: 'error' }, /** * @method buildApiRequests * Returns a list of API request(s), **not executed**. * @param {Ext.data.Request} request The data request * @return {Object[]} API request(s) * @abstract */ /** * @protected * @inheritdoc */ doRequest: function(operation) { var me = this, request = me.buildRequest(operation), writer = me.getWriter(), error = false; if (writer && operation.allowWrite()) { request = writer.write(request); } me.execute(me.buildApiRequests(request)) .then(function(response) { me.processApiResponse(operation, request, response); }); return request; }, /** * @method buildUrl * @protected * @inheritdoc */ buildUrl: function(request) { return ''; }, privates: { execute: function(requests) { requests = [].concat(requests); // BUG: when using the gapi batch feature and trying to modify the same event // more than one time, the request partially fails and returns a 502 error. // See https://code.google.com/a/google.com/p/apps-api-issues/issues/detail?id=4528 // TODO: use the following code once fixed! also check that it doesn't break // maxResults limit for event list requests. // var batch = gapi.client.newBatch(); // Ext.Array.each(requests, function(r, i) { batch.add(r, { id: i }); }); // return batch.execute(); // WORKAROUND for the issue above (REMOVE ME) var results = []; return Ext.Array.reduce(requests, function(sequence, r) { return sequence.then(function() { return r.then(function(result) { results.push(result); }); }); }, Ext.Deferred.resolved()).then(function() { return { result: results }; }); }, processApiResponse: function(operation, request, responses) { var error = false, results = []; // responses.result is not a regular Object, can't iterate with Ext.Object.each() Ext.each(Object.keys(responses.result), function(index) { var result = responses.result[index].result; if (result.error) { error = result.error.message; return false; } results.push(result); }); this.processResponse(true, operation, request, { results: error ? [] : results, success: !error, error: error }); }, sanitizeItems: function(items) { var results = [], ids = []; // Batch can return different versions of the same record, only keep the last one. Ext.Array.each(items, function(item) { if (!Ext.Array.contains(ids, item.id)) { results.push(item); ids.push(item.id); } }, this, true); return results; } }});