From bab5dba6e1800d6f54aa660a75861479111fabbc Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 19 Mar 2025 13:42:15 +0530 Subject: [PATCH] feat(app): port history saving features --- ui/app/api/chats/[id]/route.ts | 69 ++++++++++++++++++++++++++++++++++ ui/app/api/chats/route.ts | 15 ++++++++ ui/app/c/[chatId]/page.tsx | 6 ++- ui/app/library/page.tsx | 2 +- ui/components/DeleteChat.tsx | 13 +++---- 5 files changed, 94 insertions(+), 11 deletions(-) create mode 100644 ui/app/api/chats/[id]/route.ts create mode 100644 ui/app/api/chats/route.ts diff --git a/ui/app/api/chats/[id]/route.ts b/ui/app/api/chats/[id]/route.ts new file mode 100644 index 0000000..6891454 --- /dev/null +++ b/ui/app/api/chats/[id]/route.ts @@ -0,0 +1,69 @@ +import db from '@/lib/db'; +import { chats, messages } from '@/lib/db/schema'; +import { eq } from 'drizzle-orm'; + +export const GET = async ( + req: Request, + { params }: { params: Promise<{ id: string }> }, +) => { + try { + const { id } = await params; + + const chatExists = await db.query.chats.findFirst({ + where: eq(chats.id, id), + }); + + if (!chatExists) { + return Response.json({ message: 'Chat not found' }, { status: 404 }); + } + + const chatMessages = await db.query.messages.findMany({ + where: eq(messages.chatId, id), + }); + + return Response.json( + { + chat: chatExists, + messages: chatMessages, + }, + { status: 200 }, + ); + } catch (err) { + console.error('Error in getting chat by id: ', err); + return Response.json( + { message: 'An error has occurred.' }, + { status: 500 }, + ); + } +}; + +export const DELETE = async ( + req: Request, + { params }: { params: Promise<{ id: string }> }, +) => { + try { + const { id } = await params; + + const chatExists = await db.query.chats.findFirst({ + where: eq(chats.id, id), + }); + + if (!chatExists) { + return Response.json({ message: 'Chat not found' }, { status: 404 }); + } + + await db.delete(chats).where(eq(chats.id, id)).execute(); + await db.delete(messages).where(eq(messages.chatId, id)).execute(); + + return Response.json( + { message: 'Chat deleted successfully' }, + { status: 200 }, + ); + } catch (err) { + console.error('Error in deleting chat by id: ', err); + return Response.json( + { message: 'An error has occurred.' }, + { status: 500 }, + ); + } +}; diff --git a/ui/app/api/chats/route.ts b/ui/app/api/chats/route.ts new file mode 100644 index 0000000..986a192 --- /dev/null +++ b/ui/app/api/chats/route.ts @@ -0,0 +1,15 @@ +import db from '@/lib/db'; + +export const GET = async (req: Request) => { + try { + let chats = await db.query.chats.findMany(); + chats = chats.reverse(); + return Response.json({ chats: chats }, { status: 200 }); + } catch (err) { + console.error('Error in getting chats: ', err); + return Response.json( + { message: 'An error has occurred.' }, + { status: 500 }, + ); + } +}; diff --git a/ui/app/c/[chatId]/page.tsx b/ui/app/c/[chatId]/page.tsx index dc3c92a..aac125a 100644 --- a/ui/app/c/[chatId]/page.tsx +++ b/ui/app/c/[chatId]/page.tsx @@ -1,7 +1,9 @@ import ChatWindow from '@/components/ChatWindow'; +import React from 'react'; -const Page = ({ params }: { params: { chatId: string } }) => { - return ; +const Page = ({ params }: { params: Promise<{ chatId: string }> }) => { + const { chatId } = React.use(params); + return ; }; export default Page; diff --git a/ui/app/library/page.tsx b/ui/app/library/page.tsx index 379596c..9c40b2b 100644 --- a/ui/app/library/page.tsx +++ b/ui/app/library/page.tsx @@ -21,7 +21,7 @@ const Page = () => { const fetchChats = async () => { setLoading(true); - const res = await fetch(`${process.env.NEXT_PUBLIC_API_URL}/chats`, { + const res = await fetch(`/api/chats`, { method: 'GET', headers: { 'Content-Type': 'application/json', diff --git a/ui/components/DeleteChat.tsx b/ui/components/DeleteChat.tsx index 2857fc8..3acc9fc 100644 --- a/ui/components/DeleteChat.tsx +++ b/ui/components/DeleteChat.tsx @@ -29,15 +29,12 @@ const DeleteChat = ({ const handleDelete = async () => { setLoading(true); try { - const res = await fetch( - `${process.env.NEXT_PUBLIC_API_URL}/chats/${chatId}`, - { - method: 'DELETE', - headers: { - 'Content-Type': 'application/json', - }, + const res = await fetch(`/api/chats/${chatId}`, { + method: 'DELETE', + headers: { + 'Content-Type': 'application/json', }, - ); + }); if (res.status != 200) { throw new Error('Failed to delete chat');