增强关键接口幂等与限流保护

This commit is contained in:
yml2213
2026-05-26 08:32:15 +08:00
parent dea3023825
commit 49ac82698f
7 changed files with 369 additions and 10 deletions
@@ -3,7 +3,7 @@ import path from 'node:path'
import { PROJECT_ROOT } from '../../config/runtime.js'
import { createTaskEvent } from '../../repositories/task-event-repo.js'
import { updateTask } from '../../repositories/task-repo.js'
import { getTaskById, updateTask, updateTaskStatusIfCurrent } from '../../repositories/task-repo.js'
import { createHttpError } from '../../utils/http.js'
import { nowIso } from '../../utils/time.js'
import {
@@ -201,7 +201,7 @@ export async function confirmKuaishouCloudClaimRole(token: unknown) {
})
}
if (['role_confirmed', 'dispatched_pending_return', 'completed'].includes(String(context.task.task_status || '').trim())) {
if (['role_confirmed', 'redeeming', 'dispatched_pending_return', 'completed', 'manual_review'].includes(String(context.task.task_status || '').trim())) {
return getKuaishouCloudClaimDetail(token)
}
@@ -257,18 +257,58 @@ export async function redeemKuaishouCloudClaim(token: unknown) {
})
}
if (context.task.task_status !== 'role_confirmed') {
const currentStatus = String(context.task.task_status || '').trim()
if (['redeeming', 'dispatched_pending_return', 'completed', 'manual_review'].includes(currentStatus)) {
return getKuaishouCloudClaimDetail(token)
}
if (currentStatus !== 'role_confirmed') {
throw createHttpError('请先确认角色信息', {
statusCode: 409,
errorCode: 'claim_kuaishou_cloud_role_not_confirmed',
})
}
await dispatchKuaishouCloudFulfillmentTask(context.task, {
source: 'claim_page_redeem',
actor: { source: 'claim_page' },
autoFinalize: true,
const lockedTask = await updateTaskStatusIfCurrent(context.task.id, 'role_confirmed', {
task_status: 'redeeming',
user_action_status: 'not_required',
last_error: '',
updated_at: now,
})
if (!lockedTask) {
return getKuaishouCloudClaimDetail(token)
}
try {
await dispatchKuaishouCloudFulfillmentTask(lockedTask, {
source: 'claim_page_redeem',
actor: { source: 'claim_page' },
autoFinalize: true,
})
} catch (error) {
const latestTask = await getTaskById(lockedTask.id)
if (latestTask && String(latestTask.task_status || '').trim() !== 'redeeming') {
return getKuaishouCloudClaimDetail(token)
}
const message = error instanceof Error ? error.message : '兑换请求提交失败,请联系客服处理'
await updateTask(lockedTask.id, {
task_status: 'manual_review',
user_action_status: 'not_required',
last_error: message,
result_code: 'kuaishou_cloud_redeem_failed',
result_message: message,
updated_at: nowIso(),
})
await createTaskEvent(lockedTask.id, 'kuaishou_cloud_redeem_failed', {
source: 'claim_page_redeem',
errorMessage: message,
}, nowIso())
throw error
}
return getKuaishouCloudClaimDetail(token)
}