From b0e12b2027cb670aa3fcbcdbe08fad0aec085f81 Mon Sep 17 00:00:00 2001 From: "Chen, Tai-Lin" Date: Thu, 21 Dec 2023 17:58:52 +0800 Subject: [PATCH] refactor: use questList to calculate total quests and completed --- packages/analytics/src/controllers/index.js | 15 ++++-- packages/analytics/src/models/quests.js | 55 --------------------- 2 files changed, 12 insertions(+), 58 deletions(-) diff --git a/packages/analytics/src/controllers/index.js b/packages/analytics/src/controllers/index.js index 8557cba..19edb1d 100644 --- a/packages/analytics/src/controllers/index.js +++ b/packages/analytics/src/controllers/index.js @@ -1,13 +1,22 @@ import { userCount } from '../models/users.js' -import { totalQuests, totalCompleted } from '../models/quests.js' +import { questList } from '../models/quests.js' // eslint-disable-next-line import/prefer-default-export export async function homeController(req, res) { + const quests = await questList() + const [totalQuests, totalCompleted] = quests.reduce( + ([total, completed], quest) => [ + total + quest.started, + completed + quest.completed, + ], + [0, 0] + ) + const payload = { title: 'Linux Odyssey Admin', userCount: await userCount(), - totalQuests: await totalQuests(), - totalCompleted: await totalCompleted(), + totalQuests, + totalCompleted, } payload.completedRate = Math.round((payload.totalCompleted / payload.totalQuests) * 10000) / 100 diff --git a/packages/analytics/src/models/quests.js b/packages/analytics/src/models/quests.js index b5f7471..2b64889 100644 --- a/packages/analytics/src/models/quests.js +++ b/packages/analytics/src/models/quests.js @@ -2,61 +2,6 @@ /* eslint-disable func-names */ import { UserProfile } from '@linux-odyssey/models' -export function totalQuests() { - return UserProfile.aggregate([ - { - $project: { - _id: 0, - progress: { $objectToArray: '$progress' }, - }, - }, - { - $unwind: '$progress', - }, - { - $group: { - _id: null, - totalCount: { $sum: 1 }, - }, - }, - ]).then((results) => { - if (results.length === 0) { - throw new Error('No documents found') - } - return results[0].totalCount - }) -} - -export function totalCompleted() { - return UserProfile.aggregate([ - { - $project: { - _id: 0, - progress: { $objectToArray: '$progress' }, - }, - }, - { - $unwind: '$progress', - }, - { - $match: { - 'progress.v.completed': true, - }, - }, - { - $group: { - _id: null, - totalCount: { $sum: 1 }, - }, - }, - ]).then((results) => { - if (results.length === 0) { - throw new Error('No documents found') - } - return results[0].totalCount - }) -} - export function questList() { return UserProfile.aggregate([ {