82 lines
2.5 KiB
TypeScript
82 lines
2.5 KiB
TypeScript
import { ZError } from "common/ZError";
|
|
import BaseController, { ROLE_ANON } from "common/base.controller";
|
|
import { role, router } from "decorators/router";
|
|
import { ActivityInfo } from "models/ActivityInfo";
|
|
import { ActivityUser } from "models/ActivityUser";
|
|
import { RedisClient } from "redis/RedisClient";
|
|
import { rankKey } from "services/rank.svr";
|
|
import { yesterday } from "utils/date.util";
|
|
|
|
const MAX_LIMIT = 50
|
|
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) {
|
|
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')
|
|
}
|
|
user.inviteUser = inviteUser.id
|
|
await user.save()
|
|
return {}
|
|
}
|
|
|
|
@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 RedisClient().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 RedisClient().zscore(yesterdayKey, id)
|
|
results.push({
|
|
rank: start + i / 2 + 1,
|
|
address: user?.address || 'unknow',
|
|
invite,
|
|
score,
|
|
yesterday: yesterdayScore ? parseInt(yesterdayScore+'') : 0
|
|
})
|
|
}
|
|
return results;
|
|
}
|
|
} |