Spaces:
Runtime error
Runtime error
File size: 1,744 Bytes
77610ec | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | import { Request, Response, NextFunction } from "express";
import prisma from "../../prisma/client";
export const getUserAnalytics = async (req: Request, res: Response, next: NextFunction) => {
const userId = (req as any).user?.id;
try {
const user = await prisma.user.findUnique({
where: { id: userId },
select: {
xp: true,
streak: true,
_count: {
select: {
projects: true,
submissions: true,
achievements: true
}
}
}
});
const projectCompletion = await prisma.userProject.groupBy({
by: ["status"],
where: { userId },
_count: true
});
res.json({
success: true,
data: {
stats: user,
projectCompletion
}
});
} catch (error: any) {
next(error);
}
};
export const getAdminAnalytics = async (req: Request, res: Response, next: NextFunction) => {
const userId = (req as any).user?.id;
try {
const user = await prisma.user.findUnique({ where: { id: userId } });
if (user?.role !== "ADMIN") {
return res.status(403).json({ success: false, message: "Forbidden" });
}
const totalUsers = await prisma.user.count();
const totalProjects = await prisma.project.count();
const totalSubmissions = await prisma.submission.count();
const popularProjects = await prisma.project.findMany({
orderBy: { submissionCount: "desc" },
take: 5,
select: { title: true, submissionCount: true }
});
res.json({
success: true,
data: {
totalUsers,
totalProjects,
totalSubmissions,
popularProjects
}
});
} catch (error: any) {
next(error);
}
};
|