增加几个用于管理员查询的接口

This commit is contained in:
CounterFire2023 2024-05-17 17:11:44 +08:00
parent d52ceb5e83
commit 8d19ebcaa2

View File

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