@attrove/sdk 0.1.17 → 0.1.18
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/cjs/admin-client.js +2 -2
- package/cjs/constants.js +1 -1
- package/cjs/resources/webhooks.js +79 -2
- package/esm/admin-client.d.ts +2 -2
- package/esm/admin-client.js +2 -2
- package/esm/constants.d.ts +1 -1
- package/esm/constants.js +1 -1
- package/esm/resources/webhooks.d.ts +21 -7
- package/esm/resources/webhooks.d.ts.map +1 -1
- package/esm/resources/webhooks.js +79 -2
- package/esm/resources/webhooks.js.map +1 -1
- package/package.json +1 -1
package/cjs/admin-client.js
CHANGED
|
@@ -117,8 +117,8 @@ class AdminUsersResource {
|
|
|
117
117
|
*
|
|
118
118
|
* const { token, expires_at } = await admin.users.createConnectToken(userId);
|
|
119
119
|
*
|
|
120
|
-
* // Redirect user to
|
|
121
|
-
* const
|
|
120
|
+
* // Redirect user to the connect page with this token
|
|
121
|
+
* const connectUrl = `https://connect.attrove.com/integrations/connect?token=${token}&user_id=${userId}`;
|
|
122
122
|
* ```
|
|
123
123
|
*/
|
|
124
124
|
async createConnectToken(userId) {
|
package/cjs/constants.js
CHANGED
|
@@ -13,7 +13,7 @@ exports.getWsCloseReason = exports.WS_CLOSE_CODES = exports.RETRYABLE_STATUS_SET
|
|
|
13
13
|
* Automatically synchronized with package.json during the release process.
|
|
14
14
|
* For programmatic access, use `getVersion()` from './version'.
|
|
15
15
|
*/
|
|
16
|
-
exports.SDK_VERSION = "0.1.
|
|
16
|
+
exports.SDK_VERSION = "0.1.18"; // auto-synced from package.json during release
|
|
17
17
|
/**
|
|
18
18
|
* Default API base URL for Attrove services.
|
|
19
19
|
*/
|
|
@@ -3,11 +3,65 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.AdminWebhooksResource = void 0;
|
|
4
4
|
const index_js_1 = require("../errors/index.js");
|
|
5
5
|
const index_js_2 = require("../types/index.js");
|
|
6
|
+
const ADMIN_WEBHOOK_SUBSCRIBABLE_EVENT_TYPES = [
|
|
7
|
+
'messages.new',
|
|
8
|
+
'sync.completed',
|
|
9
|
+
'integration.status_changed',
|
|
10
|
+
'webhook.test',
|
|
11
|
+
'meetings.new',
|
|
12
|
+
'events.new',
|
|
13
|
+
'events.starting_soon',
|
|
14
|
+
];
|
|
15
|
+
const _arrayCoversType = true;
|
|
16
|
+
void _arrayCoversType;
|
|
17
|
+
const ADMIN_WEBHOOK_SUBSCRIBABLE_EVENT_TYPE_SET = new Set(ADMIN_WEBHOOK_SUBSCRIBABLE_EVENT_TYPES);
|
|
6
18
|
function validateWebhookId(id, fieldName = 'id') {
|
|
7
19
|
if (!(0, index_js_2.isValidUUID)(id)) {
|
|
8
20
|
throw new index_js_1.ValidationError(`${fieldName} must be a valid UUID format`, index_js_2.ErrorCodes.VALIDATION_INVALID_FORMAT, { field: fieldName, expected: 'UUID format' });
|
|
9
21
|
}
|
|
10
22
|
}
|
|
23
|
+
function validateWebhookUserIds(userIds) {
|
|
24
|
+
if (userIds === undefined || userIds === null) {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
if (!Array.isArray(userIds) || userIds.length === 0) {
|
|
28
|
+
throw new index_js_1.ValidationError('userIds must be a non-empty array of UUIDs or null', index_js_2.ErrorCodes.VALIDATION_INVALID_FORMAT, { field: 'userIds' });
|
|
29
|
+
}
|
|
30
|
+
const invalidUserId = userIds.find((userId) => !(0, index_js_2.isValidUUID)(userId));
|
|
31
|
+
if (invalidUserId) {
|
|
32
|
+
throw new index_js_1.ValidationError('userIds must contain only valid UUIDs', index_js_2.ErrorCodes.VALIDATION_INVALID_FORMAT, {
|
|
33
|
+
field: 'userIds',
|
|
34
|
+
value: invalidUserId,
|
|
35
|
+
expected: 'UUID format',
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
function validateWebhookEventTypes(eventTypes, fieldName = 'eventTypes') {
|
|
40
|
+
if (eventTypes === undefined) {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
const invalidEventType = eventTypes.find((eventType) => !ADMIN_WEBHOOK_SUBSCRIBABLE_EVENT_TYPE_SET.has(eventType));
|
|
44
|
+
if (invalidEventType) {
|
|
45
|
+
throw new index_js_1.ValidationError(`Unsupported webhook event type: ${invalidEventType}`, index_js_2.ErrorCodes.VALIDATION_INVALID_FORMAT, {
|
|
46
|
+
field: fieldName,
|
|
47
|
+
value: invalidEventType,
|
|
48
|
+
expected: ADMIN_WEBHOOK_SUBSCRIBABLE_EVENT_TYPES.join(', '),
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
const VALID_STARTING_SOON_MINUTES = new Set([5, 10, 15, 30, 60]);
|
|
53
|
+
function validateStartingSoonMinutes(value) {
|
|
54
|
+
if (value === undefined || value === null) {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
if (!VALID_STARTING_SOON_MINUTES.has(value)) {
|
|
58
|
+
throw new index_js_1.ValidationError(`startingSoonMinutes must be one of 5, 10, 15, 30, 60 (got ${value})`, index_js_2.ErrorCodes.VALIDATION_OUT_OF_RANGE, {
|
|
59
|
+
field: 'startingSoonMinutes',
|
|
60
|
+
value,
|
|
61
|
+
expected: '5, 10, 15, 30, 60',
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
}
|
|
11
65
|
function validateWebhookCreateOptions(options) {
|
|
12
66
|
if (!options.url || typeof options.url !== 'string') {
|
|
13
67
|
throw new index_js_1.ValidationError('url is required and must be a non-empty string', index_js_2.ErrorCodes.VALIDATION_REQUIRED_FIELD, { field: 'url' });
|
|
@@ -18,11 +72,16 @@ function validateWebhookCreateOptions(options) {
|
|
|
18
72
|
if (!Array.isArray(options.eventTypes) || options.eventTypes.length === 0) {
|
|
19
73
|
throw new index_js_1.ValidationError('eventTypes must contain at least one event type', index_js_2.ErrorCodes.VALIDATION_REQUIRED_FIELD, { field: 'eventTypes' });
|
|
20
74
|
}
|
|
75
|
+
validateWebhookEventTypes(options.eventTypes);
|
|
76
|
+
validateWebhookUserIds(options.userIds);
|
|
77
|
+
validateStartingSoonMinutes(options.startingSoonMinutes);
|
|
21
78
|
}
|
|
22
79
|
function validateWebhookUpdateOptions(options) {
|
|
23
80
|
if (options.url === undefined &&
|
|
24
81
|
options.eventTypes === undefined &&
|
|
25
|
-
options.isActive === undefined
|
|
82
|
+
options.isActive === undefined &&
|
|
83
|
+
options.userIds === undefined &&
|
|
84
|
+
options.startingSoonMinutes === undefined) {
|
|
26
85
|
throw new index_js_1.ValidationError('At least one field must be provided for update', index_js_2.ErrorCodes.VALIDATION_REQUIRED_FIELD, { field: 'options' });
|
|
27
86
|
}
|
|
28
87
|
if (typeof options.url === 'string' && !options.url.startsWith('https://')) {
|
|
@@ -32,11 +91,15 @@ function validateWebhookUpdateOptions(options) {
|
|
|
32
91
|
(!Array.isArray(options.eventTypes) || options.eventTypes.length === 0)) {
|
|
33
92
|
throw new index_js_1.ValidationError('eventTypes must contain at least one event type', index_js_2.ErrorCodes.VALIDATION_INVALID_FORMAT, { field: 'eventTypes' });
|
|
34
93
|
}
|
|
94
|
+
validateWebhookEventTypes(options.eventTypes);
|
|
95
|
+
validateWebhookUserIds(options.userIds);
|
|
96
|
+
validateStartingSoonMinutes(options.startingSoonMinutes);
|
|
35
97
|
}
|
|
36
98
|
function mapEndpoint(raw) {
|
|
37
99
|
return {
|
|
38
100
|
id: raw.id,
|
|
39
101
|
partnerId: raw.partner_id,
|
|
102
|
+
userIds: raw.user_ids ?? null,
|
|
40
103
|
url: raw.url,
|
|
41
104
|
eventTypes: raw.event_types,
|
|
42
105
|
isActive: raw.is_active,
|
|
@@ -44,6 +107,9 @@ function mapEndpoint(raw) {
|
|
|
44
107
|
consecutiveFailures: raw.consecutive_failures,
|
|
45
108
|
secretPrefix: raw.secret_prefix,
|
|
46
109
|
secretSuffix: raw.secret_suffix,
|
|
110
|
+
startingSoonMinutes: VALID_STARTING_SOON_MINUTES.has(raw.starting_soon_minutes)
|
|
111
|
+
? raw.starting_soon_minutes
|
|
112
|
+
: null,
|
|
47
113
|
createdByUserId: raw.created_by_user_id,
|
|
48
114
|
createdAt: raw.created_at,
|
|
49
115
|
updatedAt: raw.updated_at,
|
|
@@ -68,6 +134,7 @@ function mapDelivery(raw) {
|
|
|
68
134
|
eventType: raw.event_type,
|
|
69
135
|
eventVersion: raw.event_version,
|
|
70
136
|
occurredAt: raw.occurred_at,
|
|
137
|
+
eventUserId: raw.event_user_id ?? null,
|
|
71
138
|
};
|
|
72
139
|
}
|
|
73
140
|
class AdminWebhooksResource {
|
|
@@ -82,6 +149,10 @@ class AdminWebhooksResource {
|
|
|
82
149
|
url: options.url,
|
|
83
150
|
event_types: options.eventTypes,
|
|
84
151
|
is_active: options.isActive,
|
|
152
|
+
...(options.userIds !== undefined ? { user_ids: options.userIds } : {}),
|
|
153
|
+
...(options.startingSoonMinutes !== undefined
|
|
154
|
+
? { starting_soon_minutes: options.startingSoonMinutes }
|
|
155
|
+
: {}),
|
|
85
156
|
});
|
|
86
157
|
return {
|
|
87
158
|
...mapEndpoint(raw),
|
|
@@ -99,7 +170,7 @@ class AdminWebhooksResource {
|
|
|
99
170
|
const raw = await this.http.get(`/v1/webhooks/${id}`);
|
|
100
171
|
return mapEndpoint(raw);
|
|
101
172
|
}
|
|
102
|
-
/**
|
|
173
|
+
/** Applies partial updates to a webhook endpoint's configuration (URL, event types, active status, user scope, or starting-soon threshold). */
|
|
103
174
|
async update(id, options) {
|
|
104
175
|
validateWebhookId(id);
|
|
105
176
|
validateWebhookUpdateOptions(options);
|
|
@@ -113,6 +184,12 @@ class AdminWebhooksResource {
|
|
|
113
184
|
if (options.isActive !== undefined) {
|
|
114
185
|
body['is_active'] = options.isActive;
|
|
115
186
|
}
|
|
187
|
+
if (options.userIds !== undefined) {
|
|
188
|
+
body['user_ids'] = options.userIds;
|
|
189
|
+
}
|
|
190
|
+
if (options.startingSoonMinutes !== undefined) {
|
|
191
|
+
body['starting_soon_minutes'] = options.startingSoonMinutes;
|
|
192
|
+
}
|
|
116
193
|
const raw = await this.http.patch(`/v1/webhooks/${id}`, body);
|
|
117
194
|
return mapEndpoint(raw);
|
|
118
195
|
}
|
package/esm/admin-client.d.ts
CHANGED
|
@@ -68,8 +68,8 @@ export declare class AdminUsersResource {
|
|
|
68
68
|
*
|
|
69
69
|
* const { token, expires_at } = await admin.users.createConnectToken(userId);
|
|
70
70
|
*
|
|
71
|
-
* // Redirect user to
|
|
72
|
-
* const
|
|
71
|
+
* // Redirect user to the connect page with this token
|
|
72
|
+
* const connectUrl = `https://connect.attrove.com/integrations/connect?token=${token}&user_id=${userId}`;
|
|
73
73
|
* ```
|
|
74
74
|
*/
|
|
75
75
|
createConnectToken(userId: string): Promise<CreateTokenResponse>;
|
package/esm/admin-client.js
CHANGED
|
@@ -114,8 +114,8 @@ export class AdminUsersResource {
|
|
|
114
114
|
*
|
|
115
115
|
* const { token, expires_at } = await admin.users.createConnectToken(userId);
|
|
116
116
|
*
|
|
117
|
-
* // Redirect user to
|
|
118
|
-
* const
|
|
117
|
+
* // Redirect user to the connect page with this token
|
|
118
|
+
* const connectUrl = `https://connect.attrove.com/integrations/connect?token=${token}&user_id=${userId}`;
|
|
119
119
|
* ```
|
|
120
120
|
*/
|
|
121
121
|
async createConnectToken(userId) {
|
package/esm/constants.d.ts
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* Automatically synchronized with package.json during the release process.
|
|
11
11
|
* For programmatic access, use `getVersion()` from './version'.
|
|
12
12
|
*/
|
|
13
|
-
export declare const SDK_VERSION = "0.1.
|
|
13
|
+
export declare const SDK_VERSION = "0.1.18";
|
|
14
14
|
/**
|
|
15
15
|
* Default API base URL for Attrove services.
|
|
16
16
|
*/
|
package/esm/constants.js
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* Automatically synchronized with package.json during the release process.
|
|
11
11
|
* For programmatic access, use `getVersion()` from './version'.
|
|
12
12
|
*/
|
|
13
|
-
export const SDK_VERSION = "0.1.
|
|
13
|
+
export const SDK_VERSION = "0.1.18"; // auto-synced from package.json during release
|
|
14
14
|
/**
|
|
15
15
|
* Default API base URL for Attrove services.
|
|
16
16
|
*/
|
|
@@ -1,9 +1,16 @@
|
|
|
1
1
|
import { HttpClient } from '../utils/fetch.js';
|
|
2
2
|
/**
|
|
3
3
|
* Webhook event types available in the Attrove API.
|
|
4
|
-
*
|
|
4
|
+
* Must be kept in sync with WEBHOOK_EVENT_TYPES in @attrove/shared-types.
|
|
5
5
|
*/
|
|
6
|
-
export type AdminWebhookEventType = 'messages.new' | 'sync.completed' | 'integration.status_changed' | 'webhook.test' | 'meetings.new' | 'meetings.summary_ready' | 'events.new';
|
|
6
|
+
export type AdminWebhookEventType = 'messages.new' | 'sync.completed' | 'integration.status_changed' | 'webhook.test' | 'meetings.new' | 'meetings.summary_ready' | 'events.new' | 'events.starting_soon';
|
|
7
|
+
/**
|
|
8
|
+
* Event types that can be subscribed to when creating or updating an endpoint.
|
|
9
|
+
* Kept in sync with WEBHOOK_SUBSCRIBABLE_EVENT_TYPES in @attrove/shared-types.
|
|
10
|
+
*/
|
|
11
|
+
export type AdminWebhookSubscribableEventType = Exclude<AdminWebhookEventType, 'meetings.summary_ready'>;
|
|
12
|
+
/** Valid values for the starting_soon_minutes endpoint configuration. */
|
|
13
|
+
export type AdminStartingSoonMinutes = 5 | 10 | 15 | 30 | 60;
|
|
7
14
|
/**
|
|
8
15
|
* All delivery statuses exposed by the API, including 'unknown' (read-only sentinel for unrecognized DB values).
|
|
9
16
|
*/
|
|
@@ -13,13 +20,15 @@ export type AdminWebhookDeliveryStatusFilterable = Exclude<AdminWebhookDeliveryS
|
|
|
13
20
|
export interface AdminWebhookEndpoint {
|
|
14
21
|
id: string;
|
|
15
22
|
partnerId: string;
|
|
23
|
+
userIds: string[] | null;
|
|
16
24
|
url: string;
|
|
17
|
-
eventTypes:
|
|
25
|
+
eventTypes: AdminWebhookSubscribableEventType[];
|
|
18
26
|
isActive: boolean;
|
|
19
27
|
autoPausedAt: string | null;
|
|
20
28
|
consecutiveFailures: number;
|
|
21
29
|
secretPrefix: string;
|
|
22
30
|
secretSuffix: string;
|
|
31
|
+
startingSoonMinutes: AdminStartingSoonMinutes | null;
|
|
23
32
|
createdByUserId: string | null;
|
|
24
33
|
createdAt: string;
|
|
25
34
|
updatedAt: string;
|
|
@@ -42,9 +51,10 @@ export interface AdminWebhookDelivery {
|
|
|
42
51
|
deliveredAt: string | null;
|
|
43
52
|
createdAt: string;
|
|
44
53
|
updatedAt: string;
|
|
45
|
-
eventType?:
|
|
54
|
+
eventType?: AdminWebhookEventType;
|
|
46
55
|
eventVersion?: number;
|
|
47
56
|
occurredAt?: string;
|
|
57
|
+
eventUserId?: string | null;
|
|
48
58
|
}
|
|
49
59
|
export interface AdminWebhookTestResult {
|
|
50
60
|
endpointId: string;
|
|
@@ -60,13 +70,17 @@ export interface AdminRotateWebhookSecretResult {
|
|
|
60
70
|
}
|
|
61
71
|
export interface CreateWebhookOptions {
|
|
62
72
|
url: string;
|
|
63
|
-
eventTypes:
|
|
73
|
+
eventTypes: AdminWebhookSubscribableEventType[];
|
|
64
74
|
isActive?: boolean;
|
|
75
|
+
userIds?: string[] | null;
|
|
76
|
+
startingSoonMinutes?: AdminStartingSoonMinutes | null;
|
|
65
77
|
}
|
|
66
78
|
export interface UpdateWebhookOptions {
|
|
67
79
|
url?: string;
|
|
68
|
-
eventTypes?:
|
|
80
|
+
eventTypes?: AdminWebhookSubscribableEventType[];
|
|
69
81
|
isActive?: boolean;
|
|
82
|
+
userIds?: string[] | null;
|
|
83
|
+
startingSoonMinutes?: AdminStartingSoonMinutes | null;
|
|
70
84
|
}
|
|
71
85
|
export interface ListWebhookDeliveriesOptions {
|
|
72
86
|
limit?: number;
|
|
@@ -83,7 +97,7 @@ export declare class AdminWebhooksResource {
|
|
|
83
97
|
list(): Promise<AdminWebhookEndpoint[]>;
|
|
84
98
|
/** Retrieves a single webhook endpoint by ID. */
|
|
85
99
|
get(id: string): Promise<AdminWebhookEndpoint>;
|
|
86
|
-
/**
|
|
100
|
+
/** Applies partial updates to a webhook endpoint's configuration (URL, event types, active status, user scope, or starting-soon threshold). */
|
|
87
101
|
update(id: string, options: UpdateWebhookOptions): Promise<AdminWebhookEndpoint>;
|
|
88
102
|
/** Deletes a webhook endpoint and all associated deliveries. */
|
|
89
103
|
delete(id: string): Promise<{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhooks.d.ts","sourceRoot":"","sources":["../../../../../packages/sdk/src/resources/webhooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAI/C;;;GAGG;AACH,MAAM,MAAM,qBAAqB,GAC7B,cAAc,GACd,gBAAgB,GAChB,4BAA4B,GAC5B,cAAc,GACd,cAAc,GACd,wBAAwB,GACxB,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"webhooks.d.ts","sourceRoot":"","sources":["../../../../../packages/sdk/src/resources/webhooks.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,64 @@
|
|
|
1
1
|
import { ValidationError } from '../errors/index.js';
|
|
2
2
|
import { ErrorCodes, isValidUUID } from '../types/index.js';
|
|
3
|
+
const ADMIN_WEBHOOK_SUBSCRIBABLE_EVENT_TYPES = [
|
|
4
|
+
'messages.new',
|
|
5
|
+
'sync.completed',
|
|
6
|
+
'integration.status_changed',
|
|
7
|
+
'webhook.test',
|
|
8
|
+
'meetings.new',
|
|
9
|
+
'events.new',
|
|
10
|
+
'events.starting_soon',
|
|
11
|
+
];
|
|
12
|
+
const _arrayCoversType = true;
|
|
13
|
+
void _arrayCoversType;
|
|
14
|
+
const ADMIN_WEBHOOK_SUBSCRIBABLE_EVENT_TYPE_SET = new Set(ADMIN_WEBHOOK_SUBSCRIBABLE_EVENT_TYPES);
|
|
3
15
|
function validateWebhookId(id, fieldName = 'id') {
|
|
4
16
|
if (!isValidUUID(id)) {
|
|
5
17
|
throw new ValidationError(`${fieldName} must be a valid UUID format`, ErrorCodes.VALIDATION_INVALID_FORMAT, { field: fieldName, expected: 'UUID format' });
|
|
6
18
|
}
|
|
7
19
|
}
|
|
20
|
+
function validateWebhookUserIds(userIds) {
|
|
21
|
+
if (userIds === undefined || userIds === null) {
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
if (!Array.isArray(userIds) || userIds.length === 0) {
|
|
25
|
+
throw new ValidationError('userIds must be a non-empty array of UUIDs or null', ErrorCodes.VALIDATION_INVALID_FORMAT, { field: 'userIds' });
|
|
26
|
+
}
|
|
27
|
+
const invalidUserId = userIds.find((userId) => !isValidUUID(userId));
|
|
28
|
+
if (invalidUserId) {
|
|
29
|
+
throw new ValidationError('userIds must contain only valid UUIDs', ErrorCodes.VALIDATION_INVALID_FORMAT, {
|
|
30
|
+
field: 'userIds',
|
|
31
|
+
value: invalidUserId,
|
|
32
|
+
expected: 'UUID format',
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
function validateWebhookEventTypes(eventTypes, fieldName = 'eventTypes') {
|
|
37
|
+
if (eventTypes === undefined) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
const invalidEventType = eventTypes.find((eventType) => !ADMIN_WEBHOOK_SUBSCRIBABLE_EVENT_TYPE_SET.has(eventType));
|
|
41
|
+
if (invalidEventType) {
|
|
42
|
+
throw new ValidationError(`Unsupported webhook event type: ${invalidEventType}`, ErrorCodes.VALIDATION_INVALID_FORMAT, {
|
|
43
|
+
field: fieldName,
|
|
44
|
+
value: invalidEventType,
|
|
45
|
+
expected: ADMIN_WEBHOOK_SUBSCRIBABLE_EVENT_TYPES.join(', '),
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
const VALID_STARTING_SOON_MINUTES = new Set([5, 10, 15, 30, 60]);
|
|
50
|
+
function validateStartingSoonMinutes(value) {
|
|
51
|
+
if (value === undefined || value === null) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
if (!VALID_STARTING_SOON_MINUTES.has(value)) {
|
|
55
|
+
throw new ValidationError(`startingSoonMinutes must be one of 5, 10, 15, 30, 60 (got ${value})`, ErrorCodes.VALIDATION_OUT_OF_RANGE, {
|
|
56
|
+
field: 'startingSoonMinutes',
|
|
57
|
+
value,
|
|
58
|
+
expected: '5, 10, 15, 30, 60',
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
}
|
|
8
62
|
function validateWebhookCreateOptions(options) {
|
|
9
63
|
if (!options.url || typeof options.url !== 'string') {
|
|
10
64
|
throw new ValidationError('url is required and must be a non-empty string', ErrorCodes.VALIDATION_REQUIRED_FIELD, { field: 'url' });
|
|
@@ -15,11 +69,16 @@ function validateWebhookCreateOptions(options) {
|
|
|
15
69
|
if (!Array.isArray(options.eventTypes) || options.eventTypes.length === 0) {
|
|
16
70
|
throw new ValidationError('eventTypes must contain at least one event type', ErrorCodes.VALIDATION_REQUIRED_FIELD, { field: 'eventTypes' });
|
|
17
71
|
}
|
|
72
|
+
validateWebhookEventTypes(options.eventTypes);
|
|
73
|
+
validateWebhookUserIds(options.userIds);
|
|
74
|
+
validateStartingSoonMinutes(options.startingSoonMinutes);
|
|
18
75
|
}
|
|
19
76
|
function validateWebhookUpdateOptions(options) {
|
|
20
77
|
if (options.url === undefined &&
|
|
21
78
|
options.eventTypes === undefined &&
|
|
22
|
-
options.isActive === undefined
|
|
79
|
+
options.isActive === undefined &&
|
|
80
|
+
options.userIds === undefined &&
|
|
81
|
+
options.startingSoonMinutes === undefined) {
|
|
23
82
|
throw new ValidationError('At least one field must be provided for update', ErrorCodes.VALIDATION_REQUIRED_FIELD, { field: 'options' });
|
|
24
83
|
}
|
|
25
84
|
if (typeof options.url === 'string' && !options.url.startsWith('https://')) {
|
|
@@ -29,11 +88,15 @@ function validateWebhookUpdateOptions(options) {
|
|
|
29
88
|
(!Array.isArray(options.eventTypes) || options.eventTypes.length === 0)) {
|
|
30
89
|
throw new ValidationError('eventTypes must contain at least one event type', ErrorCodes.VALIDATION_INVALID_FORMAT, { field: 'eventTypes' });
|
|
31
90
|
}
|
|
91
|
+
validateWebhookEventTypes(options.eventTypes);
|
|
92
|
+
validateWebhookUserIds(options.userIds);
|
|
93
|
+
validateStartingSoonMinutes(options.startingSoonMinutes);
|
|
32
94
|
}
|
|
33
95
|
function mapEndpoint(raw) {
|
|
34
96
|
return {
|
|
35
97
|
id: raw.id,
|
|
36
98
|
partnerId: raw.partner_id,
|
|
99
|
+
userIds: raw.user_ids ?? null,
|
|
37
100
|
url: raw.url,
|
|
38
101
|
eventTypes: raw.event_types,
|
|
39
102
|
isActive: raw.is_active,
|
|
@@ -41,6 +104,9 @@ function mapEndpoint(raw) {
|
|
|
41
104
|
consecutiveFailures: raw.consecutive_failures,
|
|
42
105
|
secretPrefix: raw.secret_prefix,
|
|
43
106
|
secretSuffix: raw.secret_suffix,
|
|
107
|
+
startingSoonMinutes: VALID_STARTING_SOON_MINUTES.has(raw.starting_soon_minutes)
|
|
108
|
+
? raw.starting_soon_minutes
|
|
109
|
+
: null,
|
|
44
110
|
createdByUserId: raw.created_by_user_id,
|
|
45
111
|
createdAt: raw.created_at,
|
|
46
112
|
updatedAt: raw.updated_at,
|
|
@@ -65,6 +131,7 @@ function mapDelivery(raw) {
|
|
|
65
131
|
eventType: raw.event_type,
|
|
66
132
|
eventVersion: raw.event_version,
|
|
67
133
|
occurredAt: raw.occurred_at,
|
|
134
|
+
eventUserId: raw.event_user_id ?? null,
|
|
68
135
|
};
|
|
69
136
|
}
|
|
70
137
|
export class AdminWebhooksResource {
|
|
@@ -79,6 +146,10 @@ export class AdminWebhooksResource {
|
|
|
79
146
|
url: options.url,
|
|
80
147
|
event_types: options.eventTypes,
|
|
81
148
|
is_active: options.isActive,
|
|
149
|
+
...(options.userIds !== undefined ? { user_ids: options.userIds } : {}),
|
|
150
|
+
...(options.startingSoonMinutes !== undefined
|
|
151
|
+
? { starting_soon_minutes: options.startingSoonMinutes }
|
|
152
|
+
: {}),
|
|
82
153
|
});
|
|
83
154
|
return {
|
|
84
155
|
...mapEndpoint(raw),
|
|
@@ -96,7 +167,7 @@ export class AdminWebhooksResource {
|
|
|
96
167
|
const raw = await this.http.get(`/v1/webhooks/${id}`);
|
|
97
168
|
return mapEndpoint(raw);
|
|
98
169
|
}
|
|
99
|
-
/**
|
|
170
|
+
/** Applies partial updates to a webhook endpoint's configuration (URL, event types, active status, user scope, or starting-soon threshold). */
|
|
100
171
|
async update(id, options) {
|
|
101
172
|
validateWebhookId(id);
|
|
102
173
|
validateWebhookUpdateOptions(options);
|
|
@@ -110,6 +181,12 @@ export class AdminWebhooksResource {
|
|
|
110
181
|
if (options.isActive !== undefined) {
|
|
111
182
|
body['is_active'] = options.isActive;
|
|
112
183
|
}
|
|
184
|
+
if (options.userIds !== undefined) {
|
|
185
|
+
body['user_ids'] = options.userIds;
|
|
186
|
+
}
|
|
187
|
+
if (options.startingSoonMinutes !== undefined) {
|
|
188
|
+
body['starting_soon_minutes'] = options.startingSoonMinutes;
|
|
189
|
+
}
|
|
113
190
|
const raw = await this.http.patch(`/v1/webhooks/${id}`, body);
|
|
114
191
|
return mapEndpoint(raw);
|
|
115
192
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhooks.js","sourceRoot":"","sources":["../../../../../packages/sdk/src/resources/webhooks.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"webhooks.js","sourceRoot":"","sources":["../../../../../packages/sdk/src/resources/webhooks.ts"],"names":[],"mappings":"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"}
|