/**
* Proxy to access Google **[calendar resources](https://developers.google.com/google-apps/calendar/v3/reference/calendarList)**.
*/
Ext.define('Ext.google.data.CalendarsProxy', {
extend: 'Ext.google.data.AbstractProxy',
alias: 'proxy.google-calendars',
requires: [
'Ext.google.data.EventsProxy'
],
googleApis: { 'calendar': { version: 'v3' } },
/**
* @method buildApiRequests
* @protected
* @inheritdoc
*/
buildApiRequests: function(request) {
var me = this,
action = request.getAction();
switch (action) {
case 'read':
return me.buildReadApiRequests(request);
case 'update':
return me.buildUpdateApiRequests(request);
default:
Ext.raise('unsupported request: calendars.' + action);
return null;
}
},
/**
* @method extractResponseData
* @protected
* @inheritdoc
*/
extractResponseData: function(response) {
var me = this,
data = me.callParent(arguments),
items = [];
// We assume that the response contains only results of the same kind.
Ext.each(data.results, function(result) {
switch (result.kind) {
case 'calendar#calendarList':
items = items.concat(result.items.map(me.fromApiCalendar.bind(me)));
break;
default:
break;
}
});
return {
items: me.sanitizeItems(items),
success: data.success,
error: data.error
};
},
privates: {
// https://developers.google.com/google-apps/calendar/v3/reference/calendarList#resource
toApiCalendar: function(data) {
var res = {};
Ext.Object.each(data, function(key, value) {
switch (key) {
case 'id':
res.calendarId = value;
break;
case 'hidden':
res.selected = !value;
break;
default:
break;
}
});
return res;
},
// https://developers.google.com/google-apps/calendar/v3/reference/calendarList#resource
fromApiCalendar: function(data) {
var record = {
hidden: !data.selected,
editable: false,
eventStore: {
autoSync: true,
proxy: {
type: 'google-events',
resourceTypes: 'events'
}
}
};
Ext.Object.each(data, function(key, value) {
switch (key) {
case 'id':
case 'description':
record[key] = value;
break;
case 'backgroundColor':
record.color = value;
break;
case 'summary':
record.title = value;
break;
case 'accessRole':
record.editable = (value == 'owner' || value == 'writer');
break;
default:
break;
}
});
return record;
},
// https://developers.google.com/google-apps/calendar/v3/reference/calendarList/list
buildReadApiRequests: function(request) {
return gapi.client.calendar.calendarList.list();
},
// https://developers.google.com/google-apps/calendar/v3/reference/calendarList/patch
buildUpdateApiRequests: function(request) {
var data = this.toApiCalendar(request.getJsonData());
return gapi.client.calendar.calendarList.patch(data);
}
}
});