You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
118 lines
3.0 KiB
118 lines
3.0 KiB
import {
|
|
Column,
|
|
Entity,
|
|
JoinColumn,
|
|
OneToOne,
|
|
PrimaryGeneratedColumn,
|
|
} from 'typeorm';
|
|
import { NotificationAgentTypes } from '../interfaces/api/userSettingsInterfaces';
|
|
import { hasNotificationType, Notification } from '../lib/notifications';
|
|
import { NotificationAgentKey } from '../lib/settings';
|
|
import { User } from './User';
|
|
|
|
export const ALL_NOTIFICATIONS = Object.values(Notification)
|
|
.filter((v) => !isNaN(Number(v)))
|
|
.reduce((a, v) => a + Number(v), 0);
|
|
|
|
@Entity()
|
|
export class UserSettings {
|
|
constructor(init?: Partial<UserSettings>) {
|
|
Object.assign(this, init);
|
|
}
|
|
|
|
@PrimaryGeneratedColumn()
|
|
public id: number;
|
|
|
|
@OneToOne(() => User, (user) => user.settings, { onDelete: 'CASCADE' })
|
|
@JoinColumn()
|
|
public user: User;
|
|
|
|
@Column({ default: '' })
|
|
public locale?: string;
|
|
|
|
@Column({ nullable: true })
|
|
public region?: string;
|
|
|
|
@Column({ nullable: true })
|
|
public originalLanguage?: string;
|
|
|
|
@Column({ nullable: true })
|
|
public pgpKey?: string;
|
|
|
|
@Column({ nullable: true })
|
|
public discordId?: string;
|
|
|
|
@Column({ nullable: true })
|
|
public telegramChatId?: string;
|
|
|
|
@Column({ nullable: true })
|
|
public telegramSendSilently?: boolean;
|
|
|
|
@Column({
|
|
type: 'text',
|
|
nullable: true,
|
|
transformer: {
|
|
from: (value: string | null): Partial<NotificationAgentTypes> => {
|
|
const defaultTypes = {
|
|
email: ALL_NOTIFICATIONS,
|
|
discord: 0,
|
|
pushbullet: 0,
|
|
pushover: 0,
|
|
slack: 0,
|
|
telegram: 0,
|
|
webhook: 0,
|
|
webpush: ALL_NOTIFICATIONS,
|
|
};
|
|
if (!value) {
|
|
return defaultTypes;
|
|
}
|
|
|
|
const values = JSON.parse(value) as Partial<NotificationAgentTypes>;
|
|
|
|
// Something with the migration to this field has caused some issue where
|
|
// the value pre-populates with just a raw "2"? Here we check if that's the case
|
|
// and return the default notification types if so
|
|
if (typeof values !== 'object') {
|
|
return defaultTypes;
|
|
}
|
|
|
|
if (values.email == null) {
|
|
values.email = ALL_NOTIFICATIONS;
|
|
}
|
|
|
|
if (values.webpush == null) {
|
|
values.webpush = ALL_NOTIFICATIONS;
|
|
}
|
|
|
|
return values;
|
|
},
|
|
to: (value: Partial<NotificationAgentTypes>): string | null => {
|
|
if (!value || typeof value !== 'object') {
|
|
return null;
|
|
}
|
|
|
|
const allowedKeys = Object.values(NotificationAgentKey);
|
|
|
|
// Remove any unknown notification agent keys before saving to db
|
|
(Object.keys(value) as (keyof NotificationAgentTypes)[]).forEach(
|
|
(key) => {
|
|
if (!allowedKeys.includes(key)) {
|
|
delete value[key];
|
|
}
|
|
}
|
|
);
|
|
|
|
return JSON.stringify(value);
|
|
},
|
|
},
|
|
})
|
|
public notificationTypes: Partial<NotificationAgentTypes>;
|
|
|
|
public hasNotificationType(
|
|
key: NotificationAgentKey,
|
|
type: Notification
|
|
): boolean {
|
|
return hasNotificationType(type, this.notificationTypes[key] ?? 0);
|
|
}
|
|
}
|