ChangeLepaoCount.js 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. const API = require("../../../../lib/API");
  2. const db = require("../../../../plugin/DataBase/db");
  3. const AccessControl = require("../../../../lib/AccessControl");
  4. const { BaseStdResponse } = require("../../../../BaseStdResponse");
  5. const { insertLedgerRecord } = require("../../../../lib/Lepao/CountLedger");
  6. class ChangeLepaoCount extends API {
  7. constructor() {
  8. super()
  9. this.setPath('/Admin/User/ChangeLepaoCount')
  10. this.setMethod('POST')
  11. }
  12. async onRequest(req, res) {
  13. let {
  14. uuid,
  15. session,
  16. userid,
  17. lepao_count,
  18. remark
  19. } = req.body
  20. remark = typeof remark === 'string' ? remark.trim() : ''
  21. if ([uuid, session, userid, lepao_count].some(value => value === '' || value === null || value === undefined))
  22. return res.json({
  23. ...BaseStdResponse.MISSING_PARAMETER
  24. })
  25. if (remark.length > 255)
  26. return res.json({
  27. ...BaseStdResponse.ERR,
  28. msg: '备注长度不能超过255个字符'
  29. })
  30. // 检查 session
  31. if (!await AccessControl.checkSession(uuid, session))
  32. return res.status(401).json({
  33. ...BaseStdResponse.ACCESS_DENIED
  34. })
  35. // 检查权限
  36. let permission = await AccessControl.getPermission(uuid)
  37. if (!permission.includes("admin") && !permission.includes("service"))
  38. return res.json({
  39. ...BaseStdResponse.PERMISSION_DENIED
  40. })
  41. const conn = await db.connect()
  42. try {
  43. await conn.beginTransaction()
  44. const [userRows] = await conn.execute(
  45. 'SELECT lepao_count FROM users WHERE uuid = ? FOR UPDATE',
  46. [userid]
  47. )
  48. if (!userRows || userRows.length !== 1) {
  49. await conn.rollback()
  50. return res.json({
  51. ...BaseStdResponse.MISSING_FILE,
  52. msg: '未找到用户信息'
  53. })
  54. }
  55. const beforeCount = Number(userRows[0].lepao_count || 0)
  56. const targetCount = Number(lepao_count)
  57. const delta = targetCount - beforeCount
  58. const [r] = await conn.execute(
  59. 'UPDATE users SET lepao_count = ? WHERE uuid = ?',
  60. [targetCount, userid]
  61. )
  62. if (!r || r.affectedRows !== 1) {
  63. await conn.rollback()
  64. return res.json({
  65. ...BaseStdResponse.DATABASE_ERR
  66. })
  67. }
  68. if (delta !== 0) {
  69. await insertLedgerRecord({
  70. executor: conn,
  71. userUuid: userid,
  72. delta,
  73. balanceBefore: beforeCount,
  74. balanceAfter: targetCount,
  75. bizType: 'admin_adjust',
  76. bizId: `admin_adjust:${Date.now()}:${userid}`,
  77. operatorUuid: uuid,
  78. remark: remark || '系统调整次数'
  79. })
  80. }
  81. await conn.commit()
  82. } catch (error) {
  83. try { await conn.rollback() } catch (_) { }
  84. this.logger.error(`管理员调整次数失败: ${error.stack || error}`)
  85. return res.json({
  86. ...BaseStdResponse.DATABASE_ERR
  87. })
  88. } finally {
  89. if (conn?.connection && typeof conn.connection.release === 'function' && typeof conn?.release === 'function') {
  90. conn.release()
  91. }
  92. }
  93. res.json({
  94. ...BaseStdResponse.OK
  95. })
  96. }
  97. }
  98. module.exports.ChangeLepaoCount = ChangeLepaoCount