@@ -234,6 +234,7 @@ PreferenceSchema.pre(
234
234
const processObjectId = ( id ) => {
235
235
if ( ! id ) return null ;
236
236
if ( id instanceof mongoose . Types . ObjectId ) return id ;
237
+ if ( typeof id === "string" && id . trim ( ) === "" ) return null ;
237
238
try {
238
239
return mongoose . Types . ObjectId ( id ) ;
239
240
} catch ( error ) {
@@ -242,37 +243,43 @@ PreferenceSchema.pre(
242
243
}
243
244
} ;
244
245
245
- // Comprehensive ID fields processing
246
- const idFieldsToProcess = [
246
+ // Define field categories
247
+ const singleIdFields = [
248
+ "user_id" ,
249
+ "group_id" ,
247
250
"airqloud_id" ,
248
- "airqloud_ids" ,
249
251
"grid_id" ,
250
- "grid_ids" ,
251
252
"cohort_id" ,
252
- "cohort_ids" ,
253
253
"network_id" ,
254
+ ] ;
255
+ const arrayIdFields = [
256
+ "airqloud_ids" ,
257
+ "grid_ids" ,
258
+ "cohort_ids" ,
254
259
"network_ids" ,
255
- "group_id" ,
256
- "group_ids" ,
257
260
"site_ids" ,
258
261
"device_ids" ,
262
+ "group_ids" ,
263
+ ] ;
264
+ const selectedArrayFields = [
265
+ "selected_sites" ,
266
+ "selected_grids" ,
267
+ "selected_devices" ,
268
+ "selected_cohorts" ,
269
+ "selected_airqlouds" ,
259
270
] ;
260
271
261
- idFieldsToProcess . forEach ( ( field ) => {
272
+ // Process single ID fields
273
+ singleIdFields . forEach ( ( field ) => {
262
274
if ( updateData [ field ] ) {
263
- if ( Array . isArray ( updateData [ field ] ) ) {
264
- updateData [ field ] = updateData [ field ] . map ( processObjectId ) ;
265
- } else {
266
- updateData [ field ] = processObjectId ( updateData [ field ] ) ;
267
- }
275
+ updateData [ field ] = processObjectId ( updateData [ field ] ) ;
268
276
}
269
277
} ) ;
270
278
271
279
// Validate user_id
272
280
if ( ! updateData . user_id ) {
273
281
return next ( new Error ( "user_id is required" ) ) ;
274
282
}
275
- updateData . user_id = processObjectId ( updateData . user_id ) ;
276
283
277
284
// Set default values if not provided
278
285
const defaultFields = [
@@ -393,29 +400,33 @@ PreferenceSchema.pre(
393
400
} ;
394
401
395
402
// Process selected arrays
396
- Object . keys ( selectedArrayProcessors ) . forEach ( ( field ) => {
403
+ selectedArrayFields . forEach ( ( field ) => {
397
404
if ( updateData [ field ] ) {
398
405
updateData [ field ] = updateData [ field ] . map (
399
406
selectedArrayProcessors [ field ]
400
407
) ;
408
+
409
+ // Use $addToSet for selected arrays
410
+ updateData . $addToSet = {
411
+ ...updateData . $addToSet ,
412
+ [ field ] : {
413
+ $each : updateData [ field ] ,
414
+ } ,
415
+ } ;
416
+ delete updateData [ field ] ;
401
417
}
402
418
} ) ;
403
419
404
- // Prepare $addToSet for array fields to prevent duplicates
405
- const arrayFieldsToAddToSet = [
406
- ...idFieldsToProcess ,
407
- "selected_sites" ,
408
- "selected_grids" ,
409
- "selected_devices" ,
410
- "selected_cohorts" ,
411
- "selected_airqlouds" ,
412
- ] ;
413
-
414
- arrayFieldsToAddToSet . forEach ( ( field ) => {
420
+ // Process array ID fields
421
+ arrayIdFields . forEach ( ( field ) => {
415
422
if ( updateData [ field ] ) {
416
- updateData . $addToSet = updateData . $addToSet || { } ;
417
- updateData . $addToSet [ field ] = {
418
- $each : updateData [ field ] ,
423
+ updateData . $addToSet = {
424
+ ...updateData . $addToSet ,
425
+ [ field ] : {
426
+ $each : Array . isArray ( updateData [ field ] )
427
+ ? updateData [ field ] . map ( processObjectId )
428
+ : [ processObjectId ( updateData [ field ] ) ] ,
429
+ } ,
419
430
} ;
420
431
delete updateData [ field ] ;
421
432
}
0 commit comments