@pipedream/microsoft_teams 0.1.1 → 0.1.3

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.
package/README.md CHANGED
@@ -1,7 +1,11 @@
1
1
  # Overview
2
2
 
3
- With the Microsoft Teams API, you can build a variety of applications and
4
- integrations that work with Teams. For example, you could build a bot that
5
- responds to questions from users, or an app that lets users add information to
6
- a shared Teams document. You could also build an integration that lets users
7
- interact with an external service right from within Teams.
3
+ The Microsoft Teams API on Pipedream allows you to automate tasks, streamline communication, and integrate with other services to enhance the functionality of Teams as a collaboration hub. With this API, you can send messages to channels, orchestrate complex workflows based on Teams events, and manage Teams' settings programmatically.
4
+
5
+ # Example Use Cases
6
+
7
+ - **Automated Daily Stand-up Notifications**: Trigger a workflow that sends a daily message to a designated Teams channel prompting team members to post their stand-up updates. This ensures consistency and regularity in team communication.
8
+
9
+ - **New Lead Alert System**: Connect the Teams API with a CRM app on Pipedream. Each time a new lead is captured in the CRM, the workflow automatically posts a summary to a sales channel in Teams, keeping the sales team instantly informed.
10
+
11
+ - **Incident Management Updates**: Integrate the Teams API with a monitoring tool like Datadog. When an incident is detected, the workflow triggers, creating a new conversation in the relevant Teams channel and tagging on-call staff to coordinate a rapid response.
@@ -5,7 +5,7 @@ export default {
5
5
  name: "Create Channel",
6
6
  description: "Create a new channel in Microsoft Teams. [See the docs here](https://docs.microsoft.com/en-us/graph/api/channel-post?view=graph-rest-1.0&tabs=http)",
7
7
  type: "action",
8
- version: "0.0.5",
8
+ version: "0.0.7",
9
9
  props: {
10
10
  microsoftTeams,
11
11
  teamId: {
@@ -5,7 +5,7 @@ export default {
5
5
  name: "List Channels",
6
6
  description: "Lists all channels in a Microsoft Team. [See the docs here](https://docs.microsoft.com/en-us/graph/api/channel-list?view=graph-rest-1.0&tabs=http)",
7
7
  type: "action",
8
- version: "0.0.5",
8
+ version: "0.0.7",
9
9
  props: {
10
10
  microsoftTeams,
11
11
  teamId: {
@@ -5,7 +5,7 @@ export default {
5
5
  name: "List Shifts",
6
6
  description: "Get the list of shift instances for a team. [See the documentation](https://learn.microsoft.com/en-us/graph/api/schedule-list-shifts?view=graph-rest-1.0&tabs=http)",
7
7
  type: "action",
8
- version: "0.0.2",
8
+ version: "0.0.4",
9
9
  props: {
10
10
  microsoftTeams,
11
11
  teamId: {
@@ -5,7 +5,7 @@ export default {
5
5
  name: "Send Channel Message",
6
6
  description: "Send a message to a team's channel. [See the docs here](https://docs.microsoft.com/en-us/graph/api/channel-post-messages?view=graph-rest-1.0&tabs=http)",
7
7
  type: "action",
8
- version: "0.0.5",
8
+ version: "0.0.7",
9
9
  props: {
10
10
  microsoftTeams,
11
11
  teamId: {
@@ -29,12 +29,19 @@ export default {
29
29
  "message",
30
30
  ],
31
31
  },
32
+ contentType: {
33
+ propDefinition: [
34
+ microsoftTeams,
35
+ "contentType",
36
+ ],
37
+ },
32
38
  },
33
39
  async run({ $ }) {
34
40
  const {
35
41
  teamId,
36
42
  channelId,
37
43
  message,
44
+ contentType,
38
45
  } = this;
39
46
 
40
47
  const response =
@@ -44,6 +51,7 @@ export default {
44
51
  content: {
45
52
  body: {
46
53
  content: message,
54
+ contentType,
47
55
  },
48
56
  },
49
57
  });
@@ -5,7 +5,7 @@ export default {
5
5
  name: "Send Chat Message",
6
6
  description: "Send a message to a team's chat. [See the docs here](https://docs.microsoft.com/en-us/graph/api/chat-post-messages?view=graph-rest-1.0&tabs=http)",
7
7
  type: "action",
8
- version: "0.0.5",
8
+ version: "0.0.7",
9
9
  props: {
10
10
  microsoftTeams,
11
11
  chatId: {
@@ -20,11 +20,18 @@ export default {
20
20
  "message",
21
21
  ],
22
22
  },
23
+ contentType: {
24
+ propDefinition: [
25
+ microsoftTeams,
26
+ "contentType",
27
+ ],
28
+ },
23
29
  },
24
30
  async run({ $ }) {
25
31
  const {
26
32
  chatId,
27
33
  message,
34
+ contentType,
28
35
  } = this;
29
36
 
30
37
  const response =
@@ -33,6 +40,7 @@ export default {
33
40
  content: {
34
41
  body: {
35
42
  content: message,
43
+ contentType,
36
44
  },
37
45
  },
38
46
  });
@@ -58,16 +58,64 @@ export default {
58
58
  chat: {
59
59
  type: "string",
60
60
  label: "Chat",
61
- description: "Team Chat within the organization (No external Contacts)",
61
+ description: "Team Chat (internal and external contacts)",
62
62
  async options({ prevContext }) {
63
63
  const response = prevContext.nextLink
64
64
  ? await this.makeRequest({
65
65
  path: prevContext.nextLink,
66
66
  })
67
67
  : await this.listChats();
68
+
69
+ const myTenantId = await this.getAuthenticatedUserTenant();
68
70
  const options = [];
71
+
72
+ this._userCache = this._userCache || new Map();
73
+
69
74
  for (const chat of response.value) {
70
- const members = chat.members.map((member) => member.displayName);
75
+ const messages = await this.makeRequest({
76
+ path: `/chats/${chat.id}/messages?$top=50`,
77
+ });
78
+
79
+ const members = await Promise.all(chat.members.map(async (member) => {
80
+ const cacheKey = `user_${member.userId}`;
81
+ let displayName = member.displayName || this._userCache.get(cacheKey);
82
+
83
+ if (!displayName) {
84
+ try {
85
+ if (messages?.value?.length > 0) {
86
+ const userMessage = messages.value.find((msg) =>
87
+ msg.from?.user?.id === member.userId);
88
+ if (userMessage?.from?.user?.displayName) {
89
+ displayName = userMessage.from.user.displayName;
90
+ }
91
+ }
92
+
93
+ if (!displayName) {
94
+ const userDetails = await this.makeRequest({
95
+ path: `/users/${member.userId}`,
96
+ });
97
+ displayName = userDetails.displayName;
98
+ }
99
+
100
+ this._userCache.set(cacheKey, displayName);
101
+ } catch (err) {
102
+ if (err.statusCode === 404) {
103
+ displayName = "User Not Found";
104
+ } else if (err.statusCode === 403) {
105
+ displayName = "Access Denied";
106
+ } else {
107
+ displayName = "Unknown User";
108
+ }
109
+ console.error(`Failed to fetch user details for ${member.userId}:`, err);
110
+ }
111
+ }
112
+
113
+ const isExternal = member.tenantId !== myTenantId || !member.tenantId;
114
+ return isExternal
115
+ ? `${displayName} (External)`
116
+ : displayName;
117
+ }));
118
+
71
119
  options.push({
72
120
  label: members.join(", "),
73
121
  value: chat.id,
@@ -96,6 +144,17 @@ export default {
96
144
  label: "Message",
97
145
  description: "Message to be sent",
98
146
  },
147
+ contentType: {
148
+ type: "string",
149
+ label: "Content Type",
150
+ description: "Text message or HTML message",
151
+ optional: true,
152
+ default: "text",
153
+ options: [
154
+ "text",
155
+ "html",
156
+ ],
157
+ },
99
158
  },
100
159
  methods: {
101
160
  _accessToken() {
@@ -133,6 +192,22 @@ export default {
133
192
  : reduction;
134
193
  }, api);
135
194
  },
195
+ async getAuthenticatedUserTenant() {
196
+ try {
197
+ const { value } = await this.client()
198
+ .api("/organization")
199
+ .get();
200
+
201
+ if (!value || value.length === 0) {
202
+ throw new Error("No organization found");
203
+ }
204
+
205
+ return value[0].id;
206
+ } catch (error) {
207
+ console.error("Failed to fetch tenant ID:", error);
208
+ throw new Error("Unable to determine tenant ID");
209
+ }
210
+ },
136
211
  async authenticatedUserId() {
137
212
  const { id } = await this.client()
138
213
  .api("/me")
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pipedream/microsoft_teams",
3
- "version": "0.1.1",
3
+ "version": "0.1.3",
4
4
  "description": "Pipedream Microsoft Teams Components",
5
5
  "main": "microsoft_teams.app.mjs",
6
6
  "keywords": [
@@ -5,7 +5,7 @@ export default {
5
5
  key: "microsoft_teams-new-channel",
6
6
  name: "New Channel",
7
7
  description: "Emit new event when a new channel is created within a team",
8
- version: "0.0.6",
8
+ version: "0.0.8",
9
9
  type: "source",
10
10
  dedupe: "unique",
11
11
  props: {
@@ -5,7 +5,7 @@ export default {
5
5
  key: "microsoft_teams-new-channel-message",
6
6
  name: "New Channel Message",
7
7
  description: "Emit new event when a new message is posted in a channel",
8
- version: "0.0.6",
8
+ version: "0.0.8",
9
9
  type: "source",
10
10
  dedupe: "unique",
11
11
  props: {
@@ -5,7 +5,7 @@ export default {
5
5
  key: "microsoft_teams-new-chat",
6
6
  name: "New Chat",
7
7
  description: "Emit new event when a new chat is created",
8
- version: "0.0.6",
8
+ version: "0.0.8",
9
9
  type: "source",
10
10
  dedupe: "unique",
11
11
  methods: {
@@ -5,7 +5,7 @@ export default {
5
5
  key: "microsoft_teams-new-chat-message",
6
6
  name: "New Chat Message",
7
7
  description: "Emit new event when a new message is received in a chat",
8
- version: "0.0.6",
8
+ version: "0.0.8",
9
9
  type: "source",
10
10
  dedupe: "unique",
11
11
  props: {
@@ -5,7 +5,7 @@ export default {
5
5
  key: "microsoft_teams-new-team",
6
6
  name: "New Team",
7
7
  description: "Emit new event when a new team is joined by the authenticated user",
8
- version: "0.0.6",
8
+ version: "0.0.8",
9
9
  type: "source",
10
10
  dedupe: "unique",
11
11
  methods: {
@@ -5,7 +5,7 @@ export default {
5
5
  key: "microsoft_teams-new-team-member",
6
6
  name: "New Team Member",
7
7
  description: "Emit new event when a new member is added to a team",
8
- version: "0.0.6",
8
+ version: "0.0.8",
9
9
  type: "source",
10
10
  dedupe: "unique",
11
11
  props: {