www-new/lib/team.ts

146 lines
3.7 KiB
TypeScript
Raw Normal View History

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";
import { serialize } from "next-mdx-remote/serialize";
2022-02-02 02:32:53 -05:00
import { getCurrentTerm } from "@/lib/events";
const EXECS_PATH = path.join("content", "team", "execs");
const fileType = ".md";
2022-02-02 02:32:53 -05:00
const { year, term } = getCurrentTerm();
2022-02-02 04:06:13 -05:00
export interface execMembers {
name: string;
order: string;
}
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-09 08:22:38 -05:00
let execMembers: execMembers[] = [];
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
)}${year})(exec=True))`,
});
2022-02-02 04:06:13 -05:00
execMembers = searchEntries
.map((item) => {
return {
name: item.cn as string,
order: item.order as string,
};
})
.sort((item1: execMembers, item2: execMembers) =>
item1.order.localeCompare(item2.order)
);
2022-02-09 12:35:23 -05:00
const formattedExec: string[] = execMembers.map(
2022-02-02 04:06:13 -05:00
(member) =>
`0${member.order}-
${member.name.split(" ")[1].toLowerCase()}-
${member.name.split(" ")[0].toLowerCase()}`
);
2022-02-02 02:32:53 -05:00
} finally {
await client.unbind();
}
2022-02-02 04:06:13 -05:00
return formattedExec;
}
export async function getExec(fileName: string, convert = true) {
2022-02-09 12:22:09 -05:00
// const posDict: { [name: string]: string } = {
// "01": "President",
// "02": "Vice President",
// "03": "Assistant Vice President",
// "04": "Treasurer",
// "05": "Systems Administrator",
// };
2022-02-09 08:22:38 -05:00
2022-02-09 12:22:09 -05:00
// 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];
// const pos = posDict[posOrder];
2022-02-09 08:22:38 -05:00
2022-02-09 12:22:09 -05:00
// let content, metadata;
2022-02-09 08:22:38 -05:00
2022-02-09 12:01:39 -05:00
// try {
2022-02-09 12:22:09 -05:00
const raw = await readFile(path.join(EXECS_PATH, `${fileName}${fileType}`));
const { content, data: metadata } = matter(raw);
2022-02-09 08:22:38 -05:00
2022-02-09 12:22:09 -05:00
const image =
(metadata.image as string | undefined) ??
(await getMemberImagePath(metadata.name));
2022-02-09 08:22:38 -05:00
2022-02-09 12:22:09 -05:00
return {
content: convert ? await serialize(content) : content,
metadata: { ...metadata, image } as Metadata,
};
2022-02-09 12:01:39 -05:00
// };
// } catch (err) {
// console.log(err);
// ({ content, metadata } = {
// content: "Coming soon!",
// metadata: {
// name: `${firstName} ${lastName}`,
// role: `${pos}`,
// },
// });
// const image = await getMemberImagePath(metadata.name);
// return {
// content: convert ? await serialize(content) : content,
// metadata: { ...metadata, image } as Metadata,
// };
// }
}
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")) ??
(await getImage(imgPath + ".jpeg")) ??
placeholder;
return img;
}