const express = require('express'); const r = express.Router(); const ur = express.Router(); const pool = require('../db'); //assign a member to a role ur.post('/', async (req, res) => { try { const body = req.body; const sql = `INSERT INTO members_roles (member_id, role_id) VALUES (?, ?);`; await pool.query(sql, [body.member_id, body.role_id]); res.sendStatus(201); } catch (err) { console.error('Insert failed:', err); res.status(500).json({ error: 'Failed to add to group' }); } }); ur.delete('/', async (req, res) => { try { const body = req.body; console.log(body); const sql = 'DELETE FROM members_roles WHERE member_id = ? AND role_id = ?' await pool.query(sql, [body.member_id, body.role_id]) res.sendStatus(200); } catch (err) { console.error("delete failed: ", err) res.status(500).json({ error: 'Failed to remove from group' }); } }) //get all roles r.get('/', async (req, res) => { try { const con = await pool.getConnection(); // Get all roles const roles = await con.query('SELECT * FROM roles;'); // Get all members for each role const membersRoles = await con.query(` SELECT mr.role_id, v.* FROM members_roles mr JOIN view_member_rank_status_all v ON mr.member_id = v.member_id `); // Group members by role_id const roleIdToMembers = {}; for (const row of membersRoles) { if (!roleIdToMembers[row.role_id]) roleIdToMembers[row.role_id] = []; // Remove role_id from member object const { role_id, ...member } = row; roleIdToMembers[role_id].push(member); } // Attach members to each role const result = roles.map(role => ({ ...role, members: roleIdToMembers[role.id] || [] })); con.release(); res.json(result); } catch (err) { console.error(err); res.status(500).json({ error: 'Internal server error' }); } }); //create a new role r.post('/', async (req, res) => { try { const { name, color, description } = req.body; console.log('Creating role:', { name, color, description }); if (!name || !color) { return res.status(400).json({ error: 'Name and color are required' }); } const hexColorRegex = /^#([0-9A-Fa-f]{6})$/; if (!hexColorRegex.test(color)) { return res.status(400).json({ error: 'Color must be a valid hex color (#ffffff)' }); } const sql = `INSERT INTO roles (name, color, description) VALUES (?, ?, ?);`; const params = [name, color, description || null]; const result = await pool.query(sql, params); res.status(201).json({ id: result.insertId, name, color, description }); } catch (err) { console.error('Insert failed:', err); res.status(500).json({ error: 'Failed to create role' }); } }) r.delete('/:id', async (req, res) => { try { const id = req.params.id; const sql = 'DELETE FROM roles WHERE id = ?'; const res = await pool.query(sql, [id]); res.sendStatus(200); } catch (error) { console.log(error); res.sendStatus(500); } }) module.exports.roles = r; module.exports.memberRoles = ur;