Files
BYW-VoiceHub/server/api/songs/[id]/expected-play.put.ts
T
Henry_Du 4ce4649aaf
Build VoiceHub FPK / build-fpk (push) Failing after 56m5s
Build and Push Docker Image / build-and-push (push) Canceled after 1h9m35s
初次提交
2026-09-06 08:19:02 +08:00

100 lines
2.8 KiB
TypeScript

import { db } from '~/drizzle/db'
import { expectedPlayDates, songs } from '~/drizzle/schema'
import { eq, and } from 'drizzle-orm'
export default defineEventHandler(async (event) => {
const songId = Number(event.context.params?.id)
const body = await readBody(event)
if (!songId || isNaN(songId)) {
throw createError({
statusCode: 400,
message: '无效的歌曲ID'
})
}
// user check
const user = event.context.user
if (!user) {
throw createError({
statusCode: 401,
message: '需要登录'
})
}
const { expectedPlayDate, expectedPlaySequence } = body
// 如果传空值,说明用户取消选择或清空
if (!expectedPlayDate || expectedPlaySequence === undefined) {
await db.update(songs).set({
expectedPlayDate: null,
expectedPlaySequence: null
}).where(eq(songs.id, songId))
return { success: true }
}
try {
// 开启事务检查冲突
const updatedSong = await db.transaction(async (tx) => {
// 1. 检查日期和序号是否有效
const dateSetting = await tx.select().from(expectedPlayDates).where(eq(expectedPlayDates.date, expectedPlayDate))
if (dateSetting.length === 0 || !dateSetting[0].enabled) {
throw createError({
statusCode: 400,
message: '该日期未开放选座'
})
}
const availableSeqs = dateSetting[0].availableSequences.split(',').map(s => parseInt(s.trim(), 10))
if (!availableSeqs.includes(expectedPlaySequence)) {
throw createError({
statusCode: 400,
message: '无效的序号'
})
}
// 2. 检查是否已被占用
const takenSongs = await tx.select({ id: songs.id })
.from(songs)
.where(
and(
eq(songs.expectedPlayDate, expectedPlayDate),
eq(songs.expectedPlaySequence, expectedPlaySequence),
eq(songs.played, false)
)
)
if (takenSongs.length > 0 && takenSongs[0].id !== songId) {
throw createError({
statusCode: 409,
message: '该序号已被占用,请选择其他序号'
})
}
// 3. 更新歌曲
const result = await tx.update(songs).set({
expectedPlayDate,
expectedPlaySequence
}).where(and(eq(songs.id, songId), eq(songs.requesterId, user.id))).returning()
if (result.length === 0) {
throw createError({
statusCode: 404,
message: '歌曲不存在或无权修改'
})
}
return result[0]
})
return { success: true, data: updatedSong }
} catch (error: any) {
console.error('更新期望播出时段失败:', error)
throw createError({
statusCode: error.statusCode || 500,
message: error.message || '操作失败'
})
}
})