ChangeLepaoCount.js 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  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. } = req.body
  19. if ([uuid, session, userid, lepao_count].some(value => value === '' || value === null || value === undefined))
  20. return res.json({
  21. ...BaseStdResponse.MISSING_PARAMETER
  22. })
  23. // 检查 session
  24. if (!await AccessControl.checkSession(uuid, session))
  25. return res.status(401).json({
  26. ...BaseStdResponse.ACCESS_DENIED
  27. })
  28. // 检查权限
  29. let permission = await AccessControl.getPermission(uuid)
  30. if (!permission.includes("admin") && !permission.includes("service"))
  31. return res.json({
  32. ...BaseStdResponse.PERMISSION_DENIED
  33. })
  34. const conn = await db.connect()
  35. try {
  36. await conn.beginTransaction()
  37. const [userRows] = await conn.execute(
  38. 'SELECT lepao_count FROM users WHERE uuid = ? FOR UPDATE',
  39. [userid]
  40. )
  41. if (!userRows || userRows.length !== 1) {
  42. await conn.rollback()
  43. return res.json({
  44. ...BaseStdResponse.MISSING_FILE,
  45. msg: '未找到用户信息'
  46. })
  47. }
  48. const beforeCount = Number(userRows[0].lepao_count || 0)
  49. const targetCount = Number(lepao_count)
  50. const delta = targetCount - beforeCount
  51. const [r] = await conn.execute(
  52. 'UPDATE users SET lepao_count = ? WHERE uuid = ?',
  53. [targetCount, userid]
  54. )
  55. if (!r || r.affectedRows !== 1) {
  56. await conn.rollback()
  57. return res.json({
  58. ...BaseStdResponse.DATABASE_ERR
  59. })
  60. }
  61. if (delta !== 0) {
  62. await insertLedgerRecord({
  63. executor: conn,
  64. userUuid: userid,
  65. delta,
  66. balanceBefore: beforeCount,
  67. balanceAfter: targetCount,
  68. bizType: 'admin_adjust',
  69. bizId: `admin_adjust:${Date.now()}:${userid}`,
  70. operatorUuid: uuid,
  71. remark: '管理员手工调整次数'
  72. })
  73. }
  74. await conn.commit()
  75. } catch (error) {
  76. try { await conn.rollback() } catch (_) { }
  77. this.logger.error(`管理员调整次数失败: ${error.stack || error}`)
  78. return res.json({
  79. ...BaseStdResponse.DATABASE_ERR
  80. })
  81. } finally {
  82. conn.release()
  83. }
  84. res.json({
  85. ...BaseStdResponse.OK
  86. })
  87. }
  88. }
  89. module.exports.ChangeLepaoCount = ChangeLepaoCount