diff --git a/website/server/controllers/api-v3/challenges.js b/website/server/controllers/api-v3/challenges.js index ffda202648..2d58eda175 100644 --- a/website/server/controllers/api-v3/challenges.js +++ b/website/server/controllers/api-v3/challenges.js @@ -257,6 +257,16 @@ api.createChallenge = { privacy: group.privacy, }; + res.analytics.track('challenge create', { + uuid: user._id, + hitType: 'event', + category: 'behavior', + challengeID: response._id, + groupID: group._id, + groupName: group.privacy === 'private' ? null : group.name, + groupType: group._id === TAVERN_ID ? 'tavern' : group.type, + }); + res.respond(201, response); }, }; @@ -315,6 +325,16 @@ api.joinChallenge = { let chalLeader = await User.findById(response.leader).select(nameFields).exec(); response.leader = chalLeader ? chalLeader.toJSON({minimize: true}) : null; + res.analytics.track('challenge join', { + uuid: user._id, + hitType: 'event', + category: 'behavior', + challengeID: challenge._id, + groupID: group._id, + groupName: group.privacy === 'private' ? null : group.name, + groupType: group._id === TAVERN_ID ? 'tavern' : group.type, + }); + res.respond(200, response); }, }; @@ -351,6 +371,17 @@ api.leaveChallenge = { // Unlink challenge's tasks from user's tasks and save the challenge await Bluebird.all([challenge.unlinkTasks(user, keep), challenge.save()]); + + res.analytics.track('challenge leave', { + uuid: user._id, + hitType: 'event', + category: 'behavior', + challengeID: challenge._id, + groupID: challenge.group._id, + groupName: challenge.group.privacy === 'private' ? null : challenge.group.name, + groupType: challenge.group._id === TAVERN_ID ? 'tavern' : challenge.group.type, + }); + res.respond(200, {}); }, }; @@ -679,6 +710,17 @@ api.deleteChallenge = { // Close channel in background, some ops are run in the background without `await`ing await challenge.closeChal({broken: 'CHALLENGE_DELETED'}); + + res.analytics.track('challenge delete', { + uuid: user._id, + hitType: 'event', + category: 'behavior', + challengeID: challenge._id, + groupID: challenge.group._id, + groupName: challenge.group.privacy === 'private' ? null : challenge.group.name, + groupType: challenge.group._id === TAVERN_ID ? 'tavern' : challenge.group.type, + }); + res.respond(200, {}); }, }; @@ -717,6 +759,18 @@ api.selectChallengeWinner = { // Close channel in background, some ops are run in the background without `await`ing await challenge.closeChal({broken: 'CHALLENGE_CLOSED', winner}); + + res.analytics.track('challenge close', { + uuid: user._id, + hitType: 'event', + category: 'behavior', + challengeID: challenge._id, + challengeWinnerID: winner._id, + groupID: challenge.group._id, + groupName: challenge.group.privacy === 'private' ? null : challenge.group.name, + groupType: challenge.group._id === TAVERN_ID ? 'tavern' : challenge.group.type, + }); + res.respond(200, {}); }, }; diff --git a/website/server/controllers/api-v3/tasks.js b/website/server/controllers/api-v3/tasks.js index 0e231e4721..415fa0198e 100644 --- a/website/server/controllers/api-v3/tasks.js +++ b/website/server/controllers/api-v3/tasks.js @@ -23,6 +23,7 @@ import common from '../../../common'; import Bluebird from 'bluebird'; import _ from 'lodash'; import logger from '../../libs/logger'; +import moment from 'moment'; const MAX_SCORE_NOTES_LENGTH = 256; @@ -166,6 +167,16 @@ api.createUserTasks = { res.respond(201, tasks.length === 1 ? tasks[0] : tasks); tasks.forEach((task) => { + // Track when new users (first 7 days) create tasks + if (moment().diff(user.auth.timestamps.created, 'days') < 7) { + res.analytics.track('task create', { + uuid: user._id, + hitType: 'event', + category: 'behavior', + taskType: task.type, + }); + } + taskActivityWebhook.send(user.webhooks, { type: 'created', task, @@ -241,6 +252,16 @@ api.createChallengeTasks = { // If adding tasks to a challenge -> sync users if (challenge) challenge.addTasks(tasks); + + tasks.forEach((task) => { + res.analytics.track('task create', { + uuid: user._id, + hitType: 'event', + category: 'behavior', + taskType: task.type, + challengeID: challenge._id, + }); + }); }, }; @@ -654,16 +675,16 @@ api.scoreTask = { } } - /* - * TODO: enable score task analytics if desired - res.analytics.track('score task', { - uuid: user._id, - hitType: 'event', - category: 'behavior', - taskType: task.type, - direction - }); - */ + // Track when new users (first 7 days) score tasks + if (moment().diff(user.auth.timestamps.created, 'days') < 7) { + res.analytics.track('task score', { + uuid: user._id, + hitType: 'event', + category: 'behavior', + taskType: task.type, + direction, + }); + } }, }; diff --git a/website/server/controllers/api-v3/tasks/groups.js b/website/server/controllers/api-v3/tasks/groups.js index 709da205fe..9ff6850218 100644 --- a/website/server/controllers/api-v3/tasks/groups.js +++ b/website/server/controllers/api-v3/tasks/groups.js @@ -58,6 +58,16 @@ api.createGroupTasks = { let tasks = await createTasks(req, res, {user, group}); res.respond(201, tasks.length === 1 ? tasks[0] : tasks); + + tasks.forEach((task) => { + res.analytics.track('task create', { + uuid: user._id, + hitType: 'event', + category: 'behavior', + taskType: task.type, + groupID: group._id, + }); + }); }, };