增加几个用于管理员查询的接口
This commit is contained in:
parent
d52ceb5e83
commit
8d19ebcaa2
@ -1,7 +1,23 @@
|
|||||||
import { ActivityUser } from 'models/ActivityUser'
|
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 { toEIP55 } from 'zutils/utils/chain.util'
|
||||||
import { createSigner } from 'fast-jwt'
|
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 sourceList = require('../../configs/admins.json')
|
||||||
const adminSet = new Set()
|
const adminSet = new Set()
|
||||||
@ -9,6 +25,12 @@ for (let o of sourceList) {
|
|||||||
adminSet.add(o.toLowerCase())
|
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 }
|
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