diff --git a/backend/src/v5/processors/teamspaces/projects/models/commons/tickets.groups.js b/backend/src/v5/processors/teamspaces/projects/models/commons/tickets.groups.js index 90ad4f57ed3..c0e91557288 100644 --- a/backend/src/v5/processors/teamspaces/projects/models/commons/tickets.groups.js +++ b/backend/src/v5/processors/teamspaces/projects/models/commons/tickets.groups.js @@ -79,7 +79,8 @@ const getObjectArrayFromRules = async (teamspace, project, model, revId, rules, return res; }; -const convertToExternalIds = async (teamspace, project, containerEntries) => { +const convertToExternalIds = async (teamspace, project, containerEntries, returnOriginalIfNotFound = false) => { + const defaultType = Object.keys(idTypes)[0]; const convertedEntries = await Promise.all(containerEntries.map(async (entry) => { // eslint-disable-next-line no-underscore-dangle if (!entry._ids) { @@ -91,17 +92,18 @@ const convertToExternalIds = async (teamspace, project, containerEntries) => { { _id: 0, shared_id: 1, rev_id: 1 }); if (!nodes.length) { - const defaultType = Object.keys(idTypes)[0]; - return { container: entry.container, [defaultType]: [] }; + return returnOriginalIfNotFound ? entry : { container: entry.container, [defaultType]: [] }; } const res = await sharedIdsToExternalIds(teamspace, entry.container, nodes[0].rev_id, - nodes.map(({ shared_ids }) => shared_ids)); + nodes.map(({ shared_id }) => shared_id)); const convertedObject = { ...entry }; if (res) { // eslint-disable-next-line no-underscore-dangle delete convertedObject._ids; convertedObject[res.type] = res.values; + } else if (!returnOriginalIfNotFound) { + return { container: entry.container, [defaultType]: [] }; } return convertedObject; })); @@ -143,7 +145,7 @@ TicketGroups.addGroups = async (teamspace, project, model, ticket, groups) => { const convertedGroups = await Promise.all(groups.map( async (group) => { if (group.objects) { - const objects = await convertToExternalIds(teamspace, project, group.objects); + const objects = await convertToExternalIds(teamspace, project, group.objects, true); return { ...group, objects }; } @@ -161,7 +163,7 @@ TicketGroups.updateTicketGroup = async (teamspace, project, model, ticket, group const convertedData = { ...data }; if (data.objects) { - convertedData.objects = await convertToExternalIds(teamspace, project, data.objects); + convertedData.objects = await convertToExternalIds(teamspace, project, data.objects, true); } await updateGroup(teamspace, project, model, ticket, groupId, convertedData, author); diff --git a/backend/tests/v5/unit/processors/teamspaces/projects/models/commons/tickets.groups.test.js b/backend/tests/v5/unit/processors/teamspaces/projects/models/commons/tickets.groups.test.js index c743d739e4e..605d1e6761a 100644 --- a/backend/tests/v5/unit/processors/teamspaces/projects/models/commons/tickets.groups.test.js +++ b/backend/tests/v5/unit/processors/teamspaces/projects/models/commons/tickets.groups.test.js @@ -252,7 +252,7 @@ const getCommonTestCases = (isUpdate) => { nodes: [], }, { - desc: `should ${action} a group without conversion if metadata are not found`, + desc: `should ${action} a group without conversion if external ids are not found`, container, group: { objects: [{ _ids: [generateRandomString()], container }] }, nodes, @@ -262,8 +262,7 @@ const getCommonTestCases = (isUpdate) => { container, group: { objects: [{ _ids: [generateRandomString()], container }] }, nodes, - metadata: times(10, - () => ({ metadata: [{ key: idTypesToKeys[idTypes.IFC][0], value: metadataValue }] })), + convertedResults: { type: idTypes.IFC, values: [metadataValue] }, convertedGroup: { objects: [{ [idTypes.IFC]: [metadataValue], container }] }, }, { @@ -271,8 +270,7 @@ const getCommonTestCases = (isUpdate) => { container, group: { objects: [{ _ids: [generateRandomString()], container }] }, nodes, - metadata: times(10, - () => ({ metadata: [{ key: idTypesToKeys[idTypes.REVIT][0], value: metadataValue }] })), + convertedResults: { type: idTypes.REVIT, values: [metadataValue] }, convertedGroup: { objects: [{ [idTypes.REVIT]: [metadataValue], container }] }, }, ]; @@ -282,16 +280,15 @@ const testAddGroups = () => { const teamspace = generateRandomString(); const project = generateRandomString(); const ticket = generateRandomString(); - const externalIdKeys = Object.values(idTypesToKeys).flat(); - const runTest = ({ desc, container, group, nodes, metadata, convertedGroup, containsMeshIds = true }) => { + const runTest = ({ desc, container, group, nodes, convertedResults, convertedGroup, containsMeshIds = true }) => { test(desc, async () => { if (containsMeshIds) { ScenesModel.getNodesByIds.mockResolvedValueOnce(nodes); } if (nodes?.length) { - MetaModel.getMetadataByQuery.mockResolvedValueOnce(metadata); + SceneProcessor.sharedIdsToExternalIds.mockResolvedValueOnce(convertedResults); } await Groups.addGroups(teamspace, project, container, ticket, [group]); @@ -308,10 +305,9 @@ const testAddGroups = () => { } if (nodes?.length) { - expect(MetaModel.getMetadataByQuery).toHaveBeenCalledTimes(1); - expect(MetaModel.getMetadataByQuery).toHaveBeenCalledWith(teamspace, container, - { rev_id: nodes[0].rev_id, parents: { $in: nodes.map((s) => s.shared_id) }, 'metadata.key': { $in: externalIdKeys } }, - { metadata: { $elemMatch: { $or: externalIdKeys.map((n) => ({ key: n })) } } }); + expect(SceneProcessor.sharedIdsToExternalIds).toHaveBeenCalledTimes(1); + expect(SceneProcessor.sharedIdsToExternalIds).toHaveBeenCalledWith(teamspace, container, + nodes[0].rev_id, nodes.map(({ shared_id }) => shared_id)); } }); }; @@ -325,16 +321,15 @@ const testUpdateGroup = () => { const ticket = generateRandomString(); const groupId = generateRandomString(); const author = generateRandomString(); - const externalIdKeys = Object.values(idTypesToKeys).flat(); - const runTest = ({ desc, container, group, nodes, metadata, convertedGroup, containsMeshIds = true }) => { + const runTest = ({ desc, container, group, nodes, convertedResults, convertedGroup, containsMeshIds = true }) => { test(desc, async () => { if (containsMeshIds) { ScenesModel.getNodesByIds.mockResolvedValueOnce(nodes); } if (nodes?.length) { - MetaModel.getMetadataByQuery.mockResolvedValueOnce(metadata); + SceneProcessor.sharedIdsToExternalIds.mockResolvedValueOnce(convertedResults); } await Groups.updateTicketGroup(teamspace, project, container, ticket, groupId, group, author); @@ -351,10 +346,9 @@ const testUpdateGroup = () => { } if (nodes?.length) { - expect(MetaModel.getMetadataByQuery).toHaveBeenCalledTimes(1); - expect(MetaModel.getMetadataByQuery).toHaveBeenCalledWith(teamspace, container, - { rev_id: nodes[0].rev_id, parents: { $in: nodes.map((s) => s.shared_id) }, 'metadata.key': { $in: externalIdKeys } }, - { metadata: { $elemMatch: { $or: externalIdKeys.map((n) => ({ key: n })) } } }); + expect(SceneProcessor.sharedIdsToExternalIds).toHaveBeenCalledTimes(1); + expect(SceneProcessor.sharedIdsToExternalIds).toHaveBeenCalledWith(teamspace, container, + nodes[0].rev_id, nodes.map(({ shared_id }) => shared_id)); } }); };