You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

66 lines
1.9 KiB

import { defineWrappedResponseHandler } from "#server/utils/handler";
import { R } from "#server/utils/response";
import { getCurrentUser } from "#server/utils/context";
import { dbGlobal } from "drizzle-pkg/lib/db";
import { agentMessageFeedback } from "drizzle-pkg/lib/schema/agent";
import { agentMessages } from "drizzle-pkg/lib/schema/agent";
import { eq, and } from "drizzle-orm";
export default defineWrappedResponseHandler(async (event) => {
const user = await getCurrentUser(event);
if (!user) {
return R.error("仅登录用户可提交反馈", null);
}
const body = await readBody(event);
const { messageId, feedback, comment } = body as {
messageId: string;
feedback: "like" | "dislike" | null;
comment?: string;
};
if (!messageId || (feedback !== null && !["like", "dislike"].includes(feedback))) {
return R.error("参数无效", null);
}
const [message] = await dbGlobal
.select({ id: agentMessages.id })
.from(agentMessages)
.where(eq(agentMessages.id, messageId))
.limit(1);
if (!message) {
return R.error("消息不存在", null);
}
const [existing] = await dbGlobal
.select()
.from(agentMessageFeedback)
.where(and(eq(agentMessageFeedback.messageId, messageId), eq(agentMessageFeedback.userId, user.id)))
.limit(1);
if (feedback === null) {
if (existing) {
await dbGlobal
.delete(agentMessageFeedback)
.where(eq(agentMessageFeedback.id, existing.id));
}
return R.success({ messageId, feedback: null });
}
if (existing) {
await dbGlobal
.update(agentMessageFeedback)
.set({ feedback, comment: comment ?? null, updatedAt: new Date() })
.where(eq(agentMessageFeedback.id, existing.id));
} else {
await dbGlobal.insert(agentMessageFeedback).values({
messageId,
userId: user.id,
feedback,
comment: comment ?? null,
});
}
return R.success({ messageId, feedback });
});