task-svr/src/controllers/activity.controller.ts
2024-01-03 19:10:05 +08:00

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;
}
}