92 lines
2.3 KiB
JavaScript
92 lines
2.3 KiB
JavaScript
import Member from "../../models/member.js";
|
|
import Tag from "../../models/tag.js";
|
|
import { requireAuth } from "../../utils/auth.js";
|
|
|
|
export default defineEventHandler(async (event) => {
|
|
await requireAuth(event);
|
|
|
|
const query = getQuery(event);
|
|
const search = query.search || "";
|
|
const circle = query.circle || "";
|
|
const craftTag = query.craftTag || "";
|
|
|
|
const dbQuery = {
|
|
showInDirectory: true,
|
|
status: "active",
|
|
};
|
|
|
|
if (circle) {
|
|
dbQuery.circle = circle;
|
|
}
|
|
|
|
const andConditions = [];
|
|
|
|
if (search) {
|
|
const escaped = escapeRegex(search);
|
|
andConditions.push({
|
|
$or: [
|
|
{ name: { $regex: escaped, $options: "i" } },
|
|
{ bio: { $regex: escaped, $options: "i" } },
|
|
],
|
|
});
|
|
}
|
|
|
|
if (craftTag) {
|
|
dbQuery.craftTags = craftTag;
|
|
}
|
|
|
|
if (andConditions.length > 0) {
|
|
dbQuery.$and = andConditions;
|
|
}
|
|
|
|
try {
|
|
const members = await Member.find(dbQuery)
|
|
.select(
|
|
"name pronouns timeZone avatar studio bio location socialLinks circle craftTags board createdAt",
|
|
)
|
|
.sort({ createdAt: -1 })
|
|
.lean();
|
|
|
|
const filteredMembers = members.map((member) => ({
|
|
_id: member._id,
|
|
name: member.name,
|
|
circle: member.circle,
|
|
createdAt: member.createdAt,
|
|
avatar: member.avatar,
|
|
pronouns: member.pronouns,
|
|
timeZone: member.timeZone,
|
|
studio: member.studio,
|
|
bio: member.bio,
|
|
location: member.location,
|
|
socialLinks: member.socialLinks,
|
|
craftTags: member.craftTags,
|
|
board: {
|
|
slackHandle: member.board?.slackHandle,
|
|
},
|
|
}));
|
|
|
|
const [craftTags, cooperativeTags] = await Promise.all([
|
|
Tag.find({ pool: "craft", active: true }).sort({ label: 1 }).lean(),
|
|
Tag.find({ pool: "cooperative", active: true }).sort({ label: 1 }).lean(),
|
|
]);
|
|
|
|
return {
|
|
members: filteredMembers,
|
|
totalCount: filteredMembers.length,
|
|
filters: {
|
|
craftTags: craftTags.map((t) => ({ slug: t.slug, label: t.label })),
|
|
cooperativeTags: cooperativeTags.map((t) => ({
|
|
slug: t.slug,
|
|
label: t.label,
|
|
})),
|
|
},
|
|
};
|
|
} catch (error) {
|
|
if (error.statusCode) throw error;
|
|
console.error("Directory fetch error:", error);
|
|
throw createError({
|
|
statusCode: 500,
|
|
message: "Failed to fetch member directory",
|
|
});
|
|
}
|
|
});
|