52 lines
1.6 KiB
TypeScript
52 lines
1.6 KiB
TypeScript
|
|
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()
|
|||
|
|
|
|||
|
|
if (!table) {
|
|||
|
|
throw createError({
|
|||
|
|
statusCode: 400,
|
|||
|
|
statusMessage: 'Table name 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 originalValidateCreate = service['validateCreate']
|
|||
|
|
service['validateCreate'] = async (data: any) => {
|
|||
|
|
if (!data.title) {
|
|||
|
|
const error = new Error('Title is required')
|
|||
|
|
;(error as any).statusCode = 400
|
|||
|
|
throw error
|
|||
|
|
}
|
|||
|
|
await originalValidateCreate.call(service, data)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
const { create } = createCrudHandlers(service)
|
|||
|
|
return await create(event)
|
|||
|
|
})
|