handle name duplicates and remove helper func

This commit is contained in:
Austin Spencer 2024-10-17 08:08:00 -04:00
parent 9ccdf305fe
commit b9772a024c
No known key found for this signature in database
2 changed files with 22 additions and 18 deletions

View File

@ -405,14 +405,33 @@ class MeController {
return res.status(400).send('Invalid payload. ereaderDevices array required') return res.status(400).send('Invalid payload. ereaderDevices array required')
} }
const ereaderDevices = req.body.ereaderDevices const userEReaderDevices = req.body.ereaderDevices
for (const device of ereaderDevices) { for (const device of userEReaderDevices) {
if (!device.name || !device.email) { if (!device.name || !device.email) {
return res.status(400).send('Invalid payload. ereaderDevices array items must have name and email') return res.status(400).send('Invalid payload. ereaderDevices array items must have name and email')
} }
} }
const updated = Database.emailSettings.updateUserEReaderDevices(req.user, ereaderDevices) const otherDevices = Database.emailSettings.ereaderDevices.filter((device) => {
return !Database.emailSettings.checkUserCanAccessDevice(device, req.user)
})
const ereaderDevices = otherDevices.concat(userEReaderDevices)
// Check for duplicate names
const nameSet = new Set()
const hasDupes = ereaderDevices.some((device) => {
if (nameSet.has(device.name)) {
return true // Duplicate found
}
nameSet.add(device.name)
return false
})
if (hasDupes) {
return res.status(400).send('Invalid payload. Duplicate "name" field found.')
}
const updated = Database.emailSettings.update({ ereaderDevices })
if (updated) { if (updated) {
await Database.updateSetting(Database.emailSettings) await Database.updateSetting(Database.emailSettings)
SocketAuthority.clientEmitter('ereader-devices-updated', { SocketAuthority.clientEmitter('ereader-devices-updated', {

View File

@ -174,20 +174,5 @@ class EmailSettings {
getEReaderDevice(deviceName) { getEReaderDevice(deviceName) {
return this.ereaderDevices.find((d) => d.name === deviceName) return this.ereaderDevices.find((d) => d.name === deviceName)
} }
/**
* Update the ereader devices that belong to a specific user
*
* @param {import('../../models/User')} user
* @param {EreaderDeviceObject[]} userEReaderDevices
* @returns {boolean}
*/
updateUserEReaderDevices(user, userEReaderDevices) {
// Filter to get all devices the user can't access separate
// then merge with the updated user devices
const otherDevices = this.ereaderDevices.filter((device) => !this.checkUserCanAccessDevice(device, user))
const ereaderDevices = otherDevices.concat(userEReaderDevices)
return this.update({ ereaderDevices })
}
} }
module.exports = EmailSettings module.exports = EmailSettings