server/laf-cloud/functions/signInClaim.ts

96 lines
2.7 KiB
TypeScript

import cloud from '@lafjs/cloud'
import Utils from "@/Utils";
import {
SIGN_IN_REWARD_DAYS,
addSignInClaim,
buildClaimId,
getChinaDateKey,
getSignInActivityStatus,
getSignInClaims,
getSignInConfig,
markSignInCompleted,
normalizeSignInState,
} from "@/SignInActivity";
const db = cloud.database();
export default async function (ctx: FunctionContext) {
const uid = ctx.body?.uid;
if (!uid) {
return { code: 0, data: null, msg: "未获取到uid" };
}
if (ctx.body?.gameName === "iaa") {
return { code: 0, data: null, msg: "七日签到仅支持主游戏" };
}
const userResult = await db.collection("users").where({ _id: uid }).getOne();
const user = userResult.data;
if (!user) {
return { code: 0, data: null, msg: "未获取到用户信息" };
}
if (user.token && !Utils.checkToken(ctx.body?.token, user.token)) {
return { code: 0, data: null, msg: "token校验失败" };
}
const state = normalizeSignInState(user.signInActivity);
if (!state) {
return { code: 0, data: null, msg: "签到活动尚未开启" };
}
const config = await getSignInConfig(state.activityId);
if (!config) {
return { code: 0, data: null, msg: "签到活动配置不存在或配置无效" };
}
const now = Date.now();
let claims = await getSignInClaims(uid, state.activityId);
const status = getSignInActivityStatus(state, claims.length, now);
if (status === "completed") {
return { code: 0, data: null, msg: "七日签到奖励已全部领取" };
}
if (status === "expired") {
return { code: 0, data: null, msg: "七日签到活动已结束" };
}
const dateKey = getChinaDateKey(now);
if (claims.some(claim => String(claim.dateKey) === dateKey)) {
return { code: 0, data: null, msg: "今天已经领取" };
}
const rewardDay = claims.length + 1;
const reward = config.rewards[rewardDay - 1];
if (!reward || rewardDay > SIGN_IN_REWARD_DAYS) {
return { code: 0, data: null, msg: "签到奖励配置异常" };
}
const claimId = buildClaimId(uid, state.activityId, dateKey);
const payload = {
_id: claimId,
claimId,
uid,
activityId: state.activityId,
dateKey,
rewardDay,
rewards: reward.items,
claimedAt: now,
};
try {
await addSignInClaim(payload);
} catch {
return { code: 0, data: null, msg: "今天已经领取" };
}
claims = claims.concat(payload);
const completed = claims.length >= SIGN_IN_REWARD_DAYS;
if (completed) {
await markSignInCompleted(uid, state, now);
}
return {
code: 1,
data: {
claimId,
rewardDay,
rewards: reward.items,
claimedCount: claims.length,
todayClaimed: true,
completed,
},
msg: "领取成功",
};
}