diff --git a/generate-routes.ts b/generate-routes.ts index 1c9c788a..5b22e339 100644 --- a/generate-routes.ts +++ b/generate-routes.ts @@ -45,6 +45,7 @@ const routePaths = [ '/acs/entrances', '/acs/systems', '/acs/users', + '/acs/users/unmanaged', '/action_attempts', '/client_sessions', '/connect_webviews', @@ -81,6 +82,7 @@ const routePathSubresources: Partial< 'systems', 'users', ], + '/acs/users': ['unmanaged'], '/phones': ['simulate'], '/devices': ['unmanaged', 'simulate'], '/noise_sensors': ['noise_thresholds', 'simulate'], diff --git a/package-lock.json b/package-lock.json index 31e199be..8953bd11 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,7 +16,7 @@ }, "devDependencies": { "@seamapi/fake-seam-connect": "^1.71.0", - "@seamapi/types": "1.227.0", + "@seamapi/types": "1.232.0", "@types/eslint": "^8.44.2", "@types/node": "^20.8.10", "ava": "^5.0.1", @@ -47,7 +47,7 @@ "npm": ">= 9.0.0" }, "peerDependencies": { - "@seamapi/types": "^1.227.0" + "@seamapi/types": "^1.232.0" }, "peerDependenciesMeta": { "@seamapi/types": { @@ -1049,10 +1049,11 @@ } }, "node_modules/@seamapi/types": { - "version": "1.227.0", - "resolved": "https://registry.npmjs.org/@seamapi/types/-/types-1.227.0.tgz", - "integrity": "sha512-LjeBNke3FHivFUinmdtL44NvFono+AASSVykaIkTqcD2KemRSP+nTVYPJCo6Fmd77j8j14jRDY9IJH6iCwu5vg==", + "version": "1.232.0", + "resolved": "https://registry.npmjs.org/@seamapi/types/-/types-1.232.0.tgz", + "integrity": "sha512-FePvHwInawBLdAwotkIr5KiT3wIwjwNEGsvubeWxN3pIxh64JtzFfaN36jtryn80FU23ZVwkXDkQ8HBGPETGrQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=18.12.0", "npm": ">= 9.0.0" diff --git a/package.json b/package.json index f641a492..6f69cf53 100644 --- a/package.json +++ b/package.json @@ -84,7 +84,7 @@ "npm": ">= 9.0.0" }, "peerDependencies": { - "@seamapi/types": "^1.227.0" + "@seamapi/types": "^1.232.0" }, "peerDependenciesMeta": { "@seamapi/types": { @@ -99,7 +99,7 @@ }, "devDependencies": { "@seamapi/fake-seam-connect": "^1.71.0", - "@seamapi/types": "1.227.0", + "@seamapi/types": "1.232.0", "@types/eslint": "^8.44.2", "@types/node": "^20.8.10", "ava": "^5.0.1", diff --git a/src/lib/seam/connect/routes/acs-users-unmanaged.ts b/src/lib/seam/connect/routes/acs-users-unmanaged.ts new file mode 100644 index 00000000..cd396121 --- /dev/null +++ b/src/lib/seam/connect/routes/acs-users-unmanaged.ts @@ -0,0 +1,196 @@ +/* + * Automatically generated by generate-routes.ts. + * Do not edit this file or add other files to this directory. + */ + +import type { RouteRequestBody, RouteResponse } from '@seamapi/types/connect' + +import { + getAuthHeadersForClientSessionToken, + warnOnInsecureuserIdentifierKey, +} from 'lib/seam/connect/auth.js' +import { type Client, createClient } from 'lib/seam/connect/client.js' +import { + isSeamHttpOptionsWithApiKey, + isSeamHttpOptionsWithClient, + isSeamHttpOptionsWithClientSessionToken, + isSeamHttpOptionsWithConsoleSessionToken, + isSeamHttpOptionsWithPersonalAccessToken, + type SeamHttpFromPublishableKeyOptions, + SeamHttpInvalidOptionsError, + type SeamHttpOptions, + type SeamHttpOptionsWithApiKey, + type SeamHttpOptionsWithClient, + type SeamHttpOptionsWithClientSessionToken, + type SeamHttpOptionsWithConsoleSessionToken, + type SeamHttpOptionsWithPersonalAccessToken, + type SeamHttpRequestOptions, +} from 'lib/seam/connect/options.js' +import { + limitToSeamHttpRequestOptions, + parseOptions, +} from 'lib/seam/connect/parse-options.js' +import { SeamHttpRequest } from 'lib/seam/connect/seam-http-request.js' +import type { SetNonNullable } from 'lib/types.js' + +import { SeamHttpClientSessions } from './client-sessions.js' + +export class SeamHttpAcsUsersUnmanaged { + client: Client + readonly defaults: Required + + constructor(apiKeyOrOptions: string | SeamHttpOptions = {}) { + const options = parseOptions(apiKeyOrOptions) + this.client = 'client' in options ? options.client : createClient(options) + this.defaults = limitToSeamHttpRequestOptions(options) + } + + static fromClient( + client: SeamHttpOptionsWithClient['client'], + options: Omit = {}, + ): SeamHttpAcsUsersUnmanaged { + const constructorOptions = { ...options, client } + if (!isSeamHttpOptionsWithClient(constructorOptions)) { + throw new SeamHttpInvalidOptionsError('Missing client') + } + return new SeamHttpAcsUsersUnmanaged(constructorOptions) + } + + static fromApiKey( + apiKey: SeamHttpOptionsWithApiKey['apiKey'], + options: Omit = {}, + ): SeamHttpAcsUsersUnmanaged { + const constructorOptions = { ...options, apiKey } + if (!isSeamHttpOptionsWithApiKey(constructorOptions)) { + throw new SeamHttpInvalidOptionsError('Missing apiKey') + } + return new SeamHttpAcsUsersUnmanaged(constructorOptions) + } + + static fromClientSessionToken( + clientSessionToken: SeamHttpOptionsWithClientSessionToken['clientSessionToken'], + options: Omit< + SeamHttpOptionsWithClientSessionToken, + 'clientSessionToken' + > = {}, + ): SeamHttpAcsUsersUnmanaged { + const constructorOptions = { ...options, clientSessionToken } + if (!isSeamHttpOptionsWithClientSessionToken(constructorOptions)) { + throw new SeamHttpInvalidOptionsError('Missing clientSessionToken') + } + return new SeamHttpAcsUsersUnmanaged(constructorOptions) + } + + static async fromPublishableKey( + publishableKey: string, + userIdentifierKey: string, + options: SeamHttpFromPublishableKeyOptions = {}, + ): Promise { + warnOnInsecureuserIdentifierKey(userIdentifierKey) + const clientOptions = parseOptions({ ...options, publishableKey }) + if (isSeamHttpOptionsWithClient(clientOptions)) { + throw new SeamHttpInvalidOptionsError( + 'The client option cannot be used with SeamHttp.fromPublishableKey', + ) + } + const client = createClient(clientOptions) + const clientSessions = SeamHttpClientSessions.fromClient(client) + const { token } = await clientSessions.getOrCreate({ + user_identifier_key: userIdentifierKey, + }) + return SeamHttpAcsUsersUnmanaged.fromClientSessionToken(token, options) + } + + static fromConsoleSessionToken( + consoleSessionToken: SeamHttpOptionsWithConsoleSessionToken['consoleSessionToken'], + workspaceId: SeamHttpOptionsWithConsoleSessionToken['workspaceId'], + options: Omit< + SeamHttpOptionsWithConsoleSessionToken, + 'consoleSessionToken' | 'workspaceId' + > = {}, + ): SeamHttpAcsUsersUnmanaged { + const constructorOptions = { ...options, consoleSessionToken, workspaceId } + if (!isSeamHttpOptionsWithConsoleSessionToken(constructorOptions)) { + throw new SeamHttpInvalidOptionsError( + 'Missing consoleSessionToken or workspaceId', + ) + } + return new SeamHttpAcsUsersUnmanaged(constructorOptions) + } + + static fromPersonalAccessToken( + personalAccessToken: SeamHttpOptionsWithPersonalAccessToken['personalAccessToken'], + workspaceId: SeamHttpOptionsWithPersonalAccessToken['workspaceId'], + options: Omit< + SeamHttpOptionsWithPersonalAccessToken, + 'personalAccessToken' | 'workspaceId' + > = {}, + ): SeamHttpAcsUsersUnmanaged { + const constructorOptions = { ...options, personalAccessToken, workspaceId } + if (!isSeamHttpOptionsWithPersonalAccessToken(constructorOptions)) { + throw new SeamHttpInvalidOptionsError( + 'Missing personalAccessToken or workspaceId', + ) + } + return new SeamHttpAcsUsersUnmanaged(constructorOptions) + } + + async updateClientSessionToken( + clientSessionToken: SeamHttpOptionsWithClientSessionToken['clientSessionToken'], + ): Promise { + const { headers } = this.client.defaults + const authHeaders = getAuthHeadersForClientSessionToken({ + clientSessionToken, + }) + for (const key of Object.keys(authHeaders)) { + if (headers[key] == null) { + throw new Error( + 'Cannot update a clientSessionToken on a client created without a clientSessionToken', + ) + } + } + this.client.defaults.headers = { ...headers, ...authHeaders } + const clientSessions = SeamHttpClientSessions.fromClient(this.client) + await clientSessions.get() + } + + get( + body?: AcsUsersUnmanagedGetParams, + ): SeamHttpRequest { + return new SeamHttpRequest(this, { + path: '/acs/users/unmanaged/get', + method: 'post', + body, + responseKey: 'acs_user', + }) + } + + list( + body?: AcsUsersUnmanagedListParams, + ): SeamHttpRequest { + return new SeamHttpRequest(this, { + path: '/acs/users/unmanaged/list', + method: 'post', + body, + responseKey: 'acs_users', + }) + } +} + +export type AcsUsersUnmanagedGetParams = + RouteRequestBody<'/acs/users/unmanaged/get'> + +export type AcsUsersUnmanagedGetResponse = SetNonNullable< + Required> +> + +export type AcsUsersUnmanagedGetOptions = never + +export type AcsUsersUnmanagedListParams = + RouteRequestBody<'/acs/users/unmanaged/list'> + +export type AcsUsersUnmanagedListResponse = SetNonNullable< + Required> +> + +export type AcsUsersUnmanagedListOptions = never diff --git a/src/lib/seam/connect/routes/acs-users.ts b/src/lib/seam/connect/routes/acs-users.ts index 8371cbea..b09257ef 100644 --- a/src/lib/seam/connect/routes/acs-users.ts +++ b/src/lib/seam/connect/routes/acs-users.ts @@ -33,6 +33,7 @@ import { import { SeamHttpRequest } from 'lib/seam/connect/seam-http-request.js' import type { SetNonNullable } from 'lib/types.js' +import { SeamHttpAcsUsersUnmanaged } from './acs-users-unmanaged.js' import { SeamHttpClientSessions } from './client-sessions.js' export class SeamHttpAcsUsers { @@ -154,6 +155,10 @@ export class SeamHttpAcsUsers { await clientSessions.get() } + get unmanaged(): SeamHttpAcsUsersUnmanaged { + return SeamHttpAcsUsersUnmanaged.fromClient(this.client, this.defaults) + } + addToAccessGroup( body?: AcsUsersAddToAccessGroupBody, ): SeamHttpRequest { diff --git a/src/lib/seam/connect/routes/index.ts b/src/lib/seam/connect/routes/index.ts index 5e545c39..a1eb540b 100644 --- a/src/lib/seam/connect/routes/index.ts +++ b/src/lib/seam/connect/routes/index.ts @@ -9,6 +9,7 @@ export * from './acs-credentials.js' export * from './acs-entrances.js' export * from './acs-systems.js' export * from './acs-users.js' +export * from './acs-users-unmanaged.js' export * from './action-attempts.js' export * from './client-sessions.js' export * from './connect-webviews.js'