72 lines
2.0 KiB
TypeScript
72 lines
2.0 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";
|
|
|
|
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;
|
|
}
|
|
} |