mirror of
				https://github.com/advplyr/audiobookshelf.git
				synced 2025-11-03 19:07:00 -05:00 
			
		
		
		
	
		
			
				
	
	
		
			154 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			154 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
const { Request, Response, NextFunction } = require('express')
 | 
						|
const Database = require('../Database')
 | 
						|
const { version } = require('../../package.json')
 | 
						|
const NotificationManager = require('../managers/NotificationManager')
 | 
						|
 | 
						|
/**
 | 
						|
 * @typedef RequestUserObject
 | 
						|
 * @property {import('../models/User')} user
 | 
						|
 *
 | 
						|
 * @typedef {Request & RequestUserObject} RequestWithUser
 | 
						|
 */
 | 
						|
 | 
						|
class NotificationController {
 | 
						|
  constructor() {}
 | 
						|
 | 
						|
  /**
 | 
						|
   * GET: /api/notifications
 | 
						|
   * Get notifications, settings and data
 | 
						|
   *
 | 
						|
   * @this {import('../routers/ApiRouter')}
 | 
						|
   *
 | 
						|
   * @param {RequestWithUser} req
 | 
						|
   * @param {Response} res
 | 
						|
   */
 | 
						|
  get(req, res) {
 | 
						|
    res.json({
 | 
						|
      data: NotificationManager.getData(),
 | 
						|
      settings: Database.notificationSettings
 | 
						|
    })
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * PATCH: /api/notifications
 | 
						|
   *
 | 
						|
   * @param {RequestWithUser} req
 | 
						|
   * @param {Response} res
 | 
						|
   */
 | 
						|
  async update(req, res) {
 | 
						|
    const updated = Database.notificationSettings.update(req.body)
 | 
						|
    if (updated) {
 | 
						|
      await Database.updateSetting(Database.notificationSettings)
 | 
						|
    }
 | 
						|
    res.sendStatus(200)
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * GET: /api/notificationdata
 | 
						|
   * @deprecated Use /api/notifications
 | 
						|
   *
 | 
						|
   * @this {import('../routers/ApiRouter')}
 | 
						|
   *
 | 
						|
   * @param {RequestWithUser} req
 | 
						|
   * @param {Response} res
 | 
						|
   */
 | 
						|
  getData(req, res) {
 | 
						|
    res.json(NotificationManager.getData())
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * GET: /api/notifications/test
 | 
						|
   *
 | 
						|
   * @this {import('../routers/ApiRouter')}
 | 
						|
   *
 | 
						|
   * @param {RequestWithUser} req
 | 
						|
   * @param {Response} res
 | 
						|
   */
 | 
						|
  async fireTestEvent(req, res) {
 | 
						|
    await NotificationManager.triggerNotification('onTest', { version: `v${version}` }, req.query.fail === '1')
 | 
						|
    res.sendStatus(200)
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * POST: /api/notifications
 | 
						|
   *
 | 
						|
   * @param {RequestWithUser} req
 | 
						|
   * @param {Response} res
 | 
						|
   */
 | 
						|
  async createNotification(req, res) {
 | 
						|
    const success = Database.notificationSettings.createNotification(req.body)
 | 
						|
 | 
						|
    if (success) {
 | 
						|
      await Database.updateSetting(Database.notificationSettings)
 | 
						|
    }
 | 
						|
    res.json(Database.notificationSettings)
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * DELETE: /api/notifications/:id
 | 
						|
   *
 | 
						|
   * @param {RequestWithUser} req
 | 
						|
   * @param {Response} res
 | 
						|
   */
 | 
						|
  async deleteNotification(req, res) {
 | 
						|
    if (Database.notificationSettings.removeNotification(req.notification.id)) {
 | 
						|
      await Database.updateSetting(Database.notificationSettings)
 | 
						|
    }
 | 
						|
    res.json(Database.notificationSettings)
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * PATCH: /api/notifications/:id
 | 
						|
   *
 | 
						|
   * @param {RequestWithUser} req
 | 
						|
   * @param {Response} res
 | 
						|
   */
 | 
						|
  async updateNotification(req, res) {
 | 
						|
    const success = Database.notificationSettings.updateNotification(req.body)
 | 
						|
    if (success) {
 | 
						|
      await Database.updateSetting(Database.notificationSettings)
 | 
						|
    }
 | 
						|
    res.json(Database.notificationSettings)
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * GET: /api/notifications/:id/test
 | 
						|
   *
 | 
						|
   * @this {import('../routers/ApiRouter')}
 | 
						|
   *
 | 
						|
   * @param {RequestWithUser} req
 | 
						|
   * @param {Response} res
 | 
						|
   */
 | 
						|
  async sendNotificationTest(req, res) {
 | 
						|
    if (!Database.notificationSettings.isUseable) return res.status(400).send('Apprise is not configured')
 | 
						|
 | 
						|
    const success = await NotificationManager.sendTestNotification(req.notification)
 | 
						|
    if (success) res.sendStatus(200)
 | 
						|
    else res.sendStatus(500)
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Requires admin or up
 | 
						|
   *
 | 
						|
   * @param {RequestWithUser} req
 | 
						|
   * @param {Response} res
 | 
						|
   * @param {NextFunction} next
 | 
						|
   */
 | 
						|
  middleware(req, res, next) {
 | 
						|
    if (!req.user.isAdminOrUp) {
 | 
						|
      return res.sendStatus(403)
 | 
						|
    }
 | 
						|
 | 
						|
    if (req.params.id) {
 | 
						|
      const notification = Database.notificationSettings.getNotification(req.params.id)
 | 
						|
      if (!notification) {
 | 
						|
        return res.sendStatus(404)
 | 
						|
      }
 | 
						|
      req.notification = notification
 | 
						|
    }
 | 
						|
 | 
						|
    next()
 | 
						|
  }
 | 
						|
}
 | 
						|
module.exports = new NotificationController()
 |