scraping-bootcamp-api / src /routes /apiRoutes.js
ShieldX's picture
Upload 11 files
3c21989 verified
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;