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);
  }
};