Skip to content

Commit 00f525c

Browse files
fix: use lean() and guard internal keys in community skill filter
1 parent a318f6a commit 00f525c

2 files changed

Lines changed: 26 additions & 28 deletions

File tree

package-lock.json

Lines changed: 0 additions & 10 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/controllers/communityController.js

Lines changed: 26 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -9,22 +9,31 @@ const communityMemberController = function () {
99
if (search) {
1010
query['userInfo.name'] = { $regex: search, $options: 'i' };
1111
}
12-
const formResponses = await FormResponse.find(query).sort({
13-
'userInfo.name': sortOrder === 'asc' ? 1 : -1,
14-
});
12+
13+
// Use .lean() to get plain JS objects so Object.entries() works correctly on subdocuments
14+
const formResponses = await FormResponse.find(query)
15+
.lean()
16+
.sort({ 'userInfo.name': sortOrder === 'asc' ? 1 : -1 });
1517

1618
const skillFilters = skills ? skills.split(',').map((s) => s.trim().toLowerCase()) : [];
17-
const structuredMembers = formResponses.map((member) => {
18-
const { userInfo, frontend, backend, general } = member;
1919

20-
const extractSkills = (section) =>
21-
Object.entries(section || {}).reduce((acc, [key, val]) => {
22-
const num = parseFloat(val);
23-
if (key.toLowerCase() !== 'overall' && !Number.isNaN(num)) {
24-
acc[key] = num;
25-
}
20+
// Extract skill keys that have a numeric rating value, excluding 'overall' and internal fields
21+
const extractSkills = (section) => {
22+
if (!section || typeof section !== 'object') return {};
23+
return Object.entries(section).reduce((acc, [key, val]) => {
24+
if (key.toLowerCase() === 'overall' || key.startsWith('$') || key.startsWith('_')) {
2625
return acc;
27-
}, {});
26+
}
27+
const num = parseFloat(val);
28+
if (!Number.isNaN(num)) {
29+
acc[key] = num;
30+
}
31+
return acc;
32+
}, {});
33+
};
34+
35+
const structuredMembers = formResponses.map((member) => {
36+
const { userInfo, frontend, backend, general } = member;
2837

2938
return {
3039
_id: member._id,
@@ -42,12 +51,11 @@ const communityMemberController = function () {
4251
const filteredMembers =
4352
skillFilters.length > 0
4453
? structuredMembers.filter((member) => {
45-
const allSkills = {
46-
...member.skills.frontend,
47-
...member.skills.backend,
48-
};
49-
const lowercased = Object.keys(allSkills).map((s) => s.toLowerCase());
50-
return skillFilters.every((filterSkill) => lowercased.includes(filterSkill));
54+
const allSkillKeys = [
55+
...Object.keys(member.skills.frontend),
56+
...Object.keys(member.skills.backend),
57+
].map((s) => s.toLowerCase());
58+
return skillFilters.every((filterSkill) => allSkillKeys.includes(filterSkill));
5159
})
5260
: structuredMembers;
5361

0 commit comments

Comments
 (0)