diff --git a/generate-routes.ts b/generate-routes.ts index bb9d5b9a..651f842e 100644 --- a/generate-routes.ts +++ b/generate-routes.ts @@ -73,6 +73,9 @@ const routePaths = [ '/unstable_locations', '/unstable_access_grants', '/unstable_access_methods', + '/spaces', + '/access_grants', + '/access_methods', '/unstable_partner', '/unstable_partner/resources', '/unstable_partner/building_blocks', diff --git a/package-lock.json b/package-lock.json index ad3d9068..329b68aa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,7 @@ }, "devDependencies": { "@seamapi/fake-seam-connect": "^1.77.0", - "@seamapi/types": "1.406.9", + "@seamapi/types": "1.410.1", "@swc/core": "^1.11.29", "@types/eslint": "^8.44.2", "@types/jsonwebtoken": "^9.0.6", @@ -49,7 +49,7 @@ "npm": ">=10.1.0" }, "peerDependencies": { - "@seamapi/types": "^1.406.9" + "@seamapi/types": "^1.410.1" }, "peerDependenciesMeta": { "@seamapi/types": { @@ -1157,9 +1157,9 @@ } }, "node_modules/@seamapi/types": { - "version": "1.406.9", - "resolved": "https://registry.npmjs.org/@seamapi/types/-/types-1.406.9.tgz", - "integrity": "sha512-VLdfvKYcB/kc4WkE7HJMyTA7Qc8tybZFP7B6Rub8mv+dEvuyTRbfkIbc8sT0NVN1q3BajW4ZAfIeq56X4hsAPA==", + "version": "1.410.1", + "resolved": "https://registry.npmjs.org/@seamapi/types/-/types-1.410.1.tgz", + "integrity": "sha512-PmPBVbx2B7sRirjJYMx4DMoHWJwZT0cZTkM0NioUa6AfCzcRUi3uT1ZG/efy2SeTTSm1NqMf90mNoQ8EaNrdjQ==", "dev": true, "license": "MIT", "engines": { diff --git a/package.json b/package.json index bebc285e..adcb597f 100644 --- a/package.json +++ b/package.json @@ -84,7 +84,7 @@ "npm": ">=10.1.0" }, "peerDependencies": { - "@seamapi/types": "^1.406.9" + "@seamapi/types": "^1.410.1" }, "peerDependenciesMeta": { "@seamapi/types": { @@ -98,7 +98,7 @@ }, "devDependencies": { "@seamapi/fake-seam-connect": "^1.77.0", - "@seamapi/types": "1.406.9", + "@seamapi/types": "1.410.1", "@swc/core": "^1.11.29", "@types/eslint": "^8.44.2", "@types/jsonwebtoken": "^9.0.6", diff --git a/src/lib/seam/connect/routes/access-grants.ts b/src/lib/seam/connect/routes/access-grants.ts new file mode 100644 index 00000000..b470e039 --- /dev/null +++ b/src/lib/seam/connect/routes/access-grants.ts @@ -0,0 +1,237 @@ +/* + * 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 { SeamPaginator } from 'lib/seam/connect/seam-paginator.js' +import type { SetNonNullable } from 'lib/types.js' + +import { SeamHttpClientSessions } from './client-sessions.js' + +export class SeamHttpAccessGrants { + 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 = {}, + ): SeamHttpAccessGrants { + const constructorOptions = { ...options, client } + if (!isSeamHttpOptionsWithClient(constructorOptions)) { + throw new SeamHttpInvalidOptionsError('Missing client') + } + return new SeamHttpAccessGrants(constructorOptions) + } + + static fromApiKey( + apiKey: SeamHttpOptionsWithApiKey['apiKey'], + options: Omit = {}, + ): SeamHttpAccessGrants { + const constructorOptions = { ...options, apiKey } + if (!isSeamHttpOptionsWithApiKey(constructorOptions)) { + throw new SeamHttpInvalidOptionsError('Missing apiKey') + } + return new SeamHttpAccessGrants(constructorOptions) + } + + static fromClientSessionToken( + clientSessionToken: SeamHttpOptionsWithClientSessionToken['clientSessionToken'], + options: Omit< + SeamHttpOptionsWithClientSessionToken, + 'clientSessionToken' + > = {}, + ): SeamHttpAccessGrants { + const constructorOptions = { ...options, clientSessionToken } + if (!isSeamHttpOptionsWithClientSessionToken(constructorOptions)) { + throw new SeamHttpInvalidOptionsError('Missing clientSessionToken') + } + return new SeamHttpAccessGrants(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 SeamHttpAccessGrants.fromClientSessionToken(token, options) + } + + static fromConsoleSessionToken( + consoleSessionToken: SeamHttpOptionsWithConsoleSessionToken['consoleSessionToken'], + workspaceId: SeamHttpOptionsWithConsoleSessionToken['workspaceId'], + options: Omit< + SeamHttpOptionsWithConsoleSessionToken, + 'consoleSessionToken' | 'workspaceId' + > = {}, + ): SeamHttpAccessGrants { + const constructorOptions = { ...options, consoleSessionToken, workspaceId } + if (!isSeamHttpOptionsWithConsoleSessionToken(constructorOptions)) { + throw new SeamHttpInvalidOptionsError( + 'Missing consoleSessionToken or workspaceId', + ) + } + return new SeamHttpAccessGrants(constructorOptions) + } + + static fromPersonalAccessToken( + personalAccessToken: SeamHttpOptionsWithPersonalAccessToken['personalAccessToken'], + workspaceId: SeamHttpOptionsWithPersonalAccessToken['workspaceId'], + options: Omit< + SeamHttpOptionsWithPersonalAccessToken, + 'personalAccessToken' | 'workspaceId' + > = {}, + ): SeamHttpAccessGrants { + const constructorOptions = { ...options, personalAccessToken, workspaceId } + if (!isSeamHttpOptionsWithPersonalAccessToken(constructorOptions)) { + throw new SeamHttpInvalidOptionsError( + 'Missing personalAccessToken or workspaceId', + ) + } + return new SeamHttpAccessGrants(constructorOptions) + } + + createPaginator( + request: SeamHttpRequest, + ): SeamPaginator { + return new SeamPaginator(this, request) + } + + 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() + } + + create( + body?: AccessGrantsCreateBody, + ): SeamHttpRequest { + return new SeamHttpRequest(this, { + pathname: '/access_grants/create', + method: 'post', + body, + responseKey: 'access_grant', + }) + } + + delete(body?: AccessGrantsDeleteParams): SeamHttpRequest { + return new SeamHttpRequest(this, { + pathname: '/access_grants/delete', + method: 'post', + body, + responseKey: undefined, + }) + } + + get( + body?: AccessGrantsGetParams, + ): SeamHttpRequest { + return new SeamHttpRequest(this, { + pathname: '/access_grants/get', + method: 'post', + body, + responseKey: 'access_grant', + }) + } + + list( + body?: AccessGrantsListParams, + ): SeamHttpRequest { + return new SeamHttpRequest(this, { + pathname: '/access_grants/list', + method: 'post', + body, + responseKey: 'access_grants', + }) + } +} + +export type AccessGrantsCreateBody = RouteRequestBody<'/access_grants/create'> + +export type AccessGrantsCreateResponse = SetNonNullable< + Required> +> + +export type AccessGrantsCreateOptions = never + +export type AccessGrantsDeleteParams = RouteRequestBody<'/access_grants/delete'> + +export type AccessGrantsDeleteResponse = SetNonNullable< + Required> +> + +export type AccessGrantsDeleteOptions = never + +export type AccessGrantsGetParams = RouteRequestBody<'/access_grants/get'> + +export type AccessGrantsGetResponse = SetNonNullable< + Required> +> + +export type AccessGrantsGetOptions = never + +export type AccessGrantsListParams = RouteRequestBody<'/access_grants/list'> + +export type AccessGrantsListResponse = SetNonNullable< + Required> +> + +export type AccessGrantsListOptions = never diff --git a/src/lib/seam/connect/routes/access-methods.ts b/src/lib/seam/connect/routes/access-methods.ts new file mode 100644 index 00000000..cb0193d3 --- /dev/null +++ b/src/lib/seam/connect/routes/access-methods.ts @@ -0,0 +1,219 @@ +/* + * 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 { SeamPaginator } from 'lib/seam/connect/seam-paginator.js' +import type { SetNonNullable } from 'lib/types.js' + +import { SeamHttpClientSessions } from './client-sessions.js' + +export class SeamHttpAccessMethods { + 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 = {}, + ): SeamHttpAccessMethods { + const constructorOptions = { ...options, client } + if (!isSeamHttpOptionsWithClient(constructorOptions)) { + throw new SeamHttpInvalidOptionsError('Missing client') + } + return new SeamHttpAccessMethods(constructorOptions) + } + + static fromApiKey( + apiKey: SeamHttpOptionsWithApiKey['apiKey'], + options: Omit = {}, + ): SeamHttpAccessMethods { + const constructorOptions = { ...options, apiKey } + if (!isSeamHttpOptionsWithApiKey(constructorOptions)) { + throw new SeamHttpInvalidOptionsError('Missing apiKey') + } + return new SeamHttpAccessMethods(constructorOptions) + } + + static fromClientSessionToken( + clientSessionToken: SeamHttpOptionsWithClientSessionToken['clientSessionToken'], + options: Omit< + SeamHttpOptionsWithClientSessionToken, + 'clientSessionToken' + > = {}, + ): SeamHttpAccessMethods { + const constructorOptions = { ...options, clientSessionToken } + if (!isSeamHttpOptionsWithClientSessionToken(constructorOptions)) { + throw new SeamHttpInvalidOptionsError('Missing clientSessionToken') + } + return new SeamHttpAccessMethods(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 SeamHttpAccessMethods.fromClientSessionToken(token, options) + } + + static fromConsoleSessionToken( + consoleSessionToken: SeamHttpOptionsWithConsoleSessionToken['consoleSessionToken'], + workspaceId: SeamHttpOptionsWithConsoleSessionToken['workspaceId'], + options: Omit< + SeamHttpOptionsWithConsoleSessionToken, + 'consoleSessionToken' | 'workspaceId' + > = {}, + ): SeamHttpAccessMethods { + const constructorOptions = { ...options, consoleSessionToken, workspaceId } + if (!isSeamHttpOptionsWithConsoleSessionToken(constructorOptions)) { + throw new SeamHttpInvalidOptionsError( + 'Missing consoleSessionToken or workspaceId', + ) + } + return new SeamHttpAccessMethods(constructorOptions) + } + + static fromPersonalAccessToken( + personalAccessToken: SeamHttpOptionsWithPersonalAccessToken['personalAccessToken'], + workspaceId: SeamHttpOptionsWithPersonalAccessToken['workspaceId'], + options: Omit< + SeamHttpOptionsWithPersonalAccessToken, + 'personalAccessToken' | 'workspaceId' + > = {}, + ): SeamHttpAccessMethods { + const constructorOptions = { ...options, personalAccessToken, workspaceId } + if (!isSeamHttpOptionsWithPersonalAccessToken(constructorOptions)) { + throw new SeamHttpInvalidOptionsError( + 'Missing personalAccessToken or workspaceId', + ) + } + return new SeamHttpAccessMethods(constructorOptions) + } + + createPaginator( + request: SeamHttpRequest, + ): SeamPaginator { + return new SeamPaginator(this, request) + } + + 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() + } + + delete(body?: AccessMethodsDeleteParams): SeamHttpRequest { + return new SeamHttpRequest(this, { + pathname: '/access_methods/delete', + method: 'post', + body, + responseKey: undefined, + }) + } + + get( + body?: AccessMethodsGetParams, + ): SeamHttpRequest { + return new SeamHttpRequest(this, { + pathname: '/access_methods/get', + method: 'post', + body, + responseKey: 'access_method', + }) + } + + list( + body?: AccessMethodsListParams, + ): SeamHttpRequest { + return new SeamHttpRequest(this, { + pathname: '/access_methods/list', + method: 'post', + body, + responseKey: 'access_methods', + }) + } +} + +export type AccessMethodsDeleteParams = + RouteRequestBody<'/access_methods/delete'> + +export type AccessMethodsDeleteResponse = SetNonNullable< + Required> +> + +export type AccessMethodsDeleteOptions = never + +export type AccessMethodsGetParams = RouteRequestBody<'/access_methods/get'> + +export type AccessMethodsGetResponse = SetNonNullable< + Required> +> + +export type AccessMethodsGetOptions = never + +export type AccessMethodsListParams = RouteRequestBody<'/access_methods/list'> + +export type AccessMethodsListResponse = SetNonNullable< + Required> +> + +export type AccessMethodsListOptions = never diff --git a/src/lib/seam/connect/routes/index.ts b/src/lib/seam/connect/routes/index.ts index f1140758..a67c977f 100644 --- a/src/lib/seam/connect/routes/index.ts +++ b/src/lib/seam/connect/routes/index.ts @@ -1,6 +1,8 @@ export * from './access-codes.js' export * from './access-codes-simulate.js' export * from './access-codes-unmanaged.js' +export * from './access-grants.js' +export * from './access-methods.js' export * from './acs.js' export * from './acs-access-groups.js' export * from './acs-credentials.js' @@ -23,6 +25,7 @@ export * from './noise-sensors-noise-thresholds.js' export * from './noise-sensors-simulate.js' export * from './phones.js' export * from './phones-simulate.js' +export * from './spaces.js' export * from './thermostats.js' export * from './thermostats-daily-programs.js' export * from './thermostats-schedules.js' diff --git a/src/lib/seam/connect/routes/spaces.ts b/src/lib/seam/connect/routes/spaces.ts new file mode 100644 index 00000000..b204bfc6 --- /dev/null +++ b/src/lib/seam/connect/routes/spaces.ts @@ -0,0 +1,329 @@ +/* + * 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 { SeamPaginator } from 'lib/seam/connect/seam-paginator.js' +import type { SetNonNullable } from 'lib/types.js' + +import { SeamHttpClientSessions } from './client-sessions.js' + +export class SeamHttpSpaces { + 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 = {}, + ): SeamHttpSpaces { + const constructorOptions = { ...options, client } + if (!isSeamHttpOptionsWithClient(constructorOptions)) { + throw new SeamHttpInvalidOptionsError('Missing client') + } + return new SeamHttpSpaces(constructorOptions) + } + + static fromApiKey( + apiKey: SeamHttpOptionsWithApiKey['apiKey'], + options: Omit = {}, + ): SeamHttpSpaces { + const constructorOptions = { ...options, apiKey } + if (!isSeamHttpOptionsWithApiKey(constructorOptions)) { + throw new SeamHttpInvalidOptionsError('Missing apiKey') + } + return new SeamHttpSpaces(constructorOptions) + } + + static fromClientSessionToken( + clientSessionToken: SeamHttpOptionsWithClientSessionToken['clientSessionToken'], + options: Omit< + SeamHttpOptionsWithClientSessionToken, + 'clientSessionToken' + > = {}, + ): SeamHttpSpaces { + const constructorOptions = { ...options, clientSessionToken } + if (!isSeamHttpOptionsWithClientSessionToken(constructorOptions)) { + throw new SeamHttpInvalidOptionsError('Missing clientSessionToken') + } + return new SeamHttpSpaces(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 SeamHttpSpaces.fromClientSessionToken(token, options) + } + + static fromConsoleSessionToken( + consoleSessionToken: SeamHttpOptionsWithConsoleSessionToken['consoleSessionToken'], + workspaceId: SeamHttpOptionsWithConsoleSessionToken['workspaceId'], + options: Omit< + SeamHttpOptionsWithConsoleSessionToken, + 'consoleSessionToken' | 'workspaceId' + > = {}, + ): SeamHttpSpaces { + const constructorOptions = { ...options, consoleSessionToken, workspaceId } + if (!isSeamHttpOptionsWithConsoleSessionToken(constructorOptions)) { + throw new SeamHttpInvalidOptionsError( + 'Missing consoleSessionToken or workspaceId', + ) + } + return new SeamHttpSpaces(constructorOptions) + } + + static fromPersonalAccessToken( + personalAccessToken: SeamHttpOptionsWithPersonalAccessToken['personalAccessToken'], + workspaceId: SeamHttpOptionsWithPersonalAccessToken['workspaceId'], + options: Omit< + SeamHttpOptionsWithPersonalAccessToken, + 'personalAccessToken' | 'workspaceId' + > = {}, + ): SeamHttpSpaces { + const constructorOptions = { ...options, personalAccessToken, workspaceId } + if (!isSeamHttpOptionsWithPersonalAccessToken(constructorOptions)) { + throw new SeamHttpInvalidOptionsError( + 'Missing personalAccessToken or workspaceId', + ) + } + return new SeamHttpSpaces(constructorOptions) + } + + createPaginator( + request: SeamHttpRequest, + ): SeamPaginator { + return new SeamPaginator(this, request) + } + + 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() + } + + addAcsEntrances( + body?: SpacesAddAcsEntrancesBody, + ): SeamHttpRequest { + return new SeamHttpRequest(this, { + pathname: '/spaces/add_acs_entrances', + method: 'post', + body, + responseKey: undefined, + }) + } + + addDevices(body?: SpacesAddDevicesBody): SeamHttpRequest { + return new SeamHttpRequest(this, { + pathname: '/spaces/add_devices', + method: 'post', + body, + responseKey: undefined, + }) + } + + create( + body?: SpacesCreateBody, + ): SeamHttpRequest { + return new SeamHttpRequest(this, { + pathname: '/spaces/create', + method: 'post', + body, + responseKey: 'space', + }) + } + + delete(body?: SpacesDeleteParams): SeamHttpRequest { + return new SeamHttpRequest(this, { + pathname: '/spaces/delete', + method: 'post', + body, + responseKey: undefined, + }) + } + + get(body?: SpacesGetParams): SeamHttpRequest { + return new SeamHttpRequest(this, { + pathname: '/spaces/get', + method: 'post', + body, + responseKey: 'space', + }) + } + + list(body?: SpacesListParams): SeamHttpRequest { + return new SeamHttpRequest(this, { + pathname: '/spaces/list', + method: 'post', + body, + responseKey: 'spaces', + }) + } + + removeAcsEntrances( + body?: SpacesRemoveAcsEntrancesParams, + ): SeamHttpRequest { + return new SeamHttpRequest(this, { + pathname: '/spaces/remove_acs_entrances', + method: 'post', + body, + responseKey: undefined, + }) + } + + removeDevices( + body?: SpacesRemoveDevicesParams, + ): SeamHttpRequest { + return new SeamHttpRequest(this, { + pathname: '/spaces/remove_devices', + method: 'post', + body, + responseKey: undefined, + }) + } + + update( + body?: SpacesUpdateBody, + ): SeamHttpRequest { + return new SeamHttpRequest(this, { + pathname: '/spaces/update', + method: 'post', + body, + responseKey: 'space', + }) + } +} + +export type SpacesAddAcsEntrancesBody = + RouteRequestBody<'/spaces/add_acs_entrances'> + +export type SpacesAddAcsEntrancesResponse = SetNonNullable< + Required> +> + +export type SpacesAddAcsEntrancesOptions = never + +export type SpacesAddDevicesBody = RouteRequestBody<'/spaces/add_devices'> + +export type SpacesAddDevicesResponse = SetNonNullable< + Required> +> + +export type SpacesAddDevicesOptions = never + +export type SpacesCreateBody = RouteRequestBody<'/spaces/create'> + +export type SpacesCreateResponse = SetNonNullable< + Required> +> + +export type SpacesCreateOptions = never + +export type SpacesDeleteParams = RouteRequestBody<'/spaces/delete'> + +export type SpacesDeleteResponse = SetNonNullable< + Required> +> + +export type SpacesDeleteOptions = never + +export type SpacesGetParams = RouteRequestBody<'/spaces/get'> + +export type SpacesGetResponse = SetNonNullable< + Required> +> + +export type SpacesGetOptions = never + +export type SpacesListParams = RouteRequestBody<'/spaces/list'> + +export type SpacesListResponse = SetNonNullable< + Required> +> + +export type SpacesListOptions = never + +export type SpacesRemoveAcsEntrancesParams = + RouteRequestBody<'/spaces/remove_acs_entrances'> + +export type SpacesRemoveAcsEntrancesResponse = SetNonNullable< + Required> +> + +export type SpacesRemoveAcsEntrancesOptions = never + +export type SpacesRemoveDevicesParams = + RouteRequestBody<'/spaces/remove_devices'> + +export type SpacesRemoveDevicesResponse = SetNonNullable< + Required> +> + +export type SpacesRemoveDevicesOptions = never + +export type SpacesUpdateBody = RouteRequestBody<'/spaces/update'> + +export type SpacesUpdateResponse = SetNonNullable< + Required> +> + +export type SpacesUpdateOptions = never diff --git a/src/lib/seam/connect/seam-http.ts b/src/lib/seam/connect/seam-http.ts index 450c6ef3..9eae2165 100644 --- a/src/lib/seam/connect/seam-http.ts +++ b/src/lib/seam/connect/seam-http.ts @@ -24,6 +24,8 @@ import { import { limitToSeamHttpRequestOptions, parseOptions } from './parse-options.js' import { SeamHttpAccessCodes, + SeamHttpAccessGrants, + SeamHttpAccessMethods, SeamHttpAcs, SeamHttpActionAttempts, SeamHttpClientSessions, @@ -34,6 +36,7 @@ import { SeamHttpLocks, SeamHttpNoiseSensors, SeamHttpPhones, + SeamHttpSpaces, SeamHttpThermostats, SeamHttpUserIdentities, SeamHttpWebhooks, @@ -173,6 +176,14 @@ export class SeamHttp { return SeamHttpAccessCodes.fromClient(this.client, this.defaults) } + get accessGrants(): SeamHttpAccessGrants { + return SeamHttpAccessGrants.fromClient(this.client, this.defaults) + } + + get accessMethods(): SeamHttpAccessMethods { + return SeamHttpAccessMethods.fromClient(this.client, this.defaults) + } + get acs(): SeamHttpAcs { return SeamHttpAcs.fromClient(this.client, this.defaults) } @@ -213,6 +224,10 @@ export class SeamHttp { return SeamHttpPhones.fromClient(this.client, this.defaults) } + get spaces(): SeamHttpSpaces { + return SeamHttpSpaces.fromClient(this.client, this.defaults) + } + get thermostats(): SeamHttpThermostats { return SeamHttpThermostats.fromClient(this.client, this.defaults) }