Files
BYW-VoiceHub/server/api/admin/expected-play-dates/index.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

95 lines
2.9 KiB
TypeScript

import { db } from '~/drizzle/db'
import { expectedPlayDates, songs } from '~/drizzle/schema'
import { desc, eq, and } from 'drizzle-orm'
export default defineEventHandler(async (event) => {
const method = event.node.req.method
const user = event.context.user
if (!user || (user.role !== 'ADMIN' && user.role !== 'SUPER_ADMIN')) {
throw createError({ statusCode: 403, message: '权限不足' })
}
if (method === 'GET') {
const dates = await db.select().from(expectedPlayDates).orderBy(desc(expectedPlayDates.date))
const result = []
for (const d of dates) {
const dateObj = new Date(d.date)
const weekdays = ['周日', '周一', '周二', '周三', '周四', '周五', '周六']
const weekday = weekdays[dateObj.getDay()]
let availableSeqs: number[] = []
if (d.availableSequences) {
availableSeqs = d.availableSequences.split(',').map(s => parseInt(s.trim(), 10)).filter(n => !isNaN(n))
}
const takenSongs = await db.select({
sequence: songs.expectedPlaySequence,
title: songs.title,
artist: songs.artist,
requesterId: songs.requesterId
})
.from(songs)
.where(
and(
eq(songs.expectedPlayDate, d.date),
eq(songs.played, false)
)
)
const takenSeqs = new Set(takenSongs.map(s => s.sequence).filter(seq => seq !== null))
const takenDetails: Record<number, any> = {}
takenSongs.forEach(s => {
if (s.sequence !== null) {
takenDetails[s.sequence] = { title: s.title, artist: s.artist }
}
})
const freeSeqs = availableSeqs.filter(seq => !takenSeqs.has(seq))
result.push({
...d,
weekday,
allSequences: availableSeqs.sort((a, b) => a - b),
takenSequences: Array.from(takenSeqs).sort((a, b) => a - b),
takenDetails,
freeSequences: freeSeqs.sort((a, b) => a - b),
isFull: freeSeqs.length === 0
})
}
return result
}
if (method === 'POST') {
const body = await readBody(event)
const { date, availableSequences } = body
if (!date || !availableSequences) {
throw createError({ statusCode: 400, message: '日期和序号不能为空' })
}
try {
// 检查是否存在
const existing = await db.select().from(expectedPlayDates).where(eq(expectedPlayDates.date, date))
if (existing.length > 0) {
// 更新
const result = await db.update(expectedPlayDates)
.set({ availableSequences })
.where(eq(expectedPlayDates.date, date))
.returning()
return result[0]
} else {
// 新增
const result = await db.insert(expectedPlayDates)
.values({ date, availableSequences })
.returning()
return result[0]
}
} catch (e: any) {
throw createError({ statusCode: 500, message: e.message || '保存失败' })
}
}
})