Files
habitica/website/server/libs/groupTasks.js
2019-10-10 20:11:50 +02:00

62 lines
1.7 KiB
JavaScript

import * as Tasks from '../models/task'; // eslint-disable-line import/no-cycle
const SHARED_COMPLETION = {
default: 'recurringCompletion',
single: 'singleCompletion',
every: 'allAssignedCompletion',
};
async function _completeMasterTask (masterTask) {
masterTask.completed = true;
await masterTask.save();
}
async function _deleteUnfinishedTasks (groupMemberTask) {
await Tasks.Task.deleteMany({
'group.taskId': groupMemberTask.group.taskId,
$and: [
{ userId: { $exists: true } },
{ userId: { $ne: groupMemberTask.userId } },
],
}).exec();
}
async function _evaluateAllAssignedCompletion (masterTask) {
let completions;
if (masterTask.group.approval && masterTask.group.approval.required) {
completions = await Tasks.Task.count({
'group.taskId': masterTask._id,
'group.approval.approved': true,
}).exec();
completions += 1;
} else {
completions = await Tasks.Task.count({
'group.taskId': masterTask._id,
completed: true,
}).exec();
}
if (completions >= masterTask.group.assignedUsers.length) {
await _completeMasterTask(masterTask);
}
}
async function handleSharedCompletion (groupMemberTask) {
const masterTask = await Tasks.Task.findOne({
_id: groupMemberTask.group.taskId,
}).exec();
if (!masterTask || !masterTask.group || masterTask.type !== 'todo') return;
if (masterTask.group.sharedCompletion === SHARED_COMPLETION.single) {
await _deleteUnfinishedTasks(groupMemberTask);
await _completeMasterTask(masterTask);
} else if (masterTask.group.sharedCompletion === SHARED_COMPLETION.every) {
await _evaluateAllAssignedCompletion(masterTask);
}
}
export {
SHARED_COMPLETION,
handleSharedCompletion,
};