114 lines
3.7 KiB
TypeScript
114 lines
3.7 KiB
TypeScript
import { db } from '~/drizzle/db'
|
|
import { notificationSettings } from '~/drizzle/schema'
|
|
import { eq } from 'drizzle-orm'
|
|
import type { NotificationSettings } from '~/types'
|
|
|
|
export default defineEventHandler(async (event) => {
|
|
// 检查用户认证
|
|
const user = event.context.user
|
|
|
|
if (!user) {
|
|
throw createError({
|
|
statusCode: 401,
|
|
message: '需要登录才能更新通知设置'
|
|
})
|
|
}
|
|
|
|
const body = await readBody(event)
|
|
|
|
// 验证请求体
|
|
if (typeof body !== 'object' || body === null) {
|
|
throw createError({
|
|
statusCode: 400,
|
|
message: '无效的请求数据'
|
|
})
|
|
}
|
|
|
|
try {
|
|
// 获取用户当前的通知设置
|
|
const existingSettingsResult = await db
|
|
.select()
|
|
.from(notificationSettings)
|
|
.where(eq(notificationSettings.userId, user.id))
|
|
.limit(1)
|
|
let dbSettings: any = existingSettingsResult[0]
|
|
|
|
if (dbSettings) {
|
|
// 更新现有设置
|
|
const updatedSettingsResult = await db
|
|
.update(notificationSettings)
|
|
.set({
|
|
enabled: body.systemNotify !== undefined ? body.systemNotify : dbSettings.enabled,
|
|
songRequestEnabled:
|
|
body.songSelectedNotify !== undefined
|
|
? body.songSelectedNotify
|
|
: dbSettings.songRequestEnabled,
|
|
songPlayedEnabled:
|
|
body.songPlayedNotify !== undefined
|
|
? body.songPlayedNotify
|
|
: dbSettings.songPlayedEnabled,
|
|
songVotedEnabled:
|
|
body.songVotedNotify !== undefined ? body.songVotedNotify : dbSettings.songVotedEnabled,
|
|
songVotedThreshold:
|
|
body.songVotedThreshold !== undefined
|
|
? Math.max(1, Math.min(10, body.songVotedThreshold))
|
|
: dbSettings.songVotedThreshold,
|
|
refreshInterval:
|
|
body.refreshInterval !== undefined
|
|
? Math.max(10, Math.min(300, body.refreshInterval))
|
|
: dbSettings.refreshInterval
|
|
// 邮件通知总开关移除
|
|
})
|
|
.where(eq(notificationSettings.userId, user.id))
|
|
.returning()
|
|
dbSettings = updatedSettingsResult[0]
|
|
} else {
|
|
// 创建新设置
|
|
const newSettingsResult = await db
|
|
.insert(notificationSettings)
|
|
.values({
|
|
userId: user.id,
|
|
enabled: body.systemNotify !== undefined ? body.systemNotify : true,
|
|
songRequestEnabled:
|
|
body.songSelectedNotify !== undefined ? body.songSelectedNotify : true,
|
|
songPlayedEnabled: body.songPlayedNotify !== undefined ? body.songPlayedNotify : true,
|
|
songVotedEnabled: body.songVotedNotify !== undefined ? body.songVotedNotify : true,
|
|
songVotedThreshold:
|
|
body.songVotedThreshold !== undefined
|
|
? Math.max(1, Math.min(10, body.songVotedThreshold))
|
|
: 1,
|
|
refreshInterval:
|
|
body.refreshInterval !== undefined
|
|
? Math.max(10, Math.min(300, body.refreshInterval))
|
|
: 60
|
|
})
|
|
.returning()
|
|
dbSettings = newSettingsResult[0]
|
|
}
|
|
|
|
// 转换为前端期望的格式
|
|
const settings: NotificationSettings = {
|
|
id: dbSettings.id,
|
|
userId: dbSettings.userId,
|
|
songSelectedNotify: dbSettings.songRequestEnabled,
|
|
songPlayedNotify: dbSettings.songPlayedEnabled,
|
|
songVotedNotify: dbSettings.songVotedEnabled,
|
|
systemNotify: dbSettings.enabled,
|
|
refreshInterval: dbSettings.refreshInterval,
|
|
songVotedThreshold: dbSettings.songVotedThreshold
|
|
}
|
|
|
|
return {
|
|
success: true,
|
|
data: settings,
|
|
message: '通知设置保存成功'
|
|
}
|
|
} catch (err) {
|
|
console.error('更新通知设置失败:', err)
|
|
throw createError({
|
|
statusCode: 500,
|
|
message: '更新通知设置失败'
|
|
})
|
|
}
|
|
})
|