diff --git a/server/controllers/MeController.js b/server/controllers/MeController.js index c7abbc232..b22ab9e65 100644 --- a/server/controllers/MeController.js +++ b/server/controllers/MeController.js @@ -394,6 +394,36 @@ class MeController { res.json(req.user.toOldJSONForBrowser()) } + /** + * POST: /api/me/ereader-devices + * + * @param {RequestWithUser} req + * @param {Response} res + */ + async updateUserEReaderDevices(req, res) { + if (!req.body.ereaderDevices || !Array.isArray(req.body.ereaderDevices)) { + return res.status(400).send('Invalid payload. ereaderDevices array required') + } + + const ereaderDevices = req.body.ereaderDevices + for (const device of ereaderDevices) { + 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) + if (updated) { + await Database.updateSetting(Database.emailSettings) + SocketAuthority.clientEmitter('ereader-devices-updated', { + ereaderDevices: Database.emailSettings.ereaderDevices + }) + } + res.json({ + ereaderDevices: Database.emailSettings.getEReaderDevices(req.user) + }) + } + /** * GET: /api/me/stats/year/:year * diff --git a/server/objects/settings/EmailSettings.js b/server/objects/settings/EmailSettings.js index db3ad7547..dbd01ba0a 100644 --- a/server/objects/settings/EmailSettings.js +++ b/server/objects/settings/EmailSettings.js @@ -174,5 +174,20 @@ 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 diff --git a/server/routers/ApiRouter.js b/server/routers/ApiRouter.js index 57067ad8b..f81bc26df 100644 --- a/server/routers/ApiRouter.js +++ b/server/routers/ApiRouter.js @@ -190,6 +190,7 @@ class ApiRouter { this.router.get('/me/series/:id/remove-from-continue-listening', MeController.removeSeriesFromContinueListening.bind(this)) this.router.get('/me/series/:id/readd-to-continue-listening', MeController.readdSeriesFromContinueListening.bind(this)) this.router.get('/me/stats/year/:year', MeController.getStatsForYear.bind(this)) + this.router.post('/me/ereader-devices', MeController.updateUserEReaderDevices.bind(this)) // // Backup Routes