feat: add ntfy and telegram notification workflows
This commit is contained in:
108
services/userSettingsStore.js
Normal file
108
services/userSettingsStore.js
Normal file
@@ -0,0 +1,108 @@
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
|
||||
const SETTINGS_DIR = path.join(__dirname, '..', 'config');
|
||||
|
||||
const DEFAULT_USER_SETTINGS = {
|
||||
notifications: {
|
||||
ntfy: {
|
||||
enabled: false,
|
||||
topic: '',
|
||||
serverUrl: ''
|
||||
},
|
||||
telegram: {
|
||||
enabled: false,
|
||||
chatId: ''
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
function ensureDir() {
|
||||
if (!fs.existsSync(SETTINGS_DIR)) {
|
||||
fs.mkdirSync(SETTINGS_DIR, { recursive: true });
|
||||
}
|
||||
}
|
||||
|
||||
function getSettingsPath(profileId = 'shared') {
|
||||
return path.join(SETTINGS_DIR, `${profileId}-notifications.json`);
|
||||
}
|
||||
|
||||
function sanitizeBoolean(value) {
|
||||
return !!value;
|
||||
}
|
||||
|
||||
function sanitizeString(value) {
|
||||
if (typeof value !== 'string') {
|
||||
if (value === null || value === undefined) {
|
||||
return '';
|
||||
}
|
||||
return String(value);
|
||||
}
|
||||
return value.trim();
|
||||
}
|
||||
|
||||
function hydrateSettingsFile(profileId) {
|
||||
ensureDir();
|
||||
const filePath = getSettingsPath(profileId);
|
||||
if (!fs.existsSync(filePath)) {
|
||||
fs.writeFileSync(filePath, JSON.stringify(DEFAULT_USER_SETTINGS, null, 2));
|
||||
}
|
||||
return filePath;
|
||||
}
|
||||
|
||||
function readNotificationSettings(profileId) {
|
||||
const filePath = hydrateSettingsFile(profileId);
|
||||
try {
|
||||
const raw = fs.readFileSync(filePath, 'utf8');
|
||||
const parsed = JSON.parse(raw);
|
||||
return {
|
||||
notifications: {
|
||||
ntfy: {
|
||||
enabled: sanitizeBoolean(parsed?.notifications?.ntfy?.enabled),
|
||||
topic: sanitizeString(parsed?.notifications?.ntfy?.topic),
|
||||
serverUrl: sanitizeString(parsed?.notifications?.ntfy?.serverUrl)
|
||||
},
|
||||
telegram: {
|
||||
enabled: sanitizeBoolean(parsed?.notifications?.telegram?.enabled),
|
||||
chatId: sanitizeString(parsed?.notifications?.telegram?.chatId)
|
||||
}
|
||||
}
|
||||
};
|
||||
} catch (error) {
|
||||
console.error(`[NOTIFICATIONS] Konnte Einstellungen für ${profileId} nicht lesen:`, error.message);
|
||||
return JSON.parse(JSON.stringify(DEFAULT_USER_SETTINGS));
|
||||
}
|
||||
}
|
||||
|
||||
function writeNotificationSettings(profileId, patch = {}) {
|
||||
const current = readNotificationSettings(profileId);
|
||||
const next = {
|
||||
notifications: {
|
||||
ntfy: {
|
||||
enabled: sanitizeBoolean(patch?.notifications?.ntfy?.enabled ?? current.notifications.ntfy.enabled),
|
||||
topic: sanitizeString(patch?.notifications?.ntfy?.topic ?? current.notifications.ntfy.topic),
|
||||
serverUrl: sanitizeString(
|
||||
patch?.notifications?.ntfy?.serverUrl ?? current.notifications.ntfy.serverUrl
|
||||
)
|
||||
},
|
||||
telegram: {
|
||||
enabled: sanitizeBoolean(
|
||||
patch?.notifications?.telegram?.enabled ?? current.notifications.telegram.enabled
|
||||
),
|
||||
chatId: sanitizeString(
|
||||
patch?.notifications?.telegram?.chatId ?? current.notifications.telegram.chatId
|
||||
)
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
const filePath = hydrateSettingsFile(profileId);
|
||||
fs.writeFileSync(filePath, JSON.stringify(next, null, 2));
|
||||
return next;
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
DEFAULT_USER_SETTINGS,
|
||||
readNotificationSettings,
|
||||
writeNotificationSettings
|
||||
};
|
||||
Reference in New Issue
Block a user