From c34f8beea94ee71d1f22f021048728b983d09c47 Mon Sep 17 00:00:00 2001 From: ajdj100 Date: Sun, 1 Mar 2026 21:11:32 -0500 Subject: [PATCH] Fixed #194 issues --- api/src/routes/members.ts | 3 ++- api/src/services/db/rolesService.ts | 13 +++++++++++++ ui/src/components/members/DischargeMember.vue | 5 ++++- ui/src/pages/memberList.vue | 18 ++++++++++++++---- 4 files changed, 33 insertions(+), 6 deletions(-) diff --git a/api/src/routes/members.ts b/api/src/routes/members.ts index 5bf0f31..9bb6933 100644 --- a/api/src/routes/members.ts +++ b/api/src/routes/members.ts @@ -6,7 +6,7 @@ import pool from '../db'; import { requireLogin, requireMemberState, requireRole } from '../middleware/auth'; import { getUserActiveLOA } from '../services/db/loaService'; import { getAllMembersLite, getMemberSettings, getMembersFull, getMembersLite, getUserData, getUserState, setUserSettings, getFilteredMembers, setUserState, getLastNonSuspendedState } from '../services/db/memberService'; -import { getUserRoles } from '../services/db/rolesService'; +import { getUserRoles, stripUserRoles } from '../services/db/rolesService'; import { memberSettings, MemberState, myData } from '@app/shared/types/member'; import { Discharge } from '@app/shared/schemas/dischargeSchema'; @@ -249,6 +249,7 @@ router.post('/discharge', [requireLogin, requireMemberState(MemberState.Member), var data: Discharge = req.body; setUserState(data.userID, MemberState.Discharged, "Member Discharged", author, con, data.reason); + stripUserRoles(data.userID, con); cancelLatestRank(data.userID, con); cancelLatestUnit(data.userID, con); con.commit(); diff --git a/api/src/services/db/rolesService.ts b/api/src/services/db/rolesService.ts index efb58ee..5e87f50 100644 --- a/api/src/services/db/rolesService.ts +++ b/api/src/services/db/rolesService.ts @@ -3,6 +3,7 @@ import pool from '../../db'; import { Role, RoleSummary } from '@app/shared/types/roles' import { logger } from '../logging/logger'; import { memberCache } from '../../routes/auth'; +import * as mariadb from 'mariadb'; export async function assignUserGroup(userID: number, roleID: number) { try { @@ -62,4 +63,16 @@ export async function getUsersWithRole(roleId: number): Promise { ) return out as MemberLight[] +} + +export async function stripUserRoles(userID: number, con: mariadb.Pool | mariadb.Connection = pool) { + try { + const out = await con.query(`DELETE FROM members_roles WHERE member_id = ?;`, [userID]); + return { success: true, affectedRows: out.affectedRows }; + } catch (error) { + logger.error('app', 'Failed to strip user roles', error); + throw error; + } finally { + memberCache.Invalidate(userID); + } } \ No newline at end of file diff --git a/ui/src/components/members/DischargeMember.vue b/ui/src/components/members/DischargeMember.vue index f5a77a3..c558461 100644 --- a/ui/src/components/members/DischargeMember.vue +++ b/ui/src/components/members/DischargeMember.vue @@ -26,7 +26,10 @@ const props = defineProps<{ member: Member | null }>() -const emit = defineEmits(['update:open', 'discharged']) +const emit = defineEmits<{ + 'update:open': [value: boolean] + 'discharged': [value: { data: Discharge }] +}>() const formSchema = toTypedSchema(dischargeSchema); diff --git a/ui/src/pages/memberList.vue b/ui/src/pages/memberList.vue index 999d60b..560fb00 100644 --- a/ui/src/pages/memberList.vue +++ b/ui/src/pages/memberList.vue @@ -32,6 +32,8 @@ import Spinner from "@/components/ui/spinner/Spinner.vue"; import DischargeMember from "@/components/members/DischargeMember.vue"; import MemberCard from "@/components/members/MemberCard.vue"; + import { useMemberDirectory } from "@/stores/memberDirectory"; + import { Discharge } from "@shared/schemas/dischargeSchema"; // --- State --- const router = useRouter(); @@ -149,15 +151,20 @@ async function onSuspend(member: Member) { await suspendMember(member.member_id); await fetchMembers(); + memberCache.invalidateMember(member.member_id); } async function onUnsuspend(member: Member) { await unsuspendMember(member.member_id); await fetchMembers(); + memberCache.invalidateMember(member.member_id); } - function handleDischargeSuccess(data) { + const memberCache = useMemberDirectory(); + + function handleDischargeSuccess(value: { data: Discharge }) { fetchMembers(); + memberCache.invalidateMember(value.data.userID); } @@ -245,7 +252,8 @@ {{ member.rank }} {{ member.unit }} - {{ MemberState[member.member_state] }} + {{ + MemberState[member.member_state] }} View Profile --> - Discharge Member - Suspend Member -- 2.37.3.windows.1