@jiexiaoyin/wecom-api 0.0.2

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 (58) hide show
  1. package/README.md +228 -0
  2. package/config.example.json +7 -0
  3. package/config.js +76 -0
  4. package/docs/approval-templates.example.json +11 -0
  5. package/docs/nginx-mirror.md +193 -0
  6. package/openclaw.plugin.json +15 -0
  7. package/package.json +34 -0
  8. package/plugin.cjs +172 -0
  9. package/plugin.ts +136 -0
  10. package/skills/wecom-api/SKILL.md +40 -0
  11. package/skills/wecom-api/index.js +288 -0
  12. package/skills/wecom-api/openclaw.plugin.json +10 -0
  13. package/src/callback-helper.js +198 -0
  14. package/src/config.cjs +286 -0
  15. package/src/core/permission.js +479 -0
  16. package/src/crypto.js +130 -0
  17. package/src/index.js +199 -0
  18. package/src/modules/addressbook/index.js +413 -0
  19. package/src/modules/addressbook_cache/index.js +365 -0
  20. package/src/modules/advanced/index.js +159 -0
  21. package/src/modules/app/index.js +102 -0
  22. package/src/modules/approval/index.js +146 -0
  23. package/src/modules/auth/index.js +103 -0
  24. package/src/modules/callback/index.js +1180 -0
  25. package/src/modules/chain/index.js +193 -0
  26. package/src/modules/checkin/index.js +142 -0
  27. package/src/modules/checkin_rules/index.js +251 -0
  28. package/src/modules/contact/index.js +481 -0
  29. package/src/modules/contact_stats/index.js +349 -0
  30. package/src/modules/custom/index.js +140 -0
  31. package/src/modules/customer/index.js +51 -0
  32. package/src/modules/disk/index.js +245 -0
  33. package/src/modules/document/index.js +282 -0
  34. package/src/modules/hr/index.js +93 -0
  35. package/src/modules/intelligence/index.js +346 -0
  36. package/src/modules/kf/index.js +74 -0
  37. package/src/modules/live/index.js +122 -0
  38. package/src/modules/media/index.js +183 -0
  39. package/src/modules/meeting/index.js +665 -0
  40. package/src/modules/message/index.js +402 -0
  41. package/src/modules/messenger/index.js +208 -0
  42. package/src/modules/moments/index.js +161 -0
  43. package/src/modules/msgaudit/index.js +24 -0
  44. package/src/modules/notify/index.js +81 -0
  45. package/src/modules/oceanengine/index.js +199 -0
  46. package/src/modules/openchat/index.js +197 -0
  47. package/src/modules/phone/index.js +45 -0
  48. package/src/modules/room/index.js +178 -0
  49. package/src/modules/schedule/index.js +246 -0
  50. package/src/modules/school/index.js +199 -0
  51. package/src/modules/security/index.js +223 -0
  52. package/src/modules/sensitive/index.js +170 -0
  53. package/src/modules/thirdparty/index.js +145 -0
  54. package/src/sdk/index.js +269 -0
  55. package/src/utils/callback-helper.js +198 -0
  56. package/test/callback-crypto.test.js +55 -0
  57. package/test/crypto.test.js +85 -0
  58. package/test/permission.test.js +115 -0
