@forteplatforms/sdk 1.0.160 → 1.0.164

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/README.md CHANGED
@@ -10,27 +10,48 @@ npm install @forteplatforms/sdk
10
10
 
11
11
  ## Authentication
12
12
 
13
- When your code runs inside a Forte-hosted service, `FORTE_API_TOKEN` is set automatically and scoped to the service's project — no configuration needed:
13
+ The SDK supports three auth modes depending on where it runs.
14
+
15
+ ### Inside a Forte-hosted service (no config)
16
+
17
+ `FORTE_API_TOKEN` is set automatically and scoped to the service's project:
14
18
 
15
19
  ```typescript
16
20
  const client = new ForteClient();
17
21
  ```
18
22
 
19
- Outside of Forte (local development, external hosting), pass the token explicitly:
23
+ ### Client-side (browser / mobile)
24
+
25
+ For calls to `client.users.*`, construct with no arguments. The browser sends the `Forte-User-Session-Token` cookie automatically after the user logs in. The SDK sets `credentials: 'include'` so the cookie reaches the API cross-origin.
20
26
 
21
27
  ```typescript
22
- const client = new ForteClient({ apiToken: 'your_api_token_here' });
28
+ const client = new ForteClient();
29
+ await client.users.renewSessionToken({ projectId });
23
30
  ```
24
31
 
25
- Or set it as an environment variable (Node.js only):
32
+ Do **not** pass `apiToken` from browser code — it's a server-side secret.
26
33
 
27
- ```bash
28
- export FORTE_API_TOKEN=your_api_token_here
34
+ ### Server-side BFF calling `client.users.*` (no token, per-call authorization)
35
+
36
+ In a BFF that proxies user-scoped calls, omit the token and forward each user's session token as the `authorization` parameter on each call:
37
+
38
+ ```typescript
39
+ const client = new ForteClient();
40
+ await client.users.renewSessionToken({
41
+ projectId,
42
+ authorization: `Bearer ${userSessionToken}`,
43
+ });
29
44
  ```
30
45
 
31
- You can generate an API token from the Forte Platforms dashboard.
46
+ ### External server-side calling `client.projects.*` (explicit token)
32
47
 
33
- > **Note:** The TypeScript SDK works in both Node.js and browser/React environments. In browsers, you must pass `apiToken` directly since environment variables are not available.
48
+ ```typescript
49
+ const client = new ForteClient({ apiToken: 'your_api_token_here' });
50
+ ```
51
+
52
+ Or set `FORTE_API_TOKEN` in the environment (Node.js only) and call `new ForteClient()`.
53
+
54
+ You can generate an API token from the Forte Platforms dashboard.
34
55
 
35
56
  ## Quick Start
36
57
 
@@ -272,6 +272,11 @@ export interface ListUserPaymentsRequest {
272
272
  }
273
273
  export interface ListUsersRequest {
274
274
  projectId: string;
275
+ email?: string;
276
+ phone?: string;
277
+ fullName?: string;
278
+ metadataKey?: string;
279
+ metadataValue?: string;
275
280
  minTime?: Date;
276
281
  maxTime?: Date;
277
282
  nextToken?: string;
@@ -1125,6 +1130,7 @@ export declare const ListUserActionLogsActionTypeType: {
1125
1130
  readonly USER_HARD_DELETED: "USER_HARD_DELETED";
1126
1131
  readonly CONTACT_METHOD_ADDED: "CONTACT_METHOD_ADDED";
1127
1132
  readonly CONTACT_METHOD_REMOVED: "CONTACT_METHOD_REMOVED";
1133
+ readonly CONTACT_METHOD_DISPLACED: "CONTACT_METHOD_DISPLACED";
1128
1134
  readonly CONTACT_METHOD_VERIFICATION_CODE_SENT: "CONTACT_METHOD_VERIFICATION_CODE_SENT";
1129
1135
  readonly CONTACT_METHOD_VERIFICATION_CODE_RE_SENT: "CONTACT_METHOD_VERIFICATION_CODE_RE_SENT";
1130
1136
  readonly CONTACT_METHOD_VERIFIED: "CONTACT_METHOD_VERIFIED";
@@ -2818,6 +2818,21 @@ var ProjectsServerApi = /** @class */ (function (_super) {
2818
2818
  throw new runtime.RequiredError('projectId', 'Required parameter "projectId" was null or undefined when calling listUsers().');
2819
2819
  }
2820
2820
  queryParameters = {};
2821
+ if (requestParameters['email'] != null) {
2822
+ queryParameters['email'] = requestParameters['email'];
2823
+ }
2824
+ if (requestParameters['phone'] != null) {
2825
+ queryParameters['phone'] = requestParameters['phone'];
2826
+ }
2827
+ if (requestParameters['fullName'] != null) {
2828
+ queryParameters['fullName'] = requestParameters['fullName'];
2829
+ }
2830
+ if (requestParameters['metadataKey'] != null) {
2831
+ queryParameters['metadataKey'] = requestParameters['metadataKey'];
2832
+ }
2833
+ if (requestParameters['metadataValue'] != null) {
2834
+ queryParameters['metadataValue'] = requestParameters['metadataValue'];
2835
+ }
2821
2836
  if (requestParameters['minTime'] != null) {
2822
2837
  queryParameters['minTime'] = requestParameters['minTime'].toISOString();
2823
2838
  }
@@ -4569,6 +4584,7 @@ exports.ListUserActionLogsActionTypeType = {
4569
4584
  USER_HARD_DELETED: 'USER_HARD_DELETED',
4570
4585
  CONTACT_METHOD_ADDED: 'CONTACT_METHOD_ADDED',
4571
4586
  CONTACT_METHOD_REMOVED: 'CONTACT_METHOD_REMOVED',
4587
+ CONTACT_METHOD_DISPLACED: 'CONTACT_METHOD_DISPLACED',
4572
4588
  CONTACT_METHOD_VERIFICATION_CODE_SENT: 'CONTACT_METHOD_VERIFICATION_CODE_SENT',
4573
4589
  CONTACT_METHOD_VERIFICATION_CODE_RE_SENT: 'CONTACT_METHOD_VERIFICATION_CODE_RE_SENT',
4574
4590
  CONTACT_METHOD_VERIFIED: 'CONTACT_METHOD_VERIFIED',
@@ -9,37 +9,18 @@
9
9
  * https://openapi-generator.tech
10
10
  * Do not edit the class manually.
11
11
  */
12
- import type { UserFilter } from './UserFilter';
13
12
  /**
14
13
  *
15
14
  * @export
16
15
  * @interface SearchUsersRequest
17
16
  */
18
17
  export interface SearchUsersRequest {
19
- /**
20
- *
21
- * @type {Array<UserFilter>}
22
- * @memberof SearchUsersRequest
23
- */
24
- filters?: Array<UserFilter>;
25
- /**
26
- *
27
- * @type {Date}
28
- * @memberof SearchUsersRequest
29
- */
30
- minTime?: Date;
31
- /**
32
- *
33
- * @type {Date}
34
- * @memberof SearchUsersRequest
35
- */
36
- maxTime?: Date;
37
18
  /**
38
19
  *
39
20
  * @type {string}
40
21
  * @memberof SearchUsersRequest
41
22
  */
42
- nextToken?: string;
23
+ q: string;
43
24
  }
44
25
  /**
45
26
  * Check if a given object implements the SearchUsersRequest interface.
@@ -18,11 +18,12 @@ exports.SearchUsersRequestFromJSON = SearchUsersRequestFromJSON;
18
18
  exports.SearchUsersRequestFromJSONTyped = SearchUsersRequestFromJSONTyped;
19
19
  exports.SearchUsersRequestToJSON = SearchUsersRequestToJSON;
20
20
  exports.SearchUsersRequestToJSONTyped = SearchUsersRequestToJSONTyped;
21
- var UserFilter_1 = require("./UserFilter");
22
21
  /**
23
22
  * Check if a given object implements the SearchUsersRequest interface.
24
23
  */
25
24
  function instanceOfSearchUsersRequest(value) {
25
+ if (!('q' in value) || value['q'] === undefined)
26
+ return false;
26
27
  return true;
27
28
  }
28
29
  function SearchUsersRequestFromJSON(json) {
@@ -33,10 +34,7 @@ function SearchUsersRequestFromJSONTyped(json, ignoreDiscriminator) {
33
34
  return json;
34
35
  }
35
36
  return {
36
- 'filters': json['filters'] == null ? undefined : (json['filters'].map(UserFilter_1.UserFilterFromJSON)),
37
- 'minTime': json['minTime'] == null ? undefined : (new Date(json['minTime'])),
38
- 'maxTime': json['maxTime'] == null ? undefined : (new Date(json['maxTime'])),
39
- 'nextToken': json['nextToken'] == null ? undefined : json['nextToken'],
37
+ 'q': json['q'],
40
38
  };
41
39
  }
42
40
  function SearchUsersRequestToJSON(json) {
@@ -48,9 +46,6 @@ function SearchUsersRequestToJSONTyped(value, ignoreDiscriminator) {
48
46
  return value;
49
47
  }
50
48
  return {
51
- 'filters': value['filters'] == null ? undefined : (value['filters'].map(UserFilter_1.UserFilterToJSON)),
52
- 'minTime': value['minTime'] == null ? value['minTime'] : value['minTime'].toISOString(),
53
- 'maxTime': value['maxTime'] == null ? value['maxTime'] : value['maxTime'].toISOString(),
54
- 'nextToken': value['nextToken'],
49
+ 'q': value['q'],
55
50
  };
56
51
  }
@@ -64,6 +64,7 @@ export declare const UserActionLogObjectActionTypeType: {
64
64
  readonly USER_HARD_DELETED: "USER_HARD_DELETED";
65
65
  readonly CONTACT_METHOD_ADDED: "CONTACT_METHOD_ADDED";
66
66
  readonly CONTACT_METHOD_REMOVED: "CONTACT_METHOD_REMOVED";
67
+ readonly CONTACT_METHOD_DISPLACED: "CONTACT_METHOD_DISPLACED";
67
68
  readonly CONTACT_METHOD_VERIFICATION_CODE_SENT: "CONTACT_METHOD_VERIFICATION_CODE_SENT";
68
69
  readonly CONTACT_METHOD_VERIFICATION_CODE_RE_SENT: "CONTACT_METHOD_VERIFICATION_CODE_RE_SENT";
69
70
  readonly CONTACT_METHOD_VERIFIED: "CONTACT_METHOD_VERIFIED";
@@ -29,6 +29,7 @@ exports.UserActionLogObjectActionTypeType = {
29
29
  USER_HARD_DELETED: 'USER_HARD_DELETED',
30
30
  CONTACT_METHOD_ADDED: 'CONTACT_METHOD_ADDED',
31
31
  CONTACT_METHOD_REMOVED: 'CONTACT_METHOD_REMOVED',
32
+ CONTACT_METHOD_DISPLACED: 'CONTACT_METHOD_DISPLACED',
32
33
  CONTACT_METHOD_VERIFICATION_CODE_SENT: 'CONTACT_METHOD_VERIFICATION_CODE_SENT',
33
34
  CONTACT_METHOD_VERIFICATION_CODE_RE_SENT: 'CONTACT_METHOD_VERIFICATION_CODE_RE_SENT',
34
35
  CONTACT_METHOD_VERIFIED: 'CONTACT_METHOD_VERIFIED',
@@ -89,7 +89,6 @@ export * from './UpdateProjectRequest';
89
89
  export * from './UpdateWebAppRequest';
90
90
  export * from './UpdateWebAppResponse';
91
91
  export * from './UserActionLogObject';
92
- export * from './UserFilter';
93
92
  export * from './UserMetricsResponse';
94
93
  export * from './UserObject';
95
94
  export * from './WebAppBuildRequestObject';
@@ -107,7 +107,6 @@ __exportStar(require("./UpdateProjectRequest"), exports);
107
107
  __exportStar(require("./UpdateWebAppRequest"), exports);
108
108
  __exportStar(require("./UpdateWebAppResponse"), exports);
109
109
  __exportStar(require("./UserActionLogObject"), exports);
110
- __exportStar(require("./UserFilter"), exports);
111
110
  __exportStar(require("./UserMetricsResponse"), exports);
112
111
  __exportStar(require("./UserObject"), exports);
113
112
  __exportStar(require("./WebAppBuildRequestObject"), exports);
package/dist/index.js CHANGED
@@ -23,14 +23,20 @@ var ForteClient = /** @class */ (function () {
23
23
  function ForteClient(options) {
24
24
  if (options === void 0) { options = {}; }
25
25
  var _a, _b, _c;
26
- // Falls back to FORTE_API_TOKEN env var in Node.js; safe in browsers where process is undefined
26
+ // Falls back to FORTE_API_TOKEN env var in Node.js; safe in browsers where process is undefined.
27
+ // No token is OK: in browsers the Forte-User-Session-Token cookie authenticates users.*;
28
+ // in BFFs the caller passes `authorization` per-call to users.*.
27
29
  var token = (_a = options.apiToken) !== null && _a !== void 0 ? _a : (typeof process !== 'undefined' ? (_b = process.env) === null || _b === void 0 ? void 0 : _b.FORTE_API_TOKEN : undefined);
28
- if (!token) {
29
- throw new Error('API token is required. Pass apiToken in the constructor options, or set the FORTE_API_TOKEN environment variable (Node.js only).');
30
+ var headers = {};
31
+ if (token) {
32
+ headers.Authorization = "Bearer ".concat(token);
30
33
  }
31
34
  var config = new runtime_1.Configuration({
32
35
  basePath: (_c = options.baseUrl) !== null && _c !== void 0 ? _c : 'https://api.forteplatforms.com',
33
- headers: { Authorization: "Bearer ".concat(token) },
36
+ headers: headers,
37
+ // Always include credentials so browsers send the Forte-User-Session-Token cookie
38
+ // cross-origin. No-op for Node.js fetch.
39
+ credentials: 'include',
34
40
  });
35
41
  this.projects = new ProjectsServerApi_1.ProjectsServerApi(config);
36
42
  this.users = new UsersServerApi_1.UsersServerApi(config);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@forteplatforms/sdk",
3
- "version": "1.0.160",
3
+ "version": "1.0.164",
4
4
  "description": "Official TypeScript SDK for Forte Platforms",
5
5
  "author": "Forte Platforms <support@forteplatforms.com>",
6
6
  "repository": {
@@ -1,50 +0,0 @@
1
- /**
2
- * OpenAPI definition
3
- * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
4
- *
5
- * The version of the OpenAPI document: v0
6
- *
7
- *
8
- * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
9
- * https://openapi-generator.tech
10
- * Do not edit the class manually.
11
- */
12
- /**
13
- *
14
- * @export
15
- * @interface UserFilter
16
- */
17
- export interface UserFilter {
18
- /**
19
- *
20
- * @type {string}
21
- * @memberof UserFilter
22
- */
23
- email?: string;
24
- /**
25
- *
26
- * @type {string}
27
- * @memberof UserFilter
28
- */
29
- phone?: string;
30
- /**
31
- *
32
- * @type {string}
33
- * @memberof UserFilter
34
- */
35
- metadataKey?: string;
36
- /**
37
- *
38
- * @type {string}
39
- * @memberof UserFilter
40
- */
41
- metadataValue?: string;
42
- }
43
- /**
44
- * Check if a given object implements the UserFilter interface.
45
- */
46
- export declare function instanceOfUserFilter(value: object): value is UserFilter;
47
- export declare function UserFilterFromJSON(json: any): UserFilter;
48
- export declare function UserFilterFromJSONTyped(json: any, ignoreDiscriminator: boolean): UserFilter;
49
- export declare function UserFilterToJSON(json: any): UserFilter;
50
- export declare function UserFilterToJSONTyped(value?: UserFilter | null, ignoreDiscriminator?: boolean): any;
@@ -1,55 +0,0 @@
1
- "use strict";
2
- /* tslint:disable */
3
- /* eslint-disable */
4
- /**
5
- * OpenAPI definition
6
- * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
7
- *
8
- * The version of the OpenAPI document: v0
9
- *
10
- *
11
- * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
12
- * https://openapi-generator.tech
13
- * Do not edit the class manually.
14
- */
15
- Object.defineProperty(exports, "__esModule", { value: true });
16
- exports.instanceOfUserFilter = instanceOfUserFilter;
17
- exports.UserFilterFromJSON = UserFilterFromJSON;
18
- exports.UserFilterFromJSONTyped = UserFilterFromJSONTyped;
19
- exports.UserFilterToJSON = UserFilterToJSON;
20
- exports.UserFilterToJSONTyped = UserFilterToJSONTyped;
21
- /**
22
- * Check if a given object implements the UserFilter interface.
23
- */
24
- function instanceOfUserFilter(value) {
25
- return true;
26
- }
27
- function UserFilterFromJSON(json) {
28
- return UserFilterFromJSONTyped(json, false);
29
- }
30
- function UserFilterFromJSONTyped(json, ignoreDiscriminator) {
31
- if (json == null) {
32
- return json;
33
- }
34
- return {
35
- 'email': json['email'] == null ? undefined : json['email'],
36
- 'phone': json['phone'] == null ? undefined : json['phone'],
37
- 'metadataKey': json['metadataKey'] == null ? undefined : json['metadataKey'],
38
- 'metadataValue': json['metadataValue'] == null ? undefined : json['metadataValue'],
39
- };
40
- }
41
- function UserFilterToJSON(json) {
42
- return UserFilterToJSONTyped(json, false);
43
- }
44
- function UserFilterToJSONTyped(value, ignoreDiscriminator) {
45
- if (ignoreDiscriminator === void 0) { ignoreDiscriminator = false; }
46
- if (value == null) {
47
- return value;
48
- }
49
- return {
50
- 'email': value['email'],
51
- 'phone': value['phone'],
52
- 'metadataKey': value['metadataKey'],
53
- 'metadataValue': value['metadataValue'],
54
- };
55
- }