diff --git a/lib/tasks/restore.js b/lib/tasks/restore.js index ee90c0c0..b7d246e7 100644 --- a/lib/tasks/restore.js +++ b/lib/tasks/restore.js @@ -10,8 +10,8 @@ function timeout(ms) { } async function restore(task, data, options) { - const messageHandler = options.messageHandler; - const mailboxHandler = options.mailboxHandler; + const { messageHandler, mailboxHandler, loggelf } = options; + const putMessage = util.promisify(messageHandler.put.bind(messageHandler)); const createMailbox = util.promisify((...args) => { @@ -89,6 +89,14 @@ async function restore(task, data, options) { if (!userData) { // no such user anymore log.error('Tasks', 'task=restore id=%s user=%s error=%s', task._id, data.user, 'No such user'); + loggelf({ + short_message: '[TASKFAIL] restore', + _task_action: 'restore', + _task_id: task._id.toString(), + _user: data.user.toString(), + _error: 'No such user', + _task_result: 'fail' + }); return true; } @@ -100,16 +108,26 @@ async function restore(task, data, options) { } }); + let restoredMessages = 0; + let messageData; while ((messageData = await cursor.next())) { // use special recovery mailbox - const archived = messageData._id; messageData.mailbox = await ensuretargetMailbox(userData._id, userData.language); if (!messageData.mailbox) { // failed to ensure mailbox log.info('Tasks', 'task=restore id=%s user=%s message=%s action=failed target=%s', task._id, data.user, archived, messageData.mailbox); + loggelf({ + short_message: '[TASKFAIL] restore', + _task_action: 'restore', + _task_id: task._id.toString(), + _user: data.user.toString(), + _message: archived.toString(), + _error: 'Failed to create folder', + _task_result: 'fail' + }); continue; } @@ -128,12 +146,32 @@ async function restore(task, data, options) { messageResponse = await putMessage(messageData); } catch (err) { log.error('Tasks', 'task=restore id=%s user=%s message=%s error=%s', task._id, data.user, archived, 'Failed to restore message. ' + err.message); + loggelf({ + short_message: '[TASKFAIL] restore', + _task_action: 'restore', + _task_id: task._id.toString(), + _user: data.user.toString(), + _message: archived.toString(), + _error: 'Failed to restore message. ' + err.message, + _task_result: 'fail' + }); + await timeout(5000); continue; } if (!messageResponse) { log.error('Tasks', 'task=restore id=%s user=%s message=%s error=%s', task._id, data.user, archived, 'Failed to restore message'); + loggelf({ + short_message: '[TASKFAIL] restore', + _task_action: 'restore', + _task_id: task._id.toString(), + _user: data.user.toString(), + _message: archived.toString(), + _error: 'Failed to restore message', + _task_result: 'fail' + }); + await timeout(1000); continue; } @@ -164,6 +202,20 @@ async function restore(task, data, options) { messageResponse.uid ); + loggelf({ + short_message: '[TASKOK] restore', + _task_action: 'restore', + _task_id: task._id.toString(), + _user: data.user.toString(), + _message: archived.toString(), + _task_result: 'success', + + _restored_mailbox: messageResponse.mailbox, + _restored_uid: messageResponse.uid + }); + + restoredMessages++; + try { let r = await db.database.collection('archived').deleteOne({ _id: archived }); log.info('Tasks', 'task=restore id=%s user=%s message=%s action=deleted count=%s', task._id, data.user, archived, r.deletedCount); @@ -179,6 +231,8 @@ async function restore(task, data, options) { } } await cursor.close(); + + return { restoredMessages }; } module.exports = (task, data, options, callback) => { diff --git a/tasks.js b/tasks.js index c9cd8ac1..35e4164b 100644 --- a/tasks.js +++ b/tasks.js @@ -542,10 +542,29 @@ function processTask(task, data, callback) { mailboxHandler, loggelf }, - err => { + (err, result) => { if (err) { + loggelf({ + short_message: '[TASKFAIL] restore', + _task_action: 'restore', + _task_id: task._id.toString(), + _user: data.user.toString(), + _task_result: 'error', + _error: err.message + }); + return callback(err); } + + loggelf({ + short_message: '[TASKOK] restore', + _task_action: 'restore', + _task_id: task._id.toString(), + _user: data.user.toString(), + _task_result: 'finished', + _restored_messages: result.restoredMessages + }); + // release callback(null, true); }