| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- const db = require('../../plugin/DataBase/db')
- const AccessControl = require('../AccessControl')
- const { BaseStdResponse } = require('../../BaseStdResponse')
- function isMissing(value) {
- return value === '' || value === null || value === undefined
- }
- function errorResponse(base, msg) {
- return { ...base, msg }
- }
- async function queryAccount(studentNum) {
- const rows = await db.query(
- `SELECT uid, token, school_id, student_num, userAgent, state, create_user
- FROM lepao_account
- WHERE student_num = ?`,
- [studentNum]
- )
- return rows?.[0] || null
- }
- function validateRunnableAccount(account) {
- if (!account) {
- return errorResponse(BaseStdResponse.ERR, '未找到该乐跑账号')
- }
- if (account.state !== 1) {
- return errorResponse(BaseStdResponse.ERR, '仅状态为正常的账号可查看官方记录')
- }
- if (!account.uid || !account.token || !account.school_id) {
- return errorResponse(BaseStdResponse.ERR, '乐跑账号登录信息不完整,请使用登录器更新账号')
- }
- return null
- }
- async function loadUserOfficialAccount(uuid, studentNum) {
- const account = await queryAccount(studentNum)
- if (!account || account.create_user !== uuid) {
- return {
- error: errorResponse(BaseStdResponse.ERR, '未找到该乐跑账号或无权限操作')
- }
- }
- const invalid = validateRunnableAccount(account)
- if (invalid) return { error: invalid }
- return { account }
- }
- async function loadAdminOfficialAccount(uuid, studentNum) {
- const permission = await AccessControl.getPermission(uuid)
- if (!permission.includes('admin') && !permission.includes('service') && !permission.includes('server')) {
- return {
- error: BaseStdResponse.PERMISSION_DENIED
- }
- }
- const account = await queryAccount(studentNum)
- const invalid = validateRunnableAccount(account)
- if (invalid) return { error: invalid }
- return { account }
- }
- function isLoginExpiredError(error) {
- const msg = error?.message || ''
- return (
- error?.code === 'LEPAO_LOGIN_EXPIRED' ||
- String(msg).includes('重新登录') ||
- String(msg).includes('登录已过期') ||
- String(msg).includes('登录失效')
- )
- }
- async function markAccountLoginExpired(studentNum, logger) {
- if (!studentNum) return
- try {
- await db.query('UPDATE lepao_account SET state = 0, update_time = ? WHERE student_num = ?', [
- Date.now(),
- studentNum
- ])
- logger?.warn?.(`${studentNum} 官方乐跑登录已失效,账号状态已更新为未登录`)
- } catch (updateError) {
- logger?.error?.(`更新乐跑账号登录状态失败 ${studentNum}: ${updateError.stack || updateError}`)
- }
- }
- async function mapOfficialError(error, studentNum, logger) {
- if (isLoginExpiredError(error)) {
- await markAccountLoginExpired(studentNum, logger)
- return errorResponse(BaseStdResponse.ERR, '乐跑登录已过期,请使用登录器更新账号')
- }
- const msg = error?.message || '获取官方乐跑记录失败'
- return errorResponse(BaseStdResponse.ERR, msg)
- }
- module.exports = {
- isMissing,
- loadUserOfficialAccount,
- loadAdminOfficialAccount,
- isLoginExpiredError,
- markAccountLoginExpired,
- mapOfficialError
- }
|