2021-08-23 11:11:42 -04:00
|
|
|
import { readFile, readdir, access } from "fs/promises";
|
|
|
|
import path from "path";
|
|
|
|
|
|
|
|
import matter from "gray-matter";
|
2022-02-02 02:32:53 -05:00
|
|
|
import { Client } from "ldapts";
|
2021-08-23 11:11:42 -04:00
|
|
|
import { serialize } from "next-mdx-remote/serialize";
|
|
|
|
|
2022-02-02 02:32:53 -05:00
|
|
|
import { getCurrentTerm } from "@/lib/events";
|
|
|
|
|
2021-09-03 21:55:23 -04:00
|
|
|
const EXECS_PATH = path.join("content", "team", "execs");
|
2021-08-23 11:11:42 -04:00
|
|
|
const fileType = ".md";
|
2022-02-02 02:32:53 -05:00
|
|
|
const { year, term } = getCurrentTerm();
|
2021-08-23 11:11:42 -04:00
|
|
|
|
2022-02-13 22:45:30 -05:00
|
|
|
const execPositions: { [name: string]: number } = {
|
2022-02-16 10:42:40 -05:00
|
|
|
president: 1,
|
2022-02-13 22:45:30 -05:00
|
|
|
"vice-president": 2,
|
|
|
|
secretary: 3,
|
|
|
|
treasurer: 4,
|
|
|
|
sysadmin: 5,
|
2022-02-13 10:48:30 -05:00
|
|
|
};
|
|
|
|
|
2022-02-13 22:45:30 -05:00
|
|
|
const positionNames: string[] = [
|
|
|
|
"President",
|
|
|
|
"Vice President",
|
|
|
|
"Assistant Vice President",
|
|
|
|
"Treasurer",
|
|
|
|
"System Administrator",
|
|
|
|
];
|
|
|
|
|
2022-02-16 10:31:14 -05:00
|
|
|
export interface ExecMembers {
|
2022-02-02 04:06:13 -05:00
|
|
|
name: string;
|
2022-02-13 10:48:30 -05:00
|
|
|
position: string;
|
2022-02-02 04:06:13 -05:00
|
|
|
}
|
|
|
|
|
2021-08-23 11:11:42 -04:00
|
|
|
export interface Metadata {
|
|
|
|
name: string;
|
|
|
|
role: string;
|
|
|
|
image: string;
|
|
|
|
}
|
|
|
|
|
|
|
|
export async function getExecNames() {
|
2022-02-09 08:22:38 -05:00
|
|
|
if (process.env.USE_LDAP?.toLowerCase() !== "true") {
|
|
|
|
return (await readdir(EXECS_PATH))
|
|
|
|
.filter((name) => name.endsWith(fileType))
|
|
|
|
.map((name) => name.slice(0, -1 * fileType.length));
|
|
|
|
}
|
2022-02-02 02:32:53 -05:00
|
|
|
|
|
|
|
const url = "ldap://ldap1.csclub.uwaterloo.ca";
|
|
|
|
const searchDN = "ou=People,dc=csclub,dc=uwaterloo,dc=ca";
|
|
|
|
const client = new Client({ url });
|
|
|
|
|
2022-02-16 10:31:14 -05:00
|
|
|
let execMembers: ExecMembers[] = [];
|
2022-02-13 10:48:30 -05:00
|
|
|
let formattedExec: string[];
|
2022-02-09 08:22:38 -05:00
|
|
|
|
2022-02-02 02:32:53 -05:00
|
|
|
try {
|
|
|
|
await client.bind("", "");
|
|
|
|
const { searchEntries } = await client.search(searchDN, {
|
|
|
|
scope: "sub",
|
|
|
|
filter: `(&(objectClass=member)(term=${(term as string).slice(
|
|
|
|
0,
|
|
|
|
1
|
2022-02-16 07:29:32 -05:00
|
|
|
)}${year}))`,
|
2022-02-02 02:32:53 -05:00
|
|
|
});
|
|
|
|
|
2022-02-02 04:06:13 -05:00
|
|
|
execMembers = searchEntries
|
|
|
|
.map((item) => {
|
|
|
|
return {
|
|
|
|
name: item.cn as string,
|
2022-02-16 07:29:32 -05:00
|
|
|
position:
|
2022-02-16 10:31:14 -05:00
|
|
|
item.position === undefined ? "" : (item.position[0] as string),
|
2022-02-02 04:06:13 -05:00
|
|
|
};
|
|
|
|
})
|
2022-02-16 10:31:14 -05:00
|
|
|
.filter((item: ExecMembers) => item.position !== "");
|
2022-02-16 08:45:37 -05:00
|
|
|
|
2022-02-16 10:31:14 -05:00
|
|
|
execMembers = execMembers.sort((item1: ExecMembers, item2: ExecMembers) => {
|
2022-02-16 08:45:37 -05:00
|
|
|
return execPositions[item1.position] - execPositions[item2.position];
|
|
|
|
});
|
2022-02-13 10:48:30 -05:00
|
|
|
|
|
|
|
formattedExec = execMembers.map(
|
2022-02-02 04:06:13 -05:00
|
|
|
(member) =>
|
2022-02-13 22:45:30 -05:00
|
|
|
`0${execPositions[member.position]}-${member.name
|
2022-02-13 11:32:05 -05:00
|
|
|
.split(" ")[0]
|
|
|
|
.toLowerCase()}-${member.name.split(" ")[1].toLowerCase()}`
|
2022-02-02 04:06:13 -05:00
|
|
|
);
|
2022-02-13 20:33:00 -05:00
|
|
|
|
2022-02-13 21:09:12 -05:00
|
|
|
formattedExec = [...formattedExec, "06-codey"];
|
2022-02-02 02:32:53 -05:00
|
|
|
} finally {
|
|
|
|
await client.unbind();
|
|
|
|
}
|
|
|
|
|
2022-02-02 04:06:13 -05:00
|
|
|
return formattedExec;
|
2021-08-23 11:11:42 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
export async function getExec(fileName: string, convert = true) {
|
2022-02-13 22:45:30 -05:00
|
|
|
let content, metadata;
|
|
|
|
|
|
|
|
try {
|
|
|
|
const raw = await readFile(path.join(EXECS_PATH, `${fileName}${fileType}`));
|
|
|
|
({ content, data: metadata } = matter(raw));
|
|
|
|
|
|
|
|
const image =
|
|
|
|
(metadata.image as string | undefined) ??
|
|
|
|
(await getMemberImagePath(metadata.name));
|
|
|
|
|
|
|
|
return {
|
|
|
|
content: convert ? await serialize(content) : content,
|
|
|
|
metadata: { ...metadata, image } as Metadata,
|
|
|
|
};
|
|
|
|
} catch (err) {
|
|
|
|
const firstName =
|
|
|
|
fileName.split("-")[1][0].toUpperCase() + fileName.split("-")[1].slice(1);
|
|
|
|
const lastName =
|
|
|
|
fileName.split("-")[2][0].toUpperCase() + fileName.split("-")[2].slice(1);
|
|
|
|
|
|
|
|
const posOrder = fileName.split("-")[0][1];
|
|
|
|
const posName = positionNames[Number(posOrder) - 1];
|
|
|
|
({ content, metadata } = {
|
|
|
|
content: "Coming soon!",
|
|
|
|
metadata: {
|
|
|
|
name: `${firstName} ${lastName}`,
|
2022-02-16 08:45:37 -05:00
|
|
|
role: `${posName} ${Number(posOrder) - 1}`,
|
2022-02-13 22:45:30 -05:00
|
|
|
},
|
|
|
|
});
|
|
|
|
|
|
|
|
const image = await getMemberImagePath(metadata.name);
|
|
|
|
|
|
|
|
return {
|
|
|
|
content: convert ? await serialize(content) : content,
|
|
|
|
metadata: { ...metadata, image } as Metadata,
|
|
|
|
};
|
|
|
|
}
|
2021-08-23 11:11:42 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
async function getImage(imgPath: string) {
|
|
|
|
try {
|
|
|
|
await access(path.join("public", imgPath));
|
|
|
|
return imgPath;
|
|
|
|
} catch {
|
|
|
|
return undefined;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
export async function getMemberImagePath(name: string) {
|
|
|
|
const imgPath = path.join("images", "team", name.replace(" ", ""));
|
|
|
|
const placeholder = path.join(
|
|
|
|
"images",
|
|
|
|
"team",
|
|
|
|
"team-member-placeholder.svg"
|
|
|
|
);
|
|
|
|
const img =
|
|
|
|
(await getImage(imgPath + ".jpg")) ??
|
|
|
|
(await getImage(imgPath + ".png")) ??
|
|
|
|
(await getImage(imgPath + ".gif")) ??
|
2021-10-31 16:58:14 -04:00
|
|
|
(await getImage(imgPath + ".jpeg")) ??
|
2021-08-23 11:11:42 -04:00
|
|
|
placeholder;
|
|
|
|
return img;
|
|
|
|
}
|