@cryozerolabs/n8n-nodes-dingtalk 0.3.4 → 0.4.0

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 (25) hide show
  1. package/README.md +14 -2
  2. package/dist/credentials/DingtalkApi.credentials.js +9 -10
  3. package/dist/credentials/DingtalkApi.credentials.js.map +1 -1
  4. package/dist/docs/images/stream-push-guide.png +0 -0
  5. package/dist/nodes/DingtalkNode/DingtalkNodeTrigger.node.d.ts +5 -0
  6. package/dist/nodes/DingtalkNode/DingtalkNodeTrigger.node.js +65 -0
  7. package/dist/nodes/DingtalkNode/DingtalkNodeTrigger.node.js.map +1 -0
  8. package/dist/nodes/DingtalkNode/DingtalkNodeTrigger.node.json +21 -0
  9. package/dist/nodes/DingtalkNode/resources/todo/tasksDelete.d.ts +3 -0
  10. package/dist/nodes/DingtalkNode/resources/todo/tasksDelete.js +95 -0
  11. package/dist/nodes/DingtalkNode/resources/todo/tasksDelete.js.map +1 -0
  12. package/dist/nodes/DingtalkNode/resources/user/getByMobile.d.ts +3 -0
  13. package/dist/nodes/DingtalkNode/resources/user/getByMobile.js +39 -0
  14. package/dist/nodes/DingtalkNode/resources/user/getByMobile.js.map +1 -0
  15. package/dist/nodes/DingtalkNode/resources/user/index.js +3 -1
  16. package/dist/nodes/DingtalkNode/resources/user/index.js.map +1 -1
  17. package/dist/nodes/DingtalkNode/resources/user/search.d.ts +3 -0
  18. package/dist/nodes/DingtalkNode/resources/user/search.js +71 -0
  19. package/dist/nodes/DingtalkNode/resources/user/search.js.map +1 -0
  20. package/dist/nodes/DingtalkNode/triggers/streamPushTrigger.d.ts +3 -0
  21. package/dist/nodes/DingtalkNode/triggers/streamPushTrigger.js +307 -0
  22. package/dist/nodes/DingtalkNode/triggers/streamPushTrigger.js.map +1 -0
  23. package/dist/package.json +3 -2
  24. package/dist/tsconfig.tsbuildinfo +1 -1
  25. package/package.json +3 -2
package/README.md CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  这是一个钉钉(DingTalk)的 n8n 社区节点,让你可以在 n8n 工作流中集成钉钉开放平台的各种 API。
7
7
 
8
- 钉钉是阿里巴巴集团打造的企业级智能移动办公平台,为全球企业组织提供一站式的数字化办公解决方案。本节点基于钉钉开放平台 API 开发,支持 AI 表格、用户管理、身份验证等核心功能。
8
+ 钉钉是阿里巴巴集团打造的企业级智能移动办公平台,为全球企业组织提供一站式的数字化办公解决方案。本节点基于钉钉开放平台 API 开发,支持 Stream模式监听事件订阅、AI 表格、用户管理、身份验证等核心功能。
9
9
 
10
10
  > ⚡ 使用教程、最佳实践等详尽说明请访问项目 Wiki:<https://github.com/cryozerolabs/n8n-nodes-dingtalk/wiki>
11
11
 
@@ -52,6 +52,12 @@
52
52
 
53
53
  ### 👥 用户管理 (User)
54
54
  - **获取用户详情** - 根据 userId 获取用户信息(unionId)
55
+ - **根据手机号查询用户** - 根据手机号获取用户的userId
56
+ - **搜索用户userId** - 获取指定用户的详细信息
57
+
58
+ ### ⚡️ 事件订阅
59
+ ![Stream Push](docs/images/stream-push-guide.png)
60
+ - **Stream模式推送** - 触发器,监听事件订阅回调,Stream 模式不需要公网服务器、IP、域名等资源。
55
61
 
56
62
 
57
63
  ## 🚀 安装指南
