mirror of
				https://github.com/advplyr/audiobookshelf.git
				synced 2025-10-27 11:18:14 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			142 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			142 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| const { Request, Response, NextFunction } = require('express')
 | |
| const Logger = require('../Logger')
 | |
| const SocketAuthority = require('../SocketAuthority')
 | |
| const Database = require('../Database')
 | |
| 
 | |
| /**
 | |
|  * @typedef RequestUserObject
 | |
|  * @property {import('../models/User')} user
 | |
|  *
 | |
|  * @typedef {Request & RequestUserObject} RequestWithUser
 | |
|  */
 | |
| 
 | |
| class EmailController {
 | |
|   constructor() {}
 | |
| 
 | |
|   /**
 | |
|    * GET: /api/emails/settings
 | |
|    *
 | |
|    * @param {RequestWithUser} req
 | |
|    * @param {Response} res
 | |
|    */
 | |
|   getSettings(req, res) {
 | |
|     res.json({
 | |
|       settings: Database.emailSettings
 | |
|     })
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * PATCH: /api/emails/settings
 | |
|    *
 | |
|    * @param {RequestWithUser} req
 | |
|    * @param {Response} res
 | |
|    */
 | |
|   async updateSettings(req, res) {
 | |
|     const updated = Database.emailSettings.update(req.body)
 | |
|     if (updated) {
 | |
|       await Database.updateSetting(Database.emailSettings)
 | |
|     }
 | |
|     res.json({
 | |
|       settings: Database.emailSettings
 | |
|     })
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * POST: /api/emails/test
 | |
|    *
 | |
|    * @this {import('../routers/ApiRouter')}
 | |
|    *
 | |
|    * @param {RequestWithUser} req
 | |
|    * @param {Response} res
 | |
|    */
 | |
|   async sendTest(req, res) {
 | |
|     this.emailManager.sendTest(res)
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * POST: /api/emails/ereader-devices
 | |
|    *
 | |
|    * @param {RequestWithUser} req
 | |
|    * @param {Response} res
 | |
|    */
 | |
|   async updateEReaderDevices(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.update({
 | |
|       ereaderDevices
 | |
|     })
 | |
|     if (updated) {
 | |
|       await Database.updateSetting(Database.emailSettings)
 | |
|       SocketAuthority.adminEmitter('ereader-devices-updated', {
 | |
|         ereaderDevices: Database.emailSettings.ereaderDevices
 | |
|       })
 | |
|     }
 | |
|     res.json({
 | |
|       ereaderDevices: Database.emailSettings.ereaderDevices
 | |
|     })
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * POST: /api/emails/send-ebook-to-device
 | |
|    * Send ebook to device
 | |
|    * User must have access to device and library item
 | |
|    *
 | |
|    * @param {RequestWithUser} req
 | |
|    * @param {Response} res
 | |
|    */
 | |
|   async sendEBookToDevice(req, res) {
 | |
|     Logger.debug(`[EmailController] Send ebook to device requested by user "${req.user.username}" for libraryItemId=${req.body.libraryItemId}, deviceName=${req.body.deviceName}`)
 | |
| 
 | |
|     const device = Database.emailSettings.getEReaderDevice(req.body.deviceName)
 | |
|     if (!device) {
 | |
|       return res.status(404).send('Ereader device not found')
 | |
|     }
 | |
| 
 | |
|     // Check user has access to device
 | |
|     if (!Database.emailSettings.checkUserCanAccessDevice(device, req.user)) {
 | |
|       return res.sendStatus(403)
 | |
|     }
 | |
| 
 | |
|     const libraryItem = await Database.libraryItemModel.getExpandedById(req.body.libraryItemId)
 | |
|     if (!libraryItem) {
 | |
|       return res.status(404).send('Library item not found')
 | |
|     }
 | |
| 
 | |
|     // Check user has access to library item
 | |
|     if (!req.user.checkCanAccessLibraryItem(libraryItem)) {
 | |
|       return res.sendStatus(403)
 | |
|     }
 | |
| 
 | |
|     const ebookFile = libraryItem.media.ebookFile
 | |
|     if (!ebookFile) {
 | |
|       return res.status(404).send('Ebook file not found')
 | |
|     }
 | |
| 
 | |
|     this.emailManager.sendEBookToDevice(ebookFile, device, res)
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    *
 | |
|    * @param {RequestWithUser} req
 | |
|    * @param {Response} res
 | |
|    * @param {NextFunction} next
 | |
|    */
 | |
|   adminMiddleware(req, res, next) {
 | |
|     if (!req.user.isAdminOrUp) {
 | |
|       return res.sendStatus(404)
 | |
|     }
 | |
| 
 | |
|     next()
 | |
|   }
 | |
| }
 | |
| module.exports = new EmailController()
 |