Merge branch 'main' into promotions
This commit is contained in:
@@ -79,9 +79,11 @@ router.get('/me', [requireLogin], async (req, res) => {
|
||||
|
||||
try {
|
||||
let application = await getMemberApplication(userID);
|
||||
|
||||
if (application === undefined)
|
||||
|
||||
if (application === undefined) {
|
||||
res.sendStatus(204);
|
||||
return;
|
||||
}
|
||||
|
||||
const comments: CommentRow[] = await getApplicationComments(application.id);
|
||||
|
||||
|
||||
@@ -46,32 +46,35 @@ passport.use(new OpenIDConnectStrategy({
|
||||
|
||||
//lookup existing user
|
||||
const existing = await con.query(`SELECT id FROM members WHERE authentik_issuer = ? AND authentik_sub = ? LIMIT 1;`, [issuer, sub]);
|
||||
let memberId: number;
|
||||
let memberId: number | null = null;
|
||||
//if member exists
|
||||
if (existing.length > 0) {
|
||||
memberId = existing[0].id;
|
||||
} else {
|
||||
//otherwise: create account
|
||||
//otherwise: create account mode
|
||||
const jwt = parseJwt(jwtClaims);
|
||||
const discordID = jwt.discord.id as number;
|
||||
const discordID = jwt.discord?.id as number;
|
||||
|
||||
//check if account is available to claim
|
||||
memberId = await mapDiscordtoID(discordID);
|
||||
if (discordID)
|
||||
memberId = await mapDiscordtoID(discordID);
|
||||
|
||||
if (memberId === null) {
|
||||
// create new account
|
||||
if (discordID && memberId) {
|
||||
// claim account
|
||||
console.log("Claiming account");
|
||||
const result = await con.query(
|
||||
`UPDATE members SET authentik_sub = ?, authentik_issuer = ? WHERE id = ?;`,
|
||||
[sub, issuer, memberId]
|
||||
)
|
||||
} else {
|
||||
console.log("New Account");
|
||||
// new account
|
||||
const username = sub.username;
|
||||
const result = await con.query(
|
||||
`INSERT INTO members (name, authentik_sub, authentik_issuer) VALUES (?, ?, ?)`,
|
||||
[username, sub, issuer]
|
||||
)
|
||||
memberId = Number(result.insertId);
|
||||
} else {
|
||||
// claim existing account
|
||||
const result = await con.query(
|
||||
`UPDATE members SET authentik_sub = ?, authentik_issuer = ? WHERE id = ?;`,
|
||||
[sub, issuer, memberId]
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@ router.post("/", async (req: Request, res: Response) => {
|
||||
});
|
||||
|
||||
//admin posts LOA
|
||||
router.post("/admin", [requireRole("17th Administrator")], async (req: Request, res: Response) => {
|
||||
router.post("/admin", [requireRole(['17th Administrator', '17th HQ', '17th Command'])], async (req: Request, res: Response) => {
|
||||
let LOARequest = req.body as LOARequest;
|
||||
LOARequest.created_by = req.user.id;
|
||||
LOARequest.filed_date = new Date();
|
||||
@@ -67,7 +67,7 @@ router.get("/history", async (req: Request, res: Response) => {
|
||||
}
|
||||
})
|
||||
|
||||
router.get('/all', [requireRole("17th Administrator")], async (req: Request, res: Response) => {
|
||||
router.get('/all', [requireRole(['17th Administrator', '17th HQ', '17th Command'])], async (req: Request, res: Response) => {
|
||||
try {
|
||||
const page = Number(req.query.page) || undefined;
|
||||
const pageSize = Number(req.query.pageSize) || undefined;
|
||||
@@ -107,7 +107,7 @@ router.post('/cancel/:id', async (req: Request, res: Response) => {
|
||||
})
|
||||
|
||||
//TODO: enforce admin only
|
||||
router.post('/adminCancel/:id', [requireRole("17th Administrator")], async (req: Request, res: Response) => {
|
||||
router.post('/adminCancel/:id', [requireRole(['17th Administrator', '17th HQ', '17th Command'])], async (req: Request, res: Response) => {
|
||||
let closer = req.user.id;
|
||||
try {
|
||||
await closeLOA(Number(req.params.id), closer);
|
||||
@@ -119,7 +119,7 @@ router.post('/adminCancel/:id', [requireRole("17th Administrator")], async (req:
|
||||
})
|
||||
|
||||
// TODO: Enforce admin only
|
||||
router.post('/extend/:id', [requireRole("17th Administrator")], async (req: Request, res: Response) => {
|
||||
router.post('/extend/:id', [requireRole(['17th Administrator', '17th HQ', '17th Command'])], async (req: Request, res: Response) => {
|
||||
const to: Date = req.body.to;
|
||||
|
||||
if (!to) {
|
||||
|
||||
@@ -5,7 +5,8 @@ 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 } from '../services/rolesService';
|
||||
import { assignUserGroup, createGroup, getAllRoles, getRole, getUsersWithRole } from '../services/rolesService';
|
||||
import { Request, Response } from 'express';
|
||||
|
||||
r.use(requireLogin)
|
||||
ur.use(requireLogin)
|
||||
@@ -15,10 +16,16 @@ ur.post('/', [requireMemberState(MemberState.Member), requireRole("17th Administ
|
||||
try {
|
||||
const body = req.body;
|
||||
|
||||
assignUserGroup(body.member_id, body.role_id);
|
||||
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' });
|
||||
}
|
||||
@@ -44,45 +51,39 @@ ur.delete('/', [requireMemberState(MemberState.Member), requireRole("17th Admini
|
||||
//get all roles
|
||||
r.get('/', [requireMemberState(MemberState.Member)], async (req, res) => {
|
||||
try {
|
||||
var 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_unit_status_latest 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] || []
|
||||
}));
|
||||
|
||||
res.json(result);
|
||||
const roles = await getAllRoles();
|
||||
res.status(200).json(roles);
|
||||
} catch (err) {
|
||||
console.error(err);
|
||||
res.status(500).json({ error: 'Internal server error' });
|
||||
} finally {
|
||||
con.release();
|
||||
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("17th Administrator")], async (req, res) => {
|
||||
r.post('/', [requireMemberState(MemberState.Member), requireRole("dev")], async (req, res) => {
|
||||
try {
|
||||
const { name, color, description } = req.body;
|
||||
if (!name || !color) {
|
||||
@@ -103,7 +104,7 @@ r.post('/', [requireMemberState(MemberState.Member), requireRole("17th Administr
|
||||
}
|
||||
})
|
||||
|
||||
r.delete('/:id', [requireMemberState(MemberState.Member), requireRole("17th Administrator")], async (req, res) => {
|
||||
r.delete('/:id', [requireMemberState(MemberState.Member), requireRole("dev")], async (req, res) => {
|
||||
try {
|
||||
const id = req.params.id;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user