UpdateSelfAccount.js 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  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. if ([uuid, session, student_num].some((v) => v === '' || v === null || v === undefined)) {
  19. return res.json({
  20. ...BaseStdResponse.MISSING_PARAMETER
  21. })
  22. }
  23. if (!await AccessControl.checkSession(uuid, session)) {
  24. return res.status(401).json({
  25. ...BaseStdResponse.ACCESS_DENIED
  26. })
  27. }
  28. try {
  29. const rows = await db.query(
  30. 'SELECT token, state FROM lepao_account WHERE student_num = ? AND create_user = ?',
  31. [student_num, uuid]
  32. )
  33. if (!rows || rows.length !== 1) {
  34. return res.json({
  35. ...BaseStdResponse.ERR,
  36. msg: '未找到该乐跑账号或无权限操作'
  37. })
  38. }
  39. const account = rows[0]
  40. if (!account.token || String(account.token).trim() === '') {
  41. return res.json({
  42. ...BaseStdResponse.ERR,
  43. msg: '账号未登录,请先在客户端更新 JKES 登录信息'
  44. })
  45. }
  46. const now = new Date()
  47. const y = now.getFullYear()
  48. const m = now.getMonth() + 1
  49. const monthKm = await fetchJkesMonthKm(account.token, y, m)
  50. const totalKm = await fetchJkesTotalKm(account.token)
  51. const updateTime = Date.now()
  52. const updateRows = await db.query(
  53. 'UPDATE lepao_account SET term_num = ?, total_num = ?, state = 1, update_time = ? WHERE student_num = ? AND create_user = ?',
  54. [monthKm, totalKm, updateTime, student_num, uuid]
  55. )
  56. if (!updateRows || updateRows.affectedRows !== 1) {
  57. return res.json({
  58. ...BaseStdResponse.DATABASE_ERR
  59. })
  60. }
  61. const prev = await readState(student_num, now)
  62. await writeState(student_num, { km: monthKm, doubles: prev.doubles }, now)
  63. return res.json({
  64. ...BaseStdResponse.OK,
  65. data: {
  66. term_num: monthKm,
  67. total_num: totalKm,
  68. state: 1
  69. }
  70. })
  71. } catch (error) {
  72. this.logger.error(`用户自助同步乐跑账号失败: ${error.stack || error}`)
  73. return res.json({
  74. ...BaseStdResponse.ERR,
  75. msg: '同步失败,请稍后再试'
  76. })
  77. }
  78. }
  79. }
  80. module.exports.UpdateSelfAccount = UpdateSelfAccount