@@ -0,0 +1,115 @@
1
+ /**
2
+ * 权限模块测试
3
+ *
4
+ * 运行:node test/permission.test.js
5
+ */
6
+
7
+ const Permission = require('../src/core/permission');
8
+
9
+ // 模拟 addressbook 模块
10
+ const mockAddressbook = {
11
+ async getUser(userId) {
12
+ const userMap = {
13
+ 'JieXiaoYin': { userid: 'JieXiaoYin', department: [14] },
14
+ 'ZhouZhou': { userid: 'ZhouZhou', department: [14] },
15
+ 'ZhangJing': { userid: 'ZhangJing', department: [28, 18] },
16
+ 'WeiXiaoYiRan': { userid: 'WeiXiaoYiRan', department: [19, 20] },
17
+ 'ZhuQiXia': { userid: 'ZhuQiXia', department: [8] },
18
+ 'staff001': { userid: 'staff001', department: [15] }
19
+ };
20
+ return userMap[userId] || null;
21
+ },
22
+ async getDepartmentDetail(deptId) {
23
+ const deptMap = {
24
+ 14: { id: 14, department_chairman_userid: 'JieXiaoYin' },
25
+ 8: { id: 8, department_chairman_userid: 'ZhuQiXia' },
26
+ 28: { id: 28, department_chairman_userid: 'ZhangJing' }
27
+ };
28
+ return deptMap[deptId] || null;
29
+ }
30
+ };
31
+
32
+ // 测试配置(带角色映射)
33
+ const testConfig = {
34
+ roleMapping: {
35
+ admin: {
36
+ users: ['admin001']
37
+ },
38
+ manager: {
39
+ departments: [14, 8], // 华为管理组 + 总仓
40
+ users: ['manager001']
41
+ },
42
+ staff: {
43
+ departments: [],
44
+ users: []
45
+ }
46
+ }
47
+ };
48
+
49
+ async function runTests() {
50
+ console.log('=== 权限模块测试 ===\n');
51
+
52
+ const permission = new Permission(testConfig, mockAddressbook);
53
+
54
+ // 1. 测试角色获取
55
+ console.log('1. 测试角色获取');
56
+ console.log(' - admin001 (映射表admin) →', await permission.getUserRole('admin001'));
57
+ console.log(' - manager001 (映射表manager) →', await permission.getUserRole('manager001'));
58
+ console.log(' - JieXiaoYin (华为管理组负责人) →', await permission.getUserRole('JieXiaoYin'));
59
+ console.log(' - staff001 (普通员工) →', await permission.getUserRole('staff001'));
60
+ console.log('');
61
+
62
+ // 2. 测试权限检查
63
+ console.log('2. 测试权限检查 (contact.getClientList)');
64
+ console.log(' - admin001 →', await permission.checkPermission('admin001', 'contact', 'getClientList'));
65
+ console.log(' - manager001 →', await permission.checkPermission('manager001', 'contact', 'getClientList'));
66
+ console.log(' - staff001 →', await permission.checkPermission('staff001', 'contact', 'getClientList'));
67
+ console.log('');
68
+
69
+ // 3. 测试管理员全权限
70
+ console.log('3. 测试管理员全权限 (app.setAppInfo)');
71
+ console.log(' - admin001 →', await permission.checkPermission('admin001', 'app', 'setAppInfo'));
72
+ console.log(' - manager001 →', await permission.checkPermission('manager001', 'app', 'setAppInfo'));
73
+ console.log(' - staff001 →', await permission.checkPermission('staff001', 'app', 'setAppInfo'));
74
+ console.log('');
75
+
76
+ // 4. 测试数据范围
77
+ console.log('4. 测试数据范围');
78
+ console.log(' - admin:', JSON.stringify(await permission.getDataScope('admin001')));
79
+ console.log(' - manager001:', JSON.stringify(await permission.getDataScope('manager001')));
80
+ console.log(' - staff001:', JSON.stringify(await permission.getDataScope('staff001')));
81
+ console.log('');
82
+
83
+ // 5. 测试数据过滤
84
+ console.log('5. 测试数据过滤');
85
+ const testData = [
86
+ { userId: 'JieXiaoYin', name: '接晓银', department: 14 },
87
+ { userId: 'staff001', name: '普通员工', department: 15 },
88
+ { userId: 'ZhangJing', name: '张静', department: 18 },
89
+ { userId: 'WeiXiaoYiRan', name: '王燕燕', department: 19 }
90
+ ];
91
+
92
+ console.log(' 原始数据:', testData.length, '条');
93
+ const filteredByManager = await permission.filterData(testData, 'manager001', 'userId');
94
+ console.log(' manager001 (管辖14/8) 过滤后:', filteredByManager.length, '条');
95
+ console.log(' 过滤结果:', filteredByManager.map(d => d.name).join(', '));
96
+
97
+ const filteredByStaff = await permission.filterData(testData, 'staff001', 'userId');
98
+ console.log(' staff001 过滤后:', filteredByStaff.length, '条');
99
+ console.log(' 过滤结果:', filteredByStaff.map(d => d.name).join(', '));
100
+ console.log('');
101
+
102
+ // 6. 测试 requirePermission 抛出异常
103
+ console.log('6. 测试 requirePermission 异常');
104
+ try {
105
+ await permission.requirePermission('staff001', 'app', 'setAppInfo');
106
+ console.log(' ✗ 预期抛出异常但没有');
107
+ } catch (e) {
108
+ console.log(' ✓ staff001 调用 app.setAppInfo 正确抛出异常:', e.message);
109
+ }
110
+ console.log('');
111
+
112
+ console.log('=== 测试完成 ===');
113
+ }
114
+
115
+ runTests().catch(console.error);