mirror of
https://github.com/sct/overseerr.git
synced 2025-09-17 17:24:35 +02:00

* refactor(ui): add tabs to user notification settings * feat(notif): allow users to enable/disable specific agents * fix(ui): only enforce required fields when agent is enabled * fix(ui): hide unavailable notification agents * feat(notif): mention admin users for admin Discord notifications * fix(ui): modify styling of PGP key textareas to suit expected input * fix(notif): mention all admins when there are multiple and fix rebase error * fix: add missing form values, and fix Yup validation * refactor: reduce repeated logic/code in email notif agent * refactor: move 'Notification Types' label into NotificationTypeSelector component * fix(email): correct inconsistencies in email template formatting * refactor: use bitfields for storing user-enabled notif agent types * feat: improve notification agent logging * fix(ui): mark string fields as nullable so empty values are not type errors * fix: add validation for PGP-related inputs * fix: correctly fetch user in user settings & log mentioned IDs for Discord notifs * fix(ui): fix mobile nav dropdown text & add hover effect to button-style tabs * fix(notif): process admin email notifications asynchronously * fix(logging): log name of notification type instead of its enum value * fix: mark required fields and pass all user settings values to API * fix(frontend): call mutate after changing email/Discord/Telegram global notif settings * refactor: get global notif settings from relevant API endpoints instead of adding to public settings * fix(notif): fall back to email notifications being enabled (default) if user settings do not exist * fix(notif): do not set notifyUser for MEDIA_PENDING or MEDIA_AUTO_APPROVED * fix: expose notif enabled settings in user notif endpoints & remove global enable notif setting * fix(notif): remove unnecessary allowed_mentions object from Discord payload * fix(notif): use form values for email test notification * fix: make suggested changes and regenerate DB migration * fix: loosen validation of PGP keys * fix: fix user profile settings routes * fix: remove route guard from profile pages
64 lines
1.6 KiB
TypeScript
64 lines
1.6 KiB
TypeScript
import logger from '../../logger';
|
|
import { getSettings } from '../settings';
|
|
import type { NotificationAgent, NotificationPayload } from './agents/agent';
|
|
|
|
export enum Notification {
|
|
MEDIA_PENDING = 2,
|
|
MEDIA_APPROVED = 4,
|
|
MEDIA_AVAILABLE = 8,
|
|
MEDIA_FAILED = 16,
|
|
TEST_NOTIFICATION = 32,
|
|
MEDIA_DECLINED = 64,
|
|
MEDIA_AUTO_APPROVED = 128,
|
|
}
|
|
|
|
export const hasNotificationType = (
|
|
types: Notification | Notification[],
|
|
value: number
|
|
): boolean => {
|
|
let total = 0;
|
|
|
|
// If we are not checking any notifications, bail out and return true
|
|
if (types === 0) {
|
|
return true;
|
|
}
|
|
|
|
if (Array.isArray(types)) {
|
|
// Combine all notification values into one
|
|
total = types.reduce((a, v) => a + v, 0);
|
|
} else {
|
|
total = types;
|
|
}
|
|
|
|
return !!(value & total);
|
|
};
|
|
|
|
class NotificationManager {
|
|
private activeAgents: NotificationAgent[] = [];
|
|
|
|
public registerAgents = (agents: NotificationAgent[]): void => {
|
|
this.activeAgents = [...this.activeAgents, ...agents];
|
|
logger.info('Registered notification agents', { label: 'Notifications' });
|
|
};
|
|
|
|
public sendNotification(
|
|
type: Notification,
|
|
payload: NotificationPayload
|
|
): void {
|
|
const settings = getSettings().notifications;
|
|
logger.info(`Sending notification(s) for ${Notification[type]}`, {
|
|
label: 'Notifications',
|
|
subject: payload.subject,
|
|
});
|
|
this.activeAgents.forEach((agent) => {
|
|
if (settings.enabled && agent.shouldSend(type)) {
|
|
agent.send(type, payload);
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
const notificationManager = new NotificationManager();
|
|
|
|
export default notificationManager;
|