From 1952d29aca2c31a4c880505ff37dd3d04a45dce3 Mon Sep 17 00:00:00 2001 From: Daniil <8039921+DaniilSmirnov@users.noreply.github.com> Date: Fri, 25 Sep 2026 11:35:37 +0200 Subject: [PATCH] Fix current group update on origin assignment --- lib/db/models/all/model.js | 46 ++++++++++++++++++++++++++++---------- 1 file changed, 34 insertions(+), 12 deletions(-) diff --git a/lib/db/models/all/model.js b/lib/db/models/all/model.js index 4c083681c1..1a0b7b39dd 100644 --- a/lib/db/models/all/model.js +++ b/lib/db/models/all/model.js @@ -1422,20 +1422,43 @@ export const updateDevicesCurrentGroup = async(serials, group) => { } export const updateDevicesOriginGroup = async(serial, group) => { - const update = { - $set: { + const updateDevice = async(deviceSerial) => { + const device = await db.devices.findOne({serial: deviceSerial}) + if (!device) { + return false + } + + const previousOrigin = device.group?.origin + const isInOriginGroup = device.group?.id === previousOrigin + const set = { 'group.origin': group.id, 'group.originName': group.name } - } - const stats = await ( - Array.isArray(serial) ? - db.devices.updateMany({serial: {$in: serial}}, update) : - db.devices.updateOne({serial}, update) - ) + // Keep a free device visible in its newly assigned origin group. A device + // in a transient booking must remain in that booking until it is released. + if (isInOriginGroup) { + Object.assign(set, { + 'group.id': group.id, + 'group.name': group.name, + 'group.owner': group.owner, + 'group.lifeTime': group.dates[0], + 'group.class': group.class, + 'group.repetitions': group.repetitions, + 'group.runUrl': group.runUrl + }) + } + + const stats = await db.devices.updateOne( + {serial: deviceSerial, 'group.origin': previousOrigin, 'group.id': device.group?.id}, + {$set: set} + ) + + return stats.modifiedCount || stats.matchedCount + } - if (stats.modifiedCount || stats.matchedCount) { + const results = await Promise.all((Array.isArray(serial) ? serial : [serial]).map(updateDevice)) + if (results.some(Boolean)) { log.info( '[updateDevicesOriginGroup] Successfully updated origin group in device [serial: "%s", group: "%s", name: "%s"]', serial, @@ -1446,11 +1469,10 @@ export const updateDevicesOriginGroup = async(serial, group) => { } log.error( - '[updateDevicesOriginGroup] Device not found [serial: "%s", group: "%s", name: "%s", stats: %s]', + '[updateDevicesOriginGroup] Device(s) not found [serial: "%s", group: "%s", name: "%s"]', serial, group.id, - group.name, - JSON.stringify(stats, null, 2) + group.name ) return false }