Procházet zdrojové kódy

fix(YouTube): Days with no queries not returned in chart data

Owen Diffey před 2 roky
rodič
revize
9984486eab
1 změnil soubory, kde provedl 72 přidání a 37 odebrání
  1. 72 37
      backend/logic/youtube.js

+ 72 - 37
backend/logic/youtube.js

@@ -270,45 +270,80 @@ class _YouTubeModule extends CoreClass {
 
 	GET_QUOTA_CHART_DATA(payload) {
 		return new Promise((resolve, reject) => {
-			const fromDate = new Date(new Date() - (8 * 24 * 60 * 60 * 1000));
-			YouTubeModule.youtubeApiRequestModel.aggregate([
-				{
-					$match: { date: { $gte: fromDate } }
-				},
-				{
-					$group: {
-						_id: { $dateToString: { format: "%Y-%m-%d", date: "$date" } },
-						usage: { $sum: "$quotaCost" },
-						count: { $sum: 1 }
-					}
-				},
-				{
-					$sort: { _id: 1 }
-				},
-				{
-					$project: { date: "$_id", usage: 1, count: 1 }
-				}
-			]).exec((err, data) => {
-				if (err) return reject(err);
-				return resolve({
-					quotaUsage: {
-						labels: data.map(row => row.date),
-						datasets: [{
-							label: "All",
-							data: data.map(row => row.usage),
-							borderColor: "rgb(2, 166, 242)"
-						}]
+			async.waterfall(
+				[
+					next => {
+						const fromDate = new Date(new Date() - (6 * 24 * 60 * 60 * 1000));
+						fromDate.setUTCHours(0, 0, 0);
+						const dates = [];
+						const tempDate = new Date(fromDate.getTime());
+						while (dates.length < 7) {
+							dates.push(new Date(tempDate));
+							tempDate.setDate(tempDate.getDate() + 1);
+						}
+						next(null, fromDate, dates);
+					},
+
+					(fromDate, dates, next) => {
+						YouTubeModule.youtubeApiRequestModel.aggregate([
+							{
+								$match: { date: { $gte: fromDate } }
+							},
+							{
+								$group: {
+									_id: { $dateToString: { format: "%Y-%m-%d", date: "$date" } },
+									usage: { $sum: "$quotaCost" },
+									count: { $sum: 1 }
+								}
+							},
+							{
+								$sort: { _id: 1 }
+							},
+							{
+								$project: { date: "$_id", usage: 1, count: 1 }
+							}
+						]).exec((err, data) => {
+							if (err) next(err);
+							else next(null, dates, data);
+						});
 					},
-					apiRequests: {
-						labels: data.map(row => row.date),
-						datasets: [{
-							label: "All",
-							data: data.map(row => row.count),
-							borderColor: "rgb(2, 166, 242)"
-						}]
+
+					(dates, data, next) => {
+						const filteredData = dates.map(
+							date => {
+								const dayData = data.find(
+									row => new Date(row.date).getDate() === date.getDate()
+								);
+								if (dayData) return { date, usage: dayData.usage, count: dayData.count };
+								return { date, usage: 0, count: 0 };
+							}
+						);
+						const friendlyDates = dates.map(date => date.toISOString().split("T")[0]);
+						next(null, {
+							quotaUsage: {
+								labels: friendlyDates,
+								datasets: [{
+									label: "All",
+									data: filteredData.map(row => row.usage),
+									borderColor: "rgb(2, 166, 242)"
+								}]
+							},
+							apiRequests: {
+								labels: friendlyDates,
+								datasets: [{
+									label: "All",
+									data: filteredData.map(row => row.count),
+									borderColor: "rgb(2, 166, 242)"
+								}]
+							}
+						});
 					}
-				});
-			});
+				],
+				(err, data) => {
+					if (err) reject(err);
+					else resolve(data);
+				}
+			);
 		});
 	}