|
|
@ -1,7 +1,7 @@ |
|
|
import { dbGlobal } from "drizzle-pkg/lib/db"; |
|
|
import { dbGlobal } from "drizzle-pkg/lib/db"; |
|
|
import { agentSessions, agentMessages, agentMessageFeedback } from "drizzle-pkg/lib/schema/agent"; |
|
|
import { agentSessions, agentMessages, agentMessageFeedback } from "drizzle-pkg/lib/schema/agent"; |
|
|
import { eq, desc, asc, and, lt, isNull, sql, max } from "drizzle-orm"; |
|
|
import { eq, desc, asc, and, lt, isNull, sql, max } from "drizzle-orm"; |
|
|
import type { AgentSessionRow, AgentMessageRow } from "./types"; |
|
|
import type { AgentSessionRow, AgentMessageRow, AgentMessageWithFeedback } from "./types"; |
|
|
|
|
|
|
|
|
export async function createSession(params: { |
|
|
export async function createSession(params: { |
|
|
userId?: number | null; |
|
|
userId?: number | null; |
|
|
@ -118,28 +118,47 @@ export async function softDeleteSession(id: string): Promise<void> { |
|
|
|
|
|
|
|
|
export async function getMessagesBySession( |
|
|
export async function getMessagesBySession( |
|
|
sessionId: string, |
|
|
sessionId: string, |
|
|
params?: { before?: number; limit?: number; latest?: boolean }, |
|
|
params?: { before?: number; limit?: number; latest?: boolean; userId?: number | null }, |
|
|
): Promise<AgentMessageRow[]> { |
|
|
): Promise<AgentMessageWithFeedback[]> { |
|
|
const { before, limit = 50, latest = false } = params ?? {}; |
|
|
const { before, limit = 50, latest = false, userId = null } = params ?? {}; |
|
|
const conditions = [eq(agentMessages.sessionId, sessionId)]; |
|
|
const conditions = [eq(agentMessages.sessionId, sessionId)]; |
|
|
if (before !== undefined) { |
|
|
if (before !== undefined) { |
|
|
conditions.push(lt(agentMessages.sortOrder, before)); |
|
|
conditions.push(lt(agentMessages.sortOrder, before)); |
|
|
} |
|
|
} |
|
|
if (latest) { |
|
|
|
|
|
const rows = await dbGlobal |
|
|
const baseQuery = () => |
|
|
.select() |
|
|
dbGlobal |
|
|
|
|
|
.select({ |
|
|
|
|
|
message: agentMessages, |
|
|
|
|
|
feedback: agentMessageFeedback.feedback, |
|
|
|
|
|
}) |
|
|
.from(agentMessages) |
|
|
.from(agentMessages) |
|
|
.where(and(...conditions)) |
|
|
.leftJoin( |
|
|
|
|
|
agentMessageFeedback, |
|
|
|
|
|
and( |
|
|
|
|
|
eq(agentMessageFeedback.messageId, agentMessages.id), |
|
|
|
|
|
userId ? eq(agentMessageFeedback.userId, userId) : sql`false`, |
|
|
|
|
|
), |
|
|
|
|
|
) |
|
|
|
|
|
.where(and(...conditions)); |
|
|
|
|
|
|
|
|
|
|
|
if (latest) { |
|
|
|
|
|
const rows = await baseQuery() |
|
|
.orderBy(desc(agentMessages.sortOrder)) |
|
|
.orderBy(desc(agentMessages.sortOrder)) |
|
|
.limit(limit); |
|
|
.limit(limit); |
|
|
return rows.reverse(); |
|
|
const reversed = rows.reverse(); |
|
|
|
|
|
return reversed.map((r) => ({ |
|
|
|
|
|
...r.message, |
|
|
|
|
|
feedback: (r.feedback ?? null) as "like" | "dislike" | null, |
|
|
|
|
|
})); |
|
|
} |
|
|
} |
|
|
return dbGlobal |
|
|
const rows = await baseQuery() |
|
|
.select() |
|
|
|
|
|
.from(agentMessages) |
|
|
|
|
|
.where(and(...conditions)) |
|
|
|
|
|
.orderBy(asc(agentMessages.sortOrder)) |
|
|
.orderBy(asc(agentMessages.sortOrder)) |
|
|
.limit(limit); |
|
|
.limit(limit); |
|
|
|
|
|
return rows.map((r) => ({ |
|
|
|
|
|
...r.message, |
|
|
|
|
|
feedback: (r.feedback ?? null) as "like" | "dislike" | null, |
|
|
|
|
|
})); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
export async function getMaxSortOrder(sessionId: string): Promise<number> { |
|
|
export async function getMaxSortOrder(sessionId: string): Promise<number> { |
|
|
|