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"; 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 user = req.user; let { page, activity, limit } = req.params page = parseInt(page || '0') limit = parseInt(limit || MAX_LIMIT) if (page < 0) { page = 0 } const start = page * limit const end = start + limit - 1 let records = await new RedisClient().zrevrange(`${activity}:score`, start, end) let results: any = [] for (let i = 0; i < records.length; i+=2) { let id = records[i] let score = parseInt(records[i + 1]) let user = await ActivityUser.findById(id) results.push({ rank: start + i / 2 + 1, address: user.address, score }) } return results; } }