@@ -10,15 +10,16 @@ const typeMapping = {
1010} ;
1111
1212// Recursive field definition builder
13- function buildFieldDef ( field , projectId , isExternal ) {
13+ // Recursive field definition builder
14+ function buildFieldDef ( field , projectId , isExternal , isUsersCollection = false ) {
1415 // Object type — nested sub-schema
1516 if ( field . type === "Object" && field . fields && field . fields . length > 0 ) {
1617 const subSchema = { } ;
1718 field . fields . forEach ( ( f ) => {
1819 const normalizedKey = normalizeKey ( f . key ) ;
1920 if ( ! normalizedKey ) return ;
2021
21- subSchema [ normalizedKey ] = buildFieldDef ( f , projectId , isExternal ) ;
22+ subSchema [ normalizedKey ] = buildFieldDef ( f , projectId , isExternal , isUsersCollection ) ;
2223 } ) ;
2324 return { type : subSchema , required : ! ! field . required } ;
2425 }
@@ -42,7 +43,7 @@ function buildFieldDef(field, projectId, isExternal) {
4243 const normalizedKey = normalizeKey ( f . key ) ;
4344 if ( ! normalizedKey ) return ;
4445
45- subSchema [ normalizedKey ] = buildFieldDef ( f , projectId , isExternal ) ;
46+ subSchema [ normalizedKey ] = buildFieldDef ( f , projectId , isExternal , isUsersCollection ) ;
4647 } ) ;
4748 return { type : [ subSchema ] , required : ! ! field . required } ;
4849 }
@@ -71,25 +72,32 @@ function buildFieldDef(field, projectId, isExternal) {
7172 }
7273
7374 // Primitive types
74- return {
75+ const def = {
7576 type : typeMapping [ field . type ] ,
7677 required : ! ! field . required ,
7778 } ;
79+
80+ // HARDEN: Exclude password by default for project users
81+ if ( isUsersCollection && normalizeKey ( field . key ) === "password" ) {
82+ def . select = false ;
83+ }
84+
85+ return def ;
7886}
7987function normalizeKey ( key ) {
8088 return String ( key || "" )
8189 . replace ( / \uFEFF / g, "" )
8290 . trim ( ) ;
8391}
8492
85- function buildMongooseSchema ( fieldsArray = [ ] , projectId , isExternal ) {
93+ function buildMongooseSchema ( fieldsArray = [ ] , projectId , isExternal , isUsersCollection = false ) {
8694 const schemaDef = { } ;
8795
8896 fieldsArray . forEach ( ( field ) => {
8997 const normalizedKey = normalizeKey ( field . key ) ;
9098 if ( ! normalizedKey ) return ;
9199
92- schemaDef [ normalizedKey ] = buildFieldDef ( field , projectId , isExternal ) ;
100+ schemaDef [ normalizedKey ] = buildFieldDef ( field , projectId , isExternal , isUsersCollection ) ;
93101 } ) ;
94102
95103 return new mongoose . Schema ( schemaDef , {
@@ -126,7 +134,8 @@ function getCompiledModel(connection, collectionData, projectId, isExternal) {
126134 }
127135
128136 // Build schema + compile
129- const schema = buildMongooseSchema ( collectionData . model , projectId , isExternal ) ;
137+ const isUsersCollection = collectionData . name === "users" ;
138+ const schema = buildMongooseSchema ( collectionData . model , projectId , isExternal , isUsersCollection ) ;
130139 const model = connection . model ( collectionName , schema ) ;
131140
132141 // Cache it
@@ -135,6 +144,7 @@ function getCompiledModel(connection, collectionData, projectId, isExternal) {
135144 return model ;
136145}
137146
147+
138148// Clear cached model (needed when schema changes)
139149function clearCompiledModel ( connection , collectionName ) {
140150 if ( modelRegistry . has ( connection ) ) {
0 commit comments