feat: align with upstream 1.5.9.9

This commit is contained in:
2026-09-12 18:21:11 +08:00
commit 34f0679117
805 changed files with 376275 additions and 0 deletions
@@ -0,0 +1,72 @@
export const NOTIFICATION_TITLE_MAX_LENGTH = 200
export const NOTIFICATION_CONTENT_MAX_LENGTH = 20000
export const NOTIFICATION_SOURCES = {
SYSTEM: 'SYSTEM',
ADMIN_MANUAL: 'ADMIN_MANUAL'
} as const
export type NotificationSenderInput = {
id: number
name?: string | null
username?: string | null
}
export type NotificationSenderSnapshot = {
senderId: number | null
senderName: string | null
senderUsername: string | null
}
export const resolveNotificationSource = (sender: NotificationSenderInput | null) =>
sender ? NOTIFICATION_SOURCES.ADMIN_MANUAL : NOTIFICATION_SOURCES.SYSTEM
export const createNotificationSenderSnapshot = (
sender: NotificationSenderInput | null = null
): NotificationSenderSnapshot => ({
senderId: sender?.id ?? null,
senderName: sender?.name?.trim() || null,
senderUsername: sender?.username?.trim() || null
})
export const serializeNotificationSender = (snapshot: NotificationSenderSnapshot) =>
snapshot.senderId
? {
id: snapshot.senderId,
name: snapshot.senderName,
username: snapshot.senderUsername
}
: null
export const shouldCheckImportantNotification = (
authenticated: boolean,
userId?: number | null,
requirePasswordChange = false
): boolean =>
authenticated && Number.isInteger(userId) && Number(userId) > 0 && !requirePasswordChange
export const canSendSystemNotification = (role?: string): boolean =>
role === 'ADMIN' || role === 'SUPER_ADMIN'
export const resolveImportantFlag = (value: unknown): boolean | null => {
if (value === undefined) return false
return typeof value === 'boolean' ? value : null
}
export const shouldDeliverSystemNotification = (
important: boolean,
notificationsEnabled?: boolean
): boolean => important || notificationsEnabled !== false
export const shouldRetainNotificationHistory = (type: string, source: string): boolean =>
type === 'SYSTEM_NOTICE' && source === NOTIFICATION_SOURCES.ADMIN_MANUAL
export const createNotificationReadUpdate = (updatedAt = new Date()) => ({
read: true as const,
updatedAt
})
export const createNotificationUserDeleteUpdate = (updatedAt = new Date()) => ({
userDeleted: true as const,
read: true as const,
updatedAt
})