Skip to content

Commit f7b1a54

Browse files
Admin API added
1 parent f1b8499 commit f7b1a54

18 files changed

Lines changed: 433 additions & 4 deletions

nodes/LinkedApi/LinkedApi.node.ts

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import type {
66
} from 'n8n-workflow';
77
import { NodeConnectionType, NodeOperationError } from 'n8n-workflow';
88
import {
9+
availableAdminOperations,
910
availableOtherOperations,
1011
availableSalesNavigatorOperations,
1112
availableStandardOperations,
@@ -41,6 +42,16 @@ import {
4142
CancelWorkflow,
4243
PollConversations,
4344
ActionsUsageStatistics,
45+
AdminGetSubscriptionStatus,
46+
AdminGetSeats,
47+
AdminSetSeats,
48+
AdminGetAccounts,
49+
AdminConnectAccount,
50+
AdminDisconnectAccount,
51+
AdminRegenerateToken,
52+
AdminGetLimitsUsage,
53+
AdminSetLimits,
54+
AdminResetLimits,
4455
} from './operations';
4556
import { LinkedApiOperation } from './shared/LinkedApiOperation';
4657

@@ -74,6 +85,16 @@ const operations: Record<string, LinkedApiOperation> = {
7485
cancelWorkflow: new CancelWorkflow(),
7586
pollConversations: new PollConversations(),
7687
actionsUsageStatistics: new ActionsUsageStatistics(),
88+
adminGetSubscriptionStatus: new AdminGetSubscriptionStatus(),
89+
adminGetSeats: new AdminGetSeats(),
90+
adminSetSeats: new AdminSetSeats(),
91+
adminGetAccounts: new AdminGetAccounts(),
92+
adminConnectAccount: new AdminConnectAccount(),
93+
adminDisconnectAccount: new AdminDisconnectAccount(),
94+
adminRegenerateToken: new AdminRegenerateToken(),
95+
adminGetLimitsUsage: new AdminGetLimitsUsage(),
96+
adminSetLimits: new AdminSetLimits(),
97+
adminResetLimits: new AdminResetLimits(),
7798
};
7899

79100
export class LinkedApi implements INodeType {
@@ -104,7 +125,7 @@ export class LinkedApi implements INodeType {
104125
location: 'outputPane',
105126
whenToDisplay: 'beforeExecution',
106127
displayCondition:
107-
'={{ !["getWorkflowResult", "cancelWorkflow", "pollConversations", "actionsUsageStatistics"].includes($parameter["operation"]) }}',
128+
'={{ !["getWorkflowResult", "cancelWorkflow", "pollConversations", "actionsUsageStatistics", "adminGetSubscriptionStatus", "adminGetSeats", "adminSetSeats", "adminGetAccounts", "adminConnectAccount", "adminDisconnectAccount", "adminRegenerateToken", "adminGetLimitsUsage", "adminSetLimits", "adminResetLimits"].includes($parameter["operation"]) }}',
108129
},
109130
],
110131
credentials: [
@@ -118,6 +139,7 @@ export class LinkedApi implements INodeType {
118139
availableStandardOperations,
119140
availableSalesNavigatorOperations,
120141
availableOtherOperations,
142+
availableAdminOperations,
121143
// Standard actions
122144
...operations.checkConnectionStatus.operationFields,
123145
...operations.commentOnPost.operationFields,
@@ -150,6 +172,17 @@ export class LinkedApi implements INodeType {
150172
...operations.cancelWorkflow.operationFields,
151173
...operations.pollConversations.operationFields,
152174
...operations.actionsUsageStatistics.operationFields,
175+
// Admin actions
176+
...operations.adminGetSubscriptionStatus.operationFields,
177+
...operations.adminGetSeats.operationFields,
178+
...operations.adminSetSeats.operationFields,
179+
...operations.adminGetAccounts.operationFields,
180+
...operations.adminConnectAccount.operationFields,
181+
...operations.adminDisconnectAccount.operationFields,
182+
...operations.adminRegenerateToken.operationFields,
183+
...operations.adminGetLimitsUsage.operationFields,
184+
...operations.adminSetLimits.operationFields,
185+
...operations.adminResetLimits.operationFields,
153186
],
154187
};
155188

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { IExecuteFunctions, INodeProperties } from 'n8n-workflow';
2+
import { AdminLinkedApiOperation } from '../../shared/AdminOperation';
3+
import { AVAILABLE_ACTION } from '../../shared/AvailableActions';
4+
5+
export class AdminConnectAccount extends AdminLinkedApiOperation {
6+
operationName = AVAILABLE_ACTION.adminConnectAccount;
7+
endpoint = 'accounts.createConnectionSession';
8+
fields: INodeProperties[] = [];
9+
requestBody = (_: IExecuteFunctions): Record<string, any> | undefined => undefined;
10+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import { IExecuteFunctions, INodeProperties } from 'n8n-workflow';
2+
import { createParameterWithDisplayOptions } from '../../shared/SharedParameters';
3+
import { AdminLinkedApiOperation } from '../../shared/AdminOperation';
4+
import { AVAILABLE_ACTION } from '../../shared/AvailableActions';
5+
6+
export class AdminDisconnectAccount extends AdminLinkedApiOperation {
7+
operationName = AVAILABLE_ACTION.adminDisconnectAccount;
8+
endpoint = 'accounts.disconnect';
9+
fields: INodeProperties[] = [
10+
createParameterWithDisplayOptions(
11+
{
12+
displayName: 'Account ID',
13+
name: 'accountId',
14+
type: 'string',
15+
required: true,
16+
default: '',
17+
description: 'UUID of the account to disconnect',
18+
},
19+
this.show,
20+
),
21+
];
22+
requestBody = (context: IExecuteFunctions): Record<string, any> => ({
23+
accountId: this.stringParameter(context, 'accountId'),
24+
});
25+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { IExecuteFunctions, INodeProperties } from 'n8n-workflow';
2+
import { AdminLinkedApiOperation } from '../../shared/AdminOperation';
3+
import { AVAILABLE_ACTION } from '../../shared/AvailableActions';
4+
5+
export class AdminGetAccounts extends AdminLinkedApiOperation {
6+
operationName = AVAILABLE_ACTION.adminGetAccounts;
7+
endpoint = 'accounts.getAll';
8+
fields: INodeProperties[] = [];
9+
requestBody = (_: IExecuteFunctions): Record<string, any> | undefined => undefined;
10+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import { IExecuteFunctions, INodeProperties } from 'n8n-workflow';
2+
import { createParameterWithDisplayOptions } from '../../shared/SharedParameters';
3+
import { AdminLinkedApiOperation } from '../../shared/AdminOperation';
4+
import { AVAILABLE_ACTION } from '../../shared/AvailableActions';
5+
6+
export class AdminGetLimitsUsage extends AdminLinkedApiOperation {
7+
operationName = AVAILABLE_ACTION.adminGetLimitsUsage;
8+
endpoint = 'limits.getUsage';
9+
fields: INodeProperties[] = [
10+
createParameterWithDisplayOptions(
11+
{
12+
displayName: 'Account ID',
13+
name: 'accountId',
14+
type: 'string',
15+
required: true,
16+
default: '',
17+
description: 'UUID of the account',
18+
},
19+
this.show,
20+
),
21+
];
22+
requestBody = (context: IExecuteFunctions): Record<string, any> => ({
23+
accountId: this.stringParameter(context, 'accountId'),
24+
});
25+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { IExecuteFunctions, INodeProperties } from 'n8n-workflow';
2+
import { AdminLinkedApiOperation } from '../../shared/AdminOperation';
3+
import { AVAILABLE_ACTION } from '../../shared/AvailableActions';
4+
5+
export class AdminGetSeats extends AdminLinkedApiOperation {
6+
operationName = AVAILABLE_ACTION.adminGetSeats;
7+
endpoint = 'subscription.getSeats';
8+
fields: INodeProperties[] = [];
9+
requestBody = (_: IExecuteFunctions): Record<string, any> | undefined => undefined;
10+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { IExecuteFunctions, INodeProperties } from 'n8n-workflow';
2+
import { AdminLinkedApiOperation } from '../../shared/AdminOperation';
3+
import { AVAILABLE_ACTION } from '../../shared/AvailableActions';
4+
5+
export class AdminGetSubscriptionStatus extends AdminLinkedApiOperation {
6+
operationName = AVAILABLE_ACTION.adminGetSubscriptionStatus;
7+
endpoint = 'subscription.getStatus';
8+
fields: INodeProperties[] = [];
9+
requestBody = (_: IExecuteFunctions): Record<string, any> | undefined => undefined;
10+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import { IExecuteFunctions, INodeProperties } from 'n8n-workflow';
2+
import { createParameterWithDisplayOptions } from '../../shared/SharedParameters';
3+
import { AdminLinkedApiOperation } from '../../shared/AdminOperation';
4+
import { AVAILABLE_ACTION } from '../../shared/AvailableActions';
5+
6+
export class AdminRegenerateToken extends AdminLinkedApiOperation {
7+
operationName = AVAILABLE_ACTION.adminRegenerateToken;
8+
endpoint = 'accounts.regenerateIdentificationToken';
9+
fields: INodeProperties[] = [
10+
createParameterWithDisplayOptions(
11+
{
12+
displayName: 'Account ID',
13+
name: 'accountId',
14+
type: 'string',
15+
required: true,
16+
default: '',
17+
description: 'UUID of the account',
18+
},
19+
this.show,
20+
),
21+
];
22+
requestBody = (context: IExecuteFunctions): Record<string, any> => ({
23+
accountId: this.stringParameter(context, 'accountId'),
24+
});
25+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import { IExecuteFunctions, INodeProperties } from 'n8n-workflow';
2+
import { createParameterWithDisplayOptions } from '../../shared/SharedParameters';
3+
import { AdminLinkedApiOperation } from '../../shared/AdminOperation';
4+
import { AVAILABLE_ACTION } from '../../shared/AvailableActions';
5+
6+
export class AdminResetLimits extends AdminLinkedApiOperation {
7+
operationName = AVAILABLE_ACTION.adminResetLimits;
8+
endpoint = 'limits.resetToDefaults';
9+
fields: INodeProperties[] = [
10+
createParameterWithDisplayOptions(
11+
{
12+
displayName: 'Account ID',
13+
name: 'accountId',
14+
type: 'string',
15+
required: true,
16+
default: '',
17+
description: 'UUID of the account',
18+
},
19+
this.show,
20+
),
21+
];
22+
requestBody = (context: IExecuteFunctions): Record<string, any> => ({
23+
accountId: this.stringParameter(context, 'accountId'),
24+
});
25+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import { IExecuteFunctions, INodeProperties, NodeOperationError } from 'n8n-workflow';
2+
import { createParameterWithDisplayOptions } from '../../shared/SharedParameters';
3+
import { AdminLinkedApiOperation } from '../../shared/AdminOperation';
4+
import { AVAILABLE_ACTION } from '../../shared/AvailableActions';
5+
6+
export class AdminSetLimits extends AdminLinkedApiOperation {
7+
operationName = AVAILABLE_ACTION.adminSetLimits;
8+
endpoint = 'limits.set';
9+
fields: INodeProperties[] = [
10+
createParameterWithDisplayOptions(
11+
{
12+
displayName: 'Account ID',
13+
name: 'accountId',
14+
type: 'string',
15+
required: true,
16+
default: '',
17+
description: 'UUID of the account',
18+
},
19+
this.show,
20+
),
21+
createParameterWithDisplayOptions(
22+
{
23+
displayName: 'Limits',
24+
name: 'limits',
25+
type: 'json',
26+
required: true,
27+
default:
28+
'[{"category": "stMessages", "period": "daily", "maxValue": 25, "isEnabled": true}]',
29+
description:
30+
'JSON array of limit configurations. Each entry: { category, period (daily/weekly/monthly), maxValue, isEnabled? }. Categories: stPersonProfileViews, stCompanyPageViews, stConnectionRequests, stMessages, stSearchQueries, stReactions, stComments, stPosts, nvPersonProfileViews, nvCompanyPageViews, nvMessages.',
31+
},
32+
this.show,
33+
),
34+
];
35+
requestBody = (context: IExecuteFunctions): Record<string, any> => {
36+
const limitsString = this.stringParameter(context, 'limits');
37+
let limits: unknown;
38+
try {
39+
limits = JSON.parse(limitsString);
40+
} catch {
41+
throw new NodeOperationError(
42+
context.getNode(),
43+
`Invalid JSON format for limits: ${limitsString}`,
44+
);
45+
}
46+
if (!Array.isArray(limits)) {
47+
throw new NodeOperationError(context.getNode(), 'Limits must be a JSON array');
48+
}
49+
return {
50+
accountId: this.stringParameter(context, 'accountId'),
51+
limits,
52+
};
53+
};
54+
}

0 commit comments

Comments
 (0)