58 lines
1.9 KiB
TypeScript
58 lines
1.9 KiB
TypeScript
import db from "../../db";
|
|
import {
|
|
chatMessages,
|
|
type NewChatMessage,
|
|
} from "../../db/schema/chatMessages";
|
|
import { eq, desc, sql } from "drizzle-orm";
|
|
|
|
/**
|
|
* Сохранить новое сообщение в чате
|
|
*/
|
|
export async function saveChatMessage(message: NewChatMessage) {
|
|
try {
|
|
console.log("[saveChatMessage] Attempting to insert message:", message);
|
|
const [newMessage] = await db
|
|
.insert(chatMessages)
|
|
.values(message)
|
|
.returning();
|
|
console.log("[saveChatMessage] Message inserted successfully:", newMessage);
|
|
return newMessage;
|
|
} catch (error) {
|
|
console.error("[saveChatMessage] Database error:", error);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Получить историю сообщений для сессии
|
|
* @param sessionId ID сессии
|
|
* @param limit Максимальное количество сообщений (по умолчанию 100)
|
|
*/
|
|
export async function getChatHistory(sessionId: string, limit = 100) {
|
|
const messages = await db
|
|
.select({
|
|
id: chatMessages.id,
|
|
// senderId - это либо userId (для авторизованных), либо guestId (для гостей)
|
|
senderId: sql<string>`COALESCE(${chatMessages.userId}, ${chatMessages.guestId})`.as('senderId'),
|
|
senderName: chatMessages.senderName,
|
|
content: chatMessages.content,
|
|
timestamp: chatMessages.createdAt,
|
|
type: chatMessages.type,
|
|
})
|
|
.from(chatMessages)
|
|
.where(eq(chatMessages.sessionId, sessionId))
|
|
.orderBy(desc(chatMessages.createdAt))
|
|
.limit(limit);
|
|
|
|
// Возвращаем в правильном порядке (старые сначала)
|
|
return messages.reverse();
|
|
}
|
|
|
|
/**
|
|
* Удалить все сообщения для сессии
|
|
* @param sessionId ID сессии
|
|
*/
|
|
export async function deleteChatHistory(sessionId: string) {
|
|
await db.delete(chatMessages).where(eq(chatMessages.sessionId, sessionId));
|
|
}
|