gotify to ntfy relay server intended to be used with auth tokens from ntfy,

proxmox v8+ Gotify to Ntfy proxy
This commit is contained in:
LevantinLynx
2024-06-01 03:51:36 +02:00
parent e8ab3c3d07
commit fe47d9d357
10 changed files with 2884 additions and 0 deletions

95
index.js Normal file
View File

@@ -0,0 +1,95 @@
require('dotenv').config()
process.env.RELAY_PORT ??= 8008
process.env.RELAY_HOST_IP ??= '127.0.0.1'
const topics = require('./topics.js')
const express = require('express')
const multer = require('multer')
const bodyParser = require('body-parser')
const { sendNotificationToNtfyServer } = require('./ntfy.js')
const { mainStory, config } = require('storyboard')
if (process.env.NODE_ENV === 'dev') {
config({ filter: '*:DEBUG' })
mainStory.info('ENVIRONMENT', 'Running in DEVELOPMENT mode!')
} else {
config({ filter: '*:INFO' })
mainStory.info('ENVIRONMENT', 'Running in PRODUCTION mode!')
}
require('storyboard-preset-console')
const app = express()
const upload = multer()
app.use(upload.none())
app.use(bodyParser.json())
app.post('/message', upload.none(), bodyParser.json(), async (req, res) => {
const token = req.query.token || req.headers['x-gotify-key'] || req.headers.authorization ? req.headers.authorization.replace('Bearer ', '') : ''
mainStory.debug('MESSAGE', 'Gotify message recieved:', {
attach: { ...req.body, token },
attachLevel: 'debug'
})
const priority = ['min', 'low', 'default', 'high', 'max']
const topic = token.split('/')[0]
const ntfyToken = token.split('/')[1]
if (!topic || !topics[topic]) {
const error = {
error: 'Bad Request',
errorCode: 400,
errorDescription: 'No matching topic found! Please ensure the topic is defined in topic.js and provide a token formated: topic/ntfyToken'
}
mainStory.error('NOTIFICATION', error.error, {
attach: error,
attachLevel: 'error'
})
return res.json(error).status(400)
}
if (topics[topic].ntfyToken !== ntfyToken) {
const error = {
error: 'Unauthorized',
errorCode: 401,
errorDescription: 'Please provide a token formated: topic/ntfyToken'
}
mainStory.error('NOTIFICATION', error.error, {
attach: error,
attachLevel: 'error'
})
return res.json(error).status(401)
}
if (!req.body.message) {
const error = {
error: 'Bad Request',
errorCode: 400,
errorDescription: 'Please provide a message.'
}
mainStory.error('NOTIFICATION', error.error, {
attach: error,
attachLevel: 'error'
})
return res.json(error).status(400)
}
const notification = {
topic: token.split('/')[0],
title: req.body.title,
content: req.body.message,
priority: priority[req.body.priority - 1 || 3] || 'default',
token: ntfyToken
}
const msg = await sendNotificationToNtfyServer(notification)
res.json({
id: msg.id,
appid: 1,
message: req.body.message,
title: req.body.title,
priority: req.body.priority,
date: new Date().toISOString()
})
})
app.listen(process.env.RELAY_PORT, process.env.RELAY_HOST_IP, () => {
mainStory.info('SERVER', `Relay Server is listening on http://${process.env.RELAY_HOST_IP || '127.0.0.1'}:${process.env.RELAY_PORT || 8008}`)
})