Files
DianZhanDemo/server/api/[table]/[id].put.ts
ch197511161 aaaf08e8f3 init6
2025-12-11 02:09:07 +08:00

60 lines
1.8 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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)
})