@@ -203,6 +209,12 @@
203
209
  - [功能请求](https://github.com/cryozerolabs/n8n-nodes-dingtalk/discussions)
204
210
 
205
211
  ## 📋 版本历史
212
+
213
+ ## v0.4.0
214
+ - 新增:根据手机号查询用户、搜索用户userId,简化用户获取unionId的步骤
215
+ - 新增:⚡️Stream模式事件订阅触发器
216
+ - 修改:凭证获取access_token使用企业内部api(钉钉新版本获取的统一access_token的api存在不兼容)
217
+
206
218
  ### v0.3.4
207
219
  - 增强http请求,钉钉应用申请权限后,需要使用新的access_token才会生效,对于`应用尚未开通所需的权限:[XXX.XXX.XXX]`错误,尝试刷新access_token(即使用户没有去修改权限)
208
220
 
@@ -210,7 +222,7 @@
210
222
  - 修复了AccessToken过期后无法自动刷新的问题
211
223
 
212
224
  ### v0.3.0
213
- ## ⚠️ 升级提示
225
+ #### ⚠️ 升级提示
214
226
 
215
227
  v0.3.0 重构了 AI 表格记录操作的参数模型,请在升级后逐一检查旧工作流中的相关节点:
216
228
 
@@ -55,12 +55,11 @@ class DingtalkApi {
55
55
  this.test = {
56
56
  request: {
57
57
  baseURL: 'https://api.dingtalk.com/v1.0',
58
- url: '=/oauth2/{{$credentials.corpId}}/token',
58
+ url: '=/oauth2/accessToken',
59
59
  method: 'POST',
60
60
  body: {
61
- client_id: '={{$credentials.clientId}}',
62
- client_secret: '={{$credentials.clientSecret}}',
63
- grant_type: 'client_credentials',
61
+ appKey: '={{$credentials.clientId}}',
62
+ appSecret: '={{$credentials.clientSecret}}',
64
63
  },
65
64
  },
66
65
  };
@@ -68,17 +67,17 @@ class DingtalkApi {
68
67
  async preAuthentication(credentials) {
69
68
  const res = await this.helpers.httpRequest({
70
69
  method: 'POST',
71
- url: `https://api.dingtalk.com/v1.0/oauth2/${credentials.corpId}/token`,
70
+ url: `https://api.dingtalk.com/v1.0/oauth2/accessToken`,
72
71
  body: {
73
- client_id: credentials.clientId,
74
- client_secret: credentials.clientSecret,
75
- grant_type: 'client_credentials',
72
+ appKey: credentials.clientId,
73
+ appSecret: credentials.clientSecret,
76
74
  },
77
75
  });
78
- if (res.code || !res.access_token) {
76
+ const accessToken = res.accessToken || res.access_token;
77
+ if (res.code || !accessToken) {
79
78
  throw new Error(`授权失败: ${res.message}`);
80
79
  }
81
- return { accessToken: res.access_token };
80
+ return { accessToken };
82
81
  }
83
82
  async authenticate(credentials, requestOptions) {
84
83
  var _a, _b, _c, _d;
@@ -1 +1 @@
1
- {"version":3,"file":"DingtalkApi.credentials.js","sourceRoot":"","sources":["../../credentials/DingtalkApi.credentials.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"DingtalkApi.credentials.js","sourceRoot":"","sources":["../../credentials/DingtalkApi.credentials.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { type INodeType, type INodeTypeDescription, type ITriggerFunctions, type ITriggerResponse } from 'n8n-workflow';
2
+ export declare class DingtalkNodeTrigger implements INodeType {
3
+ description: INodeTypeDescription;
4
+ trigger(this: ITriggerFunctions): Promise<ITriggerResponse | undefined>;
5
+ }
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DingtalkNodeTrigger = void 0;
4
+ const n8n_workflow_1 = require("n8n-workflow");
5
+ const streamPushTrigger_1 = require("./triggers/streamPushTrigger");
6
+ const triggerDefinitions = [
7
+ {
8
+ value: 'stream.push',
9
+ name: 'Stream模式事件订阅',
10
+ description: '当钉钉通过 Stream 模式推送事件时触发。',
11
+ properties: streamPushTrigger_1.streamPushTriggerOptions,
12
+ run: streamPushTrigger_1.runStreamPushTrigger,
13
+ },
14
+ ];
15
+ const triggerMap = new Map(triggerDefinitions.map((def) => [def.value, def]));
16
+ class DingtalkNodeTrigger {
17
+ constructor() {
18
+ this.description = {
19
+ displayName: 'Dingtalk Node Trigger',
20
+ name: 'dingtalkNodeTrigger',
21
+ icon: 'file:icon.png',
22
+ group: ['trigger'],
23
+ version: 1,
24
+ description: 'Dingtalk Node Trigger',
25
+ subtitle: '={{($parameter["event"])}}',
26
+ defaults: {
27
+ name: 'Dingtalk Node Trigger',
28
+ },
29
+ inputs: [],
30
+ outputs: ["main"],
31
+ credentials: [
32
+ {
33
+ name: 'dingtalkApi',
34
+ required: true,
35
+ },
36
+ ],
37
+ properties: [
38
+ {
39
+ displayName: 'Event',
40
+ name: 'event',
41
+ type: 'options',
42
+ default: 'stream.push',
43
+ options: triggerDefinitions.map((def) => ({
44
+ name: def.name,
45
+ value: def.value,
46
+ description: def.description,
47
+ })),
48
+ },
49
+ ...triggerDefinitions.flatMap((def) => def.properties),
50
+ ],
51
+ };
52
+ }
53
+ async trigger() {
54
+ const event = this.getNodeParameter('event', 0);
55
+ const definition = triggerMap.get(event);
56
+ if (!definition) {
57
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Unsupported trigger event "${event}"`, {
58
+ description: '请选择一个可用的触发类型。',
59
+ });
60
+ }
61
+ return definition.run.call(this);
62
+ }
63
+ }
64
+ exports.DingtalkNodeTrigger = DingtalkNodeTrigger;
65
+ //# sourceMappingURL=DingtalkNodeTrigger.node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DingtalkNodeTrigger.node.js","sourceRoot":"","sources":["../../../nodes/DingtalkNode/DingtalkNodeTrigger.node.ts"],"names":[],"mappings":";;;AAAA,+CAQsB;AACtB,oEAA8F;AAU9F,MAAM,kBAAkB,GAAwB;IAC9C;QACE,KAAK,EAAE,aAAa;QACpB,IAAI,EAAE,cAAc;QACpB,WAAW,EAAE,yBAAyB;QACtC,UAAU,EAAE,4CAAwB;QACpC,GAAG,EAAE,wCAAoB;KAC1B;CACF,CAAC;AAEF,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;AAE9E,MAAa,mBAAmB;IAAhC;QACE,gBAAW,GAAyB;YAClC,WAAW,EAAE,uBAAuB;YACpC,IAAI,EAAE,qBAAqB;YAE3B,IAAI,EAAE,eAAe;YACrB,KAAK,EAAE,CAAC,SAAS,CAAC;YAClB,OAAO,EAAE,CAAC;YACV,WAAW,EAAE,uBAAuB;YACpC,QAAQ,EAAE,4BAA4B;YACtC,QAAQ,EAAE;gBACR,IAAI,EAAE,uBAAuB;aAC9B;YACD,MAAM,EAAE,EAAE;YACV,OAAO,EAAE,QAAyB;YAClC,WAAW,EAAE;gBACX;oBACE,IAAI,EAAE,aAAa;oBACnB,QAAQ,EAAE,IAAI;iBACf;aACF;YACD,UAAU,EAAE;gBACV;oBACE,WAAW,EAAE,OAAO;oBACpB,IAAI,EAAE,OAAO;oBACb,IAAI,EAAE,SAAS;oBAEf,OAAO,EAAE,aAAa;oBACtB,OAAO,EAAE,kBAAkB,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;wBACxC,IAAI,EAAE,GAAG,CAAC,IAAI;wBACd,KAAK,EAAE,GAAG,CAAC,KAAK;wBAChB,WAAW,EAAE,GAAG,CAAC,WAAW;qBAC7B,CAAC,CAAC;iBACJ;gBACD,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC;aACvD;SACF,CAAC;IAaJ,CAAC;IAXC,KAAK,CAAC,OAAO;QACX,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAW,CAAC;QAC1D,MAAM,UAAU,GAAG,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,IAAI,iCAAkB,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,8BAA8B,KAAK,GAAG,EAAE;gBACnF,WAAW,EAAE,eAAe;aAC7B,CAAC,CAAC;QACL,CAAC;QAED,OAAO,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;CACF;AAjDD,kDAiDC"}
@@ -0,0 +1,21 @@
1
+ {
2
+ "node": "@cryozerolabs/n8n-nodes-dingtalk",
3
+ "nodeVersion": "0.3.4",
4
+ "codexVersion": "0.3.4",
5
+ "categories": ["Productivity", "Communication"],
6
+ "resources": {
7
+ "credentialDocumentation": [
8
+ {
9
+ "url": "https://github.com/cryozerolabs/n8n-nodes-dingtalk?tab=readme-ov-file#-%E8%BA%AB%E4%BB%BD%E9%AA%8C%E8%AF%81%E9%85%8D%E7%BD%AE"
10
+ }
11
+ ],
12
+ "primaryDocumentation": [
13
+ {
14
+ "url": "https://github.com/cryozerolabs/n8n-nodes-dingtalk?tab=readme-ov-file"
15
+ },
16
+ {
17
+ "url": "https://open.dingtalk.com/document/development/develop-stream-mode-push-server"
18
+ }
19
+ ]
20
+ }
21
+ }
@@ -0,0 +1,3 @@
1
+ import { OperationDef } from '../../../shared/operation';
2
+ declare const op: OperationDef;
3
+ export default op;
@@ -0,0 +1,95 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const operator_1 = require("../../../shared/properties/operator");
4
+ const request_1 = require("../../../shared/request");
5
+ const body_1 = require("../../../shared/properties/body");
6
+ const OP = 'todo.tasks.query';
7
+ const showOnly = { show: { operation: [OP] } };
8
+ const formProperties = [
9
+ {
10
+ displayName: '分页游标',
11
+ name: 'nextToken',
12
+ type: 'string',
13
+ default: '',
14
+ displayOptions: showOnly,
15
+ description: '如果一个查询条件一次无法全部返回结果,会返回分页token,下次查询带上该token后会返回后续数据,直到分页token为null表示数据已经全部查询完毕。',
16
+ },
17
+ {
18
+ displayName: '待办完成状态',
19
+ name: 'isDone',
20
+ type: 'options',
21
+ displayOptions: showOnly,
22
+ default: '',
23
+ options: [
24
+ { name: '所有', value: '' },
25
+ { name: '已完成', value: true },
26
+ { name: '未完成', value: false },
27
+ ],
28
+ },
29
+ {
30
+ displayName: '查询目标用户角色类型',
31
+ name: 'roleTypes',
32
+ type: 'json',
33
+ default: '[]',
34
+ displayOptions: showOnly,
35
+ description: `executor:执行人,creator:创建人,participant:参与人。可以同时传多个值。外层list表示或的关系,内层list表示与的关系。例如:[["executor"], ["creator"],["participant"]] 或 [["executor", "creator"]]。`,
36
+ },
37
+ {
38
+ displayName: '待办的业务类型',
39
+ name: 'todoType',
40
+ type: 'options',
41
+ default: '',
42
+ options: [
43
+ { name: '所有', value: '' },
44
+ { name: '待办', value: 'TODO' },
45
+ { name: '待阅', value: 'READ' },
46
+ ],
47
+ description: '待办的业务类型,目前支持两种: TODO:待办业务类型; READ:待阅业务类型。 不传该入参时,默认查询的是所有业务类型。',
48
+ displayOptions: showOnly,
49
+ },
50
+ ];
51
+ const properties = [
52
+ ...(0, operator_1.operatorProps)(showOnly),
53
+ ...(0, body_1.bodyProps)(showOnly, {
54
+ defaultMode: 'form',
55
+ defaultJsonBody: JSON.stringify({}, null, 2),
56
+ jsonDescription: '请求体JSON数据。<a href="https://open.dingtalk.com/document/orgapp/query-the-to-do-list-of-enterprise-users" target="_blank">查看官方API文档</a>',
57
+ formProperties,
58
+ }),
59
+ ];
60
+ const op = {
61
+ value: OP,
62
+ name: '查询企业下用户待办列表',
63
+ description: '获取该授权企业下某用户的待办列表',
64
+ properties,
65
+ async run(itemIndex) {
66
+ const operatorId = await (0, operator_1.getOperatorId)(this, itemIndex);
67
+ const body = (0, body_1.getBodyData)(this, itemIndex, {
68
+ formBuilder: (ctx, idx) => {
69
+ const result = {};
70
+ const nextToken = ctx.getNodeParameter('nextToken', idx, undefined);
71
+ const isDone = ctx.getNodeParameter('isDone', idx, undefined);
72
+ const todoType = ctx.getNodeParameter('todoType', idx, undefined);
73
+ if (nextToken) {
74
+ result.nextToken = nextToken;
75
+ }
76
+ if (isDone !== '') {
77
+ result.isDone = isDone;
78
+ }
79
+ if (todoType) {
80
+ result.todoType = todoType;
81
+ }
82
+ return result;
83
+ },
84
+ });
85
+ const resp = await request_1.request.call(this, {
86
+ method: 'POST',
87
+ url: `/todo/users/${operatorId}/org/tasks/query`,
88
+ body,
89
+ });
90
+ const out = resp;
91
+ return { json: out, pairedItem: { item: itemIndex } };
92
+ },
93
+ };
94
+ exports.default = op;
95
+ //# sourceMappingURL=tasksDelete.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasksDelete.js","sourceRoot":"","sources":["../../../../../nodes/DingtalkNode/resources/todo/tasksDelete.ts"],"names":[],"mappings":";;AAGA,kEAAmF;AAEnF,qDAAkD;AAClD,0DAAyE;AAEzE,MAAM,EAAE,GAAG,kBAAkB,CAAC;AAG9B,MAAM,QAAQ,GAAG,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;AAE/C,MAAM,cAAc,GAAsB;IACxC;QACE,WAAW,EAAE,MAAM;QACnB,IAAI,EAAE,WAAW;QAEjB,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,EAAE;QACX,cAAc,EAAE,QAAQ;QACxB,WAAW,EACT,gFAAgF;KACnF;IACD;QACE,WAAW,EAAE,QAAQ;QACrB,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,SAAS;QACf,cAAc,EAAE,QAAQ;QACxB,OAAO,EAAE,EAAE;QACX,OAAO,EAAE;YACP,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE;YACzB,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE;YAC5B,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;SAC9B;KACF;IACD;QACE,WAAW,EAAE,YAAY;QACzB,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,IAAI;QACb,cAAc,EAAE,QAAQ;QACxB,WAAW,EAAE,yJAAyJ;KACvK;IACD;QACE,WAAW,EAAE,SAAS;QACtB,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,EAAE;QACX,OAAO,EAAE;YACP,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE;YACzB,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE;YAC7B,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE;SAC9B;QACD,WAAW,EACT,gEAAgE;QAClE,cAAc,EAAE,QAAQ;KACzB;CACF,CAAC;AAEF,MAAM,UAAU,GAAsB;IACpC,GAAG,IAAA,wBAAa,EAAC,QAAQ,CAAC;IAC1B,GAAG,IAAA,gBAAS,EAAC,QAAQ,EAAE;QACrB,WAAW,EAAE,MAAM;QACnB,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5C,eAAe,EACb,sIAAsI;QACxI,cAAc;KACf,CAAC;CACH,CAAC;AAEF,MAAM,EAAE,GAAiB;IACvB,KAAK,EAAE,EAAE;IACT,IAAI,EAAE,aAAa;IACnB,WAAW,EAAE,kBAAkB;IAC/B,UAAU;IACV,KAAK,CAAC,GAAG,CAA0B,SAAiB;QAClD,MAAM,UAAU,GAAG,MAAM,IAAA,wBAAa,EAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAExD,MAAM,IAAI,GAAG,IAAA,kBAAW,EAAC,IAAI,EAAE,SAAS,EAAE;YACxC,WAAW,EAAE,CAAC,GAAsB,EAAE,GAAW,EAAE,EAAE;gBACnD,MAAM,MAAM,GAAgB,EAAE,CAAC;gBAE/B,MAAM,SAAS,GAAG,GAAG,CAAC,gBAAgB,CAAC,WAAW,EAAE,GAAG,EAAE,SAAS,CAAW,CAAC;gBAC9E,MAAM,MAAM,GAAG,GAAG,CAAC,gBAAgB,CAAC,QAAQ,EAAE,GAAG,EAAE,SAAS,CAAW,CAAC;gBAExE,MAAM,QAAQ,GAAG,GAAG,CAAC,gBAAgB,CAAC,UAAU,EAAE,GAAG,EAAE,SAAS,CAAW,CAAC;gBAE5E,IAAI,SAAS,EAAE,CAAC;oBACd,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC;gBAC/B,CAAC;gBACD,IAAI,MAAM,KAAK,EAAE,EAAE,CAAC;oBAClB,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;gBACzB,CAAC;gBAID,IAAI,QAAQ,EAAE,CAAC;oBACb,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;gBAC7B,CAAC;gBAED,OAAO,MAAM,CAAC;YAChB,CAAC;SACF,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,MAAM,iBAAO,CAAC,IAAI,CAAC,IAAI,EAAE;YACpC,MAAM,EAAE,MAAM;YACd,GAAG,EAAE,eAAe,UAAU,kBAAkB;YAChD,IAAI;SACL,CAAC,CAAC;QAEH,MAAM,GAAG,GAAgB,IAA8B,CAAC;QACxD,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC;IACxD,CAAC;CACF,CAAC;AAEF,kBAAe,EAAE,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { OperationDef } from '../../../shared/operation';
2
+ declare const op: OperationDef;
3
+ export default op;
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const request_1 = require("../../../shared/request");
4
+ const OP = 'user.getByMobile';
5
+ const showOnly = { show: { operation: [OP] } };
6
+ const properties = [
7
+ {
8
+ displayName: '用户的手机号',
9
+ name: 'mobile',
10
+ type: 'string',
11
+ default: '',
12
+ required: true,
13
+ placeholder: '13000000000',
14
+ displayOptions: showOnly,
15
+ },
16
+ ];
17
+ const op = {
18
+ value: OP,
19
+ name: '根据手机号查询用户',
20
+ description: '根据手机号获取用户的userId',
21
+ properties,
22
+ async run(itemIndex) {
23
+ const mobile = this.getNodeParameter('mobile', itemIndex, '');
24
+ const resp = await request_1.request.call(this, {
25
+ method: 'POST',
26
+ url: 'https://oapi.dingtalk.com/topapi/v2/user/getbymobile',
27
+ body: {
28
+ mobile,
29
+ },
30
+ });
31
+ const out = resp;
32
+ return {
33
+ json: out,
34
+ pairedItem: { item: itemIndex },
35
+ };
36
+ },
37
+ };
38
+ exports.default = op;
39
+ //# sourceMappingURL=getByMobile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getByMobile.js","sourceRoot":"","sources":["../../../../../nodes/DingtalkNode/resources/user/getByMobile.ts"],"names":[],"mappings":";;AAOA,qDAAkD;AAElD,MAAM,EAAE,GAAG,kBAAkB,CAAC;AAC9B,MAAM,QAAQ,GAAG,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;AAE/C,MAAM,UAAU,GAAsB;IACpC;QACE,WAAW,EAAE,QAAQ;QACrB,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,EAAE;QACX,QAAQ,EAAE,IAAI;QACd,WAAW,EAAE,aAAa;QAC1B,cAAc,EAAE,QAAQ;KACzB;CACF,CAAC;AAEF,MAAM,EAAE,GAAiB;IACvB,KAAK,EAAE,EAAE;IACT,IAAI,EAAE,WAAW;IACjB,WAAW,EAAE,kBAAkB;IAC/B,UAAU;IAEV,KAAK,CAAC,GAAG,CAA0B,SAAiB;QAClD,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,SAAS,EAAE,EAAE,CAAW,CAAC;QAExE,MAAM,IAAI,GAAG,MAAM,iBAAO,CAAC,IAAI,CAAC,IAAI,EAAE;YACpC,MAAM,EAAE,MAAM;YACd,GAAG,EAAE,sDAAsD;YAC3D,IAAI,EAAE;gBACJ,MAAM;aACP;SACF,CAAC,CAAC;QAEH,MAAM,GAAG,GAAgB,IAA8B,CAAC;QACxD,OAAO;YACL,IAAI,EAAE,GAAG;YACT,UAAU,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;SAChC,CAAC;IACJ,CAAC;CACF,CAAC;AAEF,kBAAe,EAAE,CAAC"}
@@ -5,9 +5,11 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const resource_1 = require("../../../shared/resource");
7
7
  const get_1 = __importDefault(require("./get"));
8
+ const getByMobile_1 = __importDefault(require("./getByMobile"));
9
+ const search_1 = __importDefault(require("./search"));
8
10
  exports.default = (0, resource_1.makeResourceBundle)({
9
11
  value: 'user',
10
12
  name: '用户管理',
11
- operations: [get_1.default],
13
+ operations: [get_1.default, getByMobile_1.default, search_1.default],
12
14
  });
13
15
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../nodes/DingtalkNode/resources/user/index.ts"],"names":[],"mappings":";;;;;AAAA,uDAA8D;AAC9D,gDAAwB;AAExB,kBAAe,IAAA,6BAAkB,EAAC;IAChC,KAAK,EAAE,MAAM;IACb,IAAI,EAAE,MAAM;IACZ,UAAU,EAAE,CAAC,aAAG,CAAC;CAClB,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../nodes/DingtalkNode/resources/user/index.ts"],"names":[],"mappings":";;;;;AAAA,uDAA8D;AAC9D,gDAAwB;AACxB,gEAAwC;AACxC,sDAA8B;AAE9B,kBAAe,IAAA,6BAAkB,EAAC;IAChC,KAAK,EAAE,MAAM;IACb,IAAI,EAAE,MAAM;IACZ,UAAU,EAAE,CAAC,aAAG,EAAE,qBAAW,EAAE,gBAAM,CAAC;CACvC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { OperationDef } from '../../../shared/operation';
2
+ declare const op: OperationDef;
3
+ export default op;
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const request_1 = require("../../../shared/request");
4
+ const OP = 'user.search';
5
+ const showOnly = { show: { operation: [OP] } };
6
+ const properties = [
7
+ {
8
+ displayName: '用户名称、名称拼音或英文名称',
9
+ name: 'queryWord',
10
+ type: 'string',
11
+ default: '',
12
+ required: true,
13
+ displayOptions: showOnly,
14
+ },
15
+ {
16
+ displayName: '分页页码',
17
+ name: 'offset',
18
+ type: 'number',
19
+ default: 0,
20
+ required: true,
21
+ displayOptions: showOnly,
22
+ },
23
+ {
24
+ displayName: '分页大小',
25
+ name: 'size',
26
+ type: 'number',
27
+ default: 10,
28
+ required: true,
29
+ displayOptions: showOnly,
30
+ },
31
+ {
32
+ displayName: '是否精确匹配',
33
+ name: 'fullMatchField',
34
+ type: 'boolean',
35
+ default: false,
36
+ displayOptions: showOnly,
37
+ },
38
+ ];
39
+ const op = {
40
+ value: OP,
41
+ name: '搜索用户userId',
42
+ description: '获取指定用户的详细信息',
43
+ properties,
44
+ async run(itemIndex) {
45
+ const offset = this.getNodeParameter('offset', itemIndex, 1);
46
+ const size = this.getNodeParameter('size', itemIndex, 10);
47
+ const queryWord = this.getNodeParameter('queryWord', itemIndex, '');
48
+ const fullMatchField = this.getNodeParameter('fullMatchField', itemIndex, false);
49
+ const body = {
50
+ offset,
51
+ size,
52
+ queryWord,
53
+ };
54
+ body.queryWord = queryWord;
55
+ if (fullMatchField) {
56
+ body.fullMatchField = 1;
57
+ }
58
+ const resp = await request_1.request.call(this, {
59
+ method: 'POST',
60
+ url: '/contact/users/search',
61
+ body,
62
+ });
63
+ const out = resp;
64
+ return {
65
+ json: out,
66
+ pairedItem: { item: itemIndex },
67
+ };
68
+ },
69
+ };
70
+ exports.default = op;
71
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../../../../nodes/DingtalkNode/resources/user/search.ts"],"names":[],"mappings":";;AAOA,qDAAkD;AAElD,MAAM,EAAE,GAAG,aAAa,CAAC;AACzB,MAAM,QAAQ,GAAG,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;AAE/C,MAAM,UAAU,GAAsB;IACpC;QACE,WAAW,EAAE,gBAAgB;QAC7B,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,EAAE;QACX,QAAQ,EAAE,IAAI;QACd,cAAc,EAAE,QAAQ;KACzB;IACD;QACE,WAAW,EAAE,MAAM;QACnB,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,CAAC;QACV,QAAQ,EAAE,IAAI;QACd,cAAc,EAAE,QAAQ;KACzB;IACD;QACE,WAAW,EAAE,MAAM;QACnB,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,EAAE;QACX,QAAQ,EAAE,IAAI;QACd,cAAc,EAAE,QAAQ;KACzB;IACD;QACE,WAAW,EAAE,QAAQ;QACrB,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,KAAK;QACd,cAAc,EAAE,QAAQ;KACzB;CACF,CAAC;AAEF,MAAM,EAAE,GAAiB;IACvB,KAAK,EAAE,EAAE;IACT,IAAI,EAAE,YAAY;IAClB,WAAW,EAAE,aAAa;IAC1B,UAAU;IAEV,KAAK,CAAC,GAAG,CAA0B,SAAiB;QAClD,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAW,CAAC;QACvE,MAAM,IAAI,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,CAAW,CAAC;QACpE,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,SAAS,EAAE,EAAE,CAAW,CAAC;QAC9E,MAAM,cAAc,GAAG,IAAI,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,SAAS,EAAE,KAAK,CAAY,CAAC;QAE5F,MAAM,IAAI,GAAG;YACX,MAAM;YACN,IAAI;YACJ,SAAS;SACK,CAAC;QACjB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,cAAc,EAAE,CAAC;YACnB,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC;QAC1B,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,iBAAO,CAAC,IAAI,CAAC,IAAI,EAAE;YACpC,MAAM,EAAE,MAAM;YACd,GAAG,EAAE,uBAAuB;YAC5B,IAAI;SACL,CAAC,CAAC;QAEH,MAAM,GAAG,GAAgB,IAA8B,CAAC;QACxD,OAAO;YACL,IAAI,EAAE,GAAG;YACT,UAAU,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;SAChC,CAAC;IACJ,CAAC;CACF,CAAC;AAEF,kBAAe,EAAE,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { type INodeProperties, type ITriggerFunctions, type ITriggerResponse } from 'n8n-workflow';
2
+ export declare const streamPushTriggerOptions: INodeProperties[];
3
+ export declare function runStreamPushTrigger(this: ITriggerFunctions): Promise<ITriggerResponse | undefined>;