remix-demo
react router (remix) demo
git clone https://9o.is/git/remix-demo.git
adminReport.server.ts
(1324B)
1 import { json } from "@remix-run/server-runtime";
2 import { aggregateReportPerUser } from "~/models/foodEntry.server";
3 import { requireAdmin } from "~/session.server";
4
5 export async function generateReport(request: Request) {
6 await requireAdmin(request);
7
8 const today = new Date();
9 const oneWeekAgo = daysLater(7, today);
10 const twoWeeksAgo = daysLater(7, oneWeekAgo);
11 const [thisWeek, lastWeek] = await Promise.all([
12 aggregate(oneWeekAgo, today),
13 aggregate(twoWeeksAgo, oneWeekAgo),
14 ]);
15
16 try {
17 return json({ thisWeek, lastWeek });
18 } catch (error) {
19 console.error("Failed to generate admin report:", error);
20 return json({ error: "Failed to generate admin report" }, { status: 500 });
21 }
22 }
23
24 async function aggregate(start: Date, end: Date) {
25 const result = await aggregateReportPerUser(start, end);
26 const { total, calories, users } = result.reduce(
27 (a, b) => {
28 a.users += 1;
29 a.total += b._count._all;
30 a.calories += b._sum.calories || 0;
31 return a;
32 },
33 { total: 0, calories: 0, users: 0 }
34 );
35
36 return {
37 start: start,
38 end: end,
39 total,
40 averagePerUser: Math.round(calories / users),
41 };
42 }
43
44 function daysLater(days: number, date: Date): Date {
45 const result = new Date(date);
46 result.setDate(date.getDate() - days);
47 return result;
48 }