mirror of
				https://github.com/advplyr/audiobookshelf.git
				synced 2025-10-27 11:18:14 +01:00 
			
		
		
		
	Notifications UI update and delete endpoint
This commit is contained in:
		
							parent
							
								
									b08ad8785e
								
							
						
					
					
						commit
						37a3fdb606
					
				| @ -210,7 +210,7 @@ export default { | ||||
|       } | ||||
|       console.log('Sending create notification', payload) | ||||
|       this.$axios | ||||
|         .$post('/api/notifications/event', payload) | ||||
|         .$post('/api/notifications', payload) | ||||
|         .then(() => { | ||||
|           this.$toast.success('Notification created') | ||||
|         }) | ||||
|  | ||||
| @ -23,7 +23,17 @@ | ||||
|       </div> | ||||
|       <template v-for="notification in notifications"> | ||||
|         <div :key="notification.id" class="w-full bg-primary rounded-xl p-4"> | ||||
|           <p>{{ notification.eventName }}</p> | ||||
|           <div class="flex items-center"> | ||||
|             <p class="text-lg font-semibold">{{ notification.eventName }}</p> | ||||
|             <div class="flex-grow" /> | ||||
| 
 | ||||
|             <ui-btn :loading="sendingTest" small class="mr-2" @click="sendTest(notification)">Test</ui-btn> | ||||
| 
 | ||||
|             <ui-icon-btn bg-color="error" :size="7" icon-font-size="1.2rem" icon="delete" @click="deleteNotification(notification)" /> | ||||
|           </div> | ||||
|           <div class="pt-4"> | ||||
|             <p class="text-gray-300">{{ notification.urls.join(', ') }}</p> | ||||
|           </div> | ||||
|         </div> | ||||
|       </template> | ||||
|     </div> | ||||
| @ -42,11 +52,40 @@ export default { | ||||
|       notificationSettings: null, | ||||
|       notificationData: null, | ||||
|       showEditModal: false, | ||||
|       selectedNotification: null | ||||
|       selectedNotification: null, | ||||
|       sendingTest: false | ||||
|     } | ||||
|   }, | ||||
|   computed: {}, | ||||
|   methods: { | ||||
|     deleteNotification(notification) { | ||||
|       this.$axios | ||||
|         .$delete(`/api/notifications/${notification.id}`) | ||||
|         .then(() => { | ||||
|           this.$toast.success('Deleted notification') | ||||
|           this.notificationSettings.notifications = this.notificationSettings.notifications.filter((n) => n.id !== notification.id) | ||||
|           this.notifications = this.notificationSettings.notifications | ||||
|         }) | ||||
|         .catch((error) => { | ||||
|           console.error('Failed', error) | ||||
|           this.$toast.error('Failed to delete notification') | ||||
|         }) | ||||
|     }, | ||||
|     sendTest(notification) { | ||||
|       this.sendingTest = true | ||||
|       this.$axios | ||||
|         .$get(`/api/notifications/${notification.id}/test`) | ||||
|         .then(() => { | ||||
|           this.$toast.success('Triggered test notification') | ||||
|         }) | ||||
|         .catch((error) => { | ||||
|           console.error('Failed', error) | ||||
|           this.$toast.error('Failed to trigger test notification') | ||||
|         }) | ||||
|         .finally(() => { | ||||
|           this.sendingTest = false | ||||
|         }) | ||||
|     }, | ||||
|     clickCreate() { | ||||
|       this.selectedNotification = null | ||||
|       this.showEditModal = true | ||||
|  | ||||
| @ -18,17 +18,8 @@ class NotificationController { | ||||
|     res.sendStatus(200) | ||||
|   } | ||||
| 
 | ||||
|   async createEvent(req, res) { | ||||
|     const success = this.db.notificationSettings.addNewEvent(req.body) | ||||
| 
 | ||||
|     if (success) { | ||||
|       await this.db.updateEntity('settings', this.db.notificationSettings) | ||||
|     } | ||||
|     res.sendStatus(200) | ||||
|   } | ||||
| 
 | ||||
|   async updateEvent(req, res) { | ||||
|     const success = this.db.notificationSettings.updateEvent(req.body) | ||||
|   async createNotification(req, res) { | ||||
|     const success = this.db.notificationSettings.createNotification(req.body) | ||||
| 
 | ||||
|     if (success) { | ||||
|       await this.db.updateEntity('settings', this.db.notificationSettings) | ||||
| @ -40,10 +31,40 @@ class NotificationController { | ||||
|     res.json(this.notificationManager.getData()) | ||||
|   } | ||||
| 
 | ||||
|   async deleteNotification(req, res) { | ||||
|     if (this.db.notificationSettings.removeNotification(req.notification.id)) { | ||||
|       await this.db.updateEntity('settings', this.db.notificationSettings) | ||||
|     } | ||||
|     res.sendStatus(200) | ||||
|   } | ||||
| 
 | ||||
|   async updateNotification(req, res) { | ||||
|     const success = this.db.notificationSettings.updateNotification(req.body) | ||||
| 
 | ||||
|     if (success) { | ||||
|       await this.db.updateEntity('settings', this.db.notificationSettings) | ||||
|     } | ||||
|     res.sendStatus(200) | ||||
|   } | ||||
| 
 | ||||
|   sendNotificationTest(req, res) { | ||||
|     this.notificationManager.onTest() | ||||
|     res.sendStatus(200) | ||||
|   } | ||||
| 
 | ||||
|   middleware(req, res, next) { | ||||
|     if (!req.user.isAdminOrUp) { | ||||
|       return res.sendStatus(404) | ||||
|     } | ||||
| 
 | ||||
|     if (req.params.id) { | ||||
|       const notification = this.db.notificationSettings.getNotification(req.params.id) | ||||
|       if (!notification) { | ||||
|         return res.sendStatus(404) | ||||
|       } | ||||
|       req.notification = notification | ||||
|     } | ||||
| 
 | ||||
|     next() | ||||
|   } | ||||
| } | ||||
|  | ||||
| @ -48,8 +48,8 @@ class NotificationManager { | ||||
| 
 | ||||
|   sendNotification(notification, eventData) { | ||||
|     const payload = notification.getApprisePayload(eventData) | ||||
|     return axios.post(`${this.db.notificationSettings.appriseApiUrl}/notify`, payload, { timeout: 6000 }).then((data) => { | ||||
|       Logger.debug(`[NotificationManager] sendNotification: ${notification.eventName}/${notification.id} response=${data}`) | ||||
|     return axios.post(`${this.db.notificationSettings.appriseApiUrl}/notify`, payload, { timeout: 6000 }).then((response) => { | ||||
|       Logger.debug(`[NotificationManager] sendNotification: ${notification.eventName}/${notification.id} response=`, response.data) | ||||
|       return true | ||||
|     }).catch((error) => { | ||||
|       Logger.error(`[NotificationManager] sendNotification: ${notification.eventName}/${notification.id} error=`, error) | ||||
|  | ||||
| @ -15,7 +15,7 @@ class NotificationSettings { | ||||
|   construct(settings) { | ||||
|     this.appriseType = settings.appriseType | ||||
|     this.appriseApiUrl = settings.appriseApiUrl || null | ||||
|     this.notifications = (settings.notifications || []).map(n => ({ ...n })) | ||||
|     this.notifications = (settings.notifications || []).map(n => new Notification(n)) | ||||
|   } | ||||
| 
 | ||||
|   toJSON() { | ||||
| @ -35,6 +35,18 @@ class NotificationSettings { | ||||
|     return this.notifications.filter(n => n.eventName === eventName) | ||||
|   } | ||||
| 
 | ||||
|   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 | ||||
|     if (payload.appriseApiUrl !== this.appriseApiUrl) { | ||||
| @ -44,7 +56,7 @@ class NotificationSettings { | ||||
|     return false | ||||
|   } | ||||
| 
 | ||||
|   addNewEvent(payload) { | ||||
|   createNotification(payload) { | ||||
|     if (!payload) return false | ||||
|     // TODO: validate
 | ||||
| 
 | ||||
| @ -54,7 +66,7 @@ class NotificationSettings { | ||||
|     return true | ||||
|   } | ||||
| 
 | ||||
|   updateEvent(payload) { | ||||
|   updateNotification(payload) { | ||||
|     if (!payload) return false | ||||
|     const notification = this.notifications.find(n => n.id === payload.id) | ||||
|     if (!notification) return false | ||||
|  | ||||
| @ -206,9 +206,11 @@ class ApiRouter { | ||||
|     //
 | ||||
|     this.router.get('/notifications', NotificationController.middleware.bind(this), NotificationController.get.bind(this)) | ||||
|     this.router.patch('/notifications', NotificationController.middleware.bind(this), NotificationController.update.bind(this)) | ||||
|     this.router.post('/notifications/event', NotificationController.middleware.bind(this), NotificationController.createEvent.bind(this)) | ||||
|     this.router.patch('/notifications/event', NotificationController.middleware.bind(this), NotificationController.updateEvent.bind(this)) | ||||
|     this.router.get('/notificationdata', NotificationController.middleware.bind(this), NotificationController.getData.bind(this)) | ||||
|     this.router.post('/notifications', NotificationController.middleware.bind(this), NotificationController.createNotification.bind(this)) | ||||
|     this.router.delete('/notifications/:id', NotificationController.middleware.bind(this), NotificationController.deleteNotification.bind(this)) | ||||
|     this.router.patch('/notifications/:id', NotificationController.middleware.bind(this), NotificationController.updateNotification.bind(this)) | ||||
|     this.router.get('/notifications/:id/test', NotificationController.middleware.bind(this), NotificationController.sendNotificationTest.bind(this)) | ||||
| 
 | ||||
|     //
 | ||||
|     // Misc Routes
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user