@@ -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