core/apps/webapp/app/routes/api.v1.activity.contribution.tsx
Harshith Mullapudi 4882f227d2
Feat: clusters (#37)
* Feat: clustering fact statements

* Feat: cluster drift

* Feat: add recall count and model to search

* Feat: Github integration

* Fix: clustering UI

* Improve graph

* Bump: new version

---------

Co-authored-by: Manoj K <saimanoj58@gmail.com>
2025-08-05 15:31:15 +05:30

68 lines
1.6 KiB
TypeScript

import { type LoaderFunctionArgs, json } from "@remix-run/node";
import { requireUserId } from "~/services/session.server";
import { prisma } from "~/db.server";
export async function loader({ request }: LoaderFunctionArgs) {
const userId = await requireUserId(request);
// Get user's workspace
const user = await prisma.user.findUnique({
where: { id: userId },
select: { Workspace: { select: { id: true } } },
});
if (!user?.Workspace) {
throw new Response("Workspace not found", { status: 404 });
}
// Get activity data for the last year
const oneYearAgo = new Date();
oneYearAgo.setFullYear(oneYearAgo.getFullYear() - 1);
const activities = await prisma.ingestionQueue.findMany({
where: {
workspaceId: user.Workspace.id,
createdAt: {
gte: oneYearAgo,
},
},
select: {
createdAt: true,
status: true,
},
orderBy: {
createdAt: "desc",
},
});
// Group activities by date
const activityByDate = activities.reduce(
(acc, activity) => {
const date = activity.createdAt.toISOString().split("T")[0];
if (!acc[date]) {
acc[date] = { count: 0, status: activity.status };
}
acc[date].count += 1;
return acc;
},
{} as Record<string, { count: number; status: string }>,
);
// Convert to array format for the component
const contributionData = Object.entries(activityByDate).map(
([date, data]) => ({
date,
count: data.count,
status: data.status,
}),
);
return json({
success: true,
data: {
contributionData,
totalActivities: activities.length,
},
});
}