qrcode-framework
Version:
157 lines • 10.6 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const sequelize_1 = require("sequelize");
const ErrorCode_1 = require("../common/ErrorCode");
const BaseService_1 = require("../core/BaseService");
const model_1 = require("../model");
const Task_1 = require("../util/Task");
class TaskService extends BaseService_1.default {
async getTasks(type) {
const now = Date.now();
const where = {
deleted: false,
status: 1,
startAt: {
[sequelize_1.Op.or]: [
{
[sequelize_1.Op.is]: null,
},
{
[sequelize_1.Op.lte]: now,
},
],
},
endAt: {
[sequelize_1.Op.or]: [
{
[sequelize_1.Op.is]: null,
},
{
[sequelize_1.Op.gte]: now,
},
],
},
};
if (type !== undefined) {
Object.assign(where, {
rewardType: type,
});
}
const tasks = await model_1.Task.findAll({
where,
});
return tasks;
}
/**
* 获取用户完成任务的记录
* @param uid 用户uid
* @param taskId 任务id
* @param startAt 记录创建的时间有效节点,只有当记录的createdAt大于传入的参数值时,才认为是有效的
*/
async getWithStartTime(uid, taskId, startAt) {
const row = await model_1.TaskRecord.findAll({
where: {
uid,
taskId,
createdAt: {
[sequelize_1.Op.lt]: Date.now(),
[sequelize_1.Op.gte]: startAt,
},
},
});
return row.length ? row[0] : null;
}
/**
* 更新任务状态
* @param uid 用户id
* @param taskId 任务id
* @param state 任务状态
*/
async updateState(uid, taskId, state) {
const user = await model_1.User.findByPk(uid, {
include: [
{
model: model_1.UserIntegral,
as: 'integral',
required: false,
},
],
});
if (!user) {
throw new ErrorCode_1.HttpError({
status: 400,
errorCode: ErrorCode_1.ERROR_CODE.USER.NOT_FOUND,
message: '用户不存在',
});
}
const task = await model_1.Task.findByPk(taskId);
if (!task || task.deleted || task.status !== model_1.TASK_STATUS.VALID) {
throw new ErrorCode_1.HttpError({
message: '任务不存在',
errorCode: ErrorCode_1.ERROR_CODE.COMMON.NOT_FOUND,
status: 404,
});
}
const newStartTime = Task_1.calcTaskNewStartTime(task.startAt, task.period);
if (!newStartTime) {
throw new ErrorCode_1.HttpError({
message: '任务开启时间有异',
errorCode: ErrorCode_1.ERROR_CODE.COMMON.DATA_ERROR,
status: 400,
});
}
const item = await this.getWithStartTime(uid, taskId, newStartTime);
if (item && item.state === model_1.TASK_STATE.GOT) {
throw new ErrorCode_1.HttpError({ message: '任务已完成', errorCode: ErrorCode_1.ERROR_CODE.TASK.HAD_FINISHED, status: 400 });
}
try {
await global.sequelize.transaction(async (t) => {
// 添加或更新任务记录
if (item) {
item.set('state', state);
await item.save({ transaction: t });
}
else {
await model_1.TaskRecord.create({
uid,
taskId,
state,
}, {
transaction: t,
});
}
if (state === model_1.TASK_STATE.GOT) {
if (model_1.TASK_REWARD_TYPE.INTEGRAL === task.rewardType) {
await Promise.all([
// 添加用户积分记录
model_1.UserIntegralRecord.create({
uid,
value: task.reward,
latestValue: user.integral.value,
type: model_1.INTEGRAL_TYPE.TASK,
description: '完成任务',
meta: {
uid,
task,
type: model_1.INTEGRAL_TYPE.TASK,
des: `完成任务${task.title}`,
},
}, {
transaction: t,
}),
// 用户添加积分值
user.integral.increment({ value: task.reward }, {
transaction: t,
}),
]);
}
}
});
}
catch (e) {
throw new ErrorCode_1.HttpError({ message: e.message, errorCode: ErrorCode_1.ERROR_CODE.COMMON.DEFAULT, error: e, status: 500 });
}
}
}
exports.default = TaskService;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGFza1NlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJUYXNrU2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHlDQUE2QjtBQUM3QixtREFBMEQ7QUFDMUQscURBQThDO0FBQzlDLG9DQVNrQjtBQUNsQix1Q0FBa0Q7QUFFbEQsTUFBcUIsV0FBWSxTQUFRLHFCQUFXO0lBQ3pDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBYTtRQUMvQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDdkIsTUFBTSxLQUFLLEdBQUc7WUFDVixPQUFPLEVBQUUsS0FBSztZQUNkLE1BQU0sRUFBRSxDQUFDO1lBQ1QsT0FBTyxFQUFFO2dCQUNMLENBQUMsY0FBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO29CQUNMO3dCQUNJLENBQUMsY0FBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUk7cUJBQ2hCO29CQUNEO3dCQUNJLENBQUMsY0FBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUc7cUJBQ2hCO2lCQUNKO2FBQ0o7WUFDRCxLQUFLLEVBQUU7Z0JBQ0gsQ0FBQyxjQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7b0JBQ0w7d0JBQ0ksQ0FBQyxjQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSTtxQkFDaEI7b0JBQ0Q7d0JBQ0ksQ0FBQyxjQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRztxQkFDaEI7aUJBQ0o7YUFDSjtTQUNKLENBQUM7UUFDRixJQUFJLElBQUksS0FBSyxTQUFTLEVBQUU7WUFDcEIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUU7Z0JBQ2pCLFVBQVUsRUFBRSxJQUFJO2FBQ25CLENBQUMsQ0FBQztTQUNOO1FBQ0QsTUFBTSxLQUFLLEdBQUcsTUFBTSxZQUFJLENBQUMsT0FBTyxDQUFDO1lBQzdCLEtBQUs7U0FDUixDQUFDLENBQUM7UUFFSCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lB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