piece-signal-cli-rest-api 0.1.14 → 0.2.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.
- package/package.json +4 -26
- package/project.json +58 -0
- package/src/index.ts +87 -0
- package/src/lib/actions/add-admins-to-group.ts +50 -0
- package/src/lib/actions/add-device.ts +45 -0
- package/src/lib/actions/add-members-to-group.ts +50 -0
- package/src/lib/actions/block-group.ts +36 -0
- package/src/lib/actions/create-group.ts +139 -0
- package/src/lib/actions/delete-group.ts +36 -0
- package/src/lib/actions/get-contact.ts +42 -0
- package/src/lib/actions/get-group.ts +37 -0
- package/src/lib/actions/get-qr-code-link.ts +62 -0
- package/src/lib/actions/join-group.ts +36 -0
- package/src/lib/actions/list-accounts.ts +20 -0
- package/src/lib/actions/list-attachments.ts +20 -0
- package/src/lib/actions/list-contacts.ts +37 -0
- package/src/lib/actions/list-devices.ts +38 -0
- package/src/lib/actions/list-groups.ts +32 -0
- package/src/lib/actions/list-identities.ts +32 -0
- package/src/lib/actions/quit-group.ts +36 -0
- package/src/lib/actions/receive-messages.ts +108 -0
- package/src/lib/actions/remote-delete-message.ts +56 -0
- package/src/lib/actions/remove-admins-from-group.ts +50 -0
- package/src/lib/actions/remove-device.ts +36 -0
- package/src/lib/actions/remove-members-from-group.ts +50 -0
- package/src/lib/actions/remove-reaction.ts +59 -0
- package/src/lib/actions/request-approval-message.ts +215 -0
- package/src/lib/actions/search-numbers.ts +47 -0
- package/src/lib/actions/send-message.ts +189 -0
- package/src/lib/actions/send-reaction.ts +66 -0
- package/src/lib/actions/send-receipt.ts +65 -0
- package/src/lib/actions/start-typing.ts +45 -0
- package/src/lib/actions/stop-typing.ts +45 -0
- package/src/lib/actions/sync-contacts.ts +31 -0
- package/src/lib/actions/update-account-settings.ts +57 -0
- package/src/lib/actions/update-contact.ts +65 -0
- package/src/lib/actions/update-group.ts +145 -0
- package/src/lib/actions/update-profile.ts +65 -0
- package/src/lib/common/api-client.ts +150 -0
- package/src/lib/common/auth.ts +66 -0
- package/src/lib/common/message-utils.ts +449 -0
- package/src/lib/common/types.ts +73 -0
- package/src/lib/common/utils.ts +106 -0
- package/src/lib/triggers/new-group-member.ts +176 -0
- package/src/lib/triggers/new-message-received.ts +618 -0
- package/tsconfig.json +19 -0
- package/tsconfig.lib.json +11 -0
- package/src/index.d.ts +0 -8
- package/src/index.js +0 -91
- package/src/index.js.map +0 -1
- package/src/lib/actions/add-admins-to-group.d.ts +0 -12
- package/src/lib/actions/add-admins-to-group.js +0 -45
- package/src/lib/actions/add-admins-to-group.js.map +0 -1
- package/src/lib/actions/add-device.d.ts +0 -11
- package/src/lib/actions/add-device.js +0 -40
- package/src/lib/actions/add-device.js.map +0 -1
- package/src/lib/actions/add-members-to-group.d.ts +0 -12
- package/src/lib/actions/add-members-to-group.js +0 -45
- package/src/lib/actions/add-members-to-group.js.map +0 -1
- package/src/lib/actions/block-group.d.ts +0 -11
- package/src/lib/actions/block-group.js +0 -37
- package/src/lib/actions/block-group.js.map +0 -1
- package/src/lib/actions/create-group.d.ts +0 -18
- package/src/lib/actions/create-group.js +0 -117
- package/src/lib/actions/create-group.js.map +0 -1
- package/src/lib/actions/delete-group.d.ts +0 -11
- package/src/lib/actions/delete-group.js +0 -37
- package/src/lib/actions/delete-group.js.map +0 -1
- package/src/lib/actions/get-contact.d.ts +0 -11
- package/src/lib/actions/get-contact.js +0 -37
- package/src/lib/actions/get-contact.js.map +0 -1
- package/src/lib/actions/get-group.d.ts +0 -11
- package/src/lib/actions/get-group.js +0 -37
- package/src/lib/actions/get-group.js.map +0 -1
- package/src/lib/actions/get-qr-code-link.d.ts +0 -11
- package/src/lib/actions/get-qr-code-link.js +0 -60
- package/src/lib/actions/get-qr-code-link.js.map +0 -1
- package/src/lib/actions/join-group.d.ts +0 -11
- package/src/lib/actions/join-group.js +0 -37
- package/src/lib/actions/join-group.js.map +0 -1
- package/src/lib/actions/list-accounts.d.ts +0 -8
- package/src/lib/actions/list-accounts.js +0 -23
- package/src/lib/actions/list-accounts.js.map +0 -1
- package/src/lib/actions/list-attachments.d.ts +0 -8
- package/src/lib/actions/list-attachments.js +0 -23
- package/src/lib/actions/list-attachments.js.map +0 -1
- package/src/lib/actions/list-contacts.d.ts +0 -10
- package/src/lib/actions/list-contacts.js +0 -32
- package/src/lib/actions/list-contacts.js.map +0 -1
- package/src/lib/actions/list-devices.d.ts +0 -10
- package/src/lib/actions/list-devices.js +0 -32
- package/src/lib/actions/list-devices.js.map +0 -1
- package/src/lib/actions/list-groups.d.ts +0 -10
- package/src/lib/actions/list-groups.js +0 -32
- package/src/lib/actions/list-groups.js.map +0 -1
- package/src/lib/actions/list-identities.d.ts +0 -10
- package/src/lib/actions/list-identities.js +0 -32
- package/src/lib/actions/list-identities.js.map +0 -1
- package/src/lib/actions/quit-group.d.ts +0 -11
- package/src/lib/actions/quit-group.js +0 -37
- package/src/lib/actions/quit-group.js.map +0 -1
- package/src/lib/actions/remote-delete-message.d.ts +0 -12
- package/src/lib/actions/remote-delete-message.js +0 -46
- package/src/lib/actions/remote-delete-message.js.map +0 -1
- package/src/lib/actions/remove-admins-from-group.d.ts +0 -12
- package/src/lib/actions/remove-admins-from-group.js +0 -45
- package/src/lib/actions/remove-admins-from-group.js.map +0 -1
- package/src/lib/actions/remove-device.d.ts +0 -11
- package/src/lib/actions/remove-device.js +0 -37
- package/src/lib/actions/remove-device.js.map +0 -1
- package/src/lib/actions/remove-members-from-group.d.ts +0 -12
- package/src/lib/actions/remove-members-from-group.js +0 -45
- package/src/lib/actions/remove-members-from-group.js.map +0 -1
- package/src/lib/actions/remove-reaction.d.ts +0 -13
- package/src/lib/actions/remove-reaction.js +0 -52
- package/src/lib/actions/remove-reaction.js.map +0 -1
- package/src/lib/actions/request-approval-message.d.ts +0 -15
- package/src/lib/actions/request-approval-message.js +0 -161
- package/src/lib/actions/request-approval-message.js.map +0 -1
- package/src/lib/actions/resume-approval-flow.d.ts +0 -11
- package/src/lib/actions/resume-approval-flow.js +0 -181
- package/src/lib/actions/resume-approval-flow.js.map +0 -1
- package/src/lib/actions/search-numbers.d.ts +0 -11
- package/src/lib/actions/search-numbers.js +0 -42
- package/src/lib/actions/search-numbers.js.map +0 -1
- package/src/lib/actions/send-message.d.ts +0 -27
- package/src/lib/actions/send-message.js +0 -176
- package/src/lib/actions/send-message.js.map +0 -1
- package/src/lib/actions/send-reaction.d.ts +0 -14
- package/src/lib/actions/send-reaction.js +0 -58
- package/src/lib/actions/send-reaction.js.map +0 -1
- package/src/lib/actions/send-receipt.d.ts +0 -13
- package/src/lib/actions/send-receipt.js +0 -58
- package/src/lib/actions/send-receipt.js.map +0 -1
- package/src/lib/actions/start-typing.d.ts +0 -11
- package/src/lib/actions/start-typing.js +0 -40
- package/src/lib/actions/start-typing.js.map +0 -1
- package/src/lib/actions/stop-typing.d.ts +0 -11
- package/src/lib/actions/stop-typing.js +0 -40
- package/src/lib/actions/stop-typing.js.map +0 -1
- package/src/lib/actions/sync-contacts.d.ts +0 -10
- package/src/lib/actions/sync-contacts.js +0 -32
- package/src/lib/actions/sync-contacts.js.map +0 -1
- package/src/lib/actions/update-account-settings.d.ts +0 -12
- package/src/lib/actions/update-account-settings.js +0 -49
- package/src/lib/actions/update-account-settings.js.map +0 -1
- package/src/lib/actions/update-contact.d.ts +0 -13
- package/src/lib/actions/update-contact.js +0 -56
- package/src/lib/actions/update-contact.js.map +0 -1
- package/src/lib/actions/update-group.d.ts +0 -19
- package/src/lib/actions/update-group.js +0 -125
- package/src/lib/actions/update-group.js.map +0 -1
- package/src/lib/actions/update-profile.d.ts +0 -13
- package/src/lib/actions/update-profile.js +0 -56
- package/src/lib/actions/update-profile.js.map +0 -1
- package/src/lib/common/api-client.d.ts +0 -24
- package/src/lib/common/api-client.js +0 -103
- package/src/lib/common/api-client.js.map +0 -1
- package/src/lib/common/auth.d.ts +0 -8
- package/src/lib/common/auth.js +0 -68
- package/src/lib/common/auth.js.map +0 -1
- package/src/lib/common/types.d.ts +0 -65
- package/src/lib/common/types.js +0 -3
- package/src/lib/common/types.js.map +0 -1
- package/src/lib/common/utils.d.ts +0 -23
- package/src/lib/common/utils.js +0 -105
- package/src/lib/common/utils.js.map +0 -1
- package/src/lib/triggers/new-group-member.d.ts +0 -50
- package/src/lib/triggers/new-group-member.js +0 -155
- package/src/lib/triggers/new-group-member.js.map +0 -1
- package/src/lib/triggers/new-message-received.d.ts +0 -58
- package/src/lib/triggers/new-message-received.js +0 -278
- package/src/lib/triggers/new-message-received.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,29 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "piece-signal-cli-rest-api",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"dependencies": {
|
|
5
|
-
"
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
"axios-retry": "4.4.1",
|
|
9
|
-
"deepmerge-ts": "7.1.0",
|
|
10
|
-
"form-data": "4.0.4",
|
|
11
|
-
"i18next": "23.13.0",
|
|
12
|
-
"mime-types": "2.1.35",
|
|
13
|
-
"nanoid": "3.3.8",
|
|
14
|
-
"semver": "7.6.0",
|
|
15
|
-
"socket.io-client": "4.8.1",
|
|
16
|
-
"ws": "^8.18.0",
|
|
17
|
-
"zod": "4.1.13",
|
|
18
|
-
"@activepieces/pieces-common": "0.11.2",
|
|
19
|
-
"@activepieces/pieces-framework": "0.24.0",
|
|
20
|
-
"@activepieces/shared": "0.32.0",
|
|
21
|
-
"tslib": "2.6.2"
|
|
22
|
-
},
|
|
23
|
-
"resolutions": {
|
|
24
|
-
"rollup": "npm:@rollup/wasm-node"
|
|
25
|
-
},
|
|
26
|
-
"types": "./src/index.d.ts",
|
|
27
|
-
"main": "./src/index.js",
|
|
28
|
-
"type": "commonjs"
|
|
29
|
-
}
|
|
5
|
+
"ws": "^8.18.0"
|
|
6
|
+
}
|
|
7
|
+
}
|
package/project.json
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "pieces-signal-cli-rest-api",
|
|
3
|
+
"$schema": "../../../../node_modules/nx/schemas/project-schema.json",
|
|
4
|
+
"sourceRoot": "packages/pieces/community/signal-cli-rest-api/src",
|
|
5
|
+
"projectType": "library",
|
|
6
|
+
"targets": {
|
|
7
|
+
"build": {
|
|
8
|
+
"executor": "@nx/js:tsc",
|
|
9
|
+
"outputs": [
|
|
10
|
+
"{options.outputPath}"
|
|
11
|
+
],
|
|
12
|
+
"options": {
|
|
13
|
+
"outputPath": "dist/packages/pieces/community/signal-cli-rest-api",
|
|
14
|
+
"tsConfig": "packages/pieces/community/signal-cli-rest-api/tsconfig.lib.json",
|
|
15
|
+
"packageJson": "packages/pieces/community/signal-cli-rest-api/package.json",
|
|
16
|
+
"main": "packages/pieces/community/signal-cli-rest-api/src/index.ts",
|
|
17
|
+
"assets": [
|
|
18
|
+
"packages/pieces/community/signal-cli-rest-api/*.md",
|
|
19
|
+
{
|
|
20
|
+
"input": "packages/pieces/community/signal-cli-rest-api/src/i18n",
|
|
21
|
+
"output": "./src/i18n",
|
|
22
|
+
"glob": "**/!(i18n.json)"
|
|
23
|
+
}
|
|
24
|
+
],
|
|
25
|
+
"buildableProjectDepsInPackageJsonType": "dependencies",
|
|
26
|
+
"updateBuildableProjectDepsInPackageJson": true,
|
|
27
|
+
"clean": false
|
|
28
|
+
},
|
|
29
|
+
"dependsOn": [
|
|
30
|
+
"^build",
|
|
31
|
+
"prebuild"
|
|
32
|
+
]
|
|
33
|
+
},
|
|
34
|
+
"publish": {
|
|
35
|
+
"command": "node tools/scripts/publish.mjs pieces-signal-cli-rest-api {args.ver} {args.tag}",
|
|
36
|
+
"dependsOn": [
|
|
37
|
+
"build"
|
|
38
|
+
]
|
|
39
|
+
},
|
|
40
|
+
"lint": {
|
|
41
|
+
"executor": "@nx/eslint:lint",
|
|
42
|
+
"outputs": [
|
|
43
|
+
"{options.outputFile}"
|
|
44
|
+
]
|
|
45
|
+
},
|
|
46
|
+
"prebuild": {
|
|
47
|
+
"executor": "nx:run-commands",
|
|
48
|
+
"options": {
|
|
49
|
+
"cwd": "packages/pieces/community/signal-cli-rest-api",
|
|
50
|
+
"command": "bun install --no-save --silent"
|
|
51
|
+
},
|
|
52
|
+
"dependsOn": [
|
|
53
|
+
"^build"
|
|
54
|
+
]
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
"tags": []
|
|
58
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { createPiece } from '@activepieces/pieces-framework';
|
|
2
|
+
import { PieceCategory } from '@activepieces/shared';
|
|
3
|
+
import { signalCliRestApiAuth } from './lib/common/auth';
|
|
4
|
+
import { sendMessage } from './lib/actions/send-message';
|
|
5
|
+
import { createGroup } from './lib/actions/create-group';
|
|
6
|
+
import { listGroups } from './lib/actions/list-groups';
|
|
7
|
+
import { getGroup } from './lib/actions/get-group';
|
|
8
|
+
import { updateGroup } from './lib/actions/update-group';
|
|
9
|
+
import { deleteGroup } from './lib/actions/delete-group';
|
|
10
|
+
import { addMembersToGroup } from './lib/actions/add-members-to-group';
|
|
11
|
+
import { removeMembersFromGroup } from './lib/actions/remove-members-from-group';
|
|
12
|
+
import { addAdminsToGroup } from './lib/actions/add-admins-to-group';
|
|
13
|
+
import { removeAdminsFromGroup } from './lib/actions/remove-admins-from-group';
|
|
14
|
+
import { joinGroup } from './lib/actions/join-group';
|
|
15
|
+
import { quitGroup } from './lib/actions/quit-group';
|
|
16
|
+
import { blockGroup } from './lib/actions/block-group';
|
|
17
|
+
import { listContacts } from './lib/actions/list-contacts';
|
|
18
|
+
import { getContact } from './lib/actions/get-contact';
|
|
19
|
+
import { updateContact } from './lib/actions/update-contact';
|
|
20
|
+
import { syncContacts } from './lib/actions/sync-contacts';
|
|
21
|
+
import { updateProfile } from './lib/actions/update-profile';
|
|
22
|
+
import { sendReaction } from './lib/actions/send-reaction';
|
|
23
|
+
import { removeReaction } from './lib/actions/remove-reaction';
|
|
24
|
+
import { sendReceipt } from './lib/actions/send-receipt';
|
|
25
|
+
import { startTyping } from './lib/actions/start-typing';
|
|
26
|
+
import { stopTyping } from './lib/actions/stop-typing';
|
|
27
|
+
import { listAccounts } from './lib/actions/list-accounts';
|
|
28
|
+
import { getQrCodeLink } from './lib/actions/get-qr-code-link';
|
|
29
|
+
import { listDevices } from './lib/actions/list-devices';
|
|
30
|
+
import { addDevice } from './lib/actions/add-device';
|
|
31
|
+
import { removeDevice } from './lib/actions/remove-device';
|
|
32
|
+
import { remoteDeleteMessage } from './lib/actions/remote-delete-message';
|
|
33
|
+
import { listAttachments } from './lib/actions/list-attachments';
|
|
34
|
+
import { searchNumbers } from './lib/actions/search-numbers';
|
|
35
|
+
import { listIdentities } from './lib/actions/list-identities';
|
|
36
|
+
import { updateAccountSettings } from './lib/actions/update-account-settings';
|
|
37
|
+
import { requestApprovalMessage } from './lib/actions/request-approval-message';
|
|
38
|
+
import { receiveMessages } from './lib/actions/receive-messages';
|
|
39
|
+
import { newGroupMember } from './lib/triggers/new-group-member';
|
|
40
|
+
|
|
41
|
+
export const signalCliRestApi = createPiece({
|
|
42
|
+
displayName: 'Signal CLI REST API',
|
|
43
|
+
description: 'Interact with Signal Messenger via signal-cli-rest-api',
|
|
44
|
+
auth: signalCliRestApiAuth,
|
|
45
|
+
minimumSupportedRelease: '0.30.0',
|
|
46
|
+
logoUrl: 'https://cdn.activepieces.com/pieces/signal.png',
|
|
47
|
+
categories: [PieceCategory.COMMUNICATION],
|
|
48
|
+
authors: [],
|
|
49
|
+
actions: [
|
|
50
|
+
sendMessage,
|
|
51
|
+
createGroup,
|
|
52
|
+
listGroups,
|
|
53
|
+
getGroup,
|
|
54
|
+
updateGroup,
|
|
55
|
+
deleteGroup,
|
|
56
|
+
addMembersToGroup,
|
|
57
|
+
removeMembersFromGroup,
|
|
58
|
+
addAdminsToGroup,
|
|
59
|
+
removeAdminsFromGroup,
|
|
60
|
+
joinGroup,
|
|
61
|
+
quitGroup,
|
|
62
|
+
blockGroup,
|
|
63
|
+
listContacts,
|
|
64
|
+
getContact,
|
|
65
|
+
updateContact,
|
|
66
|
+
syncContacts,
|
|
67
|
+
updateProfile,
|
|
68
|
+
sendReaction,
|
|
69
|
+
removeReaction,
|
|
70
|
+
sendReceipt,
|
|
71
|
+
startTyping,
|
|
72
|
+
stopTyping,
|
|
73
|
+
listAccounts,
|
|
74
|
+
getQrCodeLink,
|
|
75
|
+
listDevices,
|
|
76
|
+
addDevice,
|
|
77
|
+
removeDevice,
|
|
78
|
+
remoteDeleteMessage,
|
|
79
|
+
listAttachments,
|
|
80
|
+
searchNumbers,
|
|
81
|
+
listIdentities,
|
|
82
|
+
updateAccountSettings,
|
|
83
|
+
requestApprovalMessage,
|
|
84
|
+
receiveMessages,
|
|
85
|
+
],
|
|
86
|
+
triggers: [newGroupMember],
|
|
87
|
+
});
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { createAction, Property } from '@activepieces/pieces-framework';
|
|
2
|
+
import { signalCliRestApiAuth } from '../common/auth';
|
|
3
|
+
import { SignalCliApiClient } from '../common/api-client';
|
|
4
|
+
import { formatPhoneNumber } from '../common/utils';
|
|
5
|
+
|
|
6
|
+
interface ChangeGroupAdminsRequest {
|
|
7
|
+
admins: string[];
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export const addAdminsToGroup = createAction({
|
|
11
|
+
auth: signalCliRestApiAuth,
|
|
12
|
+
name: 'addAdminsToGroup',
|
|
13
|
+
displayName: 'Add Admins to Group',
|
|
14
|
+
description: 'Add one or more admins to a Signal group',
|
|
15
|
+
props: {
|
|
16
|
+
number: Property.ShortText({
|
|
17
|
+
displayName: 'Phone Number',
|
|
18
|
+
description: 'Registered phone number in international format',
|
|
19
|
+
required: true,
|
|
20
|
+
}),
|
|
21
|
+
groupid: Property.ShortText({
|
|
22
|
+
displayName: 'Group ID',
|
|
23
|
+
description: 'Group ID (base64 encoded)',
|
|
24
|
+
required: true,
|
|
25
|
+
}),
|
|
26
|
+
admins: Property.Array({
|
|
27
|
+
displayName: 'Admins',
|
|
28
|
+
description: 'Array of phone numbers to add as admins',
|
|
29
|
+
required: true,
|
|
30
|
+
}),
|
|
31
|
+
},
|
|
32
|
+
async run(context) {
|
|
33
|
+
const { number, groupid, admins } = context.propsValue;
|
|
34
|
+
// Auth props are passed directly to API client
|
|
35
|
+
|
|
36
|
+
const apiClient = new SignalCliApiClient(context.auth.props);
|
|
37
|
+
const formattedNumber = formatPhoneNumber(number);
|
|
38
|
+
|
|
39
|
+
const requestBody: ChangeGroupAdminsRequest = {
|
|
40
|
+
admins: admins as string[],
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
await apiClient.post(
|
|
44
|
+
`/v1/groups/${encodeURIComponent(formattedNumber)}/${encodeURIComponent(groupid)}/admins`,
|
|
45
|
+
requestBody
|
|
46
|
+
);
|
|
47
|
+
|
|
48
|
+
return { success: true };
|
|
49
|
+
},
|
|
50
|
+
});
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { createAction, Property } from '@activepieces/pieces-framework';
|
|
2
|
+
import { signalCliRestApiAuth } from '../common/auth';
|
|
3
|
+
import { SignalCliApiClient } from '../common/api-client';
|
|
4
|
+
import { formatPhoneNumber } from '../common/utils';
|
|
5
|
+
|
|
6
|
+
interface AddDeviceRequest {
|
|
7
|
+
uri: string;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export const addDevice = createAction({
|
|
11
|
+
auth: signalCliRestApiAuth,
|
|
12
|
+
name: 'addDevice',
|
|
13
|
+
displayName: 'Add Device',
|
|
14
|
+
description: 'Link another device to this device (only works if this is the master device)',
|
|
15
|
+
props: {
|
|
16
|
+
number: Property.ShortText({
|
|
17
|
+
displayName: 'Phone Number',
|
|
18
|
+
description: 'Registered phone number in international format',
|
|
19
|
+
required: true,
|
|
20
|
+
}),
|
|
21
|
+
uri: Property.LongText({
|
|
22
|
+
displayName: 'Device Link URI',
|
|
23
|
+
description: 'Device link URI from QR code or raw endpoint',
|
|
24
|
+
required: true,
|
|
25
|
+
}),
|
|
26
|
+
},
|
|
27
|
+
async run(context) {
|
|
28
|
+
const { number, uri } = context.propsValue;
|
|
29
|
+
// Auth props are passed directly to API client
|
|
30
|
+
|
|
31
|
+
const apiClient = new SignalCliApiClient(context.auth.props);
|
|
32
|
+
const formattedNumber = formatPhoneNumber(number);
|
|
33
|
+
|
|
34
|
+
const requestBody: AddDeviceRequest = {
|
|
35
|
+
uri,
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
await apiClient.post(
|
|
39
|
+
`/v1/devices/${encodeURIComponent(formattedNumber)}`,
|
|
40
|
+
requestBody
|
|
41
|
+
);
|
|
42
|
+
|
|
43
|
+
return { success: true };
|
|
44
|
+
},
|
|
45
|
+
});
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { createAction, Property } from '@activepieces/pieces-framework';
|
|
2
|
+
import { signalCliRestApiAuth } from '../common/auth';
|
|
3
|
+
import { SignalCliApiClient } from '../common/api-client';
|
|
4
|
+
import { formatPhoneNumber } from '../common/utils';
|
|
5
|
+
|
|
6
|
+
interface ChangeGroupMembersRequest {
|
|
7
|
+
members: string[];
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export const addMembersToGroup = createAction({
|
|
11
|
+
auth: signalCliRestApiAuth,
|
|
12
|
+
name: 'addMembersToGroup',
|
|
13
|
+
displayName: 'Add Members to Group',
|
|
14
|
+
description: 'Add one or more members to a Signal group',
|
|
15
|
+
props: {
|
|
16
|
+
number: Property.ShortText({
|
|
17
|
+
displayName: 'Phone Number',
|
|
18
|
+
description: 'Registered phone number in international format',
|
|
19
|
+
required: true,
|
|
20
|
+
}),
|
|
21
|
+
groupid: Property.ShortText({
|
|
22
|
+
displayName: 'Group ID',
|
|
23
|
+
description: 'Group ID (base64 encoded)',
|
|
24
|
+
required: true,
|
|
25
|
+
}),
|
|
26
|
+
members: Property.Array({
|
|
27
|
+
displayName: 'Members',
|
|
28
|
+
description: 'Array of phone numbers to add as members',
|
|
29
|
+
required: true,
|
|
30
|
+
}),
|
|
31
|
+
},
|
|
32
|
+
async run(context) {
|
|
33
|
+
const { number, groupid, members } = context.propsValue;
|
|
34
|
+
// Auth props are passed directly to API client
|
|
35
|
+
|
|
36
|
+
const apiClient = new SignalCliApiClient(context.auth.props);
|
|
37
|
+
const formattedNumber = formatPhoneNumber(number);
|
|
38
|
+
|
|
39
|
+
const requestBody: ChangeGroupMembersRequest = {
|
|
40
|
+
members: members as string[],
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
await apiClient.post(
|
|
44
|
+
`/v1/groups/${encodeURIComponent(formattedNumber)}/${encodeURIComponent(groupid)}/members`,
|
|
45
|
+
requestBody
|
|
46
|
+
);
|
|
47
|
+
|
|
48
|
+
return { success: true };
|
|
49
|
+
},
|
|
50
|
+
});
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { createAction, Property } from '@activepieces/pieces-framework';
|
|
2
|
+
import { signalCliRestApiAuth } from '../common/auth';
|
|
3
|
+
import { SignalCliApiClient } from '../common/api-client';
|
|
4
|
+
import { formatPhoneNumber } from '../common/utils';
|
|
5
|
+
|
|
6
|
+
export const blockGroup = createAction({
|
|
7
|
+
auth: signalCliRestApiAuth,
|
|
8
|
+
name: 'blockGroup',
|
|
9
|
+
displayName: 'Block Group',
|
|
10
|
+
description: 'Block a Signal group',
|
|
11
|
+
props: {
|
|
12
|
+
number: Property.ShortText({
|
|
13
|
+
displayName: 'Phone Number',
|
|
14
|
+
description: 'Registered phone number in international format',
|
|
15
|
+
required: true,
|
|
16
|
+
}),
|
|
17
|
+
groupid: Property.ShortText({
|
|
18
|
+
displayName: 'Group ID',
|
|
19
|
+
description: 'Group ID (base64 encoded)',
|
|
20
|
+
required: true,
|
|
21
|
+
}),
|
|
22
|
+
},
|
|
23
|
+
async run(context) {
|
|
24
|
+
const { number, groupid } = context.propsValue;
|
|
25
|
+
// Auth props are passed directly to API client
|
|
26
|
+
|
|
27
|
+
const apiClient = new SignalCliApiClient(context.auth.props);
|
|
28
|
+
const formattedNumber = formatPhoneNumber(number);
|
|
29
|
+
|
|
30
|
+
await apiClient.post(
|
|
31
|
+
`/v1/groups/${encodeURIComponent(formattedNumber)}/${encodeURIComponent(groupid)}/block`
|
|
32
|
+
);
|
|
33
|
+
|
|
34
|
+
return { success: true };
|
|
35
|
+
},
|
|
36
|
+
});
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { createAction, Property } from '@activepieces/pieces-framework';
|
|
2
|
+
import { signalCliRestApiAuth } from '../common/auth';
|
|
3
|
+
import { SignalCliApiClient } from '../common/api-client';
|
|
4
|
+
import { formatPhoneNumber } from '../common/utils';
|
|
5
|
+
|
|
6
|
+
interface CreateGroupRequest {
|
|
7
|
+
name: string;
|
|
8
|
+
members: string[];
|
|
9
|
+
description?: string;
|
|
10
|
+
permissions?: {
|
|
11
|
+
add_members: 'every-member' | 'only-admins';
|
|
12
|
+
edit_group: 'every-member' | 'only-admins';
|
|
13
|
+
send_messages: 'every-member' | 'only-admins';
|
|
14
|
+
};
|
|
15
|
+
group_link?: 'disabled' | 'enabled' | 'enabled-with-approval';
|
|
16
|
+
expiration_time?: number;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
interface CreateGroupResponse {
|
|
20
|
+
id: string;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export const createGroup = createAction({
|
|
24
|
+
auth: signalCliRestApiAuth,
|
|
25
|
+
name: 'createGroup',
|
|
26
|
+
displayName: 'Create Group',
|
|
27
|
+
description: 'Create a new Signal group',
|
|
28
|
+
props: {
|
|
29
|
+
number: Property.ShortText({
|
|
30
|
+
displayName: 'Phone Number',
|
|
31
|
+
description: 'Registered phone number in international format',
|
|
32
|
+
required: true,
|
|
33
|
+
}),
|
|
34
|
+
name: Property.ShortText({
|
|
35
|
+
displayName: 'Group Name',
|
|
36
|
+
description: 'Name of the group',
|
|
37
|
+
required: true,
|
|
38
|
+
}),
|
|
39
|
+
members: Property.Array({
|
|
40
|
+
displayName: 'Members',
|
|
41
|
+
description: 'Array of phone numbers to add as members',
|
|
42
|
+
required: true,
|
|
43
|
+
}),
|
|
44
|
+
description: Property.LongText({
|
|
45
|
+
displayName: 'Description',
|
|
46
|
+
description: 'Group description',
|
|
47
|
+
required: false,
|
|
48
|
+
}),
|
|
49
|
+
add_members_permission: Property.StaticDropdown({
|
|
50
|
+
displayName: 'Add Members Permission',
|
|
51
|
+
description: 'Who can add members',
|
|
52
|
+
required: false,
|
|
53
|
+
options: {
|
|
54
|
+
options: [
|
|
55
|
+
{ label: 'Every Member', value: 'every-member' },
|
|
56
|
+
{ label: 'Only Admins', value: 'only-admins' },
|
|
57
|
+
],
|
|
58
|
+
},
|
|
59
|
+
}),
|
|
60
|
+
edit_group_permission: Property.StaticDropdown({
|
|
61
|
+
displayName: 'Edit Group Permission',
|
|
62
|
+
description: 'Who can edit the group',
|
|
63
|
+
required: false,
|
|
64
|
+
options: {
|
|
65
|
+
options: [
|
|
66
|
+
{ label: 'Every Member', value: 'every-member' },
|
|
67
|
+
{ label: 'Only Admins', value: 'only-admins' },
|
|
68
|
+
],
|
|
69
|
+
},
|
|
70
|
+
}),
|
|
71
|
+
send_messages_permission: Property.StaticDropdown({
|
|
72
|
+
displayName: 'Send Messages Permission',
|
|
73
|
+
description: 'Who can send messages',
|
|
74
|
+
required: false,
|
|
75
|
+
options: {
|
|
76
|
+
options: [
|
|
77
|
+
{ label: 'Every Member', value: 'every-member' },
|
|
78
|
+
{ label: 'Only Admins', value: 'only-admins' },
|
|
79
|
+
],
|
|
80
|
+
},
|
|
81
|
+
}),
|
|
82
|
+
group_link: Property.StaticDropdown({
|
|
83
|
+
displayName: 'Group Link',
|
|
84
|
+
description: 'Group link state',
|
|
85
|
+
required: false,
|
|
86
|
+
options: {
|
|
87
|
+
options: [
|
|
88
|
+
{ label: 'Disabled', value: 'disabled' },
|
|
89
|
+
{ label: 'Enabled', value: 'enabled' },
|
|
90
|
+
{ label: 'Enabled with Approval', value: 'enabled-with-approval' },
|
|
91
|
+
],
|
|
92
|
+
},
|
|
93
|
+
}),
|
|
94
|
+
expiration_time: Property.Number({
|
|
95
|
+
displayName: 'Expiration Time',
|
|
96
|
+
description: 'Message expiration time in seconds',
|
|
97
|
+
required: false,
|
|
98
|
+
}),
|
|
99
|
+
},
|
|
100
|
+
async run(context) {
|
|
101
|
+
const { number, name, members, description, add_members_permission, edit_group_permission, send_messages_permission, group_link, expiration_time } = context.propsValue;
|
|
102
|
+
// Auth props are passed directly to API client
|
|
103
|
+
|
|
104
|
+
const apiClient = new SignalCliApiClient(context.auth.props);
|
|
105
|
+
const formattedNumber = formatPhoneNumber(number);
|
|
106
|
+
|
|
107
|
+
const requestBody: CreateGroupRequest = {
|
|
108
|
+
name,
|
|
109
|
+
members: members as string[],
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
if (description) {
|
|
113
|
+
requestBody.description = description;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
if (add_members_permission || edit_group_permission || send_messages_permission) {
|
|
117
|
+
requestBody.permissions = {
|
|
118
|
+
add_members: (add_members_permission as 'every-member' | 'only-admins') || 'every-member',
|
|
119
|
+
edit_group: (edit_group_permission as 'every-member' | 'only-admins') || 'every-member',
|
|
120
|
+
send_messages: (send_messages_permission as 'every-member' | 'only-admins') || 'every-member',
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
if (group_link) {
|
|
125
|
+
requestBody.group_link = group_link as 'disabled' | 'enabled' | 'enabled-with-approval';
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
if (expiration_time) {
|
|
129
|
+
requestBody.expiration_time = expiration_time;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
const response = await apiClient.post<CreateGroupResponse>(
|
|
133
|
+
`/v1/groups/${encodeURIComponent(formattedNumber)}`,
|
|
134
|
+
requestBody
|
|
135
|
+
);
|
|
136
|
+
|
|
137
|
+
return response;
|
|
138
|
+
},
|
|
139
|
+
});
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { createAction, Property } from '@activepieces/pieces-framework';
|
|
2
|
+
import { signalCliRestApiAuth } from '../common/auth';
|
|
3
|
+
import { SignalCliApiClient } from '../common/api-client';
|
|
4
|
+
import { formatPhoneNumber } from '../common/utils';
|
|
5
|
+
|
|
6
|
+
export const deleteGroup = createAction({
|
|
7
|
+
auth: signalCliRestApiAuth,
|
|
8
|
+
name: 'deleteGroup',
|
|
9
|
+
displayName: 'Delete Group',
|
|
10
|
+
description: 'Delete a Signal group',
|
|
11
|
+
props: {
|
|
12
|
+
number: Property.ShortText({
|
|
13
|
+
displayName: 'Phone Number',
|
|
14
|
+
description: 'Registered phone number in international format',
|
|
15
|
+
required: true,
|
|
16
|
+
}),
|
|
17
|
+
groupid: Property.ShortText({
|
|
18
|
+
displayName: 'Group ID',
|
|
19
|
+
description: 'Group ID (base64 encoded)',
|
|
20
|
+
required: true,
|
|
21
|
+
}),
|
|
22
|
+
},
|
|
23
|
+
async run(context) {
|
|
24
|
+
const { number, groupid } = context.propsValue;
|
|
25
|
+
// Auth props are passed directly to API client
|
|
26
|
+
|
|
27
|
+
const apiClient = new SignalCliApiClient(context.auth.props);
|
|
28
|
+
const formattedNumber = formatPhoneNumber(number);
|
|
29
|
+
|
|
30
|
+
await apiClient.delete(
|
|
31
|
+
`/v1/groups/${encodeURIComponent(formattedNumber)}/${encodeURIComponent(groupid)}`
|
|
32
|
+
);
|
|
33
|
+
|
|
34
|
+
return { success: true };
|
|
35
|
+
},
|
|
36
|
+
});
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { createAction, Property } from '@activepieces/pieces-framework';
|
|
2
|
+
import { signalCliRestApiAuth } from '../common/auth';
|
|
3
|
+
import { SignalCliApiClient } from '../common/api-client';
|
|
4
|
+
import { formatPhoneNumber } from '../common/utils';
|
|
5
|
+
|
|
6
|
+
interface ContactEntry {
|
|
7
|
+
number: string;
|
|
8
|
+
name?: string;
|
|
9
|
+
expiration_in_seconds?: number;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export const getContact = createAction({
|
|
13
|
+
auth: signalCliRestApiAuth,
|
|
14
|
+
name: 'getContact',
|
|
15
|
+
displayName: 'Get Contact',
|
|
16
|
+
description: 'Get details of a specific contact',
|
|
17
|
+
props: {
|
|
18
|
+
number: Property.ShortText({
|
|
19
|
+
displayName: 'Phone Number',
|
|
20
|
+
description: 'Registered phone number in international format',
|
|
21
|
+
required: true,
|
|
22
|
+
}),
|
|
23
|
+
uuid: Property.ShortText({
|
|
24
|
+
displayName: 'Contact UUID',
|
|
25
|
+
description: 'UUID of the contact',
|
|
26
|
+
required: true,
|
|
27
|
+
}),
|
|
28
|
+
},
|
|
29
|
+
async run(context) {
|
|
30
|
+
const { number, uuid } = context.propsValue;
|
|
31
|
+
// Auth props are passed directly to API client
|
|
32
|
+
|
|
33
|
+
const apiClient = new SignalCliApiClient(context.auth.props);
|
|
34
|
+
const formattedNumber = formatPhoneNumber(number);
|
|
35
|
+
|
|
36
|
+
const response = await apiClient.get<ContactEntry>(
|
|
37
|
+
`/v1/contacts/${encodeURIComponent(formattedNumber)}/${encodeURIComponent(uuid)}`
|
|
38
|
+
);
|
|
39
|
+
|
|
40
|
+
return response;
|
|
41
|
+
},
|
|
42
|
+
});
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { createAction, Property } from '@activepieces/pieces-framework';
|
|
2
|
+
import { signalCliRestApiAuth } from '../common/auth';
|
|
3
|
+
import { SignalCliApiClient } from '../common/api-client';
|
|
4
|
+
import { GroupEntry } from '../common/types';
|
|
5
|
+
import { formatPhoneNumber } from '../common/utils';
|
|
6
|
+
|
|
7
|
+
export const getGroup = createAction({
|
|
8
|
+
auth: signalCliRestApiAuth,
|
|
9
|
+
name: 'getGroup',
|
|
10
|
+
displayName: 'Get Group',
|
|
11
|
+
description: 'Get details of a specific Signal group',
|
|
12
|
+
props: {
|
|
13
|
+
number: Property.ShortText({
|
|
14
|
+
displayName: 'Phone Number',
|
|
15
|
+
description: 'Registered phone number in international format',
|
|
16
|
+
required: true,
|
|
17
|
+
}),
|
|
18
|
+
groupid: Property.ShortText({
|
|
19
|
+
displayName: 'Group ID',
|
|
20
|
+
description: 'Group ID (base64 encoded)',
|
|
21
|
+
required: true,
|
|
22
|
+
}),
|
|
23
|
+
},
|
|
24
|
+
async run(context) {
|
|
25
|
+
const { number, groupid } = context.propsValue;
|
|
26
|
+
// Auth props are passed directly to API client
|
|
27
|
+
|
|
28
|
+
const apiClient = new SignalCliApiClient(context.auth.props);
|
|
29
|
+
const formattedNumber = formatPhoneNumber(number);
|
|
30
|
+
|
|
31
|
+
const response = await apiClient.get<GroupEntry>(
|
|
32
|
+
`/v1/groups/${encodeURIComponent(formattedNumber)}/${encodeURIComponent(groupid)}`
|
|
33
|
+
);
|
|
34
|
+
|
|
35
|
+
return response;
|
|
36
|
+
},
|
|
37
|
+
});
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { createAction, Property } from '@activepieces/pieces-framework';
|
|
2
|
+
import { httpClient, HttpMethod } from '@activepieces/pieces-common';
|
|
3
|
+
import { signalCliRestApiAuth } from '../common/auth';
|
|
4
|
+
|
|
5
|
+
export const getQrCodeLink = createAction({
|
|
6
|
+
auth: signalCliRestApiAuth,
|
|
7
|
+
name: 'getQrCodeLink',
|
|
8
|
+
displayName: 'Get QR Code Link',
|
|
9
|
+
description: 'Generate a QR code for linking a device',
|
|
10
|
+
props: {
|
|
11
|
+
device_name: Property.ShortText({
|
|
12
|
+
displayName: 'Device Name',
|
|
13
|
+
description: 'Name for the device to link',
|
|
14
|
+
required: true,
|
|
15
|
+
}),
|
|
16
|
+
qrcode_version: Property.Number({
|
|
17
|
+
displayName: 'QR Code Version',
|
|
18
|
+
description: 'QR code version (default: 10)',
|
|
19
|
+
required: false,
|
|
20
|
+
}),
|
|
21
|
+
},
|
|
22
|
+
async run(context) {
|
|
23
|
+
const { device_name, qrcode_version } = context.propsValue;
|
|
24
|
+
const { baseUrl, useBasicAuth, basicAuthUsername, basicAuthPassword } = context.auth.props;
|
|
25
|
+
|
|
26
|
+
const queryParams = new URLSearchParams();
|
|
27
|
+
queryParams.append('device_name', device_name);
|
|
28
|
+
if (qrcode_version) {
|
|
29
|
+
queryParams.append('qrcode_version', qrcode_version.toString());
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const headers: Record<string, string> = {
|
|
33
|
+
Accept: 'image/png',
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
// Add Basic Auth header if configured
|
|
37
|
+
if (useBasicAuth && basicAuthUsername && basicAuthPassword) {
|
|
38
|
+
const credentials = Buffer.from(
|
|
39
|
+
`${basicAuthUsername}:${basicAuthPassword}`
|
|
40
|
+
).toString('base64');
|
|
41
|
+
headers['Authorization'] = `Basic ${credentials}`;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// The API returns a PNG image, so we need to handle it as binary
|
|
45
|
+
const response = await httpClient.sendRequest({
|
|
46
|
+
method: HttpMethod.GET,
|
|
47
|
+
url: `${baseUrl.replace(/\/$/, '')}/v1/qrcodelink?${queryParams.toString()}`,
|
|
48
|
+
headers,
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
// Return base64 encoded image
|
|
52
|
+
if (response.body instanceof ArrayBuffer || response.body instanceof Buffer) {
|
|
53
|
+
const base64 = Buffer.from(response.body).toString('base64');
|
|
54
|
+
return {
|
|
55
|
+
qr_code_base64: `data:image/png;base64,${base64}`,
|
|
56
|
+
device_name,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
return response.body;
|
|
61
|
+
},
|
|
62
|
+
});
|