define(function(require, exports, module) { 'use strict'; var denodeifyAll = require('common/promise').denodeifyAll; var nextTick = require('common/next_tick'); function Abstract(options) { var key; for (key in options) { if (options.hasOwnProperty(key)) { this[key] = options[key]; } } denodeifyAll(this, [ 'eventCapabilities', 'getAccount', 'findCalendars', 'syncEvents', 'ensureRecurrencesExpanded', 'createEvent', 'updateEvent', 'deleteEvent' ]); } module.exports = Abstract; Abstract.prototype = { // orange (used by local calendar) defaultColor: '#F97C17', /** * Does this provider require credentials. */ useCredentials: false, /** * Does this provider require a url. */ useUrl: false, /** * Can provider sync with remote server? */ canSync: false, /** * Can expand recurring events? */ canExpandRecurringEvents: false, /** * - domain: (String) * - password: (String) * - user: (String) * * @param {Object} account user credentials. * @param {Function} callback node style (err, result). */ getAccount: function(account, callback) {}, /** * Attempts to find all calendars * for a given account. * * * account: (same as getAccount) * * @param {Object} account user credentials. * @param {Function} callback node style (err, result). */ findCalendars: function() {}, /** * Sync remote and local events. * */ syncEvents: function(account, calendar, callback) {}, /** * Ensures recurring events are expanded up to the given date. * * Its very important to correctly return the second callback arg * in the subclasses callback. When requiredExpansion is returned as true a * second call will likely be made to ensureRecurrencesExpanded to verify * there are no more pending events for the date (controller handles this). * * @param {Date} date to expand recurring events to. * @param {Function} callback [err, requiredExpansion]. * first argument is error, second indicates if any expansion was done. */ ensureRecurrencesExpanded: function(date, callback) {}, /** * Update an event * * @param {Object} event record from event store. * * @param {Object} [busytime] optional busytime instance * when a busytime is passed the edit is treated * as an "exception" and will only edit the one recurrence * related to the busytime. This may result in the creation * of a new "event" related to the busytime. */ updateEvent: function(event, busytime, callback) {}, /** * Delete event * * @param {Object} event record from the event store. * @param {Object} [busytime] optional busytime instance * when given it will only remove this occurence/exception * of the event rather then the entire sequence of events. */ deleteEvent: function(event, busytime, callback) {}, /** * Create an event */ createEvent: function(event, callback) {}, /** * Returns an object with three keys used to * determine the capabilities of a given calendar. * * - canCreate (Boolean) * - canUpdate (Boolean) * - canDelete (Boolean) * * @param {Object} calendar full calendar details. */ calendarCapabilities: function(calendar) { return { canCreateEvent: true, canUpdateEvent: true, canDeleteEvent: true }; }, /** * Returns the capabilities of a single event. * * @param {Object} event object. * @param {Function} callback [err, caps]. */ eventCapabilities: function(event, callback) { var caps = this.calendarCapabilities(); nextTick(function() { callback(null, { canCreate: caps.canCreateEvent, canUpdate: caps.canUpdateEvent, canDelete: caps.canDeleteEvent }); }); } }; });