360 строки
8.8 KiB
JavaScript
360 строки
8.8 KiB
JavaScript
/**
|
|
* @author Christoph Wurst <christoph@winzerhof-wurst.at>
|
|
*
|
|
* Mail
|
|
*
|
|
* This code is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU Affero General Public License, version 3,
|
|
* as published by the Free Software Foundation.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU Affero General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Affero General Public License, version 3,
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>
|
|
*
|
|
*/
|
|
|
|
define(function(require) {
|
|
'use strict';
|
|
|
|
var $ = require('jquery');
|
|
var _ = require('underscore');
|
|
var OC = require('OC');
|
|
var Radio = require('radio');
|
|
var messageListXhr = null;
|
|
|
|
Radio.message.reply('entities', getMessageEntities);
|
|
Radio.message.reply('entity', getMessageEntity);
|
|
Radio.message.reply('bodies', fetchMessageBodies);
|
|
Radio.message.reply('flag', flagMessage);
|
|
Radio.message.reply('send', sendMessage);
|
|
Radio.message.reply('draft', saveDraft);
|
|
|
|
/**
|
|
* @param {Account} account
|
|
* @param {Folder} folder
|
|
* @param {object} options
|
|
* @returns {Promise}
|
|
*/
|
|
function getMessageEntities(account, folder, options) {
|
|
options = options || {};
|
|
var defaults = {
|
|
cache: false,
|
|
replace: false, // Replace cached folder list
|
|
force: false,
|
|
filter: ''
|
|
};
|
|
_.defaults(options, defaults);
|
|
|
|
// Do not cache search queries
|
|
if (options.filter !== '') {
|
|
options.cache = false;
|
|
}
|
|
|
|
// Abort previous requests
|
|
if (messageListXhr !== null) {
|
|
messageListXhr.abort();
|
|
}
|
|
|
|
var defer = $.Deferred();
|
|
|
|
if (options.cache) {
|
|
// Load cached version if available
|
|
var messageList = require('cache').getMessageList(account, folder);
|
|
if (!options.force && messageList) {
|
|
_.each(messageList, function(msg) {
|
|
folder.addMessage(msg);
|
|
});
|
|
defer.resolve(folder.messages, true);
|
|
return defer.promise();
|
|
}
|
|
}
|
|
|
|
var url = OC.generateUrl('apps/mail/accounts/{accountId}/folders/{folderId}/messages',
|
|
{
|
|
accountId: account.get('accountId'),
|
|
folderId: folder.get('id')
|
|
});
|
|
|
|
// TODO: folder.messages.fetch()
|
|
messageListXhr = $.ajax(url,
|
|
{
|
|
data: {
|
|
from: options.from,
|
|
to: options.to,
|
|
filter: options.filter
|
|
},
|
|
success: function(messages) {
|
|
if (options.replace || options.cache) {
|
|
require('cache').addMessageList(account, folder, messages);
|
|
}
|
|
var collection = folder.messages;
|
|
if (options.replace) {
|
|
collection.reset();
|
|
}
|
|
_.each(messages, function(msg) {
|
|
folder.addMessage(msg);
|
|
});
|
|
defer.resolve(collection, false);
|
|
},
|
|
error: function(error, status) {
|
|
if (status !== 'abort') {
|
|
defer.reject(error);
|
|
}
|
|
}
|
|
});
|
|
|
|
return defer.promise();
|
|
}
|
|
|
|
/**
|
|
* @param {Account} account
|
|
* @param {Folder} folder
|
|
* @param {number} messageId
|
|
* @param {object} options
|
|
* @returns {Promise}
|
|
*/
|
|
function getMessageEntity(account, folder, messageId, options) {
|
|
options = options || {};
|
|
var defaults = {
|
|
backgroundMode: false
|
|
};
|
|
_.defaults(options, defaults);
|
|
|
|
var defer = $.Deferred();
|
|
|
|
// Load cached version if available
|
|
var message = require('cache').getMessage(account,
|
|
folder,
|
|
messageId);
|
|
if (message) {
|
|
defer.resolve(message);
|
|
return defer.promise();
|
|
}
|
|
|
|
var url = OC.generateUrl('apps/mail/accounts/{accountId}/folders/{folderId}/messages/{messageId}', {
|
|
accountId: account.get('accountId'),
|
|
folderId: folder.get('id'),
|
|
messageId: messageId
|
|
});
|
|
var xhr = $.ajax(url, {
|
|
type: 'GET',
|
|
success: function(message) {
|
|
defer.resolve(message);
|
|
},
|
|
error: function(jqXHR, textStatus) {
|
|
if (textStatus !== 'abort') {
|
|
defer.reject();
|
|
}
|
|
}
|
|
});
|
|
if (!options.backgroundMode) {
|
|
// Save xhr to allow aborting unneeded requests
|
|
require('state').messageLoading = xhr;
|
|
}
|
|
|
|
return defer.promise();
|
|
}
|
|
|
|
/**
|
|
* @param {Account} account
|
|
* @param {Folder} folder
|
|
* @param {array} messageIds
|
|
* @returns {undefined}
|
|
*/
|
|
function fetchMessageBodies(account, folder, messageIds) {
|
|
var defer = $.Deferred();
|
|
|
|
var cachedMessages = [];
|
|
var uncachedIds = [];
|
|
_.each(messageIds, function(messageId) {
|
|
var message = require('cache').getMessage(account, folder, messageId);
|
|
if (message) {
|
|
cachedMessages.push(message);
|
|
} else {
|
|
uncachedIds.push(messageId);
|
|
}
|
|
});
|
|
|
|
if (uncachedIds.length > 0) {
|
|
var Ids = uncachedIds.join(',');
|
|
var url = OC.generateUrl('apps/mail/accounts/{accountId}/folders/{folderId}/messages?ids={ids}', {
|
|
accountId: account.get('accountId'),
|
|
folderId: folder.get('id'),
|
|
ids: Ids
|
|
});
|
|
$.ajax(url, {
|
|
type: 'GET',
|
|
success: function(data) {
|
|
defer.resolve(data);
|
|
},
|
|
error: function() {
|
|
defer.reject();
|
|
}
|
|
});
|
|
}
|
|
|
|
return defer.promise();
|
|
}
|
|
|
|
function flagMessage(account, folder, message, flag, value) {
|
|
var defer = $.Deferred();
|
|
|
|
var flags = [flag, value];
|
|
var url = OC.generateUrl('apps/mail/accounts/{accountId}/folders/{folderId}/messages/{messageId}/flags',
|
|
{
|
|
accountId: account.get('accountId'),
|
|
folderId: folder.get('id'),
|
|
messageId: message.id
|
|
});
|
|
$.ajax(url, {
|
|
type: 'PUT',
|
|
data: {
|
|
flags: _.object([flags])
|
|
},
|
|
success: function() {
|
|
defer.resolve();
|
|
},
|
|
error: function() {
|
|
defer.reject();
|
|
}
|
|
});
|
|
|
|
return defer.promise();
|
|
}
|
|
|
|
/**
|
|
* @param {Account} account
|
|
* @param {object} message
|
|
* @param {object} options
|
|
* @returns {undefined}
|
|
*/
|
|
function sendMessage(account, message, options) {
|
|
var defer = $.Deferred();
|
|
|
|
var defaultOptions = {
|
|
draftUID: null,
|
|
aliasId: null
|
|
};
|
|
_.defaults(options, defaultOptions);
|
|
var url = OC.generateUrl('/apps/mail/accounts/{id}/send', {
|
|
id: account.get('id')
|
|
});
|
|
var data = {
|
|
type: 'POST',
|
|
success: function(data) {
|
|
if (!!options.repliedMessage) {
|
|
// Reply -> flag message as replied
|
|
Radio.ui.trigger('messagesview:messageflag:set', options.repliedMessage.get('id'), 'answered', true);
|
|
}
|
|
|
|
defer.resolve(data);
|
|
},
|
|
error: function(xhr) {
|
|
defer.reject(xhr);
|
|
},
|
|
data: {
|
|
to: message.to,
|
|
cc: message.cc,
|
|
bcc: message.bcc,
|
|
subject: message.subject,
|
|
body: message.body,
|
|
attachments: message.attachments,
|
|
folderId: options.repliedMessage ? options.repliedMessage.get('folderId') : undefined,
|
|
messageId: options.repliedMessage ? options.repliedMessage.get('messageId') : undefined,
|
|
draftUID: options.draftUID,
|
|
aliasId: options.aliasId
|
|
}
|
|
};
|
|
$.ajax(url, data);
|
|
|
|
return defer.promise();
|
|
}
|
|
|
|
/**
|
|
* @param {Account} account
|
|
* @param {object} message
|
|
* @param {object} options
|
|
* @returns {undefined}
|
|
*/
|
|
function saveDraft(account, message, options) {
|
|
var defer = $.Deferred();
|
|
|
|
var defaultOptions = {
|
|
folder: null,
|
|
messageId: null,
|
|
draftUID: null
|
|
};
|
|
_.defaults(options, defaultOptions);
|
|
|
|
// TODO: replace by Backbone model method
|
|
function undefinedOrEmptyString(prop) {
|
|
return prop === undefined || prop === '';
|
|
}
|
|
var emptyMessage = true;
|
|
var propertiesToCheck = ['to', 'cc', 'bcc', 'subject', 'body'];
|
|
_.each(propertiesToCheck, function(property) {
|
|
if (!undefinedOrEmptyString(message[property])) {
|
|
emptyMessage = false;
|
|
}
|
|
});
|
|
// END TODO
|
|
|
|
if (emptyMessage) {
|
|
if (options.draftUID !== null) {
|
|
// Message is empty + previous draft exists -> delete it
|
|
var draftsFolder = account.get('specialFolders').drafts;
|
|
var deleteUrl =
|
|
OC.generateUrl('apps/mail/accounts/{accountId}/folders/{folderId}/messages/{messageId}', {
|
|
accountId: account.get('accountId'),
|
|
folderId: draftsFolder,
|
|
messageId: options.draftUID
|
|
});
|
|
$.ajax(deleteUrl, {
|
|
type: 'DELETE'
|
|
});
|
|
}
|
|
defer.resolve({
|
|
uid: null
|
|
});
|
|
} else {
|
|
var url = OC.generateUrl('/apps/mail/accounts/{id}/draft', {
|
|
id: account.get('accountId')
|
|
});
|
|
var data = {
|
|
type: 'POST',
|
|
success: function(data) {
|
|
if (options.draftUID !== null) {
|
|
// update UID in message list
|
|
var collection = Radio.ui.request('messagesview:collection');
|
|
var message = collection.findWhere({id: options.draftUID});
|
|
if (message) {
|
|
message.set({id: data.uid});
|
|
collection.set([message], {remove: false});
|
|
}
|
|
}
|
|
defer.resolve(data);
|
|
},
|
|
error: function() {
|
|
defer.reject();
|
|
},
|
|
data: {
|
|
to: message.to,
|
|
cc: message.cc,
|
|
bcc: message.bcc,
|
|
subject: message.subject,
|
|
body: message.body,
|
|
attachments: message.attachments,
|
|
folderId: options.folder ? options.folder.get('id') : null,
|
|
messageId: options.repliedMessage ? options.repliedMessage.get('id') : null,
|
|
uid: options.draftUID
|
|
}
|
|
};
|
|
$.ajax(url, data);
|
|
}
|
|
return defer.promise();
|
|
}
|
|
}); |