From 43f7bd3a2671af26a71a4d76e9d6676bb0185b48 Mon Sep 17 00:00:00 2001 From: Yichen Zhao Date: Tue, 18 Nov 2025 11:23:14 +0800 Subject: [PATCH 1/4] refactor(wizard): add uploaded task api --- src/s3/s3.service.ts | 9 +++++++++ src/wizard/dto/task-callback.dto.ts | 4 ++-- src/wizard/internal.wizard.controller.ts | 16 +++++++++++++++- src/wizard/wizard.service.ts | 19 +++++++++++++++++-- 4 files changed, 43 insertions(+), 5 deletions(-) diff --git a/src/s3/s3.service.ts b/src/s3/s3.service.ts index 87c9b13e..11077048 100644 --- a/src/s3/s3.service.ts +++ b/src/s3/s3.service.ts @@ -233,6 +233,15 @@ export class S3Service implements OnModuleInit { }); } + async generateUploadUrl(key: string, isPublic: boolean): Promise { + const s3Client = isPublic ? this.s3PublicClient : this.s3Client; + const command = new PutObjectCommand({ + Bucket: this.bucket, + Key: key, + }); + return await getSignedUrl(s3Client, command, { expiresIn: 900 }); + } + async generateDownloadUrl( key: string, isPublic: boolean, diff --git a/src/wizard/dto/task-callback.dto.ts b/src/wizard/dto/task-callback.dto.ts index 4ade1128..e1c9baa4 100644 --- a/src/wizard/dto/task-callback.dto.ts +++ b/src/wizard/dto/task-callback.dto.ts @@ -9,8 +9,8 @@ export class TaskCallbackDto { id: string; @IsOptional() - exception: Record; + exception?: Record; @IsOptional() - output: Record; + output?: Record; } diff --git a/src/wizard/internal.wizard.controller.ts b/src/wizard/internal.wizard.controller.ts index f1093fdb..8d7e3ee6 100644 --- a/src/wizard/internal.wizard.controller.ts +++ b/src/wizard/internal.wizard.controller.ts @@ -5,7 +5,7 @@ import { transformKeysToSnakeCase } from 'omniboxd/interceptor/utils'; import { TaskCallbackDto } from 'omniboxd/wizard/dto/task-callback.dto'; import { ChunkCallbackDto } from 'omniboxd/wizard/dto/chunk-callback.dto'; import { ChunkManagerService } from 'omniboxd/wizard/chunk-manager.service'; -import { Body, Controller, Get, Post, Query, Res } from '@nestjs/common'; +import { Body, Controller, Get, Param, Post, Query, Res } from '@nestjs/common'; import { FetchTaskRequest } from 'omniboxd/wizard/dto/fetch-task-request.dto'; @Controller('internal/api/v1/wizard') @@ -33,6 +33,20 @@ export class InternalWizardController { return await this.wizardService.taskDoneCallback(taskCallback); } + @Public() + @Post('tasks/:taskId/upload') + async createTaskResult(@Param('taskId') taskId: string) { + const url = await this.wizardService.createTaskUploadUrl(taskId); + return { url }; + } + + @Public() + @Post('tasks/:taskId/callback') + async handleUploadedTaskCallback(@Param('taskId') taskId: string) { + const url = await this.wizardService.createTaskUploadUrl(taskId); + return { url }; + } + @Public() @Post('callback/chunk') async handleChunkCallback( diff --git a/src/wizard/wizard.service.ts b/src/wizard/wizard.service.ts index 92b598bd..442a119b 100644 --- a/src/wizard/wizard.service.ts +++ b/src/wizard/wizard.service.ts @@ -29,6 +29,7 @@ import { isEmpty } from 'omniboxd/utils/is-empty'; import { FetchTaskRequest } from 'omniboxd/wizard/dto/fetch-task-request.dto'; import { S3Service } from 'omniboxd/s3/s3.service'; import { createGunzip } from 'zlib'; +import { buffer } from 'node:stream/consumers'; import { SharedResourcesService } from 'omniboxd/shared-resources/shared-resources.service'; import { ResourcesService } from 'omniboxd/resources/resources.service'; @@ -227,6 +228,20 @@ export class WizardService { return { task_id: task.id, resource_id: resource.id }; } + async createTaskUploadUrl(taskId: string): Promise { + return await this.s3Service.generateUploadUrl( + `wizard-tasks/${taskId}`, + true, + ); + } + + async uploadedTaskDoneCallback(taskId: string) { + const { stream } = await this.s3Service.getObject(`wizard-tasks/${taskId}`); + const payload = await buffer(stream); + const taskCallback: TaskCallbackDto = JSON.parse(payload.toString('utf-8')); + return this.taskDoneCallback(taskCallback); + } + async taskDoneCallback(data: TaskCallbackDto) { const task = await this.wizardTaskService.taskRepository.findOneOrFail({ where: { id: data.id }, @@ -244,8 +259,8 @@ export class WizardService { } task.endedAt = new Date(); - task.exception = data.exception; - task.output = data.output; + task.exception = data.exception || null; + task.output = data.output || null; await this.preprocessTask(task); await this.wizardTaskService.taskRepository.save(task); From 50677598c27ca69e3eaec7dd7009e06fd73ad480 Mon Sep 17 00:00:00 2001 From: Yichen Zhao Date: Tue, 18 Nov 2025 11:39:23 +0800 Subject: [PATCH 2/4] fix(wizard): fix callback --- src/wizard/internal.wizard.controller.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/wizard/internal.wizard.controller.ts b/src/wizard/internal.wizard.controller.ts index 8d7e3ee6..3f48a444 100644 --- a/src/wizard/internal.wizard.controller.ts +++ b/src/wizard/internal.wizard.controller.ts @@ -43,8 +43,7 @@ export class InternalWizardController { @Public() @Post('tasks/:taskId/callback') async handleUploadedTaskCallback(@Param('taskId') taskId: string) { - const url = await this.wizardService.createTaskUploadUrl(taskId); - return { url }; + return await this.wizardService.uploadedTaskDoneCallback(taskId); } @Public() From 19a5f07bb52b60136982d996708b1688bd723723 Mon Sep 17 00:00:00 2001 From: Yichen Zhao Date: Tue, 18 Nov 2025 12:03:29 +0800 Subject: [PATCH 3/4] refactor(wizard): delete payload object --- src/wizard/wizard.service.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/wizard/wizard.service.ts b/src/wizard/wizard.service.ts index 442a119b..e26c3cb6 100644 --- a/src/wizard/wizard.service.ts +++ b/src/wizard/wizard.service.ts @@ -236,10 +236,13 @@ export class WizardService { } async uploadedTaskDoneCallback(taskId: string) { - const { stream } = await this.s3Service.getObject(`wizard-tasks/${taskId}`); + const key = `wizard-tasks/${taskId}`; + const { stream } = await this.s3Service.getObject(key); const payload = await buffer(stream); const taskCallback: TaskCallbackDto = JSON.parse(payload.toString('utf-8')); - return this.taskDoneCallback(taskCallback); + const result = await this.taskDoneCallback(taskCallback); + await this.s3Service.deleteObject(key); + return result; } async taskDoneCallback(data: TaskCallbackDto) { From 81455e267b67382427e5922f2b2bf0cb60a31c58 Mon Sep 17 00:00:00 2001 From: Yichen Zhao Date: Tue, 18 Nov 2025 14:28:20 +0800 Subject: [PATCH 4/4] refactor(otel): update url --- src/tracing.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tracing.ts b/src/tracing.ts index 6ba8dfdf..9602309e 100644 --- a/src/tracing.ts +++ b/src/tracing.ts @@ -44,7 +44,7 @@ if (isTracingEnabled()) { instrumentations: [ new HttpInstrumentation({ ignoreIncomingRequestHook: (req) => { - return excludedUrls.some((url) => req.url?.includes(url)) || false; + return excludedUrls.some((url) => req.url === url) || false; }, }), new ExpressInstrumentation({