LogsDelete.js 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. const API = require('../../../../lib/API.js')
  2. const { BaseStdResponse } = require('../../../../BaseStdResponse.js')
  3. const AccessControl = require('../../../../lib/AccessControl.js')
  4. const db = require('../../../../plugin/DataBase/db.js')
  5. const MAX_IDS = 300
  6. /**
  7. * POST /Admin/Lepao/Proxy/Logs/Delete
  8. * ids: number[] — 批量按主键删除
  9. * purge_all: 1/true — 清空整张日志表(危险操作)
  10. */
  11. class AdminLepaoProxyLogsDelete extends API {
  12. constructor() {
  13. super()
  14. this.setPath('/Admin/Lepao/Proxy/Logs/Delete')
  15. this.setMethod('POST')
  16. }
  17. async onRequest(req, res) {
  18. const { uuid, session, ids, purge_all } = req.body
  19. if ([uuid, session].some((v) => v === '' || v == null)) {
  20. return res.json({ ...BaseStdResponse.MISSING_PARAMETER })
  21. }
  22. if (!await AccessControl.checkSession(uuid, session)) {
  23. return res.status(401).json({ ...BaseStdResponse.ACCESS_DENIED })
  24. }
  25. const permission = await AccessControl.getPermission(uuid)
  26. if (!permission.includes('admin') && !permission.includes('service')) {
  27. return res.json({ ...BaseStdResponse.PERMISSION_DENIED })
  28. }
  29. const purge = purge_all === true || purge_all === 1 || purge_all === '1'
  30. try {
  31. if (purge) {
  32. await db.query('DELETE FROM lepao_proxy_log')
  33. return res.json({
  34. ...BaseStdResponse.OK,
  35. data: { mode: 'purge_all' }
  36. })
  37. }
  38. if (!Array.isArray(ids) || ids.length === 0) {
  39. return res.json({ ...BaseStdResponse.ERR, msg: '请传入 ids 数组或勾选 purge_all' })
  40. }
  41. const clean = [...new Set(ids.map((id) => Math.floor(Number(id))).filter((n) => Number.isFinite(n) && n > 0))]
  42. if (clean.length === 0) {
  43. return res.json({ ...BaseStdResponse.ERR, msg: '无效的 id' })
  44. }
  45. if (clean.length > MAX_IDS) {
  46. return res.json({ ...BaseStdResponse.ERR, msg: `单次最多删除 ${MAX_IDS} 条` })
  47. }
  48. const ph = clean.map(() => '?').join(',')
  49. await db.query(`DELETE FROM lepao_proxy_log WHERE id IN (${ph})`, clean)
  50. return res.json({
  51. ...BaseStdResponse.OK,
  52. data: { deleted: clean.length }
  53. })
  54. } catch (e) {
  55. this.logger?.error?.(`AdminLepaoProxyLogsDelete: ${e.stack || e}`)
  56. return res.json({ ...BaseStdResponse.ERR, msg: '删除日志失败' })
  57. }
  58. }
  59. }
  60. module.exports.AdminLepaoProxyLogsDelete = AdminLepaoProxyLogsDelete