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 }