( params: PerformCompleteJobParams )
| 507 | } |
| 508 | |
| 509 | export async function performCompleteJob( |
| 510 | params: PerformCompleteJobParams |
| 511 | ): Promise<PerformScheduleResult> { |
| 512 | const [job] = await db |
| 513 | .select() |
| 514 | .from(workflowSchedule) |
| 515 | .where(activeJobCondition(params.jobId, params.workspaceId)) |
| 516 | .limit(1) |
| 517 | |
| 518 | if (!job) |
| 519 | return { success: false, error: `Job not found: ${params.jobId}`, errorCode: 'not_found' } |
| 520 | if (job.status === 'completed') return { success: true, schedule: job, alreadyCompleted: true } |
| 521 | |
| 522 | const [updatedJob] = await db |
| 523 | .update(workflowSchedule) |
| 524 | .set({ status: 'completed', nextRunAt: null, updatedAt: new Date() }) |
| 525 | .where(and(eq(workflowSchedule.id, params.jobId), isNull(workflowSchedule.archivedAt))) |
| 526 | .returning() |
| 527 | |
| 528 | recordAudit({ |
| 529 | workspaceId: params.workspaceId, |
| 530 | actorId: params.userId, |
| 531 | actorName: params.actorName ?? undefined, |
| 532 | actorEmail: params.actorEmail ?? undefined, |
| 533 | action: AuditAction.SCHEDULE_UPDATED, |
| 534 | resourceType: AuditResourceType.SCHEDULE, |
| 535 | resourceId: params.jobId, |
| 536 | description: 'Completed job', |
| 537 | metadata: { operation: 'complete' }, |
| 538 | request: params.request, |
| 539 | }) |
| 540 | |
| 541 | return { success: true, schedule: updatedJob, alreadyCompleted: false } |
| 542 | } |
no test coverage detected