From 7c28bba519fbfd985e4b8e6f0c268efadde79f25 Mon Sep 17 00:00:00 2001 From: huanghaipeng Date: Mon, 7 Sep 2026 17:41:28 +0800 Subject: [PATCH] fix: select task reward ID by claim scope --- laf-cloud/functions/getTaskReward.ts | 4 +- laf-cloud/tests/task-reward-request.test.mjs | 44 ++++++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 laf-cloud/tests/task-reward-request.test.mjs diff --git a/laf-cloud/functions/getTaskReward.ts b/laf-cloud/functions/getTaskReward.ts index 8d8ada3..86f6073 100644 --- a/laf-cloud/functions/getTaskReward.ts +++ b/laf-cloud/functions/getTaskReward.ts @@ -16,7 +16,9 @@ export default async function (ctx: FunctionContext) { const refreshed = refreshTaskData(result.data.task, uid, Number(result.data.levelAmount) + 1 || 1); const scope = ctx.body.scope || "daily"; - let id = ctx.body.taskId || ctx.body.rewardId; + // 表单会将 undefined 编码为字符串,必须按领奖类型读取对应 ID。 + let id = scope === "weekly" ? ctx.body.rewardId : ctx.body.taskId; + if (id === "undefined" || id === "null") id = null; if (!id && ctx.body.taskType) { try { id = JSON.parse(ctx.body.taskType)[0]; } catch (_) { id = null; } } diff --git a/laf-cloud/tests/task-reward-request.test.mjs b/laf-cloud/tests/task-reward-request.test.mjs new file mode 100644 index 0000000..e74191e --- /dev/null +++ b/laf-cloud/tests/task-reward-request.test.mjs @@ -0,0 +1,44 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import { registerHooks } from 'node:module'; +const state = { user: null }; +registerHooks({resolve(specifier, context, nextResolve) { + if (specifier === '@/dailyTaskConfig' || specifier === '@/dailyTaskService') return {url:new URL('../functions/'+specifier.slice(2)+'.ts',import.meta.url).href,shortCircuit:true}; + if (specifier === '@/Utils') return {url:'data:text/javascript,export default {checkToken:(a,b)=>a===b}',shortCircuit:true}; + if (specifier === '@lafjs/cloud') return {url:'data:text/javascript,export default globalThis.__rewardRequestCloud',shortCircuit:true}; + return nextResolve(specifier,context); +}}); +globalThis.__rewardRequestCloud={database:()=>({collection:()=>({where:()=>({getOne:async()=>({data:state.user}),update:async data=>{Object.assign(state.user,data);return {updated:1};}})})})}; +const {refreshTaskData}=await import('../functions/dailyTaskService.ts'); +const handler=(await import('../functions/getTaskReward.ts')).default; +function setup(){ + const data=refreshTaskData(null,'test-user',20).data; + data.weeklyStars=140; + data.dailyTasks.forEach(task=>{task.value=task.target;task.state=1;}); + state.user={_id:'test-user',token:'test-token',levelAmount:19,task:JSON.stringify(data)}; + return data; +} +function request(fields){return handler({body:{uid:'test-user',token:'test-token',...fields}});} +test('weekly claims use rewardId even when form encoding sends taskId as undefined',async()=>{ + setup(); + const fields=Object.fromEntries(new URLSearchParams('scope=weekly&taskId=undefined&rewardId=weekly_35')); + const result=await request(fields); + assert.equal(result.code,1,result.msg); + assert.equal(result.data.task.weeklyRewards[0].state,2); + assert.equal(result.data.rewards.length,2); + assert.equal((await request(fields)).code,0); +}); +test('weekly scope takes precedence over a conflicting daily taskId',async()=>{ + const data=setup();const result=await request({scope:'weekly',taskId:data.dailyTasks[0].taskId,rewardId:'weekly_70'}); + assert.equal(result.code,1,result.msg);assert.equal(result.data.task.weeklyRewards[1].state,2); + assert.equal(result.data.task.dailyTasks[0].state,1); +}); +test('daily claims and legacy taskType requests remain supported',async()=>{ + const data=setup(); + assert.equal((await request({scope:'daily',taskId:data.dailyTasks[0].taskId,rewardId:'undefined'})).code,1); + assert.equal((await request({taskType:JSON.stringify([data.dailyTasks[1].taskId])})).code,1); +}); +test('missing rewardId cannot fall back to a daily ID in weekly scope',async()=>{ + const data=setup();const result=await request({scope:'weekly',taskId:data.dailyTasks[0].taskId,rewardId:'undefined'}); + assert.equal(result.code,0);assert.equal(result.msg,'未获取到奖励id'); +});