silon-sdk 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/LICENSE +21 -0
- package/README.md +560 -0
- package/dist/client.d.ts +141 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +249 -0
- package/dist/client.js.map +1 -0
- package/dist/errors.d.ts +117 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +199 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +51 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +36 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/utils.d.ts +24 -0
- package/dist/internal/utils.d.ts.map +1 -0
- package/dist/internal/utils.js +58 -0
- package/dist/internal/utils.js.map +1 -0
- package/dist/pagination.d.ts +52 -0
- package/dist/pagination.d.ts.map +1 -0
- package/dist/pagination.js +80 -0
- package/dist/pagination.js.map +1 -0
- package/dist/resources/auth.d.ts +20 -0
- package/dist/resources/auth.d.ts.map +1 -0
- package/dist/resources/auth.js +41 -0
- package/dist/resources/auth.js.map +1 -0
- package/dist/resources/broadcasts.d.ts +63 -0
- package/dist/resources/broadcasts.d.ts.map +1 -0
- package/dist/resources/broadcasts.js +103 -0
- package/dist/resources/broadcasts.js.map +1 -0
- package/dist/resources/bulk.d.ts +60 -0
- package/dist/resources/bulk.d.ts.map +1 -0
- package/dist/resources/bulk.js +137 -0
- package/dist/resources/bulk.js.map +1 -0
- package/dist/resources/client-groups.d.ts +50 -0
- package/dist/resources/client-groups.d.ts.map +1 -0
- package/dist/resources/client-groups.js +97 -0
- package/dist/resources/client-groups.js.map +1 -0
- package/dist/resources/clients.d.ts +51 -0
- package/dist/resources/clients.d.ts.map +1 -0
- package/dist/resources/clients.js +99 -0
- package/dist/resources/clients.js.map +1 -0
- package/dist/resources/events.d.ts +22 -0
- package/dist/resources/events.d.ts.map +1 -0
- package/dist/resources/events.js +38 -0
- package/dist/resources/events.js.map +1 -0
- package/dist/resources/messages.d.ts +99 -0
- package/dist/resources/messages.d.ts.map +1 -0
- package/dist/resources/messages.js +167 -0
- package/dist/resources/messages.js.map +1 -0
- package/dist/resources/otp.d.ts +26 -0
- package/dist/resources/otp.d.ts.map +1 -0
- package/dist/resources/otp.js +40 -0
- package/dist/resources/otp.js.map +1 -0
- package/dist/resources/profile.d.ts +18 -0
- package/dist/resources/profile.d.ts.map +1 -0
- package/dist/resources/profile.js +40 -0
- package/dist/resources/profile.js.map +1 -0
- package/dist/resources/push.d.ts +45 -0
- package/dist/resources/push.d.ts.map +1 -0
- package/dist/resources/push.js +103 -0
- package/dist/resources/push.js.map +1 -0
- package/dist/resources/reports.d.ts +44 -0
- package/dist/resources/reports.d.ts.map +1 -0
- package/dist/resources/reports.js +127 -0
- package/dist/resources/reports.js.map +1 -0
- package/dist/resources/suppressions.d.ts +54 -0
- package/dist/resources/suppressions.d.ts.map +1 -0
- package/dist/resources/suppressions.js +79 -0
- package/dist/resources/suppressions.js.map +1 -0
- package/dist/resources/templates.d.ts +58 -0
- package/dist/resources/templates.d.ts.map +1 -0
- package/dist/resources/templates.js +96 -0
- package/dist/resources/templates.js.map +1 -0
- package/dist/resources/webhook-endpoints.d.ts +54 -0
- package/dist/resources/webhook-endpoints.d.ts.map +1 -0
- package/dist/resources/webhook-endpoints.js +96 -0
- package/dist/resources/webhook-endpoints.js.map +1 -0
- package/dist/resources/whatsapp-templates.d.ts +20 -0
- package/dist/resources/whatsapp-templates.d.ts.map +1 -0
- package/dist/resources/whatsapp-templates.js +33 -0
- package/dist/resources/whatsapp-templates.js.map +1 -0
- package/dist/types/auth.d.ts +34 -0
- package/dist/types/auth.d.ts.map +1 -0
- package/dist/types/auth.js +8 -0
- package/dist/types/auth.js.map +1 -0
- package/dist/types/broadcasts.d.ts +174 -0
- package/dist/types/broadcasts.d.ts.map +1 -0
- package/dist/types/broadcasts.js +8 -0
- package/dist/types/broadcasts.js.map +1 -0
- package/dist/types/bulk.d.ts +161 -0
- package/dist/types/bulk.d.ts.map +1 -0
- package/dist/types/bulk.js +8 -0
- package/dist/types/bulk.js.map +1 -0
- package/dist/types/client-groups.d.ts +52 -0
- package/dist/types/client-groups.d.ts.map +1 -0
- package/dist/types/client-groups.js +8 -0
- package/dist/types/client-groups.js.map +1 -0
- package/dist/types/clients.d.ts +64 -0
- package/dist/types/clients.d.ts.map +1 -0
- package/dist/types/clients.js +8 -0
- package/dist/types/clients.js.map +1 -0
- package/dist/types/events.d.ts +64 -0
- package/dist/types/events.d.ts.map +1 -0
- package/dist/types/events.js +9 -0
- package/dist/types/events.js.map +1 -0
- package/dist/types/messages.d.ts +334 -0
- package/dist/types/messages.d.ts.map +1 -0
- package/dist/types/messages.js +8 -0
- package/dist/types/messages.js.map +1 -0
- package/dist/types/otp.d.ts +61 -0
- package/dist/types/otp.d.ts.map +1 -0
- package/dist/types/otp.js +8 -0
- package/dist/types/otp.js.map +1 -0
- package/dist/types/profile.d.ts +37 -0
- package/dist/types/profile.d.ts.map +1 -0
- package/dist/types/profile.js +8 -0
- package/dist/types/profile.js.map +1 -0
- package/dist/types/push.d.ts +90 -0
- package/dist/types/push.d.ts.map +1 -0
- package/dist/types/push.js +8 -0
- package/dist/types/push.js.map +1 -0
- package/dist/types/reports.d.ts +109 -0
- package/dist/types/reports.d.ts.map +1 -0
- package/dist/types/reports.js +8 -0
- package/dist/types/reports.js.map +1 -0
- package/dist/types/suppressions.d.ts +72 -0
- package/dist/types/suppressions.d.ts.map +1 -0
- package/dist/types/suppressions.js +8 -0
- package/dist/types/suppressions.js.map +1 -0
- package/dist/types/templates.d.ts +96 -0
- package/dist/types/templates.d.ts.map +1 -0
- package/dist/types/templates.js +9 -0
- package/dist/types/templates.js.map +1 -0
- package/dist/types/webhook-endpoints.d.ts +123 -0
- package/dist/types/webhook-endpoints.d.ts.map +1 -0
- package/dist/types/webhook-endpoints.js +8 -0
- package/dist/types/webhook-endpoints.js.map +1 -0
- package/dist/types/whatsapp-templates.d.ts +59 -0
- package/dist/types/whatsapp-templates.d.ts.map +1 -0
- package/dist/types/whatsapp-templates.js +8 -0
- package/dist/types/whatsapp-templates.js.map +1 -0
- package/dist/version.d.ts +3 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +3 -0
- package/dist/version.js.map +1 -0
- package/dist/webhooks.d.ts +48 -0
- package/dist/webhooks.d.ts.map +1 -0
- package/dist/webhooks.js +97 -0
- package/dist/webhooks.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/** The Broadcasts resource — create, aggregate status and per-recipient deliveries. */
|
|
2
|
+
import type { Silon } from "../client.js";
|
|
3
|
+
import { Page } from "../pagination.js";
|
|
4
|
+
import type { Broadcast, BroadcastAccepted, BroadcastCreateParams, BroadcastDeliveriesParams, BroadcastDelivery } from "../types/broadcasts.js";
|
|
5
|
+
/** `client.broadcasts` — send one piece of content to an audience and track it. */
|
|
6
|
+
export declare class Broadcasts {
|
|
7
|
+
#private;
|
|
8
|
+
constructor(client: Silon);
|
|
9
|
+
/**
|
|
10
|
+
* Send a broadcast — one piece of content fanned out to an audience — on
|
|
11
|
+
* any channel (`POST /api/v1/broadcasts/`).
|
|
12
|
+
*
|
|
13
|
+
* `audience` selects the recipients: `{type: "client_group", slug}`,
|
|
14
|
+
* `{type: "client_ids", client_ids: [...]}` or `{type: "recipients",
|
|
15
|
+
* recipients: [{phone_number} | {email} | {client_id}, ...]}` (max 1,000
|
|
16
|
+
* rows; a malformed row fails the whole request with a per-index pointer
|
|
17
|
+
* like `audience.recipients[3].phone_number`).
|
|
18
|
+
*
|
|
19
|
+
* Pass `send_at` (an ISO-8601 date-time string with a UTC offset, strictly
|
|
20
|
+
* in the future, at most 90 days ahead — else `422 send-at-invalid`) to
|
|
21
|
+
* schedule the broadcast: the envelope answers `status: "scheduled"`
|
|
22
|
+
* (`target_count` / `skipped_count` may be null when the audience resolves
|
|
23
|
+
* at dispatch time) and the same `id` tracks it through dispatch; cancel
|
|
24
|
+
* while still scheduled via {@link cancel}.
|
|
25
|
+
*
|
|
26
|
+
* An `Idempotency-Key` header is always sent (auto-generated UUIDv4 when
|
|
27
|
+
* `idempotency_key` is not given), which makes automatic retries safe.
|
|
28
|
+
* Channel-specific fields not covered by the typed params can be passed
|
|
29
|
+
* through `extra_body`, which is merged into the JSON body last.
|
|
30
|
+
*/
|
|
31
|
+
create(params: BroadcastCreateParams): Promise<BroadcastAccepted>;
|
|
32
|
+
/**
|
|
33
|
+
* Aggregate delivery counts for a broadcast
|
|
34
|
+
* (`GET /api/v1/broadcasts/{broadcast_id}/`). A broadcast created with
|
|
35
|
+
* `send_at` answers `status: "scheduled"` until dispatch, then the normal
|
|
36
|
+
* lifecycle — the id is stable across it.
|
|
37
|
+
*/
|
|
38
|
+
retrieve(broadcastId: string): Promise<Broadcast>;
|
|
39
|
+
/**
|
|
40
|
+
* Cancel a scheduled broadcast
|
|
41
|
+
* (`POST /api/v1/broadcasts/{broadcast_id}/cancel/`).
|
|
42
|
+
*
|
|
43
|
+
* Allowed only while the broadcast is still `"scheduled"`: resolves with
|
|
44
|
+
* the envelope showing `status: "canceled"`; a canceled broadcast never
|
|
45
|
+
* dispatches and emits a `broadcast.canceled` event. Canceling an
|
|
46
|
+
* already-canceled broadcast is safe and resolves with the same envelope
|
|
47
|
+
* again (cancel is idempotent by nature — no `Idempotency-Key` is sent).
|
|
48
|
+
* Once dispatched (or for an immediate broadcast's id) the server rejects
|
|
49
|
+
* with `409 not-cancellable`; an unknown id rejects with `404`.
|
|
50
|
+
*/
|
|
51
|
+
cancel(broadcastId: string): Promise<BroadcastAccepted>;
|
|
52
|
+
/**
|
|
53
|
+
* Per-recipient delivery rows for a broadcast, cursor-paginated
|
|
54
|
+
* (`GET /api/v1/broadcasts/{broadcast_id}/deliveries/`).
|
|
55
|
+
*
|
|
56
|
+
* ```ts
|
|
57
|
+
* const page = await client.broadcasts.deliveries("br_01J1", { limit: 100 });
|
|
58
|
+
* for await (const delivery of page.autoPaging()) { ... }
|
|
59
|
+
* ```
|
|
60
|
+
*/
|
|
61
|
+
deliveries(broadcastId: string, params?: BroadcastDeliveriesParams): Promise<Page<BroadcastDelivery>>;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=broadcasts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"broadcasts.d.ts","sourceRoot":"","sources":["../../src/resources/broadcasts.ts"],"names":[],"mappings":"AAAA,uFAAuF;AAIvF,OAAO,KAAK,EAAe,KAAK,EAAE,MAAM,cAAc,CAAC;AAEvD,OAAO,EAAE,IAAI,EAAuB,MAAM,kBAAkB,CAAC;AAC7D,OAAO,KAAK,EACV,SAAS,EACT,iBAAiB,EACjB,qBAAqB,EACrB,yBAAyB,EACzB,iBAAiB,EAClB,MAAM,wBAAwB,CAAC;AAIhC,mFAAmF;AACnF,qBAAa,UAAU;;gBAGT,MAAM,EAAE,KAAK;IAIzB;;;;;;;;;;;;;;;;;;;;;OAqBG;IACG,MAAM,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAyBvE;;;;;OAKG;IACG,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAQvD;;;;;;;;;;;OAWG;IACG,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAQ7D;;;;;;;;OAQG;IACG,UAAU,CACd,WAAW,EAAE,MAAM,EACnB,MAAM,GAAE,yBAA8B,GACrC,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;CAQpC"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/** The Broadcasts resource — create, aggregate status and per-recipient deliveries. */
|
|
2
|
+
import { randomUUID } from "node:crypto";
|
|
3
|
+
import { dropNull } from "../internal/utils.js";
|
|
4
|
+
import { Page } from "../pagination.js";
|
|
5
|
+
const BROADCASTS_PATH = "/api/v1/broadcasts/";
|
|
6
|
+
/** `client.broadcasts` — send one piece of content to an audience and track it. */
|
|
7
|
+
export class Broadcasts {
|
|
8
|
+
#client;
|
|
9
|
+
constructor(client) {
|
|
10
|
+
this.#client = client;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Send a broadcast — one piece of content fanned out to an audience — on
|
|
14
|
+
* any channel (`POST /api/v1/broadcasts/`).
|
|
15
|
+
*
|
|
16
|
+
* `audience` selects the recipients: `{type: "client_group", slug}`,
|
|
17
|
+
* `{type: "client_ids", client_ids: [...]}` or `{type: "recipients",
|
|
18
|
+
* recipients: [{phone_number} | {email} | {client_id}, ...]}` (max 1,000
|
|
19
|
+
* rows; a malformed row fails the whole request with a per-index pointer
|
|
20
|
+
* like `audience.recipients[3].phone_number`).
|
|
21
|
+
*
|
|
22
|
+
* Pass `send_at` (an ISO-8601 date-time string with a UTC offset, strictly
|
|
23
|
+
* in the future, at most 90 days ahead — else `422 send-at-invalid`) to
|
|
24
|
+
* schedule the broadcast: the envelope answers `status: "scheduled"`
|
|
25
|
+
* (`target_count` / `skipped_count` may be null when the audience resolves
|
|
26
|
+
* at dispatch time) and the same `id` tracks it through dispatch; cancel
|
|
27
|
+
* while still scheduled via {@link cancel}.
|
|
28
|
+
*
|
|
29
|
+
* An `Idempotency-Key` header is always sent (auto-generated UUIDv4 when
|
|
30
|
+
* `idempotency_key` is not given), which makes automatic retries safe.
|
|
31
|
+
* Channel-specific fields not covered by the typed params can be passed
|
|
32
|
+
* through `extra_body`, which is merged into the JSON body last.
|
|
33
|
+
*/
|
|
34
|
+
async create(params) {
|
|
35
|
+
const { idempotency_key, extra_body, ...fields } = params;
|
|
36
|
+
const body = dropNull({
|
|
37
|
+
channel: fields.channel,
|
|
38
|
+
audience: fields.audience,
|
|
39
|
+
content: fields.content,
|
|
40
|
+
template: fields.template,
|
|
41
|
+
provider: fields.provider,
|
|
42
|
+
sender: fields.sender,
|
|
43
|
+
application: fields.application,
|
|
44
|
+
widget_key: fields.widget_key,
|
|
45
|
+
priority: fields.priority,
|
|
46
|
+
ttl: fields.ttl,
|
|
47
|
+
whatsapp: fields.whatsapp,
|
|
48
|
+
whatsapp_template: fields.whatsapp_template,
|
|
49
|
+
send_at: fields.send_at,
|
|
50
|
+
});
|
|
51
|
+
if (extra_body)
|
|
52
|
+
Object.assign(body, extra_body);
|
|
53
|
+
const data = await this.#client.request("POST", BROADCASTS_PATH, {
|
|
54
|
+
body,
|
|
55
|
+
headers: { "Idempotency-Key": idempotency_key ?? randomUUID() },
|
|
56
|
+
});
|
|
57
|
+
return data;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Aggregate delivery counts for a broadcast
|
|
61
|
+
* (`GET /api/v1/broadcasts/{broadcast_id}/`). A broadcast created with
|
|
62
|
+
* `send_at` answers `status: "scheduled"` until dispatch, then the normal
|
|
63
|
+
* lifecycle — the id is stable across it.
|
|
64
|
+
*/
|
|
65
|
+
async retrieve(broadcastId) {
|
|
66
|
+
const data = await this.#client.request("GET", `${BROADCASTS_PATH}${encodeURIComponent(broadcastId)}/`);
|
|
67
|
+
return data;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Cancel a scheduled broadcast
|
|
71
|
+
* (`POST /api/v1/broadcasts/{broadcast_id}/cancel/`).
|
|
72
|
+
*
|
|
73
|
+
* Allowed only while the broadcast is still `"scheduled"`: resolves with
|
|
74
|
+
* the envelope showing `status: "canceled"`; a canceled broadcast never
|
|
75
|
+
* dispatches and emits a `broadcast.canceled` event. Canceling an
|
|
76
|
+
* already-canceled broadcast is safe and resolves with the same envelope
|
|
77
|
+
* again (cancel is idempotent by nature — no `Idempotency-Key` is sent).
|
|
78
|
+
* Once dispatched (or for an immediate broadcast's id) the server rejects
|
|
79
|
+
* with `409 not-cancellable`; an unknown id rejects with `404`.
|
|
80
|
+
*/
|
|
81
|
+
async cancel(broadcastId) {
|
|
82
|
+
const data = await this.#client.request("POST", `${BROADCASTS_PATH}${encodeURIComponent(broadcastId)}/cancel/`);
|
|
83
|
+
return data;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Per-recipient delivery rows for a broadcast, cursor-paginated
|
|
87
|
+
* (`GET /api/v1/broadcasts/{broadcast_id}/deliveries/`).
|
|
88
|
+
*
|
|
89
|
+
* ```ts
|
|
90
|
+
* const page = await client.broadcasts.deliveries("br_01J1", { limit: 100 });
|
|
91
|
+
* for await (const delivery of page.autoPaging()) { ... }
|
|
92
|
+
* ```
|
|
93
|
+
*/
|
|
94
|
+
async deliveries(broadcastId, params = {}) {
|
|
95
|
+
const path = `${BROADCASTS_PATH}${encodeURIComponent(broadcastId)}/deliveries/`;
|
|
96
|
+
const query = dropNull({ cursor: params.cursor, limit: params.limit });
|
|
97
|
+
const data = (await this.#client.request("GET", path, {
|
|
98
|
+
query,
|
|
99
|
+
}));
|
|
100
|
+
return new Page(this.#client, path, query, data);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=broadcasts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"broadcasts.js","sourceRoot":"","sources":["../../src/resources/broadcasts.ts"],"names":[],"mappings":"AAAA,uFAAuF;AAEvF,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,IAAI,EAAuB,MAAM,kBAAkB,CAAC;AAS7D,MAAM,eAAe,GAAG,qBAAqB,CAAC;AAE9C,mFAAmF;AACnF,MAAM,OAAO,UAAU;IACZ,OAAO,CAAQ;IAExB,YAAY,MAAa;QACvB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;IACxB,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,KAAK,CAAC,MAAM,CAAC,MAA6B;QACxC,MAAM,EAAE,eAAe,EAAE,UAAU,EAAE,GAAG,MAAM,EAAE,GAAG,MAAM,CAAC;QAC1D,MAAM,IAAI,GAAG,QAAQ,CAAC;YACpB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,GAAG,EAAE,MAAM,CAAC,GAAG;YACf,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;YAC3C,OAAO,EAAE,MAAM,CAAC,OAAO;SACxB,CAAC,CAAC;QACH,IAAI,UAAU;YAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QAChD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,eAAe,EAAE;YAC/D,IAAI;YACJ,OAAO,EAAE,EAAE,iBAAiB,EAAE,eAAe,IAAI,UAAU,EAAE,EAAE;SAChE,CAAC,CAAC;QACH,OAAO,IAAyB,CAAC;IACnC,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,QAAQ,CAAC,WAAmB;QAChC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CACrC,KAAK,EACL,GAAG,eAAe,GAAG,kBAAkB,CAAC,WAAW,CAAC,GAAG,CACxD,CAAC;QACF,OAAO,IAAiB,CAAC;IAC3B,CAAC;IAED;;;;;;;;;;;OAWG;IACH,KAAK,CAAC,MAAM,CAAC,WAAmB;QAC9B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CACrC,MAAM,EACN,GAAG,eAAe,GAAG,kBAAkB,CAAC,WAAW,CAAC,UAAU,CAC/D,CAAC;QACF,OAAO,IAAyB,CAAC;IACnC,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,UAAU,CACd,WAAmB,EACnB,SAAoC,EAAE;QAEtC,MAAM,IAAI,GAAG,GAAG,eAAe,GAAG,kBAAkB,CAAC,WAAW,CAAC,cAAc,CAAC;QAChF,MAAM,KAAK,GAAG,QAAQ,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAgB,CAAC;QACtF,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE;YACpD,KAAK;SACN,CAAC,CAAsC,CAAC;QACzC,OAAO,IAAI,IAAI,CAAoB,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IACtE,CAAC;CACF"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/** The Bulk resource — CSV batches, saved files, and per-recipient rows. */
|
|
2
|
+
import type { Silon } from "../client.js";
|
|
3
|
+
import type { BulkBatch, BulkBatchDetail, BulkFileInput, BulkFileList, BulkFileUpload, BulkFileUploadOptions, BulkRecipientDetail, BulkSendParams, BulkSendResult } from "../types/bulk.js";
|
|
4
|
+
/** `client.bulk.files` — CSVs saved for later bulk sends. */
|
|
5
|
+
export declare class BulkFiles {
|
|
6
|
+
#private;
|
|
7
|
+
constructor(client: Silon);
|
|
8
|
+
/** List saved CSVs (`GET /api/v1/bulk/files/` -> `{count, results}`). */
|
|
9
|
+
list(): Promise<BulkFileList>;
|
|
10
|
+
/**
|
|
11
|
+
* Upload a CSV for later bulk sends (`POST /api/v1/bulk/files/`,
|
|
12
|
+
* multipart field `file`, content type `text/csv`).
|
|
13
|
+
*
|
|
14
|
+
* `file` may be raw content (`string`, `Uint8Array`/`Buffer`) or a
|
|
15
|
+
* `{filename, content}` pair; the filename defaults to `recipients.csv`
|
|
16
|
+
* and can be overridden via `options.filename`. The response `name` is
|
|
17
|
+
* the saved filename to pass as `bulk_file` to {@link Bulk.send}.
|
|
18
|
+
*/
|
|
19
|
+
upload(file: BulkFileInput, options?: BulkFileUploadOptions): Promise<BulkFileUpload>;
|
|
20
|
+
}
|
|
21
|
+
/** `client.bulk.recipients` — per-recipient rows of a bulk batch. */
|
|
22
|
+
export declare class BulkRecipients {
|
|
23
|
+
#private;
|
|
24
|
+
constructor(client: Silon);
|
|
25
|
+
/** Fetch one recipient row (`GET /api/v1/bulk/recipient/{id}/`). */
|
|
26
|
+
retrieve(recipientId: number): Promise<BulkRecipientDetail>;
|
|
27
|
+
}
|
|
28
|
+
/** `client.bulk` — bulk (CSV) sends: batches, saved files, recipients. */
|
|
29
|
+
export declare class Bulk {
|
|
30
|
+
#private;
|
|
31
|
+
/** Saved CSV files for bulk sends. */
|
|
32
|
+
readonly files: BulkFiles;
|
|
33
|
+
/** Per-recipient rows of a batch. */
|
|
34
|
+
readonly recipients: BulkRecipients;
|
|
35
|
+
constructor(client: Silon);
|
|
36
|
+
/** List batches (`GET /api/v1/bulk/` — a bare JSON array). */
|
|
37
|
+
list(): Promise<BulkBatch[]>;
|
|
38
|
+
/** Full batch detail incl. recipients (`GET /api/v1/bulk/{id}/`). */
|
|
39
|
+
retrieve(bulkId: number): Promise<BulkBatchDetail>;
|
|
40
|
+
/**
|
|
41
|
+
* Start a bulk batch (`POST /api/v1/bulk/send/`).
|
|
42
|
+
*
|
|
43
|
+
* Supply recipients either inline via `recipients` (each row a
|
|
44
|
+
* column->value map) or by referencing a previously uploaded CSV via
|
|
45
|
+
* `bulk_file` — exactly one of the two, enforced client-side. The
|
|
46
|
+
* WhatsApp template fields (`provider`, `whatsapp_template`,
|
|
47
|
+
* `whatsapp_template_language`, `whatsapp_template_variables`) are sent
|
|
48
|
+
* as query parameters, everything else in the JSON body.
|
|
49
|
+
*
|
|
50
|
+
* @deprecated Prefer `client.messages.sendBatch` — inline rows via
|
|
51
|
+
* `messages`, or an uploaded CSV via `file` (`bulk.files.upload` stays
|
|
52
|
+
* the ingestion path). Calling this emits a one-time
|
|
53
|
+
* `DeprecationWarning`.
|
|
54
|
+
*
|
|
55
|
+
* @throws {SilonError} when neither or both of `recipients` / `bulk_file`
|
|
56
|
+
* are given.
|
|
57
|
+
*/
|
|
58
|
+
send(params: BulkSendParams): Promise<BulkSendResult>;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=bulk.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bulk.d.ts","sourceRoot":"","sources":["../../src/resources/bulk.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAE5E,OAAO,KAAK,EAAe,KAAK,EAAE,MAAM,cAAc,CAAC;AAGvD,OAAO,KAAK,EACV,SAAS,EACT,eAAe,EACf,aAAa,EACb,YAAY,EACZ,cAAc,EACd,qBAAqB,EACrB,mBAAmB,EACnB,cAAc,EACd,cAAc,EACf,MAAM,kBAAkB,CAAC;AAS1B,6DAA6D;AAC7D,qBAAa,SAAS;;gBAGR,MAAM,EAAE,KAAK;IAIzB,yEAAyE;IACnE,IAAI,IAAI,OAAO,CAAC,YAAY,CAAC;IAKnC;;;;;;;;OAQG;IACG,MAAM,CAAC,IAAI,EAAE,aAAa,EAAE,OAAO,GAAE,qBAA0B,GAAG,OAAO,CAAC,cAAc,CAAC;CAmBhG;AAED,qEAAqE;AACrE,qBAAa,cAAc;;gBAGb,MAAM,EAAE,KAAK;IAIzB,oEAAoE;IAC9D,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;CAIlE;AAED,0EAA0E;AAC1E,qBAAa,IAAI;;IAGf,sCAAsC;IACtC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,qCAAqC;IACrC,QAAQ,CAAC,UAAU,EAAE,cAAc,CAAC;gBAExB,MAAM,EAAE,KAAK;IAMzB,8DAA8D;IACxD,IAAI,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAKlC,qEAAqE;IAC/D,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAKxD;;;;;;;;;;;;;;;;;OAiBG;IACG,IAAI,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;CAwC5D"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/** The Bulk resource — CSV batches, saved files, and per-recipient rows. */
|
|
2
|
+
import { SilonError } from "../errors.js";
|
|
3
|
+
import { dropNull, emitDeprecationWarning } from "../internal/utils.js";
|
|
4
|
+
const BULK_PATH = "/api/v1/bulk/";
|
|
5
|
+
const FILES_PATH = "/api/v1/bulk/files/";
|
|
6
|
+
const SEND_PATH = "/api/v1/bulk/send/";
|
|
7
|
+
const RECIPIENT_PATH = "/api/v1/bulk/recipient/";
|
|
8
|
+
const DEFAULT_UPLOAD_FILENAME = "recipients.csv";
|
|
9
|
+
/** `client.bulk.files` — CSVs saved for later bulk sends. */
|
|
10
|
+
export class BulkFiles {
|
|
11
|
+
#client;
|
|
12
|
+
constructor(client) {
|
|
13
|
+
this.#client = client;
|
|
14
|
+
}
|
|
15
|
+
/** List saved CSVs (`GET /api/v1/bulk/files/` -> `{count, results}`). */
|
|
16
|
+
async list() {
|
|
17
|
+
const data = await this.#client.request("GET", FILES_PATH);
|
|
18
|
+
return data;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Upload a CSV for later bulk sends (`POST /api/v1/bulk/files/`,
|
|
22
|
+
* multipart field `file`, content type `text/csv`).
|
|
23
|
+
*
|
|
24
|
+
* `file` may be raw content (`string`, `Uint8Array`/`Buffer`) or a
|
|
25
|
+
* `{filename, content}` pair; the filename defaults to `recipients.csv`
|
|
26
|
+
* and can be overridden via `options.filename`. The response `name` is
|
|
27
|
+
* the saved filename to pass as `bulk_file` to {@link Bulk.send}.
|
|
28
|
+
*/
|
|
29
|
+
async upload(file, options = {}) {
|
|
30
|
+
let content;
|
|
31
|
+
let inputName;
|
|
32
|
+
if (typeof file === "object" && !(file instanceof Uint8Array)) {
|
|
33
|
+
content = file.content;
|
|
34
|
+
inputName = file.filename;
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
content = file;
|
|
38
|
+
}
|
|
39
|
+
const filename = options.filename ?? inputName ?? DEFAULT_UPLOAD_FILENAME;
|
|
40
|
+
// Copy byte input so the Blob part is backed by a plain ArrayBuffer
|
|
41
|
+
// (Uint8Array views over SharedArrayBuffer are not valid BlobParts).
|
|
42
|
+
const part = typeof content === "string" ? content : new Uint8Array(content);
|
|
43
|
+
const formData = new FormData();
|
|
44
|
+
formData.append("file", new Blob([part], { type: "text/csv" }), filename);
|
|
45
|
+
const data = await this.#client.request("POST", FILES_PATH, { formData });
|
|
46
|
+
return data;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/** `client.bulk.recipients` — per-recipient rows of a bulk batch. */
|
|
50
|
+
export class BulkRecipients {
|
|
51
|
+
#client;
|
|
52
|
+
constructor(client) {
|
|
53
|
+
this.#client = client;
|
|
54
|
+
}
|
|
55
|
+
/** Fetch one recipient row (`GET /api/v1/bulk/recipient/{id}/`). */
|
|
56
|
+
async retrieve(recipientId) {
|
|
57
|
+
const data = await this.#client.request("GET", `${RECIPIENT_PATH}${recipientId}/`);
|
|
58
|
+
return data;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/** `client.bulk` — bulk (CSV) sends: batches, saved files, recipients. */
|
|
62
|
+
export class Bulk {
|
|
63
|
+
#client;
|
|
64
|
+
/** Saved CSV files for bulk sends. */
|
|
65
|
+
files;
|
|
66
|
+
/** Per-recipient rows of a batch. */
|
|
67
|
+
recipients;
|
|
68
|
+
constructor(client) {
|
|
69
|
+
this.#client = client;
|
|
70
|
+
this.files = new BulkFiles(client);
|
|
71
|
+
this.recipients = new BulkRecipients(client);
|
|
72
|
+
}
|
|
73
|
+
/** List batches (`GET /api/v1/bulk/` — a bare JSON array). */
|
|
74
|
+
async list() {
|
|
75
|
+
const data = await this.#client.request("GET", BULK_PATH);
|
|
76
|
+
return data;
|
|
77
|
+
}
|
|
78
|
+
/** Full batch detail incl. recipients (`GET /api/v1/bulk/{id}/`). */
|
|
79
|
+
async retrieve(bulkId) {
|
|
80
|
+
const data = await this.#client.request("GET", `${BULK_PATH}${bulkId}/`);
|
|
81
|
+
return data;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Start a bulk batch (`POST /api/v1/bulk/send/`).
|
|
85
|
+
*
|
|
86
|
+
* Supply recipients either inline via `recipients` (each row a
|
|
87
|
+
* column->value map) or by referencing a previously uploaded CSV via
|
|
88
|
+
* `bulk_file` — exactly one of the two, enforced client-side. The
|
|
89
|
+
* WhatsApp template fields (`provider`, `whatsapp_template`,
|
|
90
|
+
* `whatsapp_template_language`, `whatsapp_template_variables`) are sent
|
|
91
|
+
* as query parameters, everything else in the JSON body.
|
|
92
|
+
*
|
|
93
|
+
* @deprecated Prefer `client.messages.sendBatch` — inline rows via
|
|
94
|
+
* `messages`, or an uploaded CSV via `file` (`bulk.files.upload` stays
|
|
95
|
+
* the ingestion path). Calling this emits a one-time
|
|
96
|
+
* `DeprecationWarning`.
|
|
97
|
+
*
|
|
98
|
+
* @throws {SilonError} when neither or both of `recipients` / `bulk_file`
|
|
99
|
+
* are given.
|
|
100
|
+
*/
|
|
101
|
+
async send(params) {
|
|
102
|
+
emitDeprecationWarning("SILON_BULK_SEND", "silon: bulk.send() (POST /api/v1/bulk/send/) is deprecated - prefer " +
|
|
103
|
+
"messages.sendBatch() (POST /api/v1/messages/batch/) with inline 'messages' " +
|
|
104
|
+
"rows or an uploaded CSV via 'file'.");
|
|
105
|
+
if ((params.recipients == null) === (params.bulk_file == null)) {
|
|
106
|
+
throw new SilonError("Provide exactly one of 'recipients' (inline rows) or 'bulk_file' (a saved CSV name).");
|
|
107
|
+
}
|
|
108
|
+
const body = dropNull({
|
|
109
|
+
recipients: params.recipients,
|
|
110
|
+
bulk_file: params.bulk_file,
|
|
111
|
+
channel: params.channel,
|
|
112
|
+
message: params.message,
|
|
113
|
+
template: params.template,
|
|
114
|
+
subject: params.subject,
|
|
115
|
+
sender: params.sender,
|
|
116
|
+
group: params.group,
|
|
117
|
+
application: params.application,
|
|
118
|
+
web_application: params.web_application,
|
|
119
|
+
language: params.language,
|
|
120
|
+
files: params.files,
|
|
121
|
+
name: params.name,
|
|
122
|
+
expire: params.expire,
|
|
123
|
+
remove_duplicates: params.remove_duplicates,
|
|
124
|
+
scheduled_at: params.scheduled_at,
|
|
125
|
+
timezone: params.timezone,
|
|
126
|
+
});
|
|
127
|
+
const query = dropNull({
|
|
128
|
+
provider: params.provider,
|
|
129
|
+
whatsapp_template: params.whatsapp_template,
|
|
130
|
+
whatsapp_template_language: params.whatsapp_template_language,
|
|
131
|
+
whatsapp_template_variables: params.whatsapp_template_variables,
|
|
132
|
+
});
|
|
133
|
+
const data = await this.#client.request("POST", SEND_PATH, { body, query });
|
|
134
|
+
return data;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=bulk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bulk.js","sourceRoot":"","sources":["../../src/resources/bulk.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAG5E,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAaxE,MAAM,SAAS,GAAG,eAAe,CAAC;AAClC,MAAM,UAAU,GAAG,qBAAqB,CAAC;AACzC,MAAM,SAAS,GAAG,oBAAoB,CAAC;AACvC,MAAM,cAAc,GAAG,yBAAyB,CAAC;AAEjD,MAAM,uBAAuB,GAAG,gBAAgB,CAAC;AAEjD,6DAA6D;AAC7D,MAAM,OAAO,SAAS;IACX,OAAO,CAAQ;IAExB,YAAY,MAAa;QACvB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;IACxB,CAAC;IAED,yEAAyE;IACzE,KAAK,CAAC,IAAI;QACR,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QAC3D,OAAO,IAAoB,CAAC;IAC9B,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,MAAM,CAAC,IAAmB,EAAE,UAAiC,EAAE;QACnE,IAAI,OAA4B,CAAC;QACjC,IAAI,SAA6B,CAAC;QAClC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,YAAY,UAAU,CAAC,EAAE,CAAC;YAC9D,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;YACvB,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC5B,CAAC;aAAM,CAAC;YACN,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;QACD,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,SAAS,IAAI,uBAAuB,CAAC;QAC1E,oEAAoE;QACpE,qEAAqE;QACrE,MAAM,IAAI,GACR,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,OAAO,CAAC,CAAC;QAClE,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;QAChC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;QAC1E,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC1E,OAAO,IAAsB,CAAC;IAChC,CAAC;CACF;AAED,qEAAqE;AACrE,MAAM,OAAO,cAAc;IAChB,OAAO,CAAQ;IAExB,YAAY,MAAa;QACvB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;IACxB,CAAC;IAED,oEAAoE;IACpE,KAAK,CAAC,QAAQ,CAAC,WAAmB;QAChC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,cAAc,GAAG,WAAW,GAAG,CAAC,CAAC;QACnF,OAAO,IAA2B,CAAC;IACrC,CAAC;CACF;AAED,0EAA0E;AAC1E,MAAM,OAAO,IAAI;IACN,OAAO,CAAQ;IAExB,sCAAsC;IAC7B,KAAK,CAAY;IAC1B,qCAAqC;IAC5B,UAAU,CAAiB;IAEpC,YAAY,MAAa;QACvB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,KAAK,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,CAAC;QACnC,IAAI,CAAC,UAAU,GAAG,IAAI,cAAc,CAAC,MAAM,CAAC,CAAC;IAC/C,CAAC;IAED,8DAA8D;IAC9D,KAAK,CAAC,IAAI;QACR,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QAC1D,OAAO,IAAmB,CAAC;IAC7B,CAAC;IAED,qEAAqE;IACrE,KAAK,CAAC,QAAQ,CAAC,MAAc;QAC3B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,SAAS,GAAG,MAAM,GAAG,CAAC,CAAC;QACzE,OAAO,IAAuB,CAAC;IACjC,CAAC;IAED;;;;;;;;;;;;;;;;;OAiBG;IACH,KAAK,CAAC,IAAI,CAAC,MAAsB;QAC/B,sBAAsB,CACpB,iBAAiB,EACjB,sEAAsE;YACpE,6EAA6E;YAC7E,qCAAqC,CACxC,CAAC;QACF,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC,EAAE,CAAC;YAC/D,MAAM,IAAI,UAAU,CAClB,sFAAsF,CACvF,CAAC;QACJ,CAAC;QACD,MAAM,IAAI,GAAG,QAAQ,CAAC;YACpB,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,eAAe,EAAE,MAAM,CAAC,eAAe;YACvC,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;YAC3C,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,QAAQ,EAAE,MAAM,CAAC,QAAQ;SAC1B,CAAC,CAAC;QACH,MAAM,KAAK,GAAG,QAAQ,CAAC;YACrB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;YAC3C,0BAA0B,EAAE,MAAM,CAAC,0BAA0B;YAC7D,2BAA2B,EAAE,MAAM,CAAC,2BAA2B;SAChE,CAAgB,CAAC;QAClB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAC5E,OAAO,IAAsB,CAAC;IAChC,CAAC;CACF"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/** The ClientGroups resource — CRM client groups (broadcast audiences). */
|
|
2
|
+
import type { Silon } from "../client.js";
|
|
3
|
+
import { Page } from "../pagination.js";
|
|
4
|
+
import type { ClientGroup, ClientGroupCreateParams, ClientGroupListParams, ClientGroupReplaceParams, ClientGroupUpdateParams } from "../types/client-groups.js";
|
|
5
|
+
/** `client.clientGroups` — group contacts into broadcast audiences. */
|
|
6
|
+
export declare class ClientGroups {
|
|
7
|
+
#private;
|
|
8
|
+
constructor(client: Silon);
|
|
9
|
+
/**
|
|
10
|
+
* List every group as a bare array (`GET /api/v1/crm/group/`).
|
|
11
|
+
*
|
|
12
|
+
* This eagerly returns ALL groups as a plain `ClientGroup[]` from the
|
|
13
|
+
* deprecated singular route (frozen: never cursor-paginated). Its call
|
|
14
|
+
* signature and return type are preserved for back-compat.
|
|
15
|
+
*
|
|
16
|
+
* @deprecated Prefer {@link ClientGroups.listPaginated}, which pages the
|
|
17
|
+
* canonical `GET /api/v1/crm/groups/` route lazily. Calling this emits a
|
|
18
|
+
* one-time `DeprecationWarning`.
|
|
19
|
+
*/
|
|
20
|
+
list(): Promise<ClientGroup[]>;
|
|
21
|
+
/**
|
|
22
|
+
* List groups, cursor-paginated, newest first
|
|
23
|
+
* (`GET /api/v1/crm/groups/` — the canonical C2 route). Returns a
|
|
24
|
+
* {@link Page} you can walk manually or drain with `autoPaging()`.
|
|
25
|
+
*
|
|
26
|
+
* ```ts
|
|
27
|
+
* const page = await client.clientGroups.listPaginated({ limit: 100 });
|
|
28
|
+
* for (const group of page.results) { ... } // this page only
|
|
29
|
+
* for await (const group of page.autoPaging()) { ... } // every page, lazily
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
listPaginated(params?: ClientGroupListParams): Promise<Page<ClientGroup>>;
|
|
33
|
+
/**
|
|
34
|
+
* Create a group (`POST /api/v1/crm/groups/`). Membership is written via
|
|
35
|
+
* the write-only `client_ids` list; the response echoes full `clients`.
|
|
36
|
+
*/
|
|
37
|
+
create(params: ClientGroupCreateParams): Promise<ClientGroup>;
|
|
38
|
+
/** Fetch one group (`GET /api/v1/crm/groups/{id}/`). */
|
|
39
|
+
retrieve(groupId: number): Promise<ClientGroup>;
|
|
40
|
+
/**
|
|
41
|
+
* Partial update (`PATCH /api/v1/crm/groups/{id}/`). When `client_ids` is
|
|
42
|
+
* given it REPLACES the whole membership.
|
|
43
|
+
*/
|
|
44
|
+
update(groupId: number, params?: ClientGroupUpdateParams): Promise<ClientGroup>;
|
|
45
|
+
/** Full replace (`PUT /api/v1/crm/groups/{id}/`). */
|
|
46
|
+
replace(groupId: number, params: ClientGroupReplaceParams): Promise<ClientGroup>;
|
|
47
|
+
/** Delete a group (`DELETE /api/v1/crm/groups/{id}/`, 204). */
|
|
48
|
+
delete(groupId: number): Promise<void>;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=client-groups.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-groups.d.ts","sourceRoot":"","sources":["../../src/resources/client-groups.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAE3E,OAAO,KAAK,EAAe,KAAK,EAAE,MAAM,cAAc,CAAC;AAEvD,OAAO,EAAE,IAAI,EAAuB,MAAM,kBAAkB,CAAC;AAC7D,OAAO,KAAK,EACV,WAAW,EACX,uBAAuB,EACvB,qBAAqB,EACrB,wBAAwB,EACxB,uBAAuB,EACxB,MAAM,2BAA2B,CAAC;AAiBnC,uEAAuE;AACvE,qBAAa,YAAY;;gBAGX,MAAM,EAAE,KAAK;IAIzB;;;;;;;;;;OAUG;IACG,IAAI,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAWpC;;;;;;;;;;OAUG;IACG,aAAa,CAAC,MAAM,GAAE,qBAA0B,GAAG,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAWnF;;;OAGG;IACG,MAAM,CAAC,MAAM,EAAE,uBAAuB,GAAG,OAAO,CAAC,WAAW,CAAC;IAKnE,wDAAwD;IAClD,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAKrD;;;OAGG;IACG,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,GAAE,uBAA4B,GAAG,OAAO,CAAC,WAAW,CAAC;IAOzF,qDAAqD;IAC/C,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,wBAAwB,GAAG,OAAO,CAAC,WAAW,CAAC;IAOtF,+DAA+D;IACzD,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAG7C"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/** The ClientGroups resource — CRM client groups (broadcast audiences). */
|
|
2
|
+
import { dropNull, emitDeprecationWarning } from "../internal/utils.js";
|
|
3
|
+
import { Page } from "../pagination.js";
|
|
4
|
+
// Canonical plural route (C2): cursor-paginated LIST + all single-object CRUD.
|
|
5
|
+
const GROUPS_PATH = "/api/v1/crm/groups/";
|
|
6
|
+
// Deprecated singular route, frozen: its LIST returns a bare JSON array.
|
|
7
|
+
const GROUPS_LEGACY_PATH = "/api/v1/crm/group/";
|
|
8
|
+
/** Build a group body, omitting absent fields (SPEC 7). */
|
|
9
|
+
function groupBody(params) {
|
|
10
|
+
return dropNull({
|
|
11
|
+
name: params.name,
|
|
12
|
+
slug: params.slug,
|
|
13
|
+
client_ids: params.client_ids,
|
|
14
|
+
is_active: params.is_active,
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
/** `client.clientGroups` — group contacts into broadcast audiences. */
|
|
18
|
+
export class ClientGroups {
|
|
19
|
+
#client;
|
|
20
|
+
constructor(client) {
|
|
21
|
+
this.#client = client;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* List every group as a bare array (`GET /api/v1/crm/group/`).
|
|
25
|
+
*
|
|
26
|
+
* This eagerly returns ALL groups as a plain `ClientGroup[]` from the
|
|
27
|
+
* deprecated singular route (frozen: never cursor-paginated). Its call
|
|
28
|
+
* signature and return type are preserved for back-compat.
|
|
29
|
+
*
|
|
30
|
+
* @deprecated Prefer {@link ClientGroups.listPaginated}, which pages the
|
|
31
|
+
* canonical `GET /api/v1/crm/groups/` route lazily. Calling this emits a
|
|
32
|
+
* one-time `DeprecationWarning`.
|
|
33
|
+
*/
|
|
34
|
+
async list() {
|
|
35
|
+
emitDeprecationWarning("SILON_CRM_GROUPS_LIST", "silon: clientGroups.list() (GET /api/v1/crm/group/) returns a bare, " +
|
|
36
|
+
"unpaginated array from the deprecated singular route - prefer " +
|
|
37
|
+
"clientGroups.listPaginated() (GET /api/v1/crm/groups/), which is cursor-paginated.");
|
|
38
|
+
const data = await this.#client.request("GET", GROUPS_LEGACY_PATH);
|
|
39
|
+
return data;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* List groups, cursor-paginated, newest first
|
|
43
|
+
* (`GET /api/v1/crm/groups/` — the canonical C2 route). Returns a
|
|
44
|
+
* {@link Page} you can walk manually or drain with `autoPaging()`.
|
|
45
|
+
*
|
|
46
|
+
* ```ts
|
|
47
|
+
* const page = await client.clientGroups.listPaginated({ limit: 100 });
|
|
48
|
+
* for (const group of page.results) { ... } // this page only
|
|
49
|
+
* for await (const group of page.autoPaging()) { ... } // every page, lazily
|
|
50
|
+
* ```
|
|
51
|
+
*/
|
|
52
|
+
async listPaginated(params = {}) {
|
|
53
|
+
const query = dropNull({
|
|
54
|
+
cursor: params.cursor,
|
|
55
|
+
limit: params.limit,
|
|
56
|
+
});
|
|
57
|
+
const data = (await this.#client.request("GET", GROUPS_PATH, {
|
|
58
|
+
query,
|
|
59
|
+
}));
|
|
60
|
+
return new Page(this.#client, GROUPS_PATH, query, data);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Create a group (`POST /api/v1/crm/groups/`). Membership is written via
|
|
64
|
+
* the write-only `client_ids` list; the response echoes full `clients`.
|
|
65
|
+
*/
|
|
66
|
+
async create(params) {
|
|
67
|
+
const data = await this.#client.request("POST", GROUPS_PATH, { body: groupBody(params) });
|
|
68
|
+
return data;
|
|
69
|
+
}
|
|
70
|
+
/** Fetch one group (`GET /api/v1/crm/groups/{id}/`). */
|
|
71
|
+
async retrieve(groupId) {
|
|
72
|
+
const data = await this.#client.request("GET", `${GROUPS_PATH}${groupId}/`);
|
|
73
|
+
return data;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Partial update (`PATCH /api/v1/crm/groups/{id}/`). When `client_ids` is
|
|
77
|
+
* given it REPLACES the whole membership.
|
|
78
|
+
*/
|
|
79
|
+
async update(groupId, params = {}) {
|
|
80
|
+
const data = await this.#client.request("PATCH", `${GROUPS_PATH}${groupId}/`, {
|
|
81
|
+
body: groupBody(params),
|
|
82
|
+
});
|
|
83
|
+
return data;
|
|
84
|
+
}
|
|
85
|
+
/** Full replace (`PUT /api/v1/crm/groups/{id}/`). */
|
|
86
|
+
async replace(groupId, params) {
|
|
87
|
+
const data = await this.#client.request("PUT", `${GROUPS_PATH}${groupId}/`, {
|
|
88
|
+
body: groupBody(params),
|
|
89
|
+
});
|
|
90
|
+
return data;
|
|
91
|
+
}
|
|
92
|
+
/** Delete a group (`DELETE /api/v1/crm/groups/{id}/`, 204). */
|
|
93
|
+
async delete(groupId) {
|
|
94
|
+
await this.#client.request("DELETE", `${GROUPS_PATH}${groupId}/`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=client-groups.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-groups.js","sourceRoot":"","sources":["../../src/resources/client-groups.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/** The Clients resource — CRM contact profiles. */
|
|
2
|
+
import type { Silon } from "../client.js";
|
|
3
|
+
import { Page } from "../pagination.js";
|
|
4
|
+
import type { ClientCreateParams, ClientListParams, ClientProfile, ClientUpdateParams } from "../types/clients.js";
|
|
5
|
+
/** `client.clients` — manage CRM contact profiles. */
|
|
6
|
+
export declare class Clients {
|
|
7
|
+
#private;
|
|
8
|
+
constructor(client: Silon);
|
|
9
|
+
/**
|
|
10
|
+
* List every contact as a bare array (`GET /api/v1/crm/client/`).
|
|
11
|
+
*
|
|
12
|
+
* This eagerly returns ALL contacts as a plain `ClientProfile[]` from the
|
|
13
|
+
* deprecated singular route (frozen: never cursor-paginated). Its call
|
|
14
|
+
* signature and return type are preserved for back-compat.
|
|
15
|
+
*
|
|
16
|
+
* @deprecated Prefer {@link Clients.listPaginated}, which pages the canonical
|
|
17
|
+
* `GET /api/v1/crm/clients/` route lazily and scales past the singular
|
|
18
|
+
* route's unbounded response. Calling this emits a one-time
|
|
19
|
+
* `DeprecationWarning`.
|
|
20
|
+
*/
|
|
21
|
+
list(): Promise<ClientProfile[]>;
|
|
22
|
+
/**
|
|
23
|
+
* List contacts, cursor-paginated, newest first
|
|
24
|
+
* (`GET /api/v1/crm/clients/` — the canonical C2 route). Returns a
|
|
25
|
+
* {@link Page} you can walk manually or drain with `autoPaging()`.
|
|
26
|
+
*
|
|
27
|
+
* ```ts
|
|
28
|
+
* const page = await client.clients.listPaginated({ limit: 100 });
|
|
29
|
+
* for (const contact of page.results) { ... } // this page only
|
|
30
|
+
* for await (const contact of page.autoPaging()) { ... } // every page, lazily
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
listPaginated(params?: ClientListParams): Promise<Page<ClientProfile>>;
|
|
34
|
+
/** Create a contact (`POST /api/v1/crm/clients/`). */
|
|
35
|
+
create(params: ClientCreateParams): Promise<ClientProfile>;
|
|
36
|
+
/** Fetch one contact (`GET /api/v1/crm/clients/{client_id}/`). */
|
|
37
|
+
retrieve(clientId: string): Promise<ClientProfile>;
|
|
38
|
+
/**
|
|
39
|
+
* Partial update (`PATCH /api/v1/crm/clients/{client_id}/`) — only the
|
|
40
|
+
* given fields change.
|
|
41
|
+
*/
|
|
42
|
+
update(clientId: string, params?: ClientUpdateParams): Promise<ClientProfile>;
|
|
43
|
+
/**
|
|
44
|
+
* Full replace (`PUT /api/v1/crm/clients/{client_id}/`). `client_id` itself
|
|
45
|
+
* is immutable.
|
|
46
|
+
*/
|
|
47
|
+
replace(clientId: string, params?: ClientUpdateParams): Promise<ClientProfile>;
|
|
48
|
+
/** Delete a contact (`DELETE /api/v1/crm/clients/{client_id}/`, 204). */
|
|
49
|
+
delete(clientId: string): Promise<void>;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=clients.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clients.d.ts","sourceRoot":"","sources":["../../src/resources/clients.ts"],"names":[],"mappings":"AAAA,mDAAmD;AAEnD,OAAO,KAAK,EAAe,KAAK,EAAE,MAAM,cAAc,CAAC;AAEvD,OAAO,EAAE,IAAI,EAAuB,MAAM,kBAAkB,CAAC;AAC7D,OAAO,KAAK,EACV,kBAAkB,EAClB,gBAAgB,EAChB,aAAa,EACb,kBAAkB,EACnB,MAAM,qBAAqB,CAAC;AAsB7B,sDAAsD;AACtD,qBAAa,OAAO;;gBAGN,MAAM,EAAE,KAAK;IAIzB;;;;;;;;;;;OAWG;IACG,IAAI,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IAWtC;;;;;;;;;;OAUG;IACG,aAAa,CAAC,MAAM,GAAE,gBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAWhF,sDAAsD;IAChD,MAAM,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,aAAa,CAAC;IAKhE,kEAAkE;IAC5D,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAQxD;;;OAGG;IACG,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAE,kBAAuB,GAAG,OAAO,CAAC,aAAa,CAAC;IASvF;;;OAGG;IACG,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAE,kBAAuB,GAAG,OAAO,CAAC,aAAa,CAAC;IASxF,yEAAyE;IACnE,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAG9C"}
|