122 lines
3.5 KiB
TypeScript
122 lines
3.5 KiB
TypeScript
const express = require('express');
|
|
const r = express.Router();
|
|
const ur = express.Router();
|
|
|
|
import { MemberState } from '@app/shared/types/member';
|
|
import pool from '../db';
|
|
import { requireLogin, requireMemberState, requireRole } from '../middleware/auth';
|
|
import { assignUserGroup, createGroup, getAllRoles, getRole, getUsersWithRole } from '../services/rolesService';
|
|
import { Request, Response } from 'express';
|
|
|
|
r.use(requireLogin)
|
|
ur.use(requireLogin)
|
|
|
|
//manually assign a member to a group
|
|
ur.post('/', [requireMemberState(MemberState.Member), requireRole("17th Administrator")], async (req, res) => {
|
|
try {
|
|
const body = req.body;
|
|
|
|
await assignUserGroup(body.member_id, body.role_id);
|
|
|
|
res.sendStatus(201);
|
|
} catch (err) {
|
|
if (err?.code === 'ER_DUP_ENTRY') {
|
|
return res.status(400).json({
|
|
error: 'Member already has this role',
|
|
});
|
|
}
|
|
|
|
console.error('Insert failed:', err);
|
|
res.status(500).json({ error: 'Failed to add to group' });
|
|
}
|
|
});
|
|
|
|
//manually remove member from group
|
|
ur.delete('/', [requireMemberState(MemberState.Member), requireRole("17th Administrator")], async (req, res) => {
|
|
try {
|
|
const body = req.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('/', [requireMemberState(MemberState.Member)], async (req, res) => {
|
|
try {
|
|
const roles = await getAllRoles();
|
|
res.status(200).json(roles);
|
|
} catch (err) {
|
|
console.error(err);
|
|
res.sendStatus(500);
|
|
}
|
|
});
|
|
|
|
r.get('/:id/members', [requireMemberState(MemberState.Member)], async (req: Request, res: Response) => {
|
|
try {
|
|
const members = await getUsersWithRole(Number(req.params.id));
|
|
res.status(200).json(members);
|
|
} catch (err) {
|
|
console.error(err);
|
|
res.sendStatus(500);
|
|
}
|
|
})
|
|
|
|
|
|
r.get('/:id', [requireMemberState(MemberState.Member)], async (req: Request, res: Response) => {
|
|
try {
|
|
const role = await getRole(Number(req.params.id));
|
|
res.status(200).json(role);
|
|
} catch (err) {
|
|
console.error(err);
|
|
res.sendStatus(500);
|
|
}
|
|
})
|
|
|
|
|
|
|
|
//create a new role
|
|
r.post('/', [requireMemberState(MemberState.Member), requireRole("dev")], async (req, res) => {
|
|
try {
|
|
const { name, color, description } = req.body;
|
|
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)' });
|
|
}
|
|
|
|
await createGroup(name, color, description);
|
|
|
|
res.sendStatus(201);
|
|
} catch (err) {
|
|
console.error('Insert failed:', err);
|
|
res.status(500).json({ error: 'Failed to create role' });
|
|
}
|
|
})
|
|
|
|
r.delete('/:id', [requireMemberState(MemberState.Member), requireRole("dev")], 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.error(error);
|
|
res.sendStatus(500);
|
|
}
|
|
})
|
|
|
|
export const roles = r;
|
|
export const memberRoles = ur;
|