Revived the page! He's baaaaack
This commit is contained in:
@@ -1,9 +1,97 @@
|
||||
import { Role } from "@app/shared/types/roles";
|
||||
import pool from "../../db";
|
||||
import { Member, MemberCardDetails, MemberLight, memberSettings, MemberState } from '@app/shared/types/member'
|
||||
import { Member, MemberCardDetails, MemberLight, memberSettings, MemberState, PaginatedMembers } from '@app/shared/types/member'
|
||||
import { logger } from "../logging/logger";
|
||||
import { memberCache } from "../../routes/auth";
|
||||
|
||||
export async function getFilteredMembers(
|
||||
page: number = 1,
|
||||
pageSize: number = 15,
|
||||
search?: string,
|
||||
status?: string,
|
||||
unitId?: string
|
||||
): Promise<PaginatedMembers> {
|
||||
try {
|
||||
const offset = (page - 1) * pageSize;
|
||||
const whereClauses: string[] = [];
|
||||
const params: any[] = [];
|
||||
|
||||
if (status && status !== 'all') {
|
||||
whereClauses.push(`m.state = ?`);
|
||||
params.push(status);
|
||||
}
|
||||
|
||||
if (search) {
|
||||
whereClauses.push(`v.member_name LIKE ?`);
|
||||
params.push(`%${search}%`);
|
||||
}
|
||||
|
||||
if (unitId && unitId !== 'all') {
|
||||
whereClauses.push(`v.unit = ?`);
|
||||
params.push(unitId);
|
||||
}
|
||||
|
||||
const whereClause = whereClauses.length > 0
|
||||
? ` WHERE ${whereClauses.join(' AND ')}`
|
||||
: '';
|
||||
|
||||
// COUNT QUERY
|
||||
const countQuery = `SELECT COUNT(*) as total FROM view_member_rank_unit_status_latest v INNER JOIN members m ON v.member_id = m.id ${whereClause}`;
|
||||
const [countResults]: any[] = await pool.query(countQuery, params);
|
||||
const total = Number(countResults?.total) || 0;
|
||||
|
||||
// DATA QUERY
|
||||
const dataQuery = `
|
||||
SELECT
|
||||
v.*,
|
||||
CASE
|
||||
WHEN EXISTS (
|
||||
SELECT 1 FROM leave_of_absences l
|
||||
WHERE l.member_id = v.member_id
|
||||
AND l.deleted = 0
|
||||
AND UTC_TIMESTAMP() BETWEEN l.start_date AND l.end_date
|
||||
) THEN 1 ELSE 0
|
||||
END AS on_loa
|
||||
FROM view_member_rank_unit_status_latest v
|
||||
INNER JOIN members m ON v.member_id = m.id
|
||||
${whereClause} -- Added back correctly
|
||||
ORDER BY v.member_name ASC
|
||||
LIMIT ? OFFSET ?
|
||||
`;
|
||||
|
||||
const rows: any[] = await pool.query(dataQuery, [...params, pageSize, offset]);
|
||||
|
||||
// Map rows to Member type
|
||||
const members: Member[] = rows.map(row => ({
|
||||
member_id: Number(row.member_id),
|
||||
member_name: row.member_name,
|
||||
displayName: row.displayName,
|
||||
rank: row.rank,
|
||||
rank_date: row.rank_date,
|
||||
unit: row.unit,
|
||||
unit_date: row.unit_date,
|
||||
status: row.status,
|
||||
status_date: row.status_date,
|
||||
loa_until: row.loa_until ? new Date(row.loa_until) : undefined,
|
||||
}));
|
||||
|
||||
return {
|
||||
data: members,
|
||||
pagination: {
|
||||
page,
|
||||
pageSize,
|
||||
total,
|
||||
totalPages: Math.ceil(total / pageSize),
|
||||
},
|
||||
};
|
||||
} catch (error) {
|
||||
logger.error('app', 'Error fetching filtered members', {
|
||||
error: error instanceof Error ? error.message : String(error),
|
||||
});
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
export async function getUserData(userID: number): Promise<Member> {
|
||||
const sql = `SELECT * FROM view_member_rank_unit_status_latest WHERE member_id = ?`;
|
||||
const res: Member = await pool.query(sql, [userID]);
|
||||
|
||||
Reference in New Issue
Block a user