UpdateSelfAccount.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. const API = require("../../../lib/API.js")
  2. const db = require("../../../plugin/DataBase/db.js")
  3. const AccessControl = require("../../../lib/AccessControl.js")
  4. const { BaseStdResponse } = require("../../../BaseStdResponse.js")
  5. const { fetchJkesMonthKm, fetchJkesTotalKm } = require("../../../plugin/jkes/stats")
  6. const { readState, writeState } = require("../../../plugin/jkes/monthPolicy")
  7. /**
  8. * 使用库内 JKES token 从官方接口同步本月/累计里程到 lepao_account(term_num / total_num)
  9. */
  10. class UpdateSelfAccount extends API {
  11. constructor() {
  12. super()
  13. this.setPath('/Lepao/Account/UpdateSelfAccount')
  14. this.setMethod('POST')
  15. }
  16. async onRequest(req, res) {
  17. const { uuid, session, student_num } = req.body
  18. const loginExpiredMsg = '乐跑账号登录失效,请重新使用乐跑登录器进行登录'
  19. if ([uuid, session, student_num].some((v) => v === '' || v === null || v === undefined)) {
  20. return res.json({
  21. ...BaseStdResponse.MISSING_PARAMETER
  22. })
  23. }
  24. if (!await AccessControl.checkSession(uuid, session)) {
  25. return res.status(401).json({
  26. ...BaseStdResponse.ACCESS_DENIED
  27. })
  28. }
  29. try {
  30. const rows = await db.query(
  31. 'SELECT token, state FROM lepao_account WHERE student_num = ? AND create_user = ?',
  32. [student_num, uuid]
  33. )
  34. if (!rows || rows.length !== 1) {
  35. return res.json({
  36. ...BaseStdResponse.ERR,
  37. msg: '未找到该乐跑账号或无权限操作'
  38. })
  39. }
  40. const account = rows[0]
  41. if (!account.token || String(account.token).trim() === '') {
  42. return res.json({
  43. ...BaseStdResponse.ERR,
  44. msg: '账号未登录,请先在客户端更新 JKES 登录信息'
  45. })
  46. }
  47. const now = new Date()
  48. const y = now.getFullYear()
  49. const m = now.getMonth() + 1
  50. let monthKm
  51. let totalKm
  52. try {
  53. monthKm = await fetchJkesMonthKm(account.token, y, m)
  54. totalKm = await fetchJkesTotalKm(account.token)
  55. } catch (error) {
  56. if (error?.loginExpired) {
  57. await db.query(
  58. 'UPDATE lepao_account SET state = 0, update_time = ? WHERE student_num = ? AND create_user = ?',
  59. [Date.now(), student_num, uuid]
  60. )
  61. return res.json({
  62. ...BaseStdResponse.ERR,
  63. msg: loginExpiredMsg
  64. })
  65. }
  66. throw error
  67. }
  68. const updateTime = Date.now()
  69. const updateRows = await db.query(
  70. 'UPDATE lepao_account SET term_num = ?, total_num = ?, state = 1, update_time = ? WHERE student_num = ? AND create_user = ?',
  71. [monthKm, totalKm, updateTime, student_num, uuid]
  72. )
  73. if (!updateRows || updateRows.affectedRows !== 1) {
  74. return res.json({
  75. ...BaseStdResponse.DATABASE_ERR
  76. })
  77. }
  78. const prev = await readState(student_num, now)
  79. await writeState(student_num, { km: monthKm, doubles: prev.doubles }, now)
  80. return res.json({
  81. ...BaseStdResponse.OK,
  82. data: {
  83. term_num: monthKm,
  84. total_num: totalKm,
  85. state: 1
  86. }
  87. })
  88. } catch (error) {
  89. this.logger.error(`用户自助同步乐跑账号失败: ${error.stack || error}`)
  90. return res.json({
  91. ...BaseStdResponse.ERR,
  92. msg: '同步失败,请稍后再试'
  93. })
  94. }
  95. }
  96. }
  97. module.exports.UpdateSelfAccount = UpdateSelfAccount