Files
stream.graff.tech-new/server/src/services/chat/index.ts
T

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