@knocklabs/client 0.9.4 → 0.10.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.
Files changed (35) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/dist/cjs/clients/feed/feed.js +1 -1
  3. package/dist/cjs/clients/feed/feed.js.map +1 -1
  4. package/dist/cjs/clients/messages/index.js +2 -0
  5. package/dist/cjs/clients/messages/index.js.map +1 -0
  6. package/dist/cjs/knock.js +2 -2
  7. package/dist/cjs/knock.js.map +1 -1
  8. package/dist/esm/clients/feed/feed.mjs +5 -9
  9. package/dist/esm/clients/feed/feed.mjs.map +1 -1
  10. package/dist/esm/clients/messages/index.mjs +63 -0
  11. package/dist/esm/clients/messages/index.mjs.map +1 -0
  12. package/dist/esm/knock.mjs +23 -21
  13. package/dist/esm/knock.mjs.map +1 -1
  14. package/dist/types/clients/feed/feed.d.ts +10 -11
  15. package/dist/types/clients/feed/feed.d.ts.map +1 -1
  16. package/dist/types/clients/feed/interfaces.d.ts +1 -4
  17. package/dist/types/clients/feed/interfaces.d.ts.map +1 -1
  18. package/dist/types/clients/messages/index.d.ts +15 -0
  19. package/dist/types/clients/messages/index.d.ts.map +1 -0
  20. package/dist/types/clients/messages/interfaces.d.ts +39 -0
  21. package/dist/types/clients/messages/interfaces.d.ts.map +1 -0
  22. package/dist/types/index.d.ts +3 -0
  23. package/dist/types/index.d.ts.map +1 -1
  24. package/dist/types/interfaces.d.ts +16 -0
  25. package/dist/types/interfaces.d.ts.map +1 -1
  26. package/dist/types/knock.d.ts +2 -0
  27. package/dist/types/knock.d.ts.map +1 -1
  28. package/package.json +1 -1
  29. package/src/clients/feed/feed.ts +19 -23
  30. package/src/clients/feed/interfaces.ts +1 -5
  31. package/src/clients/messages/index.ts +90 -0
  32. package/src/clients/messages/interfaces.ts +53 -0
  33. package/src/index.ts +3 -0
  34. package/src/interfaces.ts +15 -0
  35. package/src/knock.ts +2 -0
@@ -0,0 +1,90 @@
1
+ import { ApiResponse } from "../../api";
2
+ import { BulkOperation } from "../../interfaces";
3
+ import Knock from "../../knock";
4
+
5
+ import {
6
+ BulkUpdateMessagesInChannelProperties,
7
+ Message,
8
+ MessageEngagementStatus,
9
+ } from "./interfaces";
10
+
11
+ class MessageClient {
12
+ private knock: Knock;
13
+
14
+ constructor(knock: Knock) {
15
+ this.knock = knock;
16
+ }
17
+
18
+ async get(messageId: string): Promise<Message> {
19
+ const result = await this.knock.client().makeRequest({
20
+ method: "GET",
21
+ url: `/v1/messages/${messageId}`,
22
+ });
23
+
24
+ return this.handleResponse<Message>(result);
25
+ }
26
+
27
+ async updateStatus(
28
+ messageId: string,
29
+ status: MessageEngagementStatus,
30
+ ): Promise<Message> {
31
+ const result = await this.knock.client().makeRequest({
32
+ method: "PUT",
33
+ url: `/v1/messages/${messageId}/${status}`,
34
+ });
35
+
36
+ return this.handleResponse<Message>(result);
37
+ }
38
+
39
+ async removeStatus(
40
+ messageId: string,
41
+ status: Exclude<MessageEngagementStatus, "interacted">,
42
+ ): Promise<Message> {
43
+ const result = await this.knock.client().makeRequest({
44
+ method: "DELETE",
45
+ url: `/v1/messages/${messageId}/${status}`,
46
+ });
47
+
48
+ return this.handleResponse<Message>(result);
49
+ }
50
+
51
+ async batchUpdateStatuses(
52
+ messageIds: string[],
53
+ status: MessageEngagementStatus | "unseen" | "unread" | "unarchived",
54
+ ): Promise<Message[]> {
55
+ const result = await this.knock.client().makeRequest({
56
+ method: "POST",
57
+ url: `/v1/messages/batch/${status}`,
58
+ data: { message_ids: messageIds },
59
+ });
60
+
61
+ return this.handleResponse<Message[]>(result);
62
+ }
63
+
64
+ async bulkUpdateAllStatusesInChannel({
65
+ channelId,
66
+ status,
67
+ options,
68
+ }: BulkUpdateMessagesInChannelProperties): Promise<BulkOperation> {
69
+ const result = await this.knock.client().makeRequest({
70
+ method: "POST",
71
+ url: `/v1/channels/${channelId}/messages/bulk/${status}`,
72
+ data: options,
73
+ });
74
+
75
+ return this.handleResponse<BulkOperation>(result);
76
+ }
77
+
78
+ private handleResponse<T = any>(response: ApiResponse) {
79
+ if (response.statusCode === "error") {
80
+ if (response.error?.response?.status < 500) {
81
+ return response.error || response.body;
82
+ }
83
+ throw new Error(response.error || response.body);
84
+ }
85
+
86
+ return response.body as T;
87
+ }
88
+ }
89
+
90
+ export default MessageClient;
@@ -0,0 +1,53 @@
1
+ import { RecipientRef } from "../..";
2
+
3
+ export type MessageDeliveryStatus =
4
+ | "queued"
5
+ | "sent"
6
+ | "delivered"
7
+ | "delivery_attempted"
8
+ | "undelivered"
9
+ | "not_sent";
10
+
11
+ export interface NotificationSource {
12
+ key: string;
13
+ version_id: string;
14
+ categories: string[];
15
+ }
16
+
17
+ export type MessageEngagementStatus =
18
+ | "seen"
19
+ | "read"
20
+ | "interacted"
21
+ | "archived";
22
+
23
+ export interface Message<T = any> {
24
+ id: string;
25
+ channel_id: string;
26
+ recipient: RecipientRef;
27
+ actors: RecipientRef[];
28
+ inserted_at: string;
29
+ updated_at: string;
30
+ read_at: string | null;
31
+ seen_at: string | null;
32
+ archived_at: string | null;
33
+ tenant: string | null;
34
+ status: MessageDeliveryStatus;
35
+ engagement_statuses: MessageEngagementStatus[];
36
+ source: NotificationSource;
37
+ data: T | null;
38
+ metadata: {
39
+ external_id?: string;
40
+ };
41
+ }
42
+
43
+ export type BulkUpdateMessagesInChannelProperties = {
44
+ channelId: string;
45
+ status: "seen" | "read" | "archive";
46
+ options: {
47
+ user_ids?: string[];
48
+ engagement_status?: "seen" | "read" | "unseen" | "unread";
49
+ archived?: "exclude" | "include" | "only";
50
+ has_tenant?: boolean;
51
+ tenants?: string[];
52
+ };
53
+ };
package/src/index.ts CHANGED
@@ -10,6 +10,9 @@ export * from "./clients/preferences/interfaces";
10
10
  export * from "./clients/slack";
11
11
  export * from "./clients/slack/interfaces";
12
12
  export * from "./clients/users";
13
+ export * from "./clients/users/interfaces";
14
+ export * from "./clients/messages";
15
+ export * from "./clients/messages/interfaces";
13
16
  export * from "./networkStatus";
14
17
 
15
18
  export default Knock;
package/src/interfaces.ts CHANGED
@@ -27,6 +27,8 @@ export interface User extends GenericData {
27
27
 
28
28
  export type Recipient = User | KnockObject;
29
29
 
30
+ export type RecipientRef = string | { collection: string; id: string };
31
+
30
32
  export interface Activity<T = GenericData> {
31
33
  id: string;
32
34
  inserted_at: string;
@@ -50,3 +52,16 @@ export interface AuthenticateOptions {
50
52
  onUserTokenExpiring?: UserTokenExpiringCallback;
51
53
  timeBeforeExpirationInMs?: number;
52
54
  }
55
+
56
+ export interface BulkOperation {
57
+ id: string;
58
+ name: string;
59
+ status: "queued" | "processing" | "completed" | "failed";
60
+ processed_rows: number;
61
+ estimated_total_rows: number;
62
+ started_at?: string;
63
+ completed_at?: string;
64
+ failed_at?: string;
65
+ inserted_at: string;
66
+ updated_at: string;
67
+ }
package/src/knock.ts CHANGED
@@ -2,6 +2,7 @@ import { jwtDecode } from "jwt-decode";
2
2
 
3
3
  import ApiClient from "./api";
4
4
  import FeedClient from "./clients/feed";
5
+ import MessageClient from "./clients/messages";
5
6
  import ObjectClient from "./clients/objects";
6
7
  import Preferences from "./clients/preferences";
7
8
  import SlackClient from "./clients/slack";
@@ -27,6 +28,7 @@ class Knock {
27
28
  readonly preferences = new Preferences(this);
28
29
  readonly slack = new SlackClient(this);
29
30
  readonly user = new UserClient(this);
31
+ readonly messages = new MessageClient(this);
30
32
 
31
33
  constructor(
32
34
  readonly apiKey: string,