task-svr/src/controllers/activity.controller.ts
2024-03-27 11:15:17 +08:00

147 lines
4.4 KiB
TypeScript

import { ActivityInfo } from 'models/ActivityInfo'
import { ActivityUser } from 'models/ActivityUser'
import { rankKey, rankLevel, updateRankScore } from 'services/rank.svr'
import { BaseController, ROLE_ANON, SyncLocker, ZError, ZRedisClient, role, router } from 'zutils'
import { ScoreRecord } from 'models/ScoreRecord'
import { formatAddress } from 'zutils/utils/chain.util'
import { formatDate } from 'zutils/utils/date.util'
import { SCORE_INVITE_INVITEE, SCORE_INVITE_USER } from 'common/Constants'
const shareCfg = require('../../configs/share_cfg.json')
const MAX_LIMIT = 100
export default class ActivityController extends BaseController {
@role(ROLE_ANON)
@router('get /api/activity/:id')
async info(req) {
let { id } = req.params
if (!id) {
throw new ZError(11, 'invalid activity id')
}
let activity = await ActivityInfo.findById(id)
if (!activity) {
throw new ZError(12, 'activity not found')
}
return activity.toJson()
}
/**
* 更新邀请码
* @param req
* @returns
*/
@router('post /api/activity/upload_invite_code')
async uploadInviteCode(req) {
new SyncLocker().checkLock(req)
let { code } = req.params
let user = req.user
if (user.inviteUser) {
throw new ZError(11, 'already set invite user')
}
let inviteUser = await ActivityUser.findByCode(code, user.activity)
if (!inviteUser) {
throw new ZError(12, 'invalid invite code')
}
// TODO:: 检查自己是否符合条件
const dateTag = formatDate(new Date())
// 更新邀请积分-邀请人
await updateRankScore({
user: inviteUser.id,
score: shareCfg.inviter,
activity: user.activity,
scoreType: SCORE_INVITE_USER,
scoreParams: {
date: dateTag,
user: user.id,
},
})
// 更新邀请积分-被邀请人
await updateRankScore({
user: user.id,
score: shareCfg.invitee,
activity: user.activity,
scoreType: SCORE_INVITE_INVITEE,
scoreParams: {
date: dateTag,
user: inviteUser.id,
},
})
user.inviteUser = inviteUser.id
await user.save()
return {}
}
/**
* 邀请列表
*/
@router('get /api/activity/invite_list')
async inviteUserList(req) {
let user = req.user
const totalKey = rankKey(user.activity)
let users = await ActivityUser.find({ inviteUser: user.id })
let results = []
for (let u of users) {
const totalScore = await new ZRedisClient().zscore(totalKey, u.id)
const score = totalScore ? parseInt(totalScore + '') : 0
results.push({
// user: u.id,
level: rankLevel(score),
nickname: u.twitterName || u.discordName || formatAddress(u.address),
score,
})
}
return results
}
/**
* 积分详情列表
*/
@router('get /api/activity/score_list')
async scoreList(req) {
let user = req.user
const records = await ScoreRecord.find({ user: user.id, activity: user.activity })
return records.map(record => {
return {
score: record.score,
type: record.type,
//@ts-ignore
time: record.createdAt.getTime(),
}
})
}
@role(ROLE_ANON)
@router('get /api/activity/leaderboard/:activity/:page')
async inviteCode(req) {
let { page, activity, limit } = req.params
page = parseInt(page || '0')
limit = parseInt(limit || MAX_LIMIT)
page = page < 0 ? 0 : page
const start = page * limit
const end = start + limit - 1
const records = await new ZRedisClient().zrevrange(`${activity}:score`, start, end)
let results: any = []
// const yesterdayKey = rankKey(activity, yesterday())
for (let i = 0; i < records.length; i += 2) {
const id = records[i]
let score = parseInt(records[i + 1])
const user = await ActivityUser.findById(id)
// let invite = ''
// if (user?.inviteUser) {
// const inviteUser = await ActivityUser.findById(user.inviteUser)
// if (inviteUser) {
// invite = inviteUser.address
// }
// }
// const yesterdayScore = await new ZRedisClient().zscore(yesterdayKey, id)
results.push({
rank: start + i / 2 + 1,
level: rankLevel(score),
nickname: user?.twitterName || user?.discordName || user?.address ? formatAddress(user.address) : 'unknown',
score,
// yesterday: yesterdayScore ? parseInt(yesterdayScore + '') : 0,
})
}
return results
}
}