MatchMaster/server/laf-cloud/functions/monthlyCard.ts

119 lines
4.1 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import cloud from '@lafjs/cloud';
import Utils from "@/Utils";
const db = cloud.database();
const MONTH_CARD_DURATION = 30 * 24 * 60 * 60 * 1000;
export default async function (ctx: FunctionContext) {
const action = ctx.body.action;
const uid = ctx.body.uid;
if (!action) {
return { code: 0, data: null, msg: "未获取到action" };
}
if (!uid) {
return { code: 0, data: null, msg: "未获取到uid" };
}
let dbname = "users";
const gameName = ctx.body.gameName;
if (gameName == "iaa") {
dbname = "usersAd";
}
const res = await db.collection(dbname).where({ _id: uid }).getOne();
const token = ctx.body.token;
if (res.data && res.data.token) {
const isTokenValid = Utils.checkToken(token, res.data.token);
if (!isTokenValid) {
return { code: 0, data: null, msg: "token校验失败" };
}
}
switch (action) {
case "save": {
const now = Date.now();
const oldMonthCardTime = Number(res.data?.monthCardTime) || 0;
const oldMonthCardReward = Number(res.data?.monthCardReward) || 0;
const outTradeNo = ctx.body.outTradeNo;
// 测试账号校验月卡订单,并确保同一订单只延长一次。
if (outTradeNo) {
const order = await db.collection("order").where({ outTradeNo: outTradeNo }).getOne();
if (!order.data ||
order.data.itemid !== "month_Card" ||
order.data.openid !== res.data?.openid) {
return { code: 0, data: null, msg: "月卡订单校验失败" };
}
if (order.data.state !== 2) {
return { code: 0, data: null, msg: "月卡订单尚未完成发货确认" };
}
if (order.data.monthCardGranted === true) {
return {
code: 1,
data: {
monthCardTime: oldMonthCardTime,
monthCardReward: oldMonthCardReward,
alreadyGranted: true
},
msg: "该月卡订单已续订"
};
}
}
// 有效期内续订从原到期时间继续加30天
// 已过期或首次购买从当前时间加30天。
const monthCardTime = Math.max(oldMonthCardTime, now) + MONTH_CARD_DURATION;
// 有效期内续订保留当天领取状态,避免同一天重复领取。
const monthCardReward = oldMonthCardTime > now ? oldMonthCardReward : 0;
await db.collection(dbname).where({ _id: uid }).update({
monthCardTime: monthCardTime,
monthCardReward: monthCardReward
});
if (outTradeNo) {
await db.collection("order").where({ outTradeNo: outTradeNo }).update({
monthCardGranted: true
});
}
return {
code: 1,
data: {
monthCardTime: monthCardTime,
monthCardReward: monthCardReward,
alreadyGranted: false
},
msg: "月卡记录成功"
};
}
case "read": {
const monthCardTime = res.data?.monthCardTime || 0;
const monthCardReward = res.data?.monthCardReward || 0;
if (monthCardTime < Date.now()) {
return {
code: 0,
data: {
monthCardTime: monthCardTime,
monthCardReward: monthCardReward
},
msg: "不在有效期"
};
}
return {
code: 1,
data: { monthCardTime: monthCardTime },
msg: "成功"
};
}
default:
return {
code: 400,
message: "无效的操作类型,请使用 save 或 read"
};
}
}