ts-glitter 20.4.5 → 20.4.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. package/lowcode/Entry.js +1 -1
  2. package/lowcode/Entry.ts +1 -1
  3. package/lowcode/backend-manager/bg-widget.js +19 -17
  4. package/lowcode/backend-manager/bg-widget.ts +19 -17
  5. package/lowcode/cms-plugin/user/user-module.js +28 -28
  6. package/lowcode/cms-plugin/user/user-module.ts +29 -31
  7. package/lowcode/cms-plugin/user-list.js +55 -42
  8. package/lowcode/cms-plugin/user-list.ts +71 -47
  9. package/lowcode/glitter-base/route/progress.js +32 -0
  10. package/lowcode/glitter-base/route/progress.ts +36 -0
  11. package/lowcode/glitter-base/route/user.js +37 -1
  12. package/lowcode/glitter-base/route/user.ts +40 -1
  13. package/lowcode/glitterBundle/dialog/ShareDialog.ts +0 -1
  14. package/package.json +3 -1
  15. package/src/api-public/controllers/ai-chat.js.map +1 -1
  16. package/src/api-public/controllers/app-release.js.map +1 -1
  17. package/src/api-public/controllers/delivery.js.map +1 -1
  18. package/src/api-public/controllers/graph-api.js.map +1 -1
  19. package/src/api-public/controllers/index.js +9 -8
  20. package/src/api-public/controllers/index.js.map +1 -1
  21. package/src/api-public/controllers/index.ts +171 -169
  22. package/src/api-public/controllers/lambda.js.map +1 -1
  23. package/src/api-public/controllers/manager.js.map +1 -1
  24. package/src/api-public/controllers/post.js.map +1 -1
  25. package/src/api-public/controllers/progress.d.ts +3 -0
  26. package/src/api-public/controllers/progress.js +29 -0
  27. package/src/api-public/controllers/progress.js.map +1 -0
  28. package/src/api-public/controllers/progress.ts +25 -0
  29. package/src/api-public/controllers/sql_api.js.map +1 -1
  30. package/src/api-public/controllers/track.js.map +1 -1
  31. package/src/api-public/controllers/user.js +47 -1
  32. package/src/api-public/controllers/user.js.map +1 -1
  33. package/src/api-public/controllers/user.ts +44 -3
  34. package/src/api-public/services/checkout.d.ts +1 -0
  35. package/src/api-public/services/checkout.js +16 -6
  36. package/src/api-public/services/checkout.js.map +1 -1
  37. package/src/api-public/services/checkout.ts +28 -18
  38. package/src/api-public/services/customer-sessions.js.map +1 -1
  39. package/src/api-public/services/fake-data-model/fake-order.d.ts +6 -1
  40. package/src/api-public/services/fake-data-model/fake-order.js +159 -155
  41. package/src/api-public/services/fake-data-model/fake-order.js.map +1 -1
  42. package/src/api-public/services/fake-data-model/fake-order.ts +186 -179
  43. package/src/api-public/services/fake-data-model/fake-product.js +94 -94
  44. package/src/api-public/services/fake-data-model/fake-product.js.map +1 -1
  45. package/src/api-public/services/fake-data-model/fake-product.ts +109 -114
  46. package/src/api-public/services/fake-data-model/fake-user.d.ts +17 -1
  47. package/src/api-public/services/fake-data-model/fake-user.js +70 -384
  48. package/src/api-public/services/fake-data-model/fake-user.js.map +1 -1
  49. package/src/api-public/services/fake-data-model/fake-user.ts +111 -394
  50. package/src/api-public/services/initial-fake-data.js +50 -10
  51. package/src/api-public/services/initial-fake-data.js.map +1 -1
  52. package/src/api-public/services/initial-fake-data.ts +92 -22
  53. package/src/api-public/services/invoice.js.map +1 -1
  54. package/src/api-public/services/manager.js.map +1 -1
  55. package/src/api-public/services/notify.js +234 -213
  56. package/src/api-public/services/notify.js.map +1 -1
  57. package/src/api-public/services/notify.ts +520 -494
  58. package/src/api-public/services/phone-verify.js.map +1 -1
  59. package/src/api-public/services/pos.js.map +1 -1
  60. package/src/api-public/services/post.js.map +1 -1
  61. package/src/api-public/services/rebate.d.ts +1 -0
  62. package/src/api-public/services/rebate.js +15 -8
  63. package/src/api-public/services/rebate.js.map +1 -1
  64. package/src/api-public/services/rebate.ts +24 -15
  65. package/src/api-public/services/recommend.js.map +1 -1
  66. package/src/api-public/services/schedule.js +8 -5
  67. package/src/api-public/services/schedule.js.map +1 -1
  68. package/src/api-public/services/schedule.ts +344 -335
  69. package/src/api-public/services/shopee.js.map +1 -1
  70. package/src/api-public/services/shopping.d.ts +1 -1
  71. package/src/api-public/services/shopping.js +28 -25
  72. package/src/api-public/services/shopping.js.map +1 -1
  73. package/src/api-public/services/shopping.ts +89 -76
  74. package/src/api-public/services/stock.js.map +1 -1
  75. package/src/api-public/services/user.d.ts +10 -1
  76. package/src/api-public/services/user.js +245 -42
  77. package/src/api-public/services/user.js.map +1 -1
  78. package/src/api-public/services/user.ts +325 -45
  79. package/src/api-public/services/voucher.js.map +1 -1
  80. package/src/api-public/services/workers.js.map +1 -1
  81. package/src/api-public/utils/ut-permission.d.ts +0 -1
  82. package/src/api-public/utils/ut-permission.js.map +1 -1
  83. package/src/config.d.ts +2 -1
  84. package/src/config.js +2 -1
  85. package/src/config.js.map +1 -1
  86. package/src/config.ts +142 -142
  87. package/src/controllers/app.js.map +1 -1
  88. package/src/controllers/backend-server.js.map +1 -1
  89. package/src/controllers/filemanager.js.map +1 -1
  90. package/src/controllers/index.js.map +1 -1
  91. package/src/controllers/user.js.map +1 -1
  92. package/src/domain-check.js.map +1 -1
  93. package/src/index.js.map +1 -1
  94. package/src/index.ts +3 -12
  95. package/src/modules/AWSLib.js +2 -3
  96. package/src/modules/AWSLib.js.map +1 -1
  97. package/src/modules/database.d.ts +1 -2
  98. package/src/modules/database.js.map +1 -1
  99. package/src/modules/firebase.js.map +1 -1
  100. package/src/modules/logger.js.map +1 -1
  101. package/src/modules/redis.d.ts +1 -1
  102. package/src/modules/redis.js.map +1 -1
  103. package/src/run.js +1 -2
  104. package/src/run.js.map +1 -1
  105. package/src/services/backend-service.js.map +1 -1
  106. package/src/services/create-instance.js +3 -4
  107. package/src/services/create-instance.js.map +1 -1
  108. package/src/services/global-event.js.map +1 -1
  109. package/src/services/ios-release.js.map +1 -1
  110. package/src/services/page.js.map +1 -1
  111. package/src/services/private_config.js.map +1 -1
  112. package/src/services/release.js.map +1 -1
  113. package/src/services/seo.js.map +1 -1
  114. package/src/services/tool.js +2 -3
  115. package/src/services/tool.js.map +1 -1
  116. package/src/services/user.js.map +1 -1
  117. package/src/services/web-socket.js.map +1 -1
  118. package/src/update-progress-track.d.ts +14 -0
  119. package/src/update-progress-track.js +28 -0
  120. package/src/update-progress-track.js.map +1 -0
  121. package/src/update-progress-track.ts +34 -0
@@ -59,6 +59,7 @@ const public_table_check_js_1 = require("./public-table-check.js");
59
59
  const ut_timer_1 = require("../utils/ut-timer");
60
60
  const auto_fcm_js_1 = require("../../public-config-initial/auto-fcm.js");
61
61
  const phone_verify_js_1 = require("./phone-verify.js");
62
+ const update_progress_track_js_1 = require("../../update-progress-track.js");
62
63
  class User {
63
64
  constructor(app, token) {
64
65
  this.normalMember = {
@@ -1032,7 +1033,7 @@ class User {
1032
1033
  return orderByMap[orderBy] || 'u.id DESC';
1033
1034
  }
1034
1035
  async getUserList(query) {
1035
- var _a, _b, _c, _d, _e;
1036
+ var _a, _b, _c;
1036
1037
  try {
1037
1038
  const checkPoint = new ut_timer_1.UtTimer('GET-USER-LIST').checkPoint;
1038
1039
  const orderCountingSQL = await this.getCheckoutCountingModeSQL();
@@ -1260,34 +1261,97 @@ class User {
1260
1261
  where: querySql,
1261
1262
  orderBy: (_c = query.order_string) !== null && _c !== void 0 ? _c : '',
1262
1263
  });
1263
- const dataSQL = await this.getUserAndOrderSQL({
1264
- select: 'o.email, o.order_count, o.total_amount, u.*, lo.last_order_total, lo.last_order_time',
1265
- where: querySql,
1266
- orderBy: (_d = query.order_string) !== null && _d !== void 0 ? _d : '',
1267
- page: query === null || query === void 0 ? void 0 : query.page,
1268
- limit: query === null || query === void 0 ? void 0 : query.limit,
1269
- });
1270
- const levelData = (_e = (await this.getConfigV2({ key: 'member_level_config', user_id: 'manager' })).levels) !== null && _e !== void 0 ? _e : [];
1271
- const userData = (await database_1.default.query(dataSQL, [])).map((dd) => {
1272
- dd.pwd = undefined;
1273
- const find_level = levelData.find((d1) => {
1274
- return dd.member_level === d1.id;
1264
+ const processChunk = 1000;
1265
+ const getUserQuery = async (param) => {
1266
+ var _a, _b;
1267
+ const dataSQL = await this.getUserAndOrderSQL({
1268
+ select: 'o.email, o.order_count, o.total_amount, u.*, lo.last_order_total, lo.last_order_time',
1269
+ where: querySql,
1270
+ orderBy: (_a = query.order_string) !== null && _a !== void 0 ? _a : '',
1271
+ page: param === null || param === void 0 ? void 0 : param.page,
1272
+ limit: param === null || param === void 0 ? void 0 : param.limit,
1275
1273
  });
1276
- dd.tag_name = (find_level) ? find_level.tag_name : '一般會員';
1277
- return dd;
1278
- });
1279
- userData.map((dd) => {
1280
- dd.last_order_total = dd.last_order_total || 0;
1281
- dd.order_count = dd.order_count || 0;
1282
- dd.total_amount = dd.total_amount || 0;
1283
- });
1284
- return {
1285
- data: userData,
1286
- total: (await database_1.default.query(countSQL, []))[0]['count(1)'],
1287
- extra: {
1288
- noRegisterUsers: noRegisterUsers.length > 0 ? noRegisterUsers : undefined,
1289
- },
1274
+ const levelData = (_b = (await this.getConfigV2({ key: 'member_level_config', user_id: 'manager' })).levels) !== null && _b !== void 0 ? _b : [];
1275
+ const getUsers = (await database_1.default.query(dataSQL, [])).map((dd) => {
1276
+ dd.pwd = undefined;
1277
+ const find_level = levelData.find((d1) => {
1278
+ return dd.member_level === d1.id;
1279
+ });
1280
+ dd.tag_name = find_level ? find_level.tag_name : '一般會員';
1281
+ return dd;
1282
+ });
1283
+ checkPoint('getUsers');
1284
+ if (param) {
1285
+ const dataArray = [];
1286
+ for (let i = 0; i < getUsers.length; i += processChunk) {
1287
+ const data = await processUserData(getUsers.slice(i, i + processChunk));
1288
+ dataArray.push(data);
1289
+ checkPoint(`processUserData ${i}`);
1290
+ }
1291
+ return dataArray.flat();
1292
+ }
1293
+ return getUsers.map((user) => ({ userID: user.userID }));
1290
1294
  };
1295
+ const processUserData = async (userData) => {
1296
+ const levels = await this.getUserLevel(userData.map((user) => ({ userId: user.userID })));
1297
+ const levelMap = new Map(levels.map(lv => { var _a; return [lv.id, (_a = lv.data.dead_line) !== null && _a !== void 0 ? _a : '']; }));
1298
+ checkPoint('levels');
1299
+ const mapUser = async (user) => {
1300
+ var _a;
1301
+ const phone = user.userData.phone || 'asnhsauh';
1302
+ const email = user.userData.email || 'asnhsauh';
1303
+ const userRebate = await new rebate_js_1.Rebate(this.app).getOneRebate({
1304
+ user_id: user.userID,
1305
+ quickPass: true,
1306
+ });
1307
+ user.rebate = userRebate ? userRebate.point : 0;
1308
+ user.member_deadline = (_a = levelMap.get(user.userID)) !== null && _a !== void 0 ? _a : '';
1309
+ user.latest_order_date = (await database_1.default.query(`select created_time
1310
+ from \`${this.app}\`.t_checkout
1311
+ where email in ('${email}', '${phone}')
1312
+ and ${orderCountingSQL}
1313
+ order by created_time desc limit 0,1`, []))[0];
1314
+ user.latest_order_date = user.latest_order_date && user.latest_order_date.created_time;
1315
+ user.latest_order_total = (await database_1.default.query(`select total
1316
+ from \`${this.app}\`.t_checkout
1317
+ where email in ('${email}', '${phone}')
1318
+ and ${orderCountingSQL}
1319
+ order by created_time desc limit 0,1`, []))[0];
1320
+ user.latest_order_total = user.latest_order_total && user.latest_order_total.total;
1321
+ user.checkout_total = (await database_1.default.query(`select sum(total)
1322
+ from \`${this.app}\`.t_checkout
1323
+ where email in ('${email}', '${phone}')
1324
+ and ${orderCountingSQL} `, []))[0];
1325
+ user.checkout_total = user.checkout_total && user.checkout_total['sum(total)'];
1326
+ user.checkout_count = (await database_1.default.query(`select count(1)
1327
+ from \`${this.app}\`.t_checkout
1328
+ where email in ('${email}', '${phone}')
1329
+ and ${orderCountingSQL} `, []))[0];
1330
+ user.checkout_count = user.checkout_count && user.checkout_count['count(1)'];
1331
+ user.last_order_total = user.last_order_total || 0;
1332
+ user.order_count = user.order_count || 0;
1333
+ user.total_amount = user.total_amount || 0;
1334
+ };
1335
+ if (Array.isArray(userData) && userData.length > 0) {
1336
+ const chunkSize = 100;
1337
+ for (let i = 0; i < userData.length; i += chunkSize) {
1338
+ const batch = userData.slice(i, i + chunkSize);
1339
+ await Promise.all(batch.map(async (user) => {
1340
+ await mapUser(user);
1341
+ checkPoint('mapUser');
1342
+ }));
1343
+ }
1344
+ }
1345
+ return userData;
1346
+ };
1347
+ const [pageUsers, allUsers] = await Promise.all([
1348
+ getUserQuery({ page: query.page, limit: query.limit }),
1349
+ query.all_result ? getUserQuery() : [],
1350
+ ]);
1351
+ checkPoint('return data');
1352
+ return Object.assign(Object.assign({ data: pageUsers }, (allUsers.length > 0 ? { allUsers } : {})), { total: (await database_1.default.query(countSQL, []))[0]['count(1)'], extra: {
1353
+ noRegisterUsers: noRegisterUsers.length > 0 ? noRegisterUsers : undefined,
1354
+ } });
1291
1355
  }
1292
1356
  catch (e) {
1293
1357
  throw exception_1.default.BadRequestError('BAD_REQUEST', 'getUserList Error:' + e, null);
@@ -1393,11 +1457,18 @@ class User {
1393
1457
  if (existNormalTag || existZeroValue) {
1394
1458
  return levelList;
1395
1459
  }
1396
- return [this.normalMember, ...levelList];
1460
+ const formatLevelList = levelList.map((item) => {
1461
+ item.index++;
1462
+ return item;
1463
+ });
1464
+ return [this.normalMember, ...formatLevelList];
1397
1465
  }
1398
1466
  async filterMemberUpdates(idList) {
1399
1467
  try {
1400
1468
  const memberUpdates = [];
1469
+ if (idList.length === 0) {
1470
+ return [];
1471
+ }
1401
1472
  if (idList.length > 10000) {
1402
1473
  const idSetArray = [...new Set(idList)];
1403
1474
  const idMap = new Map();
@@ -1440,11 +1511,10 @@ class User {
1440
1511
  return [];
1441
1512
  }
1442
1513
  }
1443
- async setLevelData(user, memberUpdates, levelConfig) {
1514
+ async setLevelData(user, quickPass, memberUpdates, levelList) {
1444
1515
  var _a;
1445
1516
  const { userID, userData } = user;
1446
1517
  const { level_status, level_default, email } = userData;
1447
- const levelList = levelConfig !== null && levelConfig !== void 0 ? levelConfig : (await this.getLevelConfig());
1448
1518
  const normalMember = (_a = levelList[0]) !== null && _a !== void 0 ? _a : this.normalMember;
1449
1519
  const normalData = {
1450
1520
  id: normalMember.id,
@@ -1462,6 +1532,31 @@ class User {
1462
1532
  data: matchedLevel !== null && matchedLevel !== void 0 ? matchedLevel : normalData,
1463
1533
  };
1464
1534
  }
1535
+ if (quickPass) {
1536
+ const index = user.member_level ? levelList.findIndex((level) => level.id === user.member_level) : 0;
1537
+ const getLevel = levelList[index];
1538
+ const formatData = {
1539
+ id: getLevel.id,
1540
+ og: {
1541
+ id: getLevel.id,
1542
+ index: index,
1543
+ duration: getLevel.duration,
1544
+ tag_name: getLevel.tag_name,
1545
+ condition: getLevel.condition,
1546
+ dead_line: getLevel.dead_line,
1547
+ create_date: getLevel.create_date,
1548
+ },
1549
+ trigger: true,
1550
+ tag_name: getLevel.tag_name,
1551
+ dead_line: '',
1552
+ };
1553
+ return {
1554
+ id: userID,
1555
+ email,
1556
+ status: 'auto',
1557
+ data: formatData,
1558
+ };
1559
+ }
1465
1560
  if (memberUpdates.length > 0) {
1466
1561
  const matchedUpdates = await this.checkMember(user, false);
1467
1562
  const triggeredLevel = matchedUpdates.find((v) => v.trigger);
@@ -1482,6 +1577,7 @@ class User {
1482
1577
  };
1483
1578
  }
1484
1579
  async getUserLevel(data) {
1580
+ const utTimer = new ut_timer_1.UtTimer('getUserLevel');
1485
1581
  const idList = data
1486
1582
  .filter(item => Boolean(item.userId))
1487
1583
  .map(item => `${item.userId}`)
@@ -1498,20 +1594,17 @@ class User {
1498
1594
  `, []);
1499
1595
  if (!users || users.length == 0)
1500
1596
  return [];
1501
- const chunk = 50;
1502
- const chunkArray = [];
1597
+ const chunk = 20;
1503
1598
  const dataList = [];
1504
1599
  const levelConfig = await this.getLevelConfig();
1505
1600
  const memberUpdates = await this.filterMemberUpdates(idList);
1506
1601
  for (let i = 0; i < users.length; i += chunk) {
1507
- chunkArray.push(users.slice(i, i + chunk));
1508
- }
1509
- await Promise.all(chunkArray.map(async (userArray) => {
1602
+ const userArray = users.slice(i, i + chunk);
1510
1603
  await Promise.all(userArray.map(async (user) => {
1511
- const userData = await this.setLevelData(user, memberUpdates, levelConfig);
1604
+ const userData = await this.setLevelData(user, users.length > 100, memberUpdates, levelConfig);
1512
1605
  dataList.push(userData);
1513
1606
  }));
1514
- }));
1607
+ }
1515
1608
  return dataList;
1516
1609
  }
1517
1610
  async subscribe(email, tag) {
@@ -1710,11 +1803,10 @@ class User {
1710
1803
  });
1711
1804
  }
1712
1805
  if (login_config.phone_verify &&
1713
- !(await phone_verify_js_1.PhoneVerify.verify(par.userData.phone, par.userData.verify_code_phone))
1714
- &&
1715
- register_form.list.find((dd) => {
1716
- return dd.key === 'phone' && `${dd.hidden}` !== 'true';
1717
- })) {
1806
+ !(await phone_verify_js_1.PhoneVerify.verify(par.userData.phone, par.userData.verify_code_phone)) &&
1807
+ register_form.list.find((dd) => {
1808
+ return dd.key === 'phone' && `${dd.hidden}` !== 'true';
1809
+ })) {
1718
1810
  throw exception_1.default.BadRequestError('BAD_REQUEST', 'Verify code error.', {
1719
1811
  msg: 'phone-verify-false',
1720
1812
  });
@@ -1763,6 +1855,117 @@ class User {
1763
1855
  throw exception_1.default.BadRequestError(e.code || 'BAD_REQUEST', e.message, { data: userData });
1764
1856
  }
1765
1857
  }
1858
+ async batchGetUser(userId) {
1859
+ try {
1860
+ const sql = `SELECT * FROM \`${this.app}\`.t_user WHERE userID = ?`;
1861
+ const dataArray = [];
1862
+ const stack = {
1863
+ appName: this.app,
1864
+ taskId: tool_js_1.default.randomString(12),
1865
+ taskTag: 'batchGetUser',
1866
+ progress: 0,
1867
+ };
1868
+ update_progress_track_js_1.StackTracker.stack.push(stack);
1869
+ if (Array.isArray(userId) && userId.length > 0) {
1870
+ const chunkSize = 100;
1871
+ for (let i = 0; i < userId.length; i += chunkSize) {
1872
+ const size = i + chunkSize;
1873
+ const batch = userId.slice(i, size);
1874
+ await Promise.all(batch.map(async (id) => {
1875
+ const results = await database_1.default.query(sql, [database_1.default.escape(id)]);
1876
+ results.forEach((result) => delete result.pwd);
1877
+ dataArray.push(results);
1878
+ }));
1879
+ update_progress_track_js_1.StackTracker.setProgress(stack.taskId, update_progress_track_js_1.StackTracker.calcPercentage(size, userId.length));
1880
+ }
1881
+ }
1882
+ update_progress_track_js_1.StackTracker.clearProgress(stack.taskId);
1883
+ return dataArray.flat();
1884
+ }
1885
+ catch (error) {
1886
+ throw exception_1.default.BadRequestError('BAD_REQUEST', 'Batch get userData:' + error, null);
1887
+ }
1888
+ }
1889
+ async batchUpdateUserData(trackName, users) {
1890
+ try {
1891
+ const stack = {
1892
+ appName: this.app,
1893
+ taskId: tool_js_1.default.randomString(12),
1894
+ taskTag: trackName,
1895
+ progress: 0,
1896
+ };
1897
+ update_progress_track_js_1.StackTracker.stack.push(stack);
1898
+ if (Array.isArray(users) && users.length > 0) {
1899
+ const chunkSize = 200;
1900
+ for (let i = 0; i < users.length; i += chunkSize) {
1901
+ const size = i + chunkSize;
1902
+ const batch = users.slice(i, size);
1903
+ update_progress_track_js_1.StackTracker.setProgress(stack.taskId, update_progress_track_js_1.StackTracker.calcPercentage(size, users.length));
1904
+ await Promise.all(batch.map(async (user) => {
1905
+ await new Promise(async (resolve) => {
1906
+ await this.updateUserData(user.id, user.data);
1907
+ setTimeout(() => resolve(true), 200);
1908
+ });
1909
+ }));
1910
+ }
1911
+ }
1912
+ update_progress_track_js_1.StackTracker.clearProgress(stack.taskId);
1913
+ return;
1914
+ }
1915
+ catch (error) {
1916
+ throw exception_1.default.BadRequestError('BAD_REQUEST', 'Batch update userData:' + error, null);
1917
+ }
1918
+ }
1919
+ async batchAddtag(userId, tags) {
1920
+ try {
1921
+ const users = await this.batchGetUser(userId);
1922
+ const updateData = users.map((item) => {
1923
+ item.userData.tags = item.userData.tags ? [...new Set([...item.userData.tags, ...tags])] : tags;
1924
+ return {
1925
+ id: item.userID,
1926
+ data: item,
1927
+ };
1928
+ });
1929
+ await this.batchUpdateUserData('batchAddtag', updateData);
1930
+ }
1931
+ catch (error) {
1932
+ throw exception_1.default.BadRequestError('BAD_REQUEST', 'Batch add tag:' + error, null);
1933
+ }
1934
+ }
1935
+ async batchRemovetag(userId, tags) {
1936
+ try {
1937
+ const users = await this.batchGetUser(userId);
1938
+ const postMap = new Map(tags.map(tag => [tag, true]));
1939
+ const updateData = users.map((item) => {
1940
+ item.userData.tags = item.userData.tags ? item.userData.tags.filter((tag) => !postMap.get(tag)) : [];
1941
+ return {
1942
+ id: item.userID,
1943
+ data: item,
1944
+ };
1945
+ });
1946
+ await this.batchUpdateUserData('batchRemovetag', updateData);
1947
+ }
1948
+ catch (error) {
1949
+ throw exception_1.default.BadRequestError('BAD_REQUEST', 'Batch remove tag:' + error, null);
1950
+ }
1951
+ }
1952
+ async batchManualLevel(userId, level) {
1953
+ try {
1954
+ const users = await this.batchGetUser(userId);
1955
+ const updateData = users.map((item) => {
1956
+ item.userData.level_status = 'manual';
1957
+ item.userData.level_default = level;
1958
+ return {
1959
+ id: item.userID,
1960
+ data: item,
1961
+ };
1962
+ });
1963
+ await this.batchUpdateUserData('batchManualLevel', updateData);
1964
+ }
1965
+ catch (error) {
1966
+ throw exception_1.default.BadRequestError('BAD_REQUEST', 'Batch manual level:' + error, null);
1967
+ }
1968
+ }
1766
1969
  async clearUselessData(userData, manager) {
1767
1970
  var _a, _b;
1768
1971
  let config = await app_js_1.default.getAdConfig(this.app, 'glitterUserForm');