From 37a3fdb606a75262c3eb031cd376e9f6c2ff5d7c Mon Sep 17 00:00:00 2001 From: advplyr Date: Fri, 23 Sep 2022 18:10:03 -0500 Subject: [PATCH] Notifications UI update and delete endpoint --- .../notification/NotificationEditModal.vue | 2 +- client/pages/config/notifications.vue | 43 ++++++++++++++++++- server/controllers/NotificationController.js | 43 ++++++++++++++----- server/managers/NotificationManager.js | 4 +- .../objects/settings/NotificationSettings.js | 18 ++++++-- server/routers/ApiRouter.js | 6 ++- 6 files changed, 95 insertions(+), 21 deletions(-) diff --git a/client/components/modals/notification/NotificationEditModal.vue b/client/components/modals/notification/NotificationEditModal.vue index f831c0aa..a0b8ea69 100644 --- a/client/components/modals/notification/NotificationEditModal.vue +++ b/client/components/modals/notification/NotificationEditModal.vue @@ -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') }) diff --git a/client/pages/config/notifications.vue b/client/pages/config/notifications.vue index fe9b0294..c62bd48d 100644 --- a/client/pages/config/notifications.vue +++ b/client/pages/config/notifications.vue @@ -23,7 +23,17 @@ @@ -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 diff --git a/server/controllers/NotificationController.js b/server/controllers/NotificationController.js index 689680b5..0accd683 100644 --- a/server/controllers/NotificationController.js +++ b/server/controllers/NotificationController.js @@ -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() } } diff --git a/server/managers/NotificationManager.js b/server/managers/NotificationManager.js index da920268..63d27379 100644 --- a/server/managers/NotificationManager.js +++ b/server/managers/NotificationManager.js @@ -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) diff --git a/server/objects/settings/NotificationSettings.js b/server/objects/settings/NotificationSettings.js index 3a67b287..a78b56f7 100644 --- a/server/objects/settings/NotificationSettings.js +++ b/server/objects/settings/NotificationSettings.js @@ -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 diff --git a/server/routers/ApiRouter.js b/server/routers/ApiRouter.js index 6eabbbf4..812aa2b5 100644 --- a/server/routers/ApiRouter.js +++ b/server/routers/ApiRouter.js @@ -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