Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 34 additions & 12 deletions lib/db/models/all/model.js
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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
}
Expand Down