Files
DianZhanDemo/server/api/[table]/[id].put.ts

60 lines
1.8 KiB
TypeScript
Raw Normal View History

2025-12-11 02:09:07 +08:00
import { defineEventHandler, getRouterParam, createError } from 'h3'
import { prisma } from '../../lib/prisma'
import { BaseCrudService } from '../../lib/crud-service'
import { createCrudHandlers } from '../../lib/crud-handler'
import { Prisma } from '@prisma/client'
export default defineEventHandler(async event => {
const table = getRouterParam(event, 'table')?.toLowerCase()
const id = getRouterParam(event, 'id')
if (!table) {
throw createError({
statusCode: 400,
statusMessage: 'Table name is required',
})
}
if (!id) {
throw createError({
statusCode: 400,
statusMessage: 'Record ID is required',
})
}
// 将表名转换为 PascalCase 模型名(首字母大写,复数转单数)
let modelName = table
// 简单的复数转单数逻辑去掉结尾的s
if (modelName.endsWith('s')) {
modelName = modelName.slice(0, -1)
}
modelName = modelName.charAt(0).toUpperCase() + modelName.slice(1)
// 验证表名是否存在于 Prisma 模型中
if (!prisma[modelName as keyof typeof prisma]) {
throw createError({
statusCode: 404,
statusMessage: 'Table not found or not supported',
})
}
// 直接实例化 BaseCrudService传入动态表名
const service = new BaseCrudService(prisma, modelName as Prisma.ModelName)
// 如果是 posts 表,添加标题验证
if (table === 'posts') {
const originalValidateUpdate = service['validateUpdate']
service['validateUpdate'] = async (id: number, data: any, existing: any) => {
if (!data.title) {
const error = new Error('Title is required')
;(error as any).statusCode = 400
throw error
}
await originalValidateUpdate.call(service, id, data, existing)
}
}
const { update } = createCrudHandlers(service)
return await update(event)
})