drop-lobster-dedup-config-menu.js 3.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. const mysql = require('mysql2/promise')
  2. const DB_CFG = {
  3. host: process.env.DB_HOST || 'cq-cdb-8fjmemkb.sql.tencentcdb.com',
  4. port: Number(process.env.DB_PORT || 27220),
  5. user: process.env.DB_USER || 'root',
  6. password: process.env.DB_PASSWORD || 'Ylrz_1q2w3e4r5t6y',
  7. multipleStatements: true
  8. }
  9. const MASTER_DB = process.env.MASTER_DB || 'ylrz_saas'
  10. const CORE_SQL = `
  11. DELETE FROM sys_role_menu WHERE menu_id IN (3000, 29924, 2621);
  12. DELETE FROM sys_menu WHERE menu_id IN (3000, 29924) OR component = 'lobster/dedup-config/index' OR path IN ('lobster-dedup-config', 'dedup-config');
  13. INSERT IGNORE INTO sys_menu
  14. (menu_id, menu_name, parent_id, order_num, path, component, menu_type, icon, visible, status, is_frame, is_cache, perms, create_by, create_time, remark)
  15. VALUES
  16. (2621, '\u804a\u5929\u6d88\u606f\u53bb\u91cd', 2600, 15, 'messageDedup', 'admin/messageDedup/index', 'C', 'el-icon-filter', '0', '0', 0, 0, NULL, 'admin', NOW(), 'Lobster outbound message dedup policy');
  17. UPDATE sys_menu SET perms = NULL WHERE menu_id = 2621;
  18. INSERT INTO sys_role_menu (role_id, menu_id)
  19. SELECT DISTINCT rm.role_id, 2621
  20. FROM sys_role_menu rm
  21. INNER JOIN sys_menu m ON m.menu_id = rm.menu_id
  22. WHERE m.menu_id >= 2000 AND m.menu_id < 3000
  23. AND NOT EXISTS (SELECT 1 FROM sys_role_menu x WHERE x.role_id = rm.role_id AND x.menu_id = 2621);
  24. `
  25. const TENANT_TEMPLATE_CLEANUP = [
  26. ['tenant_sys_role_menu', 'menu_id IN (3000, 29924)'],
  27. ['tenant_company_role_menu', 'menu_id IN (3000, 29924)'],
  28. ['tenant_sys_menu', "menu_id IN (3000, 29924) OR component = 'lobster/dedup-config/index'"],
  29. ['tenant_company_menu', "menu_id IN (3000, 29924) OR component = 'lobster/dedup-config/index' OR path = 'dedup-config'"]
  30. ]
  31. const TENANT_SQL = `
  32. DELETE FROM sys_role_menu WHERE menu_id = 29924;
  33. DELETE FROM company_role_menu WHERE menu_id = 29924;
  34. DELETE FROM company_menu WHERE menu_id = 29924 OR path = 'dedup-config' OR component = 'lobster/dedup-config/index';
  35. DELETE FROM sys_menu WHERE menu_id = 29924 OR path = 'dedup-config' OR component = 'lobster/dedup-config/index';
  36. `
  37. function dbNameFromUrl(url) {
  38. if (!url) return null
  39. const m = String(url).match(/\/([^/?]+)(?:\?|$)/)
  40. return m ? m[1] : null
  41. }
  42. async function tableExists(conn, table) {
  43. const [rows] = await conn.query('SHOW TABLES LIKE ?', [table])
  44. return rows.length > 0
  45. }
  46. async function main() {
  47. const masterConn = await mysql.createConnection({ ...DB_CFG, database: MASTER_DB })
  48. await masterConn.query(CORE_SQL)
  49. for (const [table, where] of TENANT_TEMPLATE_CLEANUP) {
  50. if (await tableExists(masterConn, table)) {
  51. await masterConn.query(`DELETE FROM ${table} WHERE ${where}`)
  52. }
  53. }
  54. const [menuRows] = await masterConn.query(
  55. 'SELECT menu_id, menu_name, parent_id, path, component FROM sys_menu WHERE menu_id = 2621'
  56. )
  57. console.log('master menu 2621:', menuRows[0] || 'NOT FOUND')
  58. const dbs = new Set()
  59. try {
  60. const [tenants] = await masterConn.query(
  61. 'SELECT db_url FROM tenant_info WHERE db_url IS NOT NULL AND db_url != \'\''
  62. )
  63. for (const t of tenants) {
  64. const name = dbNameFromUrl(t.db_url)
  65. if (name) dbs.add(name)
  66. }
  67. } catch (e) {
  68. console.warn('tenant_info skipped:', e.message)
  69. }
  70. await masterConn.end()
  71. for (const db of dbs) {
  72. const conn = await mysql.createConnection({ ...DB_CFG, database: db })
  73. try {
  74. if (!(await tableExists(conn, 'sys_menu'))) continue
  75. await conn.query(TENANT_SQL)
  76. console.log(`${db}: tenant dedup menu removed`)
  77. } catch (e) {
  78. console.error(`${db}: ${e.message}`)
  79. } finally {
  80. await conn.end()
  81. }
  82. }
  83. }
  84. main().catch(err => {
  85. console.error(err)
  86. process.exit(1)
  87. })