增加几个用于管理员查询的接口
This commit is contained in:
parent
d52ceb5e83
commit
8d19ebcaa2
@ -1,7 +1,23 @@
|
||||
import { ActivityUser } from 'models/ActivityUser'
|
||||
import { BaseController, ZError, router } from 'zutils'
|
||||
import { BaseController, ROLE_ANON, ZError, ZRedisClient, role, router } from 'zutils'
|
||||
import { toEIP55 } from 'zutils/utils/chain.util'
|
||||
import { createSigner } from 'fast-jwt'
|
||||
import {
|
||||
INGAME_SCORE_KEY,
|
||||
SCORE_SOCIAL_TASK,
|
||||
MAX_ENHANCE_COUNT_ADV,
|
||||
MAX_ENHANCE_COUNT_BASE,
|
||||
RANK_SCORE_SCALE,
|
||||
} from 'common/Constants'
|
||||
import { formatNumShow } from 'common/Utils'
|
||||
import { ActivityGame } from 'models/ActivityGame'
|
||||
import { ChestEnhanceRecord } from 'models/ChestEnhanceRecord'
|
||||
import { InGameStats } from 'models/InGameStats'
|
||||
import { ScoreRecord } from 'models/ScoreRecord'
|
||||
import { rankKey } from 'services/rank.svr'
|
||||
import { formatDate } from 'utils/utcdate.util'
|
||||
import { InGameTaskRecord } from 'models/InGameTaskRecord'
|
||||
import { ActivityChest } from 'models/ActivityChest'
|
||||
|
||||
const sourceList = require('../../configs/admins.json')
|
||||
const adminSet = new Set()
|
||||
@ -9,6 +25,12 @@ for (let o of sourceList) {
|
||||
adminSet.add(o.toLowerCase())
|
||||
}
|
||||
|
||||
const taskList = require('../../configs/ingame_tasks.json')
|
||||
const taskMap = new Map()
|
||||
for (let o of taskList) {
|
||||
taskMap.set(o.id, o)
|
||||
}
|
||||
|
||||
/**
|
||||
* 一些简单的管理接口
|
||||
*/
|
||||
@ -41,4 +63,166 @@ class AdminController extends BaseController {
|
||||
})
|
||||
return { token }
|
||||
}
|
||||
|
||||
@router('post /api/g3y357zt67qryz3v6d6/query_user')
|
||||
async queryUserList(req, res) {
|
||||
const user = req.user
|
||||
if (!adminSet.has(user.address.toLowerCase())) {
|
||||
throw new ZError(10, 'not admin')
|
||||
}
|
||||
let { key, keyid } = req.params
|
||||
let records = []
|
||||
if (keyid) {
|
||||
records = await ActivityUser.find({
|
||||
$or: [{ twitterId: keyid }, { googleId: keyid }, { emailId: keyid }, { clientId: keyid }, { discordId: keyid }],
|
||||
})
|
||||
} else if (key) {
|
||||
records = await ActivityUser.find({ $text: { $search: key } })
|
||||
}
|
||||
return records.map(o => {
|
||||
return {
|
||||
id: o.id,
|
||||
address: o.address,
|
||||
twitterName: o.twitterName,
|
||||
discordName: o.discordName,
|
||||
googleName: o.googleName,
|
||||
googleEmail: o.googleEmail,
|
||||
email: o.email,
|
||||
clientMail: o.clientMail,
|
||||
clientPlat: o.clientPlat,
|
||||
createdAt: o.createdAt.getTime(),
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
@router('post /api/g3y357zt67qryz3v6d6/user_info')
|
||||
async queryOneUser(req, res) {
|
||||
const admin = req.user
|
||||
if (!adminSet.has(admin.address.toLowerCase())) {
|
||||
throw new ZError(10, 'not admin')
|
||||
}
|
||||
let { uid, address } = req.params
|
||||
let user
|
||||
if (uid) {
|
||||
user = await ActivityUser.findById(uid)
|
||||
} else if (address) {
|
||||
address = toEIP55(address)
|
||||
user = await ActivityUser.findOne({ address })
|
||||
}
|
||||
if (!user) {
|
||||
throw new ZError(11, 'user not found')
|
||||
}
|
||||
uid = user.id
|
||||
const ACTIVITY = 'uaw_activity'
|
||||
const todayKey = rankKey(ACTIVITY, new Date())
|
||||
const todayScore = await new ZRedisClient().zscore(todayKey, uid)
|
||||
const totalKey = rankKey(ACTIVITY)
|
||||
const totalScore = await new ZRedisClient().zscore(totalKey, uid)
|
||||
const totalRank = await new ZRedisClient().zrevrank(totalKey, uid)
|
||||
const rankGame = await new ZRedisClient().zrevrank(INGAME_SCORE_KEY, uid)
|
||||
let invite = ''
|
||||
if (user.inviteUser) {
|
||||
const inviteUser = await ActivityUser.findById(user.inviteUser)
|
||||
if (inviteUser) {
|
||||
invite = inviteUser.address.toLowerCase()
|
||||
}
|
||||
}
|
||||
const records = await ActivityUser.find({ inviteUser: user.id })
|
||||
const gameRecord = await ActivityGame.insertOrUpdate({ user: user.id, activity: ACTIVITY }, {})
|
||||
let inviteScore = 0
|
||||
const recordSocial = await ScoreRecord.find({ user: user.id, activity: ACTIVITY, type: SCORE_SOCIAL_TASK })
|
||||
let scoreSocial = recordSocial.reduce((acc, record) => acc + record.score, 0)
|
||||
const userMax = user.twitterId && user.discordId ? MAX_ENHANCE_COUNT_ADV : MAX_ENHANCE_COUNT_BASE
|
||||
const dateTag = formatDate(new Date())
|
||||
const userCurrent = await ChestEnhanceRecord.countDocuments({ user: user.id, activity: ACTIVITY, dateTag })
|
||||
let enhanceCount = userMax - userCurrent
|
||||
if (enhanceCount < 0) {
|
||||
enhanceCount = 0
|
||||
}
|
||||
const ingameStat = await InGameStats.insertOrUpdate({ user: user.id }, {})
|
||||
const ingameRecords = await InGameTaskRecord.find({ user: user.id })
|
||||
let tickets = 0
|
||||
let scoreGTask = 0
|
||||
for (let record of ingameRecords) {
|
||||
tickets += record.ticket
|
||||
scoreGTask += record.score
|
||||
}
|
||||
let result = {
|
||||
uid: user.id,
|
||||
address: user.address.toLowerCase(),
|
||||
boost: user.boost || 1,
|
||||
boostExpire: user.boostExpire,
|
||||
twitterId: user.twitterId,
|
||||
twitterName: user.twitterName,
|
||||
twitterAvatar: user.twitterAvatar,
|
||||
discordId: user.discordId,
|
||||
discordName: user.discordName,
|
||||
scoreToday: formatNumShow(todayScore ? parseInt(todayScore + '') / RANK_SCORE_SCALE : 0),
|
||||
scoreTotal: formatNumShow(totalScore ? parseInt(totalScore + '') / RANK_SCORE_SCALE : 0),
|
||||
rankTotal: totalRank != undefined ? totalRank : '-',
|
||||
rankGame: rankGame !== undefined ? rankGame : '-',
|
||||
invite,
|
||||
inviteCount: records.length,
|
||||
inviteScore,
|
||||
scoreSocial: formatNumShow(scoreSocial),
|
||||
code: user.inviteCode,
|
||||
mapopen: gameRecord.status,
|
||||
enhanceCount,
|
||||
inWhiteList: user.inWhiteList ? 1 : 0,
|
||||
googleId: user.googleId,
|
||||
googleMail: user.googleEmail,
|
||||
gameScore: ingameStat.score,
|
||||
gameTicket: ingameStat.ticket,
|
||||
emailId: user.emailId,
|
||||
email: user.email,
|
||||
gameId: user.gameId(),
|
||||
gameMail: user.gameMail(),
|
||||
gamePlat: user.clientPlat,
|
||||
createdAt: user.createdAt.getTime(),
|
||||
tickets,
|
||||
scoreGTask,
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
@router('post /api/g3y357zt67qryz3v6d6/ingame_records')
|
||||
async queryInGameHistory(req, res) {
|
||||
const admin = req.user
|
||||
if (!adminSet.has(admin.address.toLowerCase())) {
|
||||
throw new ZError(10, 'not admin')
|
||||
}
|
||||
const { uid } = req.params
|
||||
if (!uid) {
|
||||
throw new ZError(12, 'uid required')
|
||||
}
|
||||
const ingameRecords = await InGameTaskRecord.find({ user: uid })
|
||||
let tasks: any[] = []
|
||||
for (let o of ingameRecords) {
|
||||
let task = taskMap.get(o.task)
|
||||
if (task) {
|
||||
tasks.push({
|
||||
task: task.task,
|
||||
score: o.score,
|
||||
ticket: o.ticket,
|
||||
dateTag: o.dateTag,
|
||||
// @ts-ignore
|
||||
time: o.createdAt.getTime(),
|
||||
})
|
||||
}
|
||||
}
|
||||
return tasks
|
||||
}
|
||||
@router('post /api/g3y357zt67qryz3v6d6/chests')
|
||||
async queryChests(req, res) {
|
||||
const admin = req.user
|
||||
if (!adminSet.has(admin.address.toLowerCase())) {
|
||||
throw new ZError(10, 'not admin')
|
||||
}
|
||||
const { uid } = req.params
|
||||
if (!uid) {
|
||||
throw new ZError(12, 'uid required')
|
||||
}
|
||||
const records = await ActivityChest.find({ user: uid })
|
||||
return records
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user