From 0f29dabeeecdce4a92611b891f19f664cc2dad20 Mon Sep 17 00:00:00 2001 From: ajdj100 Date: Thu, 12 Feb 2026 00:53:15 -0500 Subject: [PATCH] added detailed reason to member discharge --- .../20260212052346-state-reason-detailed.js | 53 +++++++++++++++++++ ...60212052346-state-reason-detailed-down.sql | 1 + ...0260212052346-state-reason-detailed-up.sql | 3 ++ api/src/routes/members.ts | 2 +- api/src/services/db/memberService.ts | 8 +-- 5 files changed, 62 insertions(+), 5 deletions(-) create mode 100644 api/migrations/20260212052346-state-reason-detailed.js create mode 100644 api/migrations/sqls/20260212052346-state-reason-detailed-down.sql create mode 100644 api/migrations/sqls/20260212052346-state-reason-detailed-up.sql diff --git a/api/migrations/20260212052346-state-reason-detailed.js b/api/migrations/20260212052346-state-reason-detailed.js new file mode 100644 index 0000000..762432a --- /dev/null +++ b/api/migrations/20260212052346-state-reason-detailed.js @@ -0,0 +1,53 @@ +'use strict'; + +var dbm; +var type; +var seed; +var fs = require('fs'); +var path = require('path'); +var Promise; + +/** + * We receive the dbmigrate dependency from dbmigrate initially. + * This enables us to not have to rely on NODE_PATH. + */ +exports.setup = function(options, seedLink) { + dbm = options.dbmigrate; + type = dbm.dataType; + seed = seedLink; + Promise = options.Promise; +}; + +exports.up = function(db) { + var filePath = path.join(__dirname, 'sqls', '20260212052346-state-reason-detailed-up.sql'); + return new Promise( function( resolve, reject ) { + fs.readFile(filePath, {encoding: 'utf-8'}, function(err,data){ + if (err) return reject(err); + console.log('received data: ' + data); + + resolve(data); + }); + }) + .then(function(data) { + return db.runSql(data); + }); +}; + +exports.down = function(db) { + var filePath = path.join(__dirname, 'sqls', '20260212052346-state-reason-detailed-down.sql'); + return new Promise( function( resolve, reject ) { + fs.readFile(filePath, {encoding: 'utf-8'}, function(err,data){ + if (err) return reject(err); + console.log('received data: ' + data); + + resolve(data); + }); + }) + .then(function(data) { + return db.runSql(data); + }); +}; + +exports._meta = { + "version": 1 +}; diff --git a/api/migrations/sqls/20260212052346-state-reason-detailed-down.sql b/api/migrations/sqls/20260212052346-state-reason-detailed-down.sql new file mode 100644 index 0000000..44f074e --- /dev/null +++ b/api/migrations/sqls/20260212052346-state-reason-detailed-down.sql @@ -0,0 +1 @@ +/* Replace with your SQL commands */ \ No newline at end of file diff --git a/api/migrations/sqls/20260212052346-state-reason-detailed-up.sql b/api/migrations/sqls/20260212052346-state-reason-detailed-up.sql new file mode 100644 index 0000000..41d05aa --- /dev/null +++ b/api/migrations/sqls/20260212052346-state-reason-detailed-up.sql @@ -0,0 +1,3 @@ +/* Replace with your SQL commands */ + +ALTER TABLE member_state_history ADD reason_detailed TEXT; \ No newline at end of file diff --git a/api/src/routes/members.ts b/api/src/routes/members.ts index af12870..b7eb20f 100644 --- a/api/src/routes/members.ts +++ b/api/src/routes/members.ts @@ -245,7 +245,7 @@ router.post('/discharge', [requireLogin, requireMemberState(MemberState.Member), con.beginTransaction(); var data: Discharge = req.body; - setUserState(data.userID, MemberState.Discharged, "Member Discharged", author, con); + setUserState(data.userID, MemberState.Discharged, "Member Discharged", author, con, data.reason); cancelLatestRank(data.userID, con); cancelLatestUnit(data.userID, con); con.commit(); diff --git a/api/src/services/db/memberService.ts b/api/src/services/db/memberService.ts index 69c564b..25be92e 100644 --- a/api/src/services/db/memberService.ts +++ b/api/src/services/db/memberService.ts @@ -100,7 +100,7 @@ export async function getUserData(userID: number): Promise { return res[0] ?? null; } -export async function setUserState(userID: number, state: MemberState, reason: string, creatorID: number, externalCon?: mariadb.PoolConnection, endPrevious: boolean = true, createHistory: boolean = true) { +export async function setUserState(userID: number, state: MemberState, reason: string, creatorID: number, externalCon?: mariadb.PoolConnection, details: string = "", endPrevious: boolean = true, createHistory: boolean = true) { const isInternalConn = !externalCon; if (isInternalConn) var con = await pool.getConnection(); @@ -118,9 +118,9 @@ export async function setUserState(userID: number, state: MemberState, reason: s if (createHistory) { const insertHistorySql = `INSERT INTO member_state_history - (member_id, state_id, reason, created_by_id, start_date, end_date) - VALUES (?, ?, ?, ?, NOW(), NULL);`; - await con.query(insertHistorySql, [userID, state, reason, creatorID]); + (member_id, state_id, reason, created_by_id, start_date, end_date, reason_detailed) + VALUES (?, ?, ?, ?, NOW(), NULL, ?);`; + await con.query(insertHistorySql, [userID, state, reason, creatorID, details]); } if (isInternalConn) await con.commit();