From 82ca27756d0e2be660f80b61dc6f002681819fa8 Mon Sep 17 00:00:00 2001 From: Tom Butcher Date: Mon, 20 Jul 2026 02:28:13 +0100 Subject: [PATCH] Refactored editObject function to flatten object ID references before updating the database, ensuring proper data structure. Added corresponding test case to verify the flattening functionality in update operations. --- src/database/__tests__/database.test.js | 30 ++++++++++++++++++++++ src/database/database.js | 3 ++- src/services/misc/__tests__/slicer.test.js | 2 +- 3 files changed, 33 insertions(+), 2 deletions(-) diff --git a/src/database/__tests__/database.test.js b/src/database/__tests__/database.test.js index 1be6ba2..9ccc2b7 100644 --- a/src/database/__tests__/database.test.js +++ b/src/database/__tests__/database.test.js @@ -14,6 +14,23 @@ jest.unstable_mockModule('../../utils.js', () => ({ editAuditLog: jest.fn(), editNotification: jest.fn(), expandObjectIds: jest.fn((obj) => obj), + flatternObjectIds: jest.fn((object) => { + if (!object || typeof object !== 'object') { + return object; + } + + const result = {}; + + for (const [key, value] of Object.entries(object)) { + if (value && typeof value === 'object' && value._id) { + result[key] = value._id; + } else { + result[key] = value; + } + } + + return result; + }), getFieldsByRef: jest.fn(() => []), getQueryToCacheKey: jest.fn(({ model, id }) => `${model}:${id}`), modelHasRef: jest.fn(() => false), @@ -147,6 +164,19 @@ describe('Database Utilities (CRUD)', () => { expect(mockModel.findByIdAndUpdate).toHaveBeenCalledWith(id, updateData); expect(result).toEqual({ ...previousData, ...updateData }); }); + + it('should flatten object id references before updating', async () => { + const id = '123'; + const fileId = '507f1f77bcf86cd799439012'; + const updateData = { file: { _id: fileId, name: 'part.gcode' } }; + const previousData = { _id: id, name: 'Old' }; + + mockModel.lean.mockResolvedValue(previousData); + + await editObject({ model: mockModel, id, updateData }); + + expect(mockModel.findByIdAndUpdate).toHaveBeenCalledWith(id, { file: fileId }); + }); }); describe('deleteObject', () => { diff --git a/src/database/database.js b/src/database/database.js index 3634450..8792e9b 100644 --- a/src/database/database.js +++ b/src/database/database.js @@ -19,6 +19,7 @@ import { distributeStats, editNotification, deleteNotification, + flatternObjectIds, } from '../utils.js'; import { getAllModels } from '../services/misc/model.js'; import { redisServer } from './redis.js'; @@ -785,7 +786,7 @@ export const editObject = async ({ model, id, updateData, user, populate, recalc // Determine parentType from model name const parentType = model.modelName ? model.modelName : 'unknown'; // Fetch the and update object - var query = model.findByIdAndUpdate(id, updateData).lean(); + var query = model.findByIdAndUpdate(id, flatternObjectIds(updateData)).lean(); if (populate) { if (Array.isArray(populate)) { diff --git a/src/services/misc/__tests__/slicer.test.js b/src/services/misc/__tests__/slicer.test.js index e9be769..6722ca2 100644 --- a/src/services/misc/__tests__/slicer.test.js +++ b/src/services/misc/__tests__/slicer.test.js @@ -122,7 +122,7 @@ describe('slicer upload', () => { updateData: { pendingSlicerUploads: [ expect.objectContaining({ - file: storedFileId, + file: { _id: storedFileId }, shouldPrint: false, }), ],