File size: 3,806 Bytes
3c21989
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
const express = require('express');
const router = express.Router();
const { PrismaClient } = require('@prisma/client');
const { verifyToken, isAdmin } = require('../middleware/auth');
// const { sendApprovalEmail } = require('../config/email'); // We can add this later!

const prisma = new PrismaClient();

// ==========================================
// USER ROUTES
// ==========================================

// Get total approved seats for the landing page
router.get('/stats', async (req, res) => {
    try {
        const approvedCount = await prisma.user.count({
            where: { accountStatus: 'APPROVED' }
        });
        res.json({ approvedCount, totalSeats: 100 });
    } catch (error) {
        res.status(500).json({ error: 'Error fetching stats' });
    }
});

// Get user dashboard data
router.get('/dashboard', verifyToken, async (req, res) => {
    try {
        const user = await prisma.user.findUnique({
            where: { id: req.user.userId },
            select: { name: true, accountStatus: true, role: true }
        });

        let classes = [];
        // Only show class links if they are approved
        if (user.accountStatus === 'APPROVED') {
            classes = await prisma.workshopClass.findMany({
                orderBy: { dayNumber: 'asc' }
            });
        }

        res.json({ user, classes });
    } catch (error) {
        res.status(500).json({ error: 'Error fetching dashboard' });
    }
});

// ==========================================
// ADMIN ROUTES
// ==========================================

// Get all registrations for admin review
router.get('/admin/users', verifyToken, isAdmin, async (req, res) => {
    try {
        const users = await prisma.user.findMany({
            include: { payment: true, discountClaim: true },
            orderBy: { createdAt: 'desc' }
        });
        res.json(users);
    } catch (error) {
        res.status(500).json({ error: 'Error fetching users' });
    }
});

// Bulk approve/reject users
router.put('/admin/verify-bulk', verifyToken, isAdmin, async (req, res) => {
    try {
        const { userIds, status } = req.body;
        
        await prisma.user.updateMany({
            where: { id: { in: userIds } },
            data: { accountStatus: status }
        });

        res.json({ message: `${userIds.length} users updated to ${status}` });
    } catch (error) {
        res.status(500).json({ error: 'Bulk update failed' });
    }
});

// Approve or Reject a user
router.put('/admin/verify/:userId', verifyToken, isAdmin, async (req, res) => {
    try {
        const { status } = req.body; // 'APPROVED' or 'REJECTED'
        
        const updatedUser = await prisma.user.update({
            where: { id: req.params.userId },
            data: { accountStatus: status }
        });

        // Optional: Trigger an email here letting them know they are approved!

        res.json({ message: `User status updated to ${status}`, user: updatedUser });
    } catch (error) {
        res.status(500).json({ error: 'Error updating user status' });
    }
});

// Update daily class links (Zoom/GMeet)
router.put('/admin/class/:dayNumber', verifyToken, isAdmin, async (req, res) => {
    try {
        const { title, meetingLink, date } = req.body;
        
        const workshopClass = await prisma.workshopClass.upsert({
            where: { dayNumber: parseInt(req.params.dayNumber) },
            update: { title, meetingLink, date: new Date(date) },
            create: { dayNumber: parseInt(req.params.dayNumber), title, meetingLink, date: new Date(date) }
        });

        res.json({ message: 'Class updated successfully', workshopClass });
    } catch (error) {
        res.status(500).json({ error: 'Error updating class' });
    }
});

module.exports = router;