| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- const API = require("../../../lib/API.js")
- const db = require("../../../plugin/DataBase/db.js")
- const AccessControl = require("../../../lib/AccessControl.js")
- const { BaseStdResponse } = require("../../../BaseStdResponse.js")
- const { fetchJkesMonthKm, fetchJkesTotalKm } = require("../../../plugin/jkes/stats")
- const { readState, writeState } = require("../../../plugin/jkes/monthPolicy")
- /**
- * 使用库内 JKES token 从官方接口同步本月/累计里程到 lepao_account(term_num / total_num)
- */
- class UpdateSelfAccount extends API {
- constructor() {
- super()
- this.setPath('/Lepao/Account/UpdateSelfAccount')
- this.setMethod('POST')
- }
- async onRequest(req, res) {
- const { uuid, session, student_num } = req.body
- const loginExpiredMsg = '乐跑账号登录失效,请重新使用乐跑登录器进行登录'
- if ([uuid, session, student_num].some((v) => v === '' || v === null || v === undefined)) {
- return res.json({
- ...BaseStdResponse.MISSING_PARAMETER
- })
- }
- if (!await AccessControl.checkSession(uuid, session)) {
- return res.status(401).json({
- ...BaseStdResponse.ACCESS_DENIED
- })
- }
- try {
- const rows = await db.query(
- 'SELECT token, state FROM lepao_account WHERE student_num = ? AND create_user = ?',
- [student_num, uuid]
- )
- if (!rows || rows.length !== 1) {
- return res.json({
- ...BaseStdResponse.ERR,
- msg: '未找到该乐跑账号或无权限操作'
- })
- }
- const account = rows[0]
- if (!account.token || String(account.token).trim() === '') {
- return res.json({
- ...BaseStdResponse.ERR,
- msg: '账号未登录,请先在客户端更新 JKES 登录信息'
- })
- }
- const now = new Date()
- const y = now.getFullYear()
- const m = now.getMonth() + 1
- let monthKm
- let totalKm
- try {
- monthKm = await fetchJkesMonthKm(account.token, y, m)
- totalKm = await fetchJkesTotalKm(account.token)
- } catch (error) {
- if (error?.loginExpired) {
- await db.query(
- 'UPDATE lepao_account SET state = 0, update_time = ? WHERE student_num = ? AND create_user = ?',
- [Date.now(), student_num, uuid]
- )
- return res.json({
- ...BaseStdResponse.ERR,
- msg: loginExpiredMsg
- })
- }
- throw error
- }
- const updateTime = Date.now()
- const updateRows = await db.query(
- 'UPDATE lepao_account SET term_num = ?, total_num = ?, state = 1, update_time = ? WHERE student_num = ? AND create_user = ?',
- [monthKm, totalKm, updateTime, student_num, uuid]
- )
- if (!updateRows || updateRows.affectedRows !== 1) {
- return res.json({
- ...BaseStdResponse.DATABASE_ERR
- })
- }
- const prev = await readState(student_num, now)
- await writeState(student_num, { km: monthKm, doubles: prev.doubles }, now)
- return res.json({
- ...BaseStdResponse.OK,
- data: {
- term_num: monthKm,
- total_num: totalKm,
- state: 1
- }
- })
- } catch (error) {
- this.logger.error(`用户自助同步乐跑账号失败: ${error.stack || error}`)
- return res.json({
- ...BaseStdResponse.ERR,
- msg: '同步失败,请稍后再试'
- })
- }
- }
- }
- module.exports.UpdateSelfAccount = UpdateSelfAccount
|