Spaces:
Running
Running
| 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; |