const express = require('express'); const { requireAuth, getTenantDb } = require('./auth'); const router = express.Router(); // GET /api/courses router.get('/', requireAuth, async (req, res) => { try { const db = getTenantDb(req); const { data, error } = await db .from('courses') .select('*') .is('deleted_at', null) .order('created_at', { ascending: false }); if (error) { // If table doesn't exist yet, return empty array gracefully if (error.code === '42P01') { return res.json([]); } throw error; } res.json(data || []); } catch (error) { console.error('Error fetching courses:', error); res.status(500).json({ error: 'Failed to fetch courses' }); } }); // POST /api/courses router.post('/', requireAuth, async (req, res) => { try { const { title, category, duration, fee, max_price, discount, mode, trainer_name, admission_status, trainer_experience, placement_percentage, rating, syllabus, batch_timings, placement_partners, emi_options, ai_insight } = req.body; if (!title || !category || !fee) { return res.status(400).json({ error: 'Missing required fields (title, category, fee)' }); } const db = getTenantDb(req); const orgId = req.user?.user_metadata?.organization_id || '00000000-0000-0000-0000-000000000001'; const { data, error } = await db.from('courses').insert([ { organization_id: orgId, title, category, duration: duration || '', fee, max_price: max_price || fee, discount: discount || 0, mode: mode || 'Online / Offline', admission_status: admission_status || 'Open', trainer_name: trainer_name || 'TBD', trainer_experience: trainer_experience || '5+ Years', placement_percentage: placement_percentage || 80, rating: rating || 5.0, syllabus: syllabus || [], batch_timings: batch_timings || [], placement_partners: placement_partners || [], emi_options: emi_options || 'Available on request', ai_insight: ai_insight || 'New course offering.' } ]).select(); if (error) throw error; res.json(data[0]); } catch (error) { console.error('Error creating course:', error); res.status(500).json({ error: 'Failed to create course' }); } }); // PUT /api/courses/:id router.put('/:id', requireAuth, async (req, res) => { try { const { id } = req.params; const { title, category, duration, fee, max_price, discount, mode, trainer_name, admission_status, trainer_experience, placement_percentage, rating, syllabus, batch_timings, placement_partners, emi_options, ai_insight } = req.body; if (!title || !category || !fee) { return res.status(400).json({ error: 'Missing required fields (title, category, fee)' }); } const db = getTenantDb(req); const { data, error } = await db.from('courses').update({ title, category, duration: duration || '', fee, max_price: max_price || fee, discount: discount || 0, mode: mode || 'Online / Offline', admission_status: admission_status || 'Open', trainer_name: trainer_name || 'TBD', trainer_experience: trainer_experience || '5+ Years', placement_percentage: placement_percentage || 80, rating: rating || 5.0, syllabus: syllabus || [], batch_timings: batch_timings || [], placement_partners: placement_partners || [], emi_options: emi_options || 'Available on request', ai_insight: ai_insight || 'Course updated.' }).eq('id', id).select(); if (error) throw error; res.json(data[0]); } catch (error) { console.error('Error updating course:', error); res.status(500).json({ error: 'Failed to update course' }); } }); // DELETE /api/courses/:id router.delete('/:id', requireAuth, async (req, res) => { try { const { id } = req.params; const db = getTenantDb(req); // Soft delete const { error } = await db.from('courses').update({ deleted_at: new Date().toISOString() }).eq('id', id); if (error) throw error; res.json({ success: true }); } catch (error) { console.error('Error deleting course:', error); res.status(500).json({ error: 'Failed to delete course' }); } }); module.exports = router;