@@ -10,10 +10,12 @@ import { withRouteHandler } from '@/lib/core/utils/with-route-handler'
1010import { processFilesToUserFiles } from '@/lib/uploads/utils/file-utils'
1111import { downloadFileFromStorage } from '@/lib/uploads/utils/file-utils.server'
1212import type { MicrosoftGraphDriveItem } from '@/tools/onedrive/types'
13+ import type { SharepointSkippedFile , SharepointUploadError } from '@/tools/sharepoint/types'
1314
1415export const dynamic = 'force-dynamic'
1516
1617const logger = createLogger ( 'SharepointUploadAPI' )
18+ const MAX_SHAREPOINT_UPLOAD_BYTES = 250 * 1024 * 1024
1719
1820export const POST = withRouteHandler ( async ( request : NextRequest ) => {
1921 const requestId = generateRequestId ( )
@@ -76,6 +78,8 @@ export const POST = withRouteHandler(async (request: NextRequest) => {
7678 const siteId = validatedData . siteId . trim ( ) || 'root'
7779 const driveId = validatedData . driveId ?. trim ( ) || null
7880 const uploadedFiles : MicrosoftGraphDriveItem [ ] = [ ]
81+ const skippedFiles : SharepointSkippedFile [ ] = [ ]
82+ const errors : SharepointUploadError [ ] = [ ]
7983
8084 for ( const userFile of userFiles ) {
8185 logger . info ( `[${ requestId } ] Uploading file: ${ userFile . name } ` )
@@ -87,10 +91,16 @@ export const POST = withRouteHandler(async (request: NextRequest) => {
8791
8892 const fileSizeMB = buffer . length / ( 1024 * 1024 )
8993
90- if ( fileSizeMB > 250 ) {
94+ if ( buffer . length > MAX_SHAREPOINT_UPLOAD_BYTES ) {
9195 logger . warn (
9296 `[${ requestId } ] File ${ fileName } is ${ fileSizeMB . toFixed ( 2 ) } MB, exceeds 250MB limit`
9397 )
98+ skippedFiles . push ( {
99+ name : fileName ,
100+ size : buffer . length ,
101+ limit : MAX_SHAREPOINT_UPLOAD_BYTES ,
102+ reason : 'File exceeds the 250 MB Microsoft Graph small upload limit' ,
103+ } )
94104 continue
95105 }
96106
@@ -155,13 +165,12 @@ export const POST = withRouteHandler(async (request: NextRequest) => {
155165 error ?: { message ?: string }
156166 }
157167 logger . error ( `[${ requestId } ] Failed to replace file ${ fileName } :` , replaceErrorData )
158- return NextResponse . json (
159- {
160- success : false ,
161- error : replaceErrorData . error ?. message || `Failed to replace file: ${ fileName } ` ,
162- } ,
163- { status : replaceResponse . status }
164- )
168+ errors . push ( {
169+ name : fileName ,
170+ status : replaceResponse . status ,
171+ error : replaceErrorData . error ?. message || `Failed to replace file: ${ fileName } ` ,
172+ } )
173+ continue
165174 }
166175
167176 const replaceData = ( await replaceResponse . json ( ) ) as {
@@ -185,15 +194,14 @@ export const POST = withRouteHandler(async (request: NextRequest) => {
185194 continue
186195 }
187196
188- return NextResponse . json (
189- {
190- success : false ,
191- error :
192- ( errorData as { error ?: { message ?: string } } ) . error ?. message ||
193- `Failed to upload file: ${ fileName } ` ,
194- } ,
195- { status : uploadResponse . status }
196- )
197+ errors . push ( {
198+ name : fileName ,
199+ status : uploadResponse . status ,
200+ error :
201+ ( errorData as { error ?: { message ?: string } } ) . error ?. message ||
202+ `Failed to upload file: ${ fileName } ` ,
203+ } )
204+ continue
197205 }
198206
199207 const uploadData = ( await uploadResponse . json ( ) ) as MicrosoftGraphDriveItem
@@ -210,22 +218,33 @@ export const POST = withRouteHandler(async (request: NextRequest) => {
210218 }
211219
212220 if ( uploadedFiles . length === 0 ) {
213- return NextResponse . json (
214- {
215- success : false ,
216- error : 'No files were uploaded successfully' ,
221+ return NextResponse . json ( {
222+ success : false ,
223+ error : 'No files were uploaded successfully' ,
224+ output : {
225+ uploadedFiles,
226+ fileCount : 0 ,
227+ skippedFiles,
228+ skippedCount : skippedFiles . length ,
229+ errors,
217230 } ,
218- { status : 400 }
219- )
231+ } )
220232 }
221233
222- logger . info ( `[${ requestId } ] Successfully uploaded ${ uploadedFiles . length } file(s)` )
234+ logger . info ( `[${ requestId } ] Completed SharePoint upload` , {
235+ uploadedCount : uploadedFiles . length ,
236+ skippedCount : skippedFiles . length ,
237+ errorCount : errors . length ,
238+ } )
223239
224240 return NextResponse . json ( {
225241 success : true ,
226242 output : {
227243 uploadedFiles,
228244 fileCount : uploadedFiles . length ,
245+ skippedFiles,
246+ skippedCount : skippedFiles . length ,
247+ errors,
229248 } ,
230249 } )
231250 } catch ( error ) {
0 commit comments