Log message restore info to Gelf

This commit is contained in:
Andris Reinman 2022-08-23 10:04:26 +03:00
parent 9c61d147df
commit 4dfee77bf3
No known key found for this signature in database
GPG key ID: DC6C83F4D584D364
2 changed files with 77 additions and 4 deletions

View file

@ -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) => {

View file

@ -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);
}