11import {
2- type UIMessage ,
2+ appendClientMessage ,
33 appendResponseMessages ,
44 createDataStreamResponse ,
55 smoothStream ,
@@ -11,14 +11,11 @@ import {
1111 deleteChatById ,
1212 getChatById ,
1313 getMessageCountByUserId ,
14+ getMessagesByChatId ,
1415 saveChat ,
1516 saveMessages ,
1617} from '@/lib/db/queries' ;
17- import {
18- generateUUID ,
19- getMostRecentUserMessage ,
20- getTrailingMessageId ,
21- } from '@/lib/utils' ;
18+ import { generateUUID , getTrailingMessageId } from '@/lib/utils' ;
2219import { generateTitleFromUserMessage } from '../../actions' ;
2320import { createDocument } from '@/lib/ai/tools/create-document' ;
2421import { updateDocument } from '@/lib/ai/tools/update-document' ;
@@ -27,24 +24,26 @@ import { getWeather } from '@/lib/ai/tools/get-weather';
2724import { isProductionEnvironment } from '@/lib/constants' ;
2825import { myProvider } from '@/lib/ai/providers' ;
2926import { entitlementsByUserType } from '@/lib/ai/entitlements' ;
27+ import { postRequestBodySchema , type PostRequestBody } from './schema' ;
3028
3129export const maxDuration = 60 ;
3230
3331export async function POST ( request : Request ) {
32+ let requestBody : PostRequestBody ;
33+
34+ try {
35+ const json = await request . json ( ) ;
36+ requestBody = postRequestBodySchema . parse ( json ) ;
37+ } catch ( _ ) {
38+ return new Response ( 'Invalid request body' , { status : 400 } ) ;
39+ }
40+
3441 try {
35- const {
36- id,
37- messages,
38- selectedChatModel,
39- } : {
40- id : string ;
41- messages : Array < UIMessage > ;
42- selectedChatModel : string ;
43- } = await request . json ( ) ;
42+ const { id, message, selectedChatModel } = requestBody ;
4443
4544 const session = await auth ( ) ;
4645
47- if ( ! session ?. user ?. id ) {
46+ if ( ! session ?. user ) {
4847 return new Response ( 'Unauthorized' , { status : 401 } ) ;
4948 }
5049
@@ -64,17 +63,11 @@ export async function POST(request: Request) {
6463 ) ;
6564 }
6665
67- const userMessage = getMostRecentUserMessage ( messages ) ;
68-
69- if ( ! userMessage ) {
70- return new Response ( 'No user message found' , { status : 400 } ) ;
71- }
72-
7366 const chat = await getChatById ( { id } ) ;
7467
7568 if ( ! chat ) {
7669 const title = await generateTitleFromUserMessage ( {
77- message : userMessage ,
70+ message,
7871 } ) ;
7972
8073 await saveChat ( { id, userId : session . user . id , title } ) ;
@@ -84,14 +77,22 @@ export async function POST(request: Request) {
8477 }
8578 }
8679
80+ const previousMessages = await getMessagesByChatId ( { id } ) ;
81+
82+ const messages = appendClientMessage ( {
83+ // @ts -expect-error: todo add type conversion from DBMessage[] to UIMessage[]
84+ messages : previousMessages ,
85+ message,
86+ } ) ;
87+
8788 await saveMessages ( {
8889 messages : [
8990 {
9091 chatId : id ,
91- id : userMessage . id ,
92+ id : message . id ,
9293 role : 'user' ,
93- parts : userMessage . parts ,
94- attachments : userMessage . experimental_attachments ?? [ ] ,
94+ parts : message . parts ,
95+ attachments : message . experimental_attachments ?? [ ] ,
9596 createdAt : new Date ( ) ,
9697 } ,
9798 ] ,
@@ -138,7 +139,7 @@ export async function POST(request: Request) {
138139 }
139140
140141 const [ , assistantMessage ] = appendResponseMessages ( {
141- messages : [ userMessage ] ,
142+ messages : [ message ] ,
142143 responseMessages : response . messages ,
143144 } ) ;
144145
@@ -176,7 +177,7 @@ export async function POST(request: Request) {
176177 return 'Oops, an error occurred!' ;
177178 } ,
178179 } ) ;
179- } catch ( error ) {
180+ } catch ( _ ) {
180181 return new Response ( 'An error occurred while processing your request!' , {
181182 status : 500 ,
182183 } ) ;
0 commit comments