mirror of
				https://github.com/advplyr/audiobookshelf.git
				synced 2025-10-27 11:18:14 +01:00 
			
		
		
		
	* Formatting updates * Add: backup completion notification * Fix: comment for backup * Add: backup size units to notification * Add: failed backup notification * Add: calls to failed backup notification * Update: notification OpenAPI spec * Update notifications to first check if any are active for an event, update JS docs --------- Co-authored-by: advplyr <advplyr@protonmail.com>
		
			
				
	
	
		
			119 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			119 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
const Logger = require('../../Logger')
 | 
						|
const Notification = require('../Notification')
 | 
						|
const { isNullOrNaN } = require('../../utils')
 | 
						|
 | 
						|
class NotificationSettings {
 | 
						|
  constructor(settings = null) {
 | 
						|
    this.id = 'notification-settings'
 | 
						|
    this.appriseType = 'api'
 | 
						|
    this.appriseApiUrl = null
 | 
						|
    this.notifications = []
 | 
						|
    this.maxFailedAttempts = 5
 | 
						|
    this.maxNotificationQueue = 20 // once reached events will be ignored
 | 
						|
    this.notificationDelay = 1000 // ms delay between firing notifications
 | 
						|
 | 
						|
    if (settings) {
 | 
						|
      this.construct(settings)
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  construct(settings) {
 | 
						|
    this.appriseType = settings.appriseType
 | 
						|
    this.appriseApiUrl = settings.appriseApiUrl || null
 | 
						|
    this.notifications = (settings.notifications || []).map((n) => new Notification(n))
 | 
						|
    this.maxFailedAttempts = settings.maxFailedAttempts || 5
 | 
						|
    this.maxNotificationQueue = settings.maxNotificationQueue || 20
 | 
						|
    this.notificationDelay = settings.notificationDelay || 1000
 | 
						|
  }
 | 
						|
 | 
						|
  toJSON() {
 | 
						|
    return {
 | 
						|
      id: this.id,
 | 
						|
      appriseType: this.appriseType,
 | 
						|
      appriseApiUrl: this.appriseApiUrl,
 | 
						|
      notifications: this.notifications.map((n) => n.toJSON()),
 | 
						|
      maxFailedAttempts: this.maxFailedAttempts,
 | 
						|
      maxNotificationQueue: this.maxNotificationQueue,
 | 
						|
      notificationDelay: this.notificationDelay
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  get isUseable() {
 | 
						|
    return !!this.appriseApiUrl
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * @param {string} eventName
 | 
						|
   * @returns {boolean} - TRUE if there are active notifications for the event
 | 
						|
   */
 | 
						|
  getHasActiveNotificationsForEvent(eventName) {
 | 
						|
    return this.notifications.some((n) => n.eventName === eventName && n.enabled)
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * @param {string} eventName
 | 
						|
   * @returns {Notification[]}
 | 
						|
   */
 | 
						|
  getActiveNotificationsForEvent(eventName) {
 | 
						|
    return this.notifications.filter((n) => n.eventName === eventName && n.enabled)
 | 
						|
  }
 | 
						|
 | 
						|
  getNotification(id) {
 | 
						|
    return this.notifications.find((n) => n.id === id)
 | 
						|
  }
 | 
						|
 | 
						|
  removeNotification(id) {
 | 
						|
    if (this.notifications.some((n) => n.id === id)) {
 | 
						|
      this.notifications = this.notifications.filter((n) => n.id !== id)
 | 
						|
      return true
 | 
						|
    }
 | 
						|
    return false
 | 
						|
  }
 | 
						|
 | 
						|
  update(payload) {
 | 
						|
    if (!payload) return false
 | 
						|
 | 
						|
    var hasUpdates = false
 | 
						|
    if (payload.appriseApiUrl !== this.appriseApiUrl) {
 | 
						|
      this.appriseApiUrl = payload.appriseApiUrl || null
 | 
						|
      hasUpdates = true
 | 
						|
    }
 | 
						|
 | 
						|
    const _maxFailedAttempts = isNullOrNaN(payload.maxFailedAttempts) ? 5 : Number(payload.maxFailedAttempts)
 | 
						|
    if (_maxFailedAttempts !== this.maxFailedAttempts) {
 | 
						|
      this.maxFailedAttempts = _maxFailedAttempts
 | 
						|
      hasUpdates = true
 | 
						|
    }
 | 
						|
 | 
						|
    const _maxNotificationQueue = isNullOrNaN(payload.maxNotificationQueue) ? 20 : Number(payload.maxNotificationQueue)
 | 
						|
    if (_maxNotificationQueue !== this.maxNotificationQueue) {
 | 
						|
      this.maxNotificationQueue = _maxNotificationQueue
 | 
						|
      hasUpdates = true
 | 
						|
    }
 | 
						|
 | 
						|
    return hasUpdates
 | 
						|
  }
 | 
						|
 | 
						|
  createNotification(payload) {
 | 
						|
    if (!payload) return false
 | 
						|
    if (!payload.eventName || !payload.urls.length) return false
 | 
						|
 | 
						|
    const notification = new Notification()
 | 
						|
    notification.setData(payload)
 | 
						|
    this.notifications.push(notification)
 | 
						|
    return true
 | 
						|
  }
 | 
						|
 | 
						|
  updateNotification(payload) {
 | 
						|
    if (!payload) return false
 | 
						|
    const notification = this.notifications.find((n) => n.id === payload.id)
 | 
						|
    if (!notification) {
 | 
						|
      Logger.error(`[NotificationSettings] updateNotification: Notification not found ${payload.id}`)
 | 
						|
      return false
 | 
						|
    }
 | 
						|
 | 
						|
    return notification.update(payload)
 | 
						|
  }
 | 
						|
}
 | 
						|
module.exports = NotificationSettings
 |