From 93aaf92c55b74117c5befe717a18bbd92494a193 Mon Sep 17 00:00:00 2001 From: Zack Pollard Date: Mon, 4 Aug 2025 12:00:35 +0100 Subject: [PATCH] wip --- .../middleware/asset-upload.interceptor.ts | 2 ++ .../src/middleware/file-upload.interceptor.ts | 25 +++++++++++++++++++ server/src/services/asset-media.service.ts | 6 +++++ 3 files changed, 33 insertions(+) diff --git a/server/src/middleware/asset-upload.interceptor.ts b/server/src/middleware/asset-upload.interceptor.ts index 0f1eaa4ce5..3d564c8e13 100644 --- a/server/src/middleware/asset-upload.interceptor.ts +++ b/server/src/middleware/asset-upload.interceptor.ts @@ -16,7 +16,9 @@ export class AssetUploadInterceptor implements NestInterceptor { const res = context.switchToHttp().getResponse>(); const checksum = fromMaybeArray(req.headers[ImmichHeader.Checksum]); + console.log('AssetUploadInterceptor checksum:', checksum); const response = await this.service.getUploadAssetIdByChecksum(req.user, checksum); + console.log('AssetUploadInterceptor response:', response); if (response) { res.status(200); return of({ status: AssetMediaStatus.DUPLICATE, id: response.id }); diff --git a/server/src/middleware/file-upload.interceptor.ts b/server/src/middleware/file-upload.interceptor.ts index 59c28849e1..036470b52d 100644 --- a/server/src/middleware/file-upload.interceptor.ts +++ b/server/src/middleware/file-upload.interceptor.ts @@ -103,6 +103,24 @@ export class FileUploadInterceptor implements NestInterceptor { } private filename(request: AuthRequest, file: Express.Multer.File, callback: DiskStorageCallback) { + console.log('File upload started:', file.originalname); + // @ts-expect-error abc + request.emit = (eventName: string) => { + console.log('File upload event emitted:', eventName); + }; + request.on('close', () => { + console.log('Request closed'); + }); + request.on('aborted', () => { + console.log('Request aborted, cleaning up file'); + this.defaultStorage._removeFile(request, file, (error) => { + if (error) { + this.logger.warn('Request aborted, failed to cleanup file', error); + } else { + this.logger.log('Request aborted, file cleaned up successfully'); + } + }); + }); return callbackify( () => this.assetService.getUploadFilename(asRequest(request, file)), callback as Callback, @@ -128,8 +146,15 @@ export class FileUploadInterceptor implements NestInterceptor { const hash = createHash('sha1'); file.stream.on('data', (chunk) => hash.update(chunk)); + file.stream.on('error', (error) => { + this.logger.warn('Stream error while uploading file, cleaning up', error); + this.assetService.onUploadError(request, file).catch(this.logger.error); + callback(error); + }); + console.log('File upload started:', file.originalname); this.defaultStorage._handleFile(request, file, (error, info) => { if (error) { + console.error('Error handling file upload:', error); hash.destroy(); callback(error); } else { diff --git a/server/src/services/asset-media.service.ts b/server/src/services/asset-media.service.ts index 517a1f665f..03cdb8a4e1 100644 --- a/server/src/services/asset-media.service.ts +++ b/server/src/services/asset-media.service.ts @@ -131,6 +131,7 @@ export class AssetMediaService extends BaseService { sidecarFile?: UploadFile, ): Promise { try { + console.log(`Uploading asset: ${file.originalPath}, size: ${file.size}`); await this.requireAccess({ auth, permission: Permission.AssetUpload, @@ -138,20 +139,25 @@ export class AssetMediaService extends BaseService { ids: [auth.user.id], }); + console.log(`User quota: ${auth.user.quotaSizeInBytes}, usage: ${auth.user.quotaUsageInBytes}`); this.requireQuota(auth, file.size); + console.log(`Asset type: ${file.originalName}, checksum: ${file.checksum}`); if (dto.livePhotoVideoId) { await onBeforeLink( { asset: this.assetRepository, event: this.eventRepository }, { userId: auth.user.id, livePhotoVideoId: dto.livePhotoVideoId }, ); } + console.log(`Creating asset with deviceAssetId: ${dto.deviceAssetId}, deviceId: ${dto.deviceId}`); const asset = await this.create(auth.user.id, dto, file, sidecarFile); + console.log(`Asset created with id: ${asset.id}, originalPath: ${asset.originalPath}`); await this.userRepository.updateUsage(auth.user.id, file.size); return { id: asset.id, status: AssetMediaStatus.CREATED }; } catch (error: any) { + console.log(`Error uploading asset: ${error.message}, ${file.originalPath}`, error); return this.handleUploadError(error, auth, file, sidecarFile); } }