'use server'; import { sessionUser } from '@/auth'; import prisma from './prisma'; import { ChatWithMessages, MessageRaw } from './types'; import { revalidatePath } from 'next/cache'; /** * Finds or creates a user in the database based on the provided email and name. * If the user already exists, it returns the existing user. * If the user doesn't exist, it creates a new user and returns it. * * @param email - The email of the user. * @param name - The name of the user. * @returns A promise that resolves to the user object. */ export async function dbFindOrCreateUser(email: string, name: string) { // Try to find the user by email const user = await prisma.user.findUnique({ where: { email: email }, }); // If the user doesn't exist, create it if (user) { return user; } else { return prisma.user.create({ data: { email: email, name: name, }, }); } } /** * Retrieves all chats with their associated messages for the current user. * @returns A promise that resolves to an array of `ChatWithMessages` objects. */ export async function dbGetAllChat(): Promise { const { id: userId } = await sessionUser(); if (!userId) return []; return prisma.chat.findMany({ where: { userId }, include: { messages: true, }, }); } /** * Retrieves a chat with messages from the database based on the provided ID. * @param id - The ID of the chat to retrieve. * @returns A Promise that resolves to a ChatWithMessages object if found, or null if not found. */ export async function dbGetChat(id: string): Promise { return prisma.chat.findUnique({ where: { id }, include: { messages: true, }, }); } /** * Creates a new chat in the database. * * @param {string} options.id - The ID of the chat (optional). * @param {string} options.mediaUrl - The media URL for the chat. * @param {MessageRaw[]} options.initMessages - The initial messages for the chat (optional). * @returns {Promise} The created chat object. */ export async function dbPostCreateChat({ id, mediaUrl, initMessages = [], }: { id?: string; mediaUrl: string; initMessages?: MessageRaw[]; }) { const { id: userId } = await sessionUser(); const userConnect = userId ? { user: { connect: { id: userId }, // Connect the chat to an existing user }, } : {}; try { const response = await prisma.chat.create({ data: { id, mediaUrl: mediaUrl, ...userConnect, messages: { create: initMessages.map(message => ({ ...message, ...userConnect, })), }, }, include: { messages: true, }, }); revalidatePath('/chat', 'layout'); return response; } catch (error) { console.error(error); } } /** * Creates a new message in the database. * @param chatId - The ID of the chat where the message belongs. * @param message - The message object to be created. * @returns A promise that resolves to the created message. */ export async function dbPostCreateMessage(chatId: string, message: MessageRaw) { const { id: userId } = await sessionUser(); const userConnect = userId ? { user: { connect: { id: userId }, // Connect the chat to an existing user }, } : {}; return prisma.message.create({ data: { content: message.content, role: message.role, chat: { connect: { id: chatId }, }, ...userConnect, }, }); } export async function dbDeleteChat(chatId: string) { await prisma.chat.delete({ where: { id: chatId }, }); revalidatePath('/chat', 'layout'); return; }