btrz-api-client 9.19.0 → 9.21.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/lib/client.js CHANGED
@@ -501,6 +501,10 @@ function createAccounts({
501
501
  client,
502
502
  internalAuthTokenProvider
503
503
  }),
504
+ auditRecords: require("./endpoints/accounts/audit-records.js")({
505
+ client,
506
+ internalAuthTokenProvider
507
+ }),
504
508
  application: require("./endpoints/accounts/application.js")({
505
509
  client,
506
510
  internalAuthTokenProvider
@@ -0,0 +1,60 @@
1
+ const {
2
+ authorizationHeaders
3
+ } = require("./../endpoints_helpers.js");
4
+
5
+ /**
6
+ * Factory for audit-records API (btrz-api-accounts).
7
+ * @param {Object} deps
8
+ * @param {import("axios").AxiosInstance} deps.client
9
+ * @param {{ getToken: function(): string }} [deps.internalAuthTokenProvider]
10
+ * @returns {{ get: function }}
11
+ */
12
+ function auditRecordsFactory({
13
+ client,
14
+ internalAuthTokenProvider
15
+ }) {
16
+ /**
17
+ * GET /audit-records/:providerId/:folder/:itemId – get audit events for one object.
18
+ * Requires BETTEREZ_APP JWT. No query params.
19
+ * @param {Object} opts
20
+ * @param {string} [opts.token] - API key
21
+ * @param {string} [opts.jwtToken] - JWT or internal auth symbol
22
+ * @param {string} opts.providerId - Account (provider) ID
23
+ * @param {string} opts.folder - Audit folder / entity name
24
+ * @param {string} opts.itemId - Audited object ID
25
+ * @param {Object} [opts.headers] - Optional headers
26
+ * @returns {Promise<import("axios").AxiosResponse<{
27
+ * accountId: string,
28
+ * folder: string,
29
+ * objectId: string,
30
+ * events: Array<{
31
+ * ts: string,
32
+ * userId: string,
33
+ * operation: string,
34
+ * changes: Array<{path: string, from: *, to: *}>
35
+ * }>
36
+ * }>>}
37
+ */
38
+ function get({
39
+ token,
40
+ jwtToken,
41
+ providerId,
42
+ folder,
43
+ itemId,
44
+ headers
45
+ }) {
46
+ return client({
47
+ url: `/audit-records/${providerId}/${folder}/${itemId}`,
48
+ headers: authorizationHeaders({
49
+ token,
50
+ jwtToken,
51
+ internalAuthTokenProvider,
52
+ headers
53
+ })
54
+ });
55
+ }
56
+ return {
57
+ get
58
+ };
59
+ }
60
+ module.exports = auditRecordsFactory;
@@ -28,12 +28,18 @@ const {
28
28
  * @property {boolean} [nextSequenceNumber] - Include next sequence number
29
29
  */
30
30
 
31
+ /**
32
+ * Query params for GET /users/sequences (btrz-api-accounts).
33
+ * @typedef {Object} UsersSequencesBulkQuery
34
+ * @property {string} [userIds] - Comma-separated user ids whose sequences to return
35
+ */
36
+
31
37
  /**
32
38
  * Factory for users API (btrz-api-accounts).
33
39
  * @param {Object} deps
34
40
  * @param {import("axios").AxiosInstance} deps.client
35
41
  * @param {{ getToken: function(): string }} [deps.internalAuthTokenProvider]
36
- * @returns {{ get: function, getV2: function, all: function, create: function, login: function, update: function, delete: function, createOrUpdateMany: function, impersonate: function, startMfa: function, confirmMfa: function, disableMfa: function, sequences: { get: function, all: function, create: function, update: function, transfer: function } }}
42
+ * @returns {{ get: function, getV2: function, all: function, create: function, login: function, update: function, delete: function, createOrUpdateMany: function, impersonate: function, startMfa: function, confirmMfa: function, disableMfa: function, sequences: { get: function, all: function, allByUserIds: function, create: function, update: function, transfer: function } }}
37
43
  */
38
44
  function usersFactory({
39
45
  client,
@@ -526,6 +532,32 @@ function usersFactory({
526
532
  newUserId
527
533
  }
528
534
  });
535
+ },
536
+ /**
537
+ * GET /users/sequences - list sequences for multiple users.
538
+ * @param {Object} opts
539
+ * @param {string} [opts.token] - API key
540
+ * @param {string} [opts.jwtToken] - JWT or internal auth symbol
541
+ * @param {UsersSequencesBulkQuery} [opts.query] - Query params (userIds)
542
+ * @param {Object} [opts.headers] - Optional headers
543
+ * @returns {Promise<import("axios").AxiosResponse>}
544
+ */
545
+ allByUserIds({
546
+ token,
547
+ jwtToken,
548
+ query = {},
549
+ headers
550
+ }) {
551
+ return client({
552
+ url: "/users/sequences",
553
+ params: query,
554
+ headers: authorizationHeaders({
555
+ token,
556
+ jwtToken,
557
+ internalAuthTokenProvider,
558
+ headers
559
+ })
560
+ });
529
561
  }
530
562
  };
531
563
  return {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "btrz-api-client",
3
- "version": "9.19.0",
3
+ "version": "9.21.0",
4
4
  "description": "Api client for Betterez endpoints",
5
5
  "main": "index.js",
6
6
  "scripts": {
package/src/client.js CHANGED
@@ -189,6 +189,7 @@ function createAccounts({baseURL, headers, timeout, overrideFn, internalAuthToke
189
189
  agencies: require("./endpoints/accounts/agencies.js")({client, internalAuthTokenProvider}),
190
190
  agencyTypes: require("./endpoints/accounts/agency-types.js")({client, internalAuthTokenProvider}),
191
191
  authorizedExternalMessaging: require("./endpoints/accounts/authorized-external-messaging.js")({client, internalAuthTokenProvider}),
192
+ auditRecords: require("./endpoints/accounts/audit-records.js")({client, internalAuthTokenProvider}),
192
193
  application: require("./endpoints/accounts/application.js")({client, internalAuthTokenProvider}),
193
194
  applications: require("./endpoints/accounts/applications.js")({client, internalAuthTokenProvider}),
194
195
  applicationSettings: require("./endpoints/accounts/application-settings.js")({client, internalAuthTokenProvider}),
@@ -0,0 +1,45 @@
1
+ const {authorizationHeaders} = require("./../endpoints_helpers.js");
2
+
3
+ /**
4
+ * Factory for audit-records API (btrz-api-accounts).
5
+ * @param {Object} deps
6
+ * @param {import("axios").AxiosInstance} deps.client
7
+ * @param {{ getToken: function(): string }} [deps.internalAuthTokenProvider]
8
+ * @returns {{ get: function }}
9
+ */
10
+ function auditRecordsFactory({client, internalAuthTokenProvider}) {
11
+ /**
12
+ * GET /audit-records/:providerId/:folder/:itemId – get audit events for one object.
13
+ * Requires BETTEREZ_APP JWT. No query params.
14
+ * @param {Object} opts
15
+ * @param {string} [opts.token] - API key
16
+ * @param {string} [opts.jwtToken] - JWT or internal auth symbol
17
+ * @param {string} opts.providerId - Account (provider) ID
18
+ * @param {string} opts.folder - Audit folder / entity name
19
+ * @param {string} opts.itemId - Audited object ID
20
+ * @param {Object} [opts.headers] - Optional headers
21
+ * @returns {Promise<import("axios").AxiosResponse<{
22
+ * accountId: string,
23
+ * folder: string,
24
+ * objectId: string,
25
+ * events: Array<{
26
+ * ts: string,
27
+ * userId: string,
28
+ * operation: string,
29
+ * changes: Array<{path: string, from: *, to: *}>
30
+ * }>
31
+ * }>>}
32
+ */
33
+ function get({token, jwtToken, providerId, folder, itemId, headers}) {
34
+ return client({
35
+ url: `/audit-records/${providerId}/${folder}/${itemId}`,
36
+ headers: authorizationHeaders({token, jwtToken, internalAuthTokenProvider, headers})
37
+ });
38
+ }
39
+
40
+ return {
41
+ get
42
+ };
43
+ }
44
+
45
+ module.exports = auditRecordsFactory;
@@ -26,12 +26,18 @@ const {authorizationHeaders} = require("./../endpoints_helpers.js");
26
26
  * @property {boolean} [nextSequenceNumber] - Include next sequence number
27
27
  */
28
28
 
29
+ /**
30
+ * Query params for GET /users/sequences (btrz-api-accounts).
31
+ * @typedef {Object} UsersSequencesBulkQuery
32
+ * @property {string} [userIds] - Comma-separated user ids whose sequences to return
33
+ */
34
+
29
35
  /**
30
36
  * Factory for users API (btrz-api-accounts).
31
37
  * @param {Object} deps
32
38
  * @param {import("axios").AxiosInstance} deps.client
33
39
  * @param {{ getToken: function(): string }} [deps.internalAuthTokenProvider]
34
- * @returns {{ get: function, getV2: function, all: function, create: function, login: function, update: function, delete: function, createOrUpdateMany: function, impersonate: function, startMfa: function, confirmMfa: function, disableMfa: function, sequences: { get: function, all: function, create: function, update: function, transfer: function } }}
40
+ * @returns {{ get: function, getV2: function, all: function, create: function, login: function, update: function, delete: function, createOrUpdateMany: function, impersonate: function, startMfa: function, confirmMfa: function, disableMfa: function, sequences: { get: function, all: function, allByUserIds: function, create: function, update: function, transfer: function } }}
35
41
  */
36
42
  function usersFactory({client, internalAuthTokenProvider}) {
37
43
  /**
@@ -332,6 +338,22 @@ function usersFactory({client, internalAuthTokenProvider}) {
332
338
  newUserId
333
339
  }
334
340
  });
341
+ },
342
+ /**
343
+ * GET /users/sequences - list sequences for multiple users.
344
+ * @param {Object} opts
345
+ * @param {string} [opts.token] - API key
346
+ * @param {string} [opts.jwtToken] - JWT or internal auth symbol
347
+ * @param {UsersSequencesBulkQuery} [opts.query] - Query params (userIds)
348
+ * @param {Object} [opts.headers] - Optional headers
349
+ * @returns {Promise<import("axios").AxiosResponse>}
350
+ */
351
+ allByUserIds({token, jwtToken, query = {}, headers}) {
352
+ return client({
353
+ url: "/users/sequences",
354
+ params: query,
355
+ headers: authorizationHeaders({token, jwtToken, internalAuthTokenProvider, headers})
356
+ });
335
357
  }
336
358
  };
337
359
 
package/test/all.test.js CHANGED
@@ -5,6 +5,7 @@ require("./endpoints/accounts/accounts.js");
5
5
  require("./endpoints/accounts/agencies.test.js");
6
6
  require("./endpoints/accounts/agency-types.test.js");
7
7
  require("./endpoints/accounts/application-settings.test.js");
8
+ require("./endpoints/accounts/audit-records.test.js");
8
9
  require("./endpoints/accounts/applications.test.js");
9
10
  require("./endpoints/accounts/current-shifts.test.js");
10
11
  require("./endpoints/accounts/customers.js");
@@ -0,0 +1,54 @@
1
+ const assert = require("node:assert/strict");
2
+ const {axiosMock, expectRequest} = require("./../../test-helpers.js");
3
+ const api = require("./../../../src/client.js").createApiClient({baseURL: "http://test.com"});
4
+
5
+ describe("accounts/audit-records", () => {
6
+ const token = "I owe you a token";
7
+ const jwtToken = "secret";
8
+
9
+ afterEach(() => {
10
+ axiosMock.reset();
11
+ });
12
+
13
+ it("should GET audit records by providerId, folder, and itemId", () => {
14
+ const providerId = "507f1f77bcf86cd799439011";
15
+ const folder = "fares";
16
+ const itemId = "64f1aaaaaaaaaaaaaaaaaaaa";
17
+ const auditRecord = {
18
+ accountId: providerId,
19
+ folder,
20
+ objectId: itemId,
21
+ events: [{
22
+ ts: "2026-08-14T08:03:12.123Z",
23
+ userId: "user-1",
24
+ operation: "update",
25
+ changes: [{path: "name", from: "A", to: "B"}]
26
+ }]
27
+ };
28
+
29
+ axiosMock.onGet(`/audit-records/${providerId}/${folder}/${itemId}`)
30
+ .reply((config) => {
31
+ const result = expectRequest({
32
+ statusCode: 200,
33
+ token,
34
+ jwtToken,
35
+ requireJwtTokenOnGet: true
36
+ })(config);
37
+ if (result[0] !== 200) {
38
+ return result;
39
+ }
40
+ return [200, auditRecord];
41
+ });
42
+
43
+ return api.accounts.auditRecords.get({
44
+ token,
45
+ jwtToken,
46
+ providerId,
47
+ folder,
48
+ itemId
49
+ }).then((res) => {
50
+ assert.deepStrictEqual(res.status, 200);
51
+ assert.deepStrictEqual(res.data, auditRecord);
52
+ });
53
+ });
54
+ });
@@ -205,4 +205,28 @@ describe("accounts/user/{id}", () => {
205
205
  newUserId
206
206
  });
207
207
  });
208
+
209
+ it("should GET /users/sequences with query.userIds", () => {
210
+ const query = {userIds: "1234321,9876543"};
211
+ axiosMock.onGet("/users/sequences", {params: query}).reply(
212
+ expectRequest({statusCode: 200, token, jwtToken, query})
213
+ );
214
+ return api.accounts.users.sequences.allByUserIds({
215
+ jwtToken,
216
+ token,
217
+ query
218
+ });
219
+ });
220
+
221
+ it("should GET /users/sequences without inventing extra query params", () => {
222
+ const query = {userIds: "1234321"};
223
+ axiosMock.onGet("/users/sequences").reply(
224
+ expectRequest({statusCode: 200, token, jwtToken, query})
225
+ );
226
+ return api.accounts.users.sequences.allByUserIds({
227
+ jwtToken,
228
+ token,
229
+ query
230
+ });
231
+ });
208
232
  });
@@ -0,0 +1,16 @@
1
+ export = auditRecordsFactory;
2
+ /**
3
+ * Factory for audit-records API (btrz-api-accounts).
4
+ * @param {Object} deps
5
+ * @param {import("axios").AxiosInstance} deps.client
6
+ * @param {{ getToken: function(): string }} [deps.internalAuthTokenProvider]
7
+ * @returns {{ get: function }}
8
+ */
9
+ declare function auditRecordsFactory({ client, internalAuthTokenProvider }: {
10
+ client: import("axios").AxiosInstance;
11
+ internalAuthTokenProvider?: {
12
+ getToken: () => string;
13
+ };
14
+ }): {
15
+ get: Function;
16
+ };
@@ -4,7 +4,7 @@ export = usersFactory;
4
4
  * @param {Object} deps
5
5
  * @param {import("axios").AxiosInstance} deps.client
6
6
  * @param {{ getToken: function(): string }} [deps.internalAuthTokenProvider]
7
- * @returns {{ get: function, getV2: function, all: function, create: function, login: function, update: function, delete: function, createOrUpdateMany: function, impersonate: function, startMfa: function, confirmMfa: function, disableMfa: function, sequences: { get: function, all: function, create: function, update: function, transfer: function } }}
7
+ * @returns {{ get: function, getV2: function, all: function, create: function, login: function, update: function, delete: function, createOrUpdateMany: function, impersonate: function, startMfa: function, confirmMfa: function, disableMfa: function, sequences: { get: function, all: function, allByUserIds: function, create: function, update: function, transfer: function } }}
8
8
  */
9
9
  declare function usersFactory({ client, internalAuthTokenProvider }: {
10
10
  client: import("axios").AxiosInstance;
@@ -27,6 +27,7 @@ declare function usersFactory({ client, internalAuthTokenProvider }: {
27
27
  sequences: {
28
28
  get: Function;
29
29
  all: Function;
30
+ allByUserIds: Function;
30
31
  create: Function;
31
32
  update: Function;
32
33
  transfer: Function;