@@ -114,7 +114,9 @@ export async function POST(request: NextRequest) {
114114 )
115115
116116 if ( ! driveResponse . ok ) {
117- const errorData = await driveResponse . json ( ) . catch ( ( ) => ( { } ) )
117+ const errorData = ( await driveResponse . json ( ) . catch ( ( ) => ( { } ) ) ) as {
118+ error ?: { message ?: string }
119+ }
118120 logger . error ( `[${ requestId } ] Failed to get default drive:` , errorData )
119121 return NextResponse . json (
120122 {
@@ -125,7 +127,7 @@ export async function POST(request: NextRequest) {
125127 )
126128 }
127129
128- const driveData = await driveResponse . json ( )
130+ const driveData = ( await driveResponse . json ( ) ) as { id : string }
129131 effectiveDriveId = driveData . id
130132 logger . info ( `[${ requestId } ] Using default drive: ${ effectiveDriveId } ` )
131133 }
@@ -187,20 +189,76 @@ export async function POST(request: NextRequest) {
187189 logger . error ( `[${ requestId } ] Failed to upload file ${ fileName } :` , errorData )
188190
189191 if ( uploadResponse . status === 409 ) {
190- logger . warn ( `[${ requestId } ] File ${ fileName } already exists, attempting to replace` )
192+ // File exists - retry with conflict behavior set to replace
193+ logger . warn ( `[${ requestId } ] File ${ fileName } already exists, retrying with replace` )
194+ const replaceUrl = `${ uploadUrl } ?@microsoft.graph.conflictBehavior=replace`
195+ const replaceResponse = await secureFetchGraph (
196+ replaceUrl ,
197+ {
198+ method : 'PUT' ,
199+ headers : {
200+ Authorization : `Bearer ${ validatedData . accessToken } ` ,
201+ 'Content-Type' : userFile . type || 'application/octet-stream' ,
202+ } ,
203+ body : buffer ,
204+ } ,
205+ 'replaceUrl'
206+ )
207+
208+ if ( ! replaceResponse . ok ) {
209+ const replaceErrorData = ( await replaceResponse . json ( ) . catch ( ( ) => ( { } ) ) ) as {
210+ error ?: { message ?: string }
211+ }
212+ logger . error ( `[${ requestId } ] Failed to replace file ${ fileName } :` , replaceErrorData )
213+ return NextResponse . json (
214+ {
215+ success : false ,
216+ error : replaceErrorData . error ?. message || `Failed to replace file: ${ fileName } ` ,
217+ } ,
218+ { status : replaceResponse . status }
219+ )
220+ }
221+
222+ const replaceData = ( await replaceResponse . json ( ) ) as {
223+ id : string
224+ name : string
225+ webUrl : string
226+ size : number
227+ createdDateTime : string
228+ lastModifiedDateTime : string
229+ }
230+ logger . info ( `[${ requestId } ] File replaced successfully: ${ fileName } ` )
231+
232+ uploadedFiles . push ( {
233+ id : replaceData . id ,
234+ name : replaceData . name ,
235+ webUrl : replaceData . webUrl ,
236+ size : replaceData . size ,
237+ createdDateTime : replaceData . createdDateTime ,
238+ lastModifiedDateTime : replaceData . lastModifiedDateTime ,
239+ } )
191240 continue
192241 }
193242
194243 return NextResponse . json (
195244 {
196245 success : false ,
197- error : errorData . error ?. message || `Failed to upload file: ${ fileName } ` ,
246+ error :
247+ ( errorData as { error ?: { message ?: string } } ) . error ?. message ||
248+ `Failed to upload file: ${ fileName } ` ,
198249 } ,
199250 { status : uploadResponse . status }
200251 )
201252 }
202253
203- const uploadData = await uploadResponse . json ( )
254+ const uploadData = ( await uploadResponse . json ( ) ) as {
255+ id : string
256+ name : string
257+ webUrl : string
258+ size : number
259+ createdDateTime : string
260+ lastModifiedDateTime : string
261+ }
204262 logger . info ( `[${ requestId } ] File uploaded successfully: ${ fileName } ` )
205263
206264 uploadedFiles . push ( {
0 commit comments