Skip to content

Commit

Permalink
Single request for week-chart
Browse files Browse the repository at this point in the history
  • Loading branch information
edalholt committed Dec 7, 2024
1 parent f0a4ea1 commit 5e36aba
Show file tree
Hide file tree
Showing 3 changed files with 89 additions and 11 deletions.
55 changes: 55 additions & 0 deletions backend/controllers/litersMultipleDays.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
import { Request, Response } from "express";
import { Brew } from "../models/brew";

export async function getLitersForDays(req: Request, res: Response) {
const { days } = req.body;

if (!Array.isArray(days) || days.length === 0) {
return res.status(400).json({ message: "Invalid days array" });
}

try {
// Perform aggregation to group liters by day
const litersByDay = await Brew.aggregate([
{
$match: {
brewTime: {
$gte: new Date(`${days[0]}T00:00:00.000Z`),
$lte: new Date(`${days[days.length - 1]}T23:59:59.999Z`),
},
},
},
{
$addFields: {
day: { $dateToString: { format: "%Y-%m-%d", date: "$brewTime" } },
},
},
{
$match: { day: { $in: days } },
},
{
$group: {
_id: "$day",
liters: { $sum: "$liters" },
},
},
{
$sort: { _id: 1 },
},
]);

const litersMap = new Map(
litersByDay.map((item) => [item._id, item.liters])
);

const result = days.map((day) => ({
date: day,
liters: litersMap.get(day) || 0,
}));

return res.status(200).json(result);
} catch (error) {
console.error(error);
return res.status(418).json({ message: "Error" });
}
}
8 changes: 8 additions & 0 deletions backend/routes/routes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { getLitersBetweenDates } from "../controllers/litersBetweenDates";
import { getLatestBrew } from "../controllers/latestBrew";
import { heatmap } from "../controllers/heatmap";
import { getDayWithMostCoffee } from "../controllers/mostCoffeeDays";
import { getLitersForDays } from "../controllers/litersMultipleDays";

const routes = Router();

Expand All @@ -23,6 +24,13 @@ routes.post("/coffee/brew", logCoffee);
*/
routes.post("/coffee", getLitersBetweenDates);

/**
* Retrieve the total liters of coffee brewed for multiple days.
* @route POST /coffee/days
* @param {string[]} days - An array of ISO date strings.
*/
routes.post("/coffee/days", getLitersForDays);

/**
* Retrieve the latest coffee brew.
* @route GET /coffee/latest
Expand Down
37 changes: 26 additions & 11 deletions frontend/src/lib/CoffeWeekChart.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@
import axios from "axios";
import { onMount } from "svelte";
import Chart from "svelte-frappe-charts";
let chartRef;
// Initialize chart data
let data = {
labels: [],
datasets: [
Expand All @@ -23,24 +25,37 @@
"Saturday",
];
// Array of the last 7 weekdays in date format
let days: Date[] = [];
// Generate an array of the last 7 days as strings in YYYY-MM-DD format
let days: string[] = [];
for (let i = 0; i < 7; i++) {
days.push(new Date(new Date().setDate(new Date().getDate() - i)));
const date = new Date();
date.setDate(date.getDate() - i);
days.push(date.toISOString().split("T")[0]);
}
days.reverse();
onMount(async () => {
for (const day of days) {
const dayString = new Date(day).toLocaleDateString("af-NA");
const res = await axios.post("/coffee", {
startDate: dayString,
endDate: dayString,
try {
const res = await axios.post("/coffee/days", { days });
const labels: string[] = [];
const values: number[] = [];
res.data.forEach((dayData: { date: string; liters: number }) => {
const dayIndex = new Date(dayData.date).getDay();
labels.push(weekday[dayIndex]);
values.push(Number(dayData.liters.toFixed(1)));
});
chartRef.addDataPoint(weekday[new Date(day).getDay()], [
res.data.liters.toFixed(1),
]);
data = {
labels,
datasets: [
{
values,
},
],
};
} catch (error) {
console.error("Error fetching week-chart:", error);
}
});
</script>
Expand Down

0 comments on commit 5e36aba

Please sign in to comment.