diff --git a/server/controllers/MeController.js b/server/controllers/MeController.js index b22ab9e65..507edcf4b 100644 --- a/server/controllers/MeController.js +++ b/server/controllers/MeController.js @@ -405,14 +405,33 @@ class MeController { return res.status(400).send('Invalid payload. ereaderDevices array required') } - const ereaderDevices = req.body.ereaderDevices - for (const device of ereaderDevices) { + const userEReaderDevices = req.body.ereaderDevices + for (const device of userEReaderDevices) { if (!device.name || !device.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) { await Database.updateSetting(Database.emailSettings) SocketAuthority.clientEmitter('ereader-devices-updated', { diff --git a/server/objects/settings/EmailSettings.js b/server/objects/settings/EmailSettings.js index dbd01ba0a..db3ad7547 100644 --- a/server/objects/settings/EmailSettings.js +++ b/server/objects/settings/EmailSettings.js @@ -174,20 +174,5 @@ class EmailSettings { getEReaderDevice(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