From 5288c0d36b463ede08bb9133934241f563b15990 Mon Sep 17 00:00:00 2001 From: Aaron Rosen Date: Mon, 27 Jan 2025 16:59:34 -0700 Subject: [PATCH 01/15] add auth.ts --- gusto_embedded/auth.d.ts | 36 +++++++++++ gusto_embedded/auth.d.ts.map | 1 + gusto_embedded/auth.js | 112 +++++++++++++++++++++++++++++++++++ gusto_embedded/src/auth.ts | 104 ++++++++++++++++++++++++++++++++ 4 files changed, 253 insertions(+) create mode 100644 gusto_embedded/auth.d.ts create mode 100644 gusto_embedded/auth.d.ts.map create mode 100644 gusto_embedded/auth.js create mode 100644 gusto_embedded/src/auth.ts diff --git a/gusto_embedded/auth.d.ts b/gusto_embedded/auth.d.ts new file mode 100644 index 00000000..851b3596 --- /dev/null +++ b/gusto_embedded/auth.d.ts @@ -0,0 +1,36 @@ +/** + * A callback function that can be used to obtain an OAuth access token for use + * with SDKs that require OAuth security. A new token is requested from the + * OAuth provider when the current token has expired. + */ +export declare function withAuthorization(clientID: string, clientSecret: string, options?: { + tokenStore?: TokenStore; + url?: string; +}): () => Promise; +/** + * A TokenStore is used to save and retrieve OAuth tokens for use across SDK + * method calls. This interface can be implemented to store tokens in memory, + * a shared cache like Redis or a database table. + */ +export interface TokenStore { + get(): Promise<{ + token: string; + expires: number; + } | undefined>; + set(token: string, expires: number): Promise; +} +/** + * InMemoryTokenStore holds OAuth access tokens in memory for use by SDKs and + * methods that require OAuth security. + */ +export declare class InMemoryTokenStore implements TokenStore { + private token; + private expires; + constructor(); + get(): Promise<{ + token: string; + expires: number; + }>; + set(token: string, expires: number): Promise; +} +//# sourceMappingURL=auth.d.ts.map \ No newline at end of file diff --git a/gusto_embedded/auth.d.ts.map b/gusto_embedded/auth.d.ts.map new file mode 100644 index 00000000..2eee426d --- /dev/null +++ b/gusto_embedded/auth.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["src/auth.ts"],"names":[],"mappings":"AAgBA;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,OAAO,GAAE;IAAE,UAAU,CAAC,EAAE,UAAU,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,SAQtC,OAAO,CAAC,MAAM,CAAC,CAyCjC;AAED;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,GAAG,IAAI,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC,CAAC;IAC/D,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACpD;AAED;;;GAGG;AACH,qBAAa,kBAAmB,YAAW,UAAU;IACnD,OAAO,CAAC,KAAK,CAAM;IACnB,OAAO,CAAC,OAAO,CAAc;;IAIvB,GAAG;;;;IAIH,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAIzC"} \ No newline at end of file diff --git a/gusto_embedded/auth.js b/gusto_embedded/auth.js new file mode 100644 index 00000000..af5d0156 --- /dev/null +++ b/gusto_embedded/auth.js @@ -0,0 +1,112 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +exports.InMemoryTokenStore = void 0; +exports.withAuthorization = withAuthorization; +const z = __importStar(require("zod")); +const config_1 = require("./lib/config"); +// TypeScript SDKs use Zod for runtime data validation. We can use Zod +// to describe the shape of the response from the OAuth token endpoint. If the +// response is valid, Speakeasy can safely access the token and its expiration time. +const tokenResponseSchema = z.object({ + access_token: z.string(), + expires_in: z.number().positive(), +}); +// This is a rough value that adjusts when we consider an access token to be +// expired. It accounts for clock drift between the client and server +// and slow or unreliable networks. +const tolerance = 5 * 60 * 1000; +/** + * A callback function that can be used to obtain an OAuth access token for use + * with SDKs that require OAuth security. A new token is requested from the + * OAuth provider when the current token has expired. + */ +function withAuthorization(clientID, clientSecret, options = {}) { + const { tokenStore = new InMemoryTokenStore(), + // Replace this with your default OAuth provider's access token endpoint. + url = "https://api.gusto-demo.com/oauth/token", } = options; + return async () => { + const session = await tokenStore.get(); + // Return the current token if it has not expired yet. + if (session && session.expires > Date.now()) { + return session.token; + } + try { + const response = await fetch(url, { + method: "POST", + headers: { + "content-type": "application/x-www-form-urlencoded", + // Include the SDK's user agent in the request so requests can be + // tracked using observability infrastructure. + "user-agent": config_1.SDK_METADATA.userAgent, + }, + body: new URLSearchParams({ + client_id: clientID, + client_secret: clientSecret, + grant_type: "system_access", + }), + }); + if (!response.ok) { + throw new Error("Unexpected status code: " + response.status); + } + const json = await response.json(); + const data = tokenResponseSchema.parse(json); + await tokenStore.set(data.access_token, Date.now() + data.expires_in * 1000 - tolerance); + return data.access_token; + } + catch (error) { + throw new Error("Failed to obtain OAuth token: " + error); + } + }; +} +/** + * InMemoryTokenStore holds OAuth access tokens in memory for use by SDKs and + * methods that require OAuth security. + */ +class InMemoryTokenStore { + constructor() { + this.token = ""; + this.expires = Date.now(); + } + async get() { + return { token: this.token, expires: this.expires }; + } + async set(token, expires) { + this.token = token; + this.expires = expires; + } +} +exports.InMemoryTokenStore = InMemoryTokenStore; +//# sourceMappingURL=auth.js.map \ No newline at end of file diff --git a/gusto_embedded/src/auth.ts b/gusto_embedded/src/auth.ts new file mode 100644 index 00000000..e070a855 --- /dev/null +++ b/gusto_embedded/src/auth.ts @@ -0,0 +1,104 @@ +import * as z from "zod"; +import { SDK_METADATA } from "./lib/config"; + +// TypeScript SDKs use Zod for runtime data validation. We can use Zod +// to describe the shape of the response from the OAuth token endpoint. If the +// response is valid, Speakeasy can safely access the token and its expiration time. +const tokenResponseSchema = z.object({ + access_token: z.string(), + expires_in: z.number().positive(), +}); + +// This is a rough value that adjusts when we consider an access token to be +// expired. It accounts for clock drift between the client and server +// and slow or unreliable networks. +const tolerance = 5 * 60 * 1000; + +/** + * A callback function that can be used to obtain an OAuth access token for use + * with SDKs that require OAuth security. A new token is requested from the + * OAuth provider when the current token has expired. + */ +export function withAuthorization( + clientID: string, + clientSecret: string, + options: { tokenStore?: TokenStore; url?: string } = {} +) { + const { + tokenStore = new InMemoryTokenStore(), + // Replace this with your default OAuth provider's access token endpoint. + url = "https://api.gusto-demo.com/oauth/token", + } = options; + + return async (): Promise => { + const session = await tokenStore.get(); + + // Return the current token if it has not expired yet. + if (session && session.expires > Date.now()) { + return session.token; + } + + try { + const response = await fetch(url, { + method: "POST", + headers: { + "content-type": "application/x-www-form-urlencoded", + // Include the SDK's user agent in the request so requests can be + // tracked using observability infrastructure. + "user-agent": SDK_METADATA.userAgent, + }, + body: new URLSearchParams({ + client_id: clientID, + client_secret: clientSecret, + grant_type: "system_access", + }), + }); + + if (!response.ok) { + throw new Error("Unexpected status code: " + response.status); + } + + const json = await response.json(); + const data = tokenResponseSchema.parse(json); + + await tokenStore.set( + data.access_token, + Date.now() + data.expires_in * 1000 - tolerance + ); + + return data.access_token; + } catch (error) { + throw new Error("Failed to obtain OAuth token: " + error); + } + }; +} + +/** + * A TokenStore is used to save and retrieve OAuth tokens for use across SDK + * method calls. This interface can be implemented to store tokens in memory, + * a shared cache like Redis or a database table. + */ +export interface TokenStore { + get(): Promise<{ token: string; expires: number } | undefined>; + set(token: string, expires: number): Promise; +} + +/** + * InMemoryTokenStore holds OAuth access tokens in memory for use by SDKs and + * methods that require OAuth security. + */ +export class InMemoryTokenStore implements TokenStore { + private token = ""; + private expires = Date.now(); + + constructor() {} + + async get() { + return { token: this.token, expires: this.expires }; + } + + async set(token: string, expires: number) { + this.token = token; + this.expires = expires; + } +} From c882fdc768dc559640335c02e82420439b714e06 Mon Sep 17 00:00:00 2001 From: Aaron Rosen Date: Mon, 27 Jan 2025 17:06:48 -0700 Subject: [PATCH 02/15] adds source and target for generating code from local file --- .speakeasy/workflow.yaml | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/.speakeasy/workflow.yaml b/.speakeasy/workflow.yaml index dc908881..62a002b0 100644 --- a/.speakeasy/workflow.yaml +++ b/.speakeasy/workflow.yaml @@ -3,7 +3,7 @@ speakeasyVersion: latest sources: GustoEmbedded-OAS: inputs: - - location: https://raw.githubusercontent.com/Gusto/Gusto-Partner-API/refs/heads/main/generated/embedded/api.v2024-04-01.embedded.yaml + - location: https://raw.githubusercontent.com/Gusto/Gusto-Partner-API/refs/heads/ar/add-oauth-to-openapispec/generated/embedded/api.v2024-04-01.embedded.yaml authHeader: Authorization authSecret: $openapi_doc_auth_token overlays: @@ -25,3 +25,14 @@ targets: location: registry.speakeasyapi.dev/gusto/ruby-sdk/gusto-embedded-oas-typescript-code-samples labelOverride: fixedValue: Typescript (SDK) + blocking: false + local: + target: typescript + source: GustoEmbedded-local + output: ./gusto_embedded + codeSamples: + registry: + location: registry.speakeasyapi.dev/gusto/ruby-sdk/gusto-embedded-oas-typescript-code-samples + labelOverride: + fixedValue: Typescript (SDK) + blocking: false From c973f0a18131d0e6db73ceaf017fb935cdb0cce2 Mon Sep 17 00:00:00 2001 From: Aaron Rosen Date: Tue, 28 Jan 2025 13:51:36 -0700 Subject: [PATCH 03/15] implement company auth with refresh --- .../src/{auth.ts => companyAuth.ts} | 51 +++++++++++++++---- 1 file changed, 41 insertions(+), 10 deletions(-) rename gusto_embedded/src/{auth.ts => companyAuth.ts} (73%) diff --git a/gusto_embedded/src/auth.ts b/gusto_embedded/src/companyAuth.ts similarity index 73% rename from gusto_embedded/src/auth.ts rename to gusto_embedded/src/companyAuth.ts index e070a855..3ae1081c 100644 --- a/gusto_embedded/src/auth.ts +++ b/gusto_embedded/src/companyAuth.ts @@ -7,6 +7,7 @@ import { SDK_METADATA } from "./lib/config"; const tokenResponseSchema = z.object({ access_token: z.string(), expires_in: z.number().positive(), + refresh_token: z.string(), }); // This is a rough value that adjusts when we consider an access token to be @@ -19,9 +20,11 @@ const tolerance = 5 * 60 * 1000; * with SDKs that require OAuth security. A new token is requested from the * OAuth provider when the current token has expired. */ -export function withAuthorization( +export function withTokenRefresh( clientID: string, clientSecret: string, + accessToken: string, + refreshToken: string, options: { tokenStore?: TokenStore; url?: string } = {} ) { const { @@ -30,6 +33,8 @@ export function withAuthorization( url = "https://api.gusto-demo.com/oauth/token", } = options; + tokenStore.set({ token: accessToken, refreshToken, expires: 10 }); + return async (): Promise => { const session = await tokenStore.get(); @@ -50,7 +55,8 @@ export function withAuthorization( body: new URLSearchParams({ client_id: clientID, client_secret: clientSecret, - grant_type: "system_access", + grant_type: "refresh_token", + refresh_token: refreshToken, }), }); @@ -61,10 +67,11 @@ export function withAuthorization( const json = await response.json(); const data = tokenResponseSchema.parse(json); - await tokenStore.set( - data.access_token, - Date.now() + data.expires_in * 1000 - tolerance - ); + await tokenStore.set({ + token: data.access_token, + expires: Date.now() + data.expires_in * 1000 - tolerance, + refreshToken: data.refresh_token, + }); return data.access_token; } catch (error) { @@ -79,8 +86,18 @@ export function withAuthorization( * a shared cache like Redis or a database table. */ export interface TokenStore { - get(): Promise<{ token: string; expires: number } | undefined>; - set(token: string, expires: number): Promise; + get(): Promise< + { token: string; refreshToken: string; expires: number } | undefined + >; + set({ + token, + expires, + refreshToken, + }: { + token: string; + expires: number; + refreshToken: string; + }): Promise; } /** @@ -90,15 +107,29 @@ export interface TokenStore { export class InMemoryTokenStore implements TokenStore { private token = ""; private expires = Date.now(); + private refreshToken = ""; constructor() {} async get() { - return { token: this.token, expires: this.expires }; + return { + token: this.token, + expires: this.expires, + refreshToken: this.refreshToken, + }; } - async set(token: string, expires: number) { + async set({ + token, + expires, + refreshToken, + }: { + token: string; + expires: number; + refreshToken: string; + }) { this.token = token; + this.refreshToken = refreshToken; this.expires = expires; } } From 4b12dd8eb24dfd552f0b90b5b63145255d6b92db Mon Sep 17 00:00:00 2001 From: Aaron Rosen Date: Tue, 28 Jan 2025 14:32:37 -0700 Subject: [PATCH 04/15] create company auth callback --- gusto_embedded/auth.d.ts.map | 1 - .../{auth.d.ts => companyAuth.d.ts} | 19 ++++++++++--- gusto_embedded/companyAuth.d.ts.map | 1 + gusto_embedded/{auth.js => companyAuth.js} | 27 ++++++++++++++----- 4 files changed, 36 insertions(+), 12 deletions(-) delete mode 100644 gusto_embedded/auth.d.ts.map rename gusto_embedded/{auth.d.ts => companyAuth.d.ts} (63%) create mode 100644 gusto_embedded/companyAuth.d.ts.map rename gusto_embedded/{auth.js => companyAuth.js} (82%) diff --git a/gusto_embedded/auth.d.ts.map b/gusto_embedded/auth.d.ts.map deleted file mode 100644 index 2eee426d..00000000 --- a/gusto_embedded/auth.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["src/auth.ts"],"names":[],"mappings":"AAgBA;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,OAAO,GAAE;IAAE,UAAU,CAAC,EAAE,UAAU,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,SAQtC,OAAO,CAAC,MAAM,CAAC,CAyCjC;AAED;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,GAAG,IAAI,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC,CAAC;IAC/D,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACpD;AAED;;;GAGG;AACH,qBAAa,kBAAmB,YAAW,UAAU;IACnD,OAAO,CAAC,KAAK,CAAM;IACnB,OAAO,CAAC,OAAO,CAAc;;IAIvB,GAAG;;;;IAIH,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAIzC"} \ No newline at end of file diff --git a/gusto_embedded/auth.d.ts b/gusto_embedded/companyAuth.d.ts similarity index 63% rename from gusto_embedded/auth.d.ts rename to gusto_embedded/companyAuth.d.ts index 851b3596..3506d904 100644 --- a/gusto_embedded/auth.d.ts +++ b/gusto_embedded/companyAuth.d.ts @@ -3,7 +3,7 @@ * with SDKs that require OAuth security. A new token is requested from the * OAuth provider when the current token has expired. */ -export declare function withAuthorization(clientID: string, clientSecret: string, options?: { +export declare function withTokenRefresh(clientID: string, clientSecret: string, accessToken: string, refreshToken: string, options?: { tokenStore?: TokenStore; url?: string; }): () => Promise; @@ -15,9 +15,14 @@ export declare function withAuthorization(clientID: string, clientSecret: string export interface TokenStore { get(): Promise<{ token: string; + refreshToken: string; expires: number; } | undefined>; - set(token: string, expires: number): Promise; + set({ token, expires, refreshToken, }: { + token: string; + expires: number; + refreshToken: string; + }): Promise; } /** * InMemoryTokenStore holds OAuth access tokens in memory for use by SDKs and @@ -26,11 +31,17 @@ export interface TokenStore { export declare class InMemoryTokenStore implements TokenStore { private token; private expires; + private refreshToken; constructor(); get(): Promise<{ token: string; expires: number; + refreshToken: string; }>; - set(token: string, expires: number): Promise; + set({ token, expires, refreshToken, }: { + token: string; + expires: number; + refreshToken: string; + }): Promise; } -//# sourceMappingURL=auth.d.ts.map \ No newline at end of file +//# sourceMappingURL=companyAuth.d.ts.map \ No newline at end of file diff --git a/gusto_embedded/companyAuth.d.ts.map b/gusto_embedded/companyAuth.d.ts.map new file mode 100644 index 00000000..e8804cbb --- /dev/null +++ b/gusto_embedded/companyAuth.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"companyAuth.d.ts","sourceRoot":"","sources":["src/companyAuth.ts"],"names":[],"mappings":"AAiBA;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,OAAO,GAAE;IAAE,UAAU,CAAC,EAAE,UAAU,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,SAUtC,OAAO,CAAC,MAAM,CAAC,CA2CjC;AAED;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,GAAG,IAAI,OAAO,CACZ;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CACrE,CAAC;IACF,GAAG,CAAC,EACF,KAAK,EACL,OAAO,EACP,YAAY,GACb,EAAE;QACD,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,YAAY,EAAE,MAAM,CAAC;KACtB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACnB;AAED;;;GAGG;AACH,qBAAa,kBAAmB,YAAW,UAAU;IACnD,OAAO,CAAC,KAAK,CAAM;IACnB,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,YAAY,CAAM;;IAIpB,GAAG;;;;;IAQH,GAAG,CAAC,EACR,KAAK,EACL,OAAO,EACP,YAAY,GACb,EAAE;QACD,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,YAAY,EAAE,MAAM,CAAC;KACtB;CAKF"} \ No newline at end of file diff --git a/gusto_embedded/auth.js b/gusto_embedded/companyAuth.js similarity index 82% rename from gusto_embedded/auth.js rename to gusto_embedded/companyAuth.js index af5d0156..69215726 100644 --- a/gusto_embedded/auth.js +++ b/gusto_embedded/companyAuth.js @@ -34,7 +34,7 @@ var __importStar = (this && this.__importStar) || (function () { })(); Object.defineProperty(exports, "__esModule", { value: true }); exports.InMemoryTokenStore = void 0; -exports.withAuthorization = withAuthorization; +exports.withTokenRefresh = withTokenRefresh; const z = __importStar(require("zod")); const config_1 = require("./lib/config"); // TypeScript SDKs use Zod for runtime data validation. We can use Zod @@ -43,6 +43,7 @@ const config_1 = require("./lib/config"); const tokenResponseSchema = z.object({ access_token: z.string(), expires_in: z.number().positive(), + refresh_token: z.string(), }); // This is a rough value that adjusts when we consider an access token to be // expired. It accounts for clock drift between the client and server @@ -53,10 +54,11 @@ const tolerance = 5 * 60 * 1000; * with SDKs that require OAuth security. A new token is requested from the * OAuth provider when the current token has expired. */ -function withAuthorization(clientID, clientSecret, options = {}) { +function withTokenRefresh(clientID, clientSecret, accessToken, refreshToken, options = {}) { const { tokenStore = new InMemoryTokenStore(), // Replace this with your default OAuth provider's access token endpoint. url = "https://api.gusto-demo.com/oauth/token", } = options; + tokenStore.set({ token: accessToken, refreshToken, expires: 10 }); return async () => { const session = await tokenStore.get(); // Return the current token if it has not expired yet. @@ -75,7 +77,8 @@ function withAuthorization(clientID, clientSecret, options = {}) { body: new URLSearchParams({ client_id: clientID, client_secret: clientSecret, - grant_type: "system_access", + grant_type: "refresh_token", + refresh_token: refreshToken, }), }); if (!response.ok) { @@ -83,7 +86,11 @@ function withAuthorization(clientID, clientSecret, options = {}) { } const json = await response.json(); const data = tokenResponseSchema.parse(json); - await tokenStore.set(data.access_token, Date.now() + data.expires_in * 1000 - tolerance); + await tokenStore.set({ + token: data.access_token, + expires: Date.now() + data.expires_in * 1000 - tolerance, + refreshToken: data.refresh_token, + }); return data.access_token; } catch (error) { @@ -99,14 +106,20 @@ class InMemoryTokenStore { constructor() { this.token = ""; this.expires = Date.now(); + this.refreshToken = ""; } async get() { - return { token: this.token, expires: this.expires }; + return { + token: this.token, + expires: this.expires, + refreshToken: this.refreshToken, + }; } - async set(token, expires) { + async set({ token, expires, refreshToken, }) { this.token = token; + this.refreshToken = refreshToken; this.expires = expires; } } exports.InMemoryTokenStore = InMemoryTokenStore; -//# sourceMappingURL=auth.js.map \ No newline at end of file +//# sourceMappingURL=companyAuth.js.map \ No newline at end of file From bff2f93f44933b106d1841b9ee53efa391896fdb Mon Sep 17 00:00:00 2001 From: Aaron Rosen Date: Wed, 29 Jan 2025 13:41:17 -0700 Subject: [PATCH 05/15] generated client credentials oauth flow code --- gusto_embedded/.genignore | 1 + gusto_embedded/src/hooks/clientcredentials.ts | 210 ++++++++++++++++++ gusto_embedded/src/systemAuth.ts | 109 +++++++++ 3 files changed, 320 insertions(+) create mode 100644 gusto_embedded/.genignore create mode 100644 gusto_embedded/src/hooks/clientcredentials.ts create mode 100644 gusto_embedded/src/systemAuth.ts diff --git a/gusto_embedded/.genignore b/gusto_embedded/.genignore new file mode 100644 index 00000000..bdd373ab --- /dev/null +++ b/gusto_embedded/.genignore @@ -0,0 +1 @@ +/src/hooks/clientcredentials.ts diff --git a/gusto_embedded/src/hooks/clientcredentials.ts b/gusto_embedded/src/hooks/clientcredentials.ts new file mode 100644 index 00000000..b5ce36cb --- /dev/null +++ b/gusto_embedded/src/hooks/clientcredentials.ts @@ -0,0 +1,210 @@ +// Code originally generated by Speakeasy (https://www.speakeasyapi.dev). + +import * as z from "zod"; +import { stringToBase64 } from "../lib/base64.js"; +import { env } from "../lib/env.js"; +import { HTTPClient } from "../lib/http.js"; +import { parse } from "../lib/schemas.js"; +import * as components from "../models/components/index.js"; +import { + AfterErrorContext, + AfterErrorHook, + BeforeRequestContext, + BeforeRequestHook, + SDKInitHook, + SDKInitOptions, +} from "./types.js"; + +type Credentials = { + clientID: string; + clientSecret: string; + tokenURL: string | undefined; +}; + +type Session = { + credentials: Credentials; + token: string; + expiresAt?: number; + scopes: string[]; +}; + +export class ClientCredentialsHook + implements SDKInitHook, BeforeRequestHook, AfterErrorHook +{ + private baseURL?: URL | null; + private client?: HTTPClient; + private sessions: Record = {}; + + sdkInit(opts: SDKInitOptions): SDKInitOptions { + this.baseURL = opts.baseURL; + this.client = opts.client; + + return opts; + } + + async beforeRequest( + hookCtx: BeforeRequestContext, + request: Request + ): Promise { + if (!hookCtx.oAuth2Scopes) { + // OAuth2 not in use + return request; + } + + const credentials = await this.getCredentials(hookCtx.securitySource); + if (!credentials) { + return request; + } + + const sessionKey = this.getSessionKey(credentials); + + let session = this.sessions[sessionKey]; + if ( + !session || + !this.hasRequiredScopes(session.scopes, hookCtx.oAuth2Scopes) || + this.hasTokenExpired(session.expiresAt) + ) { + session = await this.doTokenRequest( + credentials, + this.getScopes(hookCtx.oAuth2Scopes, session) + ); + + this.sessions[sessionKey] = session; + } + + request.headers.set("Authorization", `Bearer ${session.token}`); + + return request; + } + + async afterError( + hookCtx: AfterErrorContext, + response: Response | null, + error: unknown + ): Promise<{ response: Response | null; error: unknown }> { + if (!hookCtx.oAuth2Scopes) { + // OAuth2 not in use + return { response, error }; + } + + if (error) { + return { response, error }; + } + + const credentials = await this.getCredentials(hookCtx.securitySource); + if (!credentials) { + return { response, error }; + } + + if (response && response?.status === 401) { + const sessionKey = this.getSessionKey(credentials); + delete this.sessions[sessionKey]; + } + + return { response, error }; + } + + private async doTokenRequest( + credentials: Credentials, + scopes: string[] + ): Promise { + const formData = new URLSearchParams(); + formData.append("grant_type", "system_access"); + formData.append("client_id", credentials.clientID); + formData.append("client_secret", credentials.clientSecret); + + if (scopes.length > 0) { + formData.append("scope", scopes.join(" ")); + } + + const tokenURL = new URL(credentials.tokenURL ?? "", this.baseURL ?? ""); + + const request = new Request(tokenURL, { + method: "POST", + headers: { + "Content-Type": "application/x-www-form-urlencoded", + }, + body: formData, + }); + + const res = await this.client?.request(request); + if (!res) { + throw new Error("Failed to fetch token"); + } + + if (res.status < 200 || res.status >= 300) { + throw new Error("Unexpected status code"); + } + + const data = await res.json(); + if (!data || typeof data !== "object") { + throw new Error("Unexpected response format"); + } + + if (data.token_type !== "Bearer") { + throw new Error("Unexpected token type"); + } + + let expiresAt: number | undefined; + if (data.expires_in) { + expiresAt = Date.now() + data.expires_in * 1000; + } + + const sess: Session = { + credentials, + token: data.access_token, + scopes, + }; + + if (expiresAt !== undefined) { + sess.expiresAt = expiresAt; + } + + return sess; + } + + private async getCredentials( + source?: unknown | (() => Promise) + ): Promise { + if (!source) { + return null; + } + + let security = source; + if (typeof source === "function") { + security = await source(); + } + const out = parse( + security, + (val) => z.lazy(() => components.Security$outboundSchema).parse(val), + "unexpected security type" + ); + + return { + clientID: out?.clientID ?? env().GUSTOEMBEDDED_CLIENT_ID ?? "", + clientSecret: + out?.clientSecret ?? env().GUSTOEMBEDDED_CLIENT_SECRET ?? "", + tokenURL: out?.tokenURL ?? env().GUSTOEMBEDDED_TOKEN_URL ?? "", + }; + } + + private getSessionKey(credentials: Credentials): string { + const key = `${credentials.clientID}:${credentials.clientSecret}`; + return stringToBase64(key); + } + + private hasRequiredScopes( + scopes: string[], + requiredScopes: string[] + ): boolean { + return requiredScopes.every((scope) => scopes.includes(scope)); + } + + private getScopes(requiredScopes: string[], sess?: Session): string[] { + return [...new Set((sess?.scopes ?? []).concat(requiredScopes))]; + } + + private hasTokenExpired(expiresAt?: number): boolean { + return !expiresAt || Date.now() + 60000 > expiresAt; + } +} diff --git a/gusto_embedded/src/systemAuth.ts b/gusto_embedded/src/systemAuth.ts new file mode 100644 index 00000000..3553140c --- /dev/null +++ b/gusto_embedded/src/systemAuth.ts @@ -0,0 +1,109 @@ +import * as z from "zod"; +import { SDK_METADATA } from "./lib/config"; + +// TypeScript SDKs use Zod for runtime data validation. We can use Zod +// to describe the shape of the response from the OAuth token endpoint. If the +// response is valid, Speakeasy can safely access the token and its expiration time. +const tokenResponseSchema = z.object({ + access_token: z.string(), + expires_in: z.number().positive(), +}); + +// This is a rough value that adjusts when we consider an access token to be +// expired. It accounts for clock drift between the client and server +// and slow or unreliable networks. +const tolerance = 5 * 60 * 1000; + +/** + * A callback function that can be used to obtain an OAuth access token for use + * with SDKs that require OAuth security. A new token is requested from the + * OAuth provider when the current token has expired. + */ +export function withSystemAccess( + clientID: string, + clientSecret: string, + options: { tokenStore?: TokenStore; url?: string } = {} +) { + const { + tokenStore = new InMemoryTokenStore(), + // Replace this with your default OAuth provider's access token endpoint. + url = "https://api.gusto-demo.com/oauth/token", + } = options; + + // tokenStore.set({ token: accessToken, expires: 10 }); + + return async (): Promise => { + const session = await tokenStore.get(); + + // Return the current token if it has not expired yet. + if (session && session.expires > Date.now()) { + return session.token; + } + + try { + const response = await fetch(url, { + method: "POST", + headers: { + "content-type": "application/x-www-form-urlencoded", + // Include the SDK's user agent in the request so requests can be + // tracked using observability infrastructure. + "user-agent": SDK_METADATA.userAgent, + }, + body: new URLSearchParams({ + client_id: clientID, + client_secret: clientSecret, + grant_type: "system_access", + }), + }); + + if (!response.ok) { + throw new Error("Unexpected status code: " + response.status); + } + + const json = await response.json(); + const data = tokenResponseSchema.parse(json); + + await tokenStore.set({ + token: data.access_token, + expires: Date.now() + data.expires_in * 1000 - tolerance, + }); + + return data.access_token; + } catch (error) { + throw new Error("Failed to obtain OAuth token: " + error); + } + }; +} + +/** + * A TokenStore is used to save and retrieve OAuth tokens for use across SDK + * method calls. This interface can be implemented to store tokens in memory, + * a shared cache like Redis or a database table. + */ +export interface TokenStore { + get(): Promise<{ token: string; expires: number } | undefined>; + set({ token, expires }: { token: string; expires: number }): Promise; +} + +/** + * InMemoryTokenStore holds OAuth access tokens in memory for use by SDKs and + * methods that require OAuth security. + */ +export class InMemoryTokenStore implements TokenStore { + private token = ""; + private expires = Date.now(); + + constructor() {} + + async get() { + return { + token: this.token, + expires: this.expires, + }; + } + + async set({ token, expires }: { token: string; expires: number }) { + this.token = token; + this.expires = expires; + } +} From ddd76d2a1513e30bb7aa083768b888ecea83aaf4 Mon Sep 17 00:00:00 2001 From: Aaron Rosen Date: Wed, 29 Jan 2025 15:59:12 -0700 Subject: [PATCH 06/15] remove autogenerated files --- gusto_embedded/companyAuth.d.ts | 47 ------- gusto_embedded/companyAuth.d.ts.map | 1 - gusto_embedded/companyAuth.js | 125 ------------------ .../components/historicalemployeebody.ts | 7 - .../operations/putv1historicalemployees.ts | 7 - gusto_embedded/src/systemAuth.ts | 109 --------------- 6 files changed, 296 deletions(-) delete mode 100644 gusto_embedded/companyAuth.d.ts delete mode 100644 gusto_embedded/companyAuth.d.ts.map delete mode 100644 gusto_embedded/companyAuth.js delete mode 100644 gusto_embedded/src/systemAuth.ts diff --git a/gusto_embedded/companyAuth.d.ts b/gusto_embedded/companyAuth.d.ts deleted file mode 100644 index 3506d904..00000000 --- a/gusto_embedded/companyAuth.d.ts +++ /dev/null @@ -1,47 +0,0 @@ -/** - * A callback function that can be used to obtain an OAuth access token for use - * with SDKs that require OAuth security. A new token is requested from the - * OAuth provider when the current token has expired. - */ -export declare function withTokenRefresh(clientID: string, clientSecret: string, accessToken: string, refreshToken: string, options?: { - tokenStore?: TokenStore; - url?: string; -}): () => Promise; -/** - * A TokenStore is used to save and retrieve OAuth tokens for use across SDK - * method calls. This interface can be implemented to store tokens in memory, - * a shared cache like Redis or a database table. - */ -export interface TokenStore { - get(): Promise<{ - token: string; - refreshToken: string; - expires: number; - } | undefined>; - set({ token, expires, refreshToken, }: { - token: string; - expires: number; - refreshToken: string; - }): Promise; -} -/** - * InMemoryTokenStore holds OAuth access tokens in memory for use by SDKs and - * methods that require OAuth security. - */ -export declare class InMemoryTokenStore implements TokenStore { - private token; - private expires; - private refreshToken; - constructor(); - get(): Promise<{ - token: string; - expires: number; - refreshToken: string; - }>; - set({ token, expires, refreshToken, }: { - token: string; - expires: number; - refreshToken: string; - }): Promise; -} -//# sourceMappingURL=companyAuth.d.ts.map \ No newline at end of file diff --git a/gusto_embedded/companyAuth.d.ts.map b/gusto_embedded/companyAuth.d.ts.map deleted file mode 100644 index e8804cbb..00000000 --- a/gusto_embedded/companyAuth.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"companyAuth.d.ts","sourceRoot":"","sources":["src/companyAuth.ts"],"names":[],"mappings":"AAiBA;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,OAAO,GAAE;IAAE,UAAU,CAAC,EAAE,UAAU,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,SAUtC,OAAO,CAAC,MAAM,CAAC,CA2CjC;AAED;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,GAAG,IAAI,OAAO,CACZ;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CACrE,CAAC;IACF,GAAG,CAAC,EACF,KAAK,EACL,OAAO,EACP,YAAY,GACb,EAAE;QACD,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,YAAY,EAAE,MAAM,CAAC;KACtB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACnB;AAED;;;GAGG;AACH,qBAAa,kBAAmB,YAAW,UAAU;IACnD,OAAO,CAAC,KAAK,CAAM;IACnB,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,YAAY,CAAM;;IAIpB,GAAG;;;;;IAQH,GAAG,CAAC,EACR,KAAK,EACL,OAAO,EACP,YAAY,GACb,EAAE;QACD,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,YAAY,EAAE,MAAM,CAAC;KACtB;CAKF"} \ No newline at end of file diff --git a/gusto_embedded/companyAuth.js b/gusto_embedded/companyAuth.js deleted file mode 100644 index 69215726..00000000 --- a/gusto_embedded/companyAuth.js +++ /dev/null @@ -1,125 +0,0 @@ -"use strict"; -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || (function () { - var ownKeys = function(o) { - ownKeys = Object.getOwnPropertyNames || function (o) { - var ar = []; - for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; - return ar; - }; - return ownKeys(o); - }; - return function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); - __setModuleDefault(result, mod); - return result; - }; -})(); -Object.defineProperty(exports, "__esModule", { value: true }); -exports.InMemoryTokenStore = void 0; -exports.withTokenRefresh = withTokenRefresh; -const z = __importStar(require("zod")); -const config_1 = require("./lib/config"); -// TypeScript SDKs use Zod for runtime data validation. We can use Zod -// to describe the shape of the response from the OAuth token endpoint. If the -// response is valid, Speakeasy can safely access the token and its expiration time. -const tokenResponseSchema = z.object({ - access_token: z.string(), - expires_in: z.number().positive(), - refresh_token: z.string(), -}); -// This is a rough value that adjusts when we consider an access token to be -// expired. It accounts for clock drift between the client and server -// and slow or unreliable networks. -const tolerance = 5 * 60 * 1000; -/** - * A callback function that can be used to obtain an OAuth access token for use - * with SDKs that require OAuth security. A new token is requested from the - * OAuth provider when the current token has expired. - */ -function withTokenRefresh(clientID, clientSecret, accessToken, refreshToken, options = {}) { - const { tokenStore = new InMemoryTokenStore(), - // Replace this with your default OAuth provider's access token endpoint. - url = "https://api.gusto-demo.com/oauth/token", } = options; - tokenStore.set({ token: accessToken, refreshToken, expires: 10 }); - return async () => { - const session = await tokenStore.get(); - // Return the current token if it has not expired yet. - if (session && session.expires > Date.now()) { - return session.token; - } - try { - const response = await fetch(url, { - method: "POST", - headers: { - "content-type": "application/x-www-form-urlencoded", - // Include the SDK's user agent in the request so requests can be - // tracked using observability infrastructure. - "user-agent": config_1.SDK_METADATA.userAgent, - }, - body: new URLSearchParams({ - client_id: clientID, - client_secret: clientSecret, - grant_type: "refresh_token", - refresh_token: refreshToken, - }), - }); - if (!response.ok) { - throw new Error("Unexpected status code: " + response.status); - } - const json = await response.json(); - const data = tokenResponseSchema.parse(json); - await tokenStore.set({ - token: data.access_token, - expires: Date.now() + data.expires_in * 1000 - tolerance, - refreshToken: data.refresh_token, - }); - return data.access_token; - } - catch (error) { - throw new Error("Failed to obtain OAuth token: " + error); - } - }; -} -/** - * InMemoryTokenStore holds OAuth access tokens in memory for use by SDKs and - * methods that require OAuth security. - */ -class InMemoryTokenStore { - constructor() { - this.token = ""; - this.expires = Date.now(); - this.refreshToken = ""; - } - async get() { - return { - token: this.token, - expires: this.expires, - refreshToken: this.refreshToken, - }; - } - async set({ token, expires, refreshToken, }) { - this.token = token; - this.refreshToken = refreshToken; - this.expires = expires; - } -} -exports.InMemoryTokenStore = InMemoryTokenStore; -//# sourceMappingURL=companyAuth.js.map \ No newline at end of file diff --git a/gusto_embedded/src/models/components/historicalemployeebody.ts b/gusto_embedded/src/models/components/historicalemployeebody.ts index c43dd400..0d6e5b5b 100644 --- a/gusto_embedded/src/models/components/historicalemployeebody.ts +++ b/gusto_embedded/src/models/components/historicalemployeebody.ts @@ -59,10 +59,6 @@ export type HistoricalEmployeeBody = { workAddress: WorkAddress; homeAddress: HistoricalEmployeeBodyHomeAddress; termination: HistoricalEmployeeBodyTermination; - /** - * Optional. If provided, the email address will be saved to the employee. - */ - email?: string | undefined; job: HistoricalEmployeeBodyJob; employeeStateTaxes?: EmployeeStateTaxes | undefined; }; @@ -413,7 +409,6 @@ export const HistoricalEmployeeBody$inboundSchema: z.ZodType< work_address: z.lazy(() => WorkAddress$inboundSchema), home_address: z.lazy(() => HistoricalEmployeeBodyHomeAddress$inboundSchema), termination: z.lazy(() => HistoricalEmployeeBodyTermination$inboundSchema), - email: z.string().optional(), job: z.lazy(() => HistoricalEmployeeBodyJob$inboundSchema), employee_state_taxes: z.lazy(() => EmployeeStateTaxes$inboundSchema) .optional(), @@ -441,7 +436,6 @@ export type HistoricalEmployeeBody$Outbound = { work_address: WorkAddress$Outbound; home_address: HistoricalEmployeeBodyHomeAddress$Outbound; termination: HistoricalEmployeeBodyTermination$Outbound; - email?: string | undefined; job: HistoricalEmployeeBodyJob$Outbound; employee_state_taxes?: EmployeeStateTaxes$Outbound | undefined; }; @@ -461,7 +455,6 @@ export const HistoricalEmployeeBody$outboundSchema: z.ZodType< workAddress: z.lazy(() => WorkAddress$outboundSchema), homeAddress: z.lazy(() => HistoricalEmployeeBodyHomeAddress$outboundSchema), termination: z.lazy(() => HistoricalEmployeeBodyTermination$outboundSchema), - email: z.string().optional(), job: z.lazy(() => HistoricalEmployeeBodyJob$outboundSchema), employeeStateTaxes: z.lazy(() => EmployeeStateTaxes$outboundSchema) .optional(), diff --git a/gusto_embedded/src/models/operations/putv1historicalemployees.ts b/gusto_embedded/src/models/operations/putv1historicalemployees.ts index d6d85079..f153aef9 100644 --- a/gusto_embedded/src/models/operations/putv1historicalemployees.ts +++ b/gusto_embedded/src/models/operations/putv1historicalemployees.ts @@ -83,10 +83,6 @@ export type PutV1HistoricalEmployeesRequestBody = { workAddress: WorkAddress; homeAddress: PutV1HistoricalEmployeesHomeAddress; termination: Termination; - /** - * Optional. If provided, the email address will be saved to the employee. - */ - email?: string | undefined; job: Job; employeeStateTaxes?: EmployeeStateTaxes | undefined; }; @@ -450,7 +446,6 @@ export const PutV1HistoricalEmployeesRequestBody$inboundSchema: z.ZodType< work_address: z.lazy(() => WorkAddress$inboundSchema), home_address: z.lazy(() => PutV1HistoricalEmployeesHomeAddress$inboundSchema), termination: z.lazy(() => Termination$inboundSchema), - email: z.string().optional(), job: z.lazy(() => Job$inboundSchema), employee_state_taxes: z.lazy(() => EmployeeStateTaxes$inboundSchema) .optional(), @@ -479,7 +474,6 @@ export type PutV1HistoricalEmployeesRequestBody$Outbound = { work_address: WorkAddress$Outbound; home_address: PutV1HistoricalEmployeesHomeAddress$Outbound; termination: Termination$Outbound; - email?: string | undefined; job: Job$Outbound; employee_state_taxes?: EmployeeStateTaxes$Outbound | undefined; }; @@ -500,7 +494,6 @@ export const PutV1HistoricalEmployeesRequestBody$outboundSchema: z.ZodType< workAddress: z.lazy(() => WorkAddress$outboundSchema), homeAddress: z.lazy(() => PutV1HistoricalEmployeesHomeAddress$outboundSchema), termination: z.lazy(() => Termination$outboundSchema), - email: z.string().optional(), job: z.lazy(() => Job$outboundSchema), employeeStateTaxes: z.lazy(() => EmployeeStateTaxes$outboundSchema) .optional(), diff --git a/gusto_embedded/src/systemAuth.ts b/gusto_embedded/src/systemAuth.ts deleted file mode 100644 index 3553140c..00000000 --- a/gusto_embedded/src/systemAuth.ts +++ /dev/null @@ -1,109 +0,0 @@ -import * as z from "zod"; -import { SDK_METADATA } from "./lib/config"; - -// TypeScript SDKs use Zod for runtime data validation. We can use Zod -// to describe the shape of the response from the OAuth token endpoint. If the -// response is valid, Speakeasy can safely access the token and its expiration time. -const tokenResponseSchema = z.object({ - access_token: z.string(), - expires_in: z.number().positive(), -}); - -// This is a rough value that adjusts when we consider an access token to be -// expired. It accounts for clock drift between the client and server -// and slow or unreliable networks. -const tolerance = 5 * 60 * 1000; - -/** - * A callback function that can be used to obtain an OAuth access token for use - * with SDKs that require OAuth security. A new token is requested from the - * OAuth provider when the current token has expired. - */ -export function withSystemAccess( - clientID: string, - clientSecret: string, - options: { tokenStore?: TokenStore; url?: string } = {} -) { - const { - tokenStore = new InMemoryTokenStore(), - // Replace this with your default OAuth provider's access token endpoint. - url = "https://api.gusto-demo.com/oauth/token", - } = options; - - // tokenStore.set({ token: accessToken, expires: 10 }); - - return async (): Promise => { - const session = await tokenStore.get(); - - // Return the current token if it has not expired yet. - if (session && session.expires > Date.now()) { - return session.token; - } - - try { - const response = await fetch(url, { - method: "POST", - headers: { - "content-type": "application/x-www-form-urlencoded", - // Include the SDK's user agent in the request so requests can be - // tracked using observability infrastructure. - "user-agent": SDK_METADATA.userAgent, - }, - body: new URLSearchParams({ - client_id: clientID, - client_secret: clientSecret, - grant_type: "system_access", - }), - }); - - if (!response.ok) { - throw new Error("Unexpected status code: " + response.status); - } - - const json = await response.json(); - const data = tokenResponseSchema.parse(json); - - await tokenStore.set({ - token: data.access_token, - expires: Date.now() + data.expires_in * 1000 - tolerance, - }); - - return data.access_token; - } catch (error) { - throw new Error("Failed to obtain OAuth token: " + error); - } - }; -} - -/** - * A TokenStore is used to save and retrieve OAuth tokens for use across SDK - * method calls. This interface can be implemented to store tokens in memory, - * a shared cache like Redis or a database table. - */ -export interface TokenStore { - get(): Promise<{ token: string; expires: number } | undefined>; - set({ token, expires }: { token: string; expires: number }): Promise; -} - -/** - * InMemoryTokenStore holds OAuth access tokens in memory for use by SDKs and - * methods that require OAuth security. - */ -export class InMemoryTokenStore implements TokenStore { - private token = ""; - private expires = Date.now(); - - constructor() {} - - async get() { - return { - token: this.token, - expires: this.expires, - }; - } - - async set({ token, expires }: { token: string; expires: number }) { - this.token = token; - this.expires = expires; - } -} From b56930fd0b74df0813b35e0a07e473ddea79f0e8 Mon Sep 17 00:00:00 2001 From: Aaron Rosen Date: Tue, 4 Feb 2025 14:12:19 -0700 Subject: [PATCH 07/15] renew system access token via pre-request hook --- .speakeasy/workflow.yaml | 2 +- .../speakeasy-modifications-overlay.yaml | 2407 +++++++++++++++++ gusto_embedded/src/hooks/clientcredentials.ts | 27 +- gusto_embedded/src/systemAuth.ts | 109 + 4 files changed, 2527 insertions(+), 18 deletions(-) create mode 100644 gusto_embedded/.speakeasy/speakeasy-modifications-overlay.yaml create mode 100644 gusto_embedded/src/systemAuth.ts diff --git a/.speakeasy/workflow.yaml b/.speakeasy/workflow.yaml index 62a002b0..a1ca7eb1 100644 --- a/.speakeasy/workflow.yaml +++ b/.speakeasy/workflow.yaml @@ -3,7 +3,7 @@ speakeasyVersion: latest sources: GustoEmbedded-OAS: inputs: - - location: https://raw.githubusercontent.com/Gusto/Gusto-Partner-API/refs/heads/ar/add-oauth-to-openapispec/generated/embedded/api.v2024-04-01.embedded.yaml + - location: https://raw.githubusercontent.com/Gusto/Gusto-Partner-API/refs/heads/main/generated/embedded/api.v2024-04-01.embedded.yaml authHeader: Authorization authSecret: $openapi_doc_auth_token overlays: diff --git a/gusto_embedded/.speakeasy/speakeasy-modifications-overlay.yaml b/gusto_embedded/.speakeasy/speakeasy-modifications-overlay.yaml new file mode 100644 index 00000000..130ff9eb --- /dev/null +++ b/gusto_embedded/.speakeasy/speakeasy-modifications-overlay.yaml @@ -0,0 +1,2407 @@ +overlay: 1.0.0 +info: + title: Speakeasy Modifications + version: 0.0.2 + x-speakeasy-metadata: + after: "" + before: "" + type: speakeasy-modifications +actions: + - target: $["components"]["securitySchemes"]["SystemAccessAuth"] + update: + type: http + scheme: custom + x-speakeasy-custom-security-scheme: + schema: + type: object + properties: + clientId: + type: string + clientSecret: + type: string + required: + - clientId + - clientSecret + - target: $["paths"]["/v1/companies/{company_id}/bank_accounts/{bank_account_uuid}/verify"]["put"] + update: + x-speakeasy-group: bankAccounts + x-speakeasy-name-override: verify + x-speakeasy-metadata: + type: method-name + before: sdk.Bank Accounts.put-v1-companies-company_id-bank-accounts-verify() + after: sdk.bankAccounts.verify() + reviewed_at: 1737756176193 + created_at: 1737756172202 + - target: $["paths"]["/v1/companies/{company_id}/attachments/{company_attachment_uuid}"]["get"] + update: + x-speakeasy-group: companyAttachments + x-speakeasy-name-override: getDetails + x-speakeasy-metadata: + type: method-name + before: sdk.Company Attachment.get-v1-companies-attachment() + after: sdk.companyAttachments.getDetails() + reviewed_at: 1737756176193 + created_at: 1737756172204 + - target: $["paths"]["/v1/companies/{company_id}/bank_accounts"]["get"] + update: + x-speakeasy-group: bankAccounts + x-speakeasy-name-override: list + x-speakeasy-metadata: + type: method-name + before: sdk.Bank Accounts.get-v1-companies-company_id-bank-accounts() + after: sdk.bankAccounts.list() + reviewed_at: 1737756176193 + created_at: 1737756172202 + - target: $["paths"]["/v1/employees/{employee_id}/i9_authorization/document_options"]["get"] + update: + x-speakeasy-group: i9Verification + x-speakeasy-name-override: getDocumentOptions + x-speakeasy-metadata: + type: method-name + before: sdk.I-9 Verification.get-v1-employees-employee_id-i9_authorization-document_options() + after: sdk.i9Verification.getDocumentOptions() + reviewed_at: 1737756176193 + created_at: 1737756172202 + - target: $["paths"]["/v1/companies/{company_id}/industry_selection"]["get"] + update: + x-speakeasy-group: industrySelection + x-speakeasy-name-override: get + x-speakeasy-metadata: + type: method-name + before: sdk.Industry Selection.get-v1-company-industry() + after: sdk.industrySelection.get() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/companies/{company_id}/pay_schedules/assign"]["post"] + update: + x-speakeasy-group: paySchedules + x-speakeasy-name-override: assign + x-speakeasy-metadata: + type: method-name + before: sdk.Pay Schedules.post-v1-companies-company_id-pay_schedules-assign() + after: sdk.paySchedules.assign() + reviewed_at: 1737756176193 + created_at: 1737756172202 + - target: $["paths"]["/v1/partner_managed_companies/{company_uuid}/accept_terms_of_service"]["post"] + update: + x-speakeasy-name-override: acceptTermsOfService + x-speakeasy-metadata: + type: method-name + before: sdk.Companies.post-partner-managed-companies-company_uuid-accept_terms_of_service() + after: sdk.companies.acceptTermsOfService() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/employee_benefits/{employee_benefit_id}"]["delete"] + update: + x-speakeasy-group: employeeBenefits + x-speakeasy-name-override: delete + x-speakeasy-metadata: + type: method-name + before: sdk.Employee Benefits.delete-v1-employee_benefits-employee_benefit_id() + after: sdk.employeeBenefits.delete() + reviewed_at: 1737756176193 + created_at: 1737756172204 + - target: $["paths"]["/v1/employees/{employee_id}/terminations"]["post"] + update: + x-speakeasy-group: employeeEmployments + x-speakeasy-name-override: createTermination + x-speakeasy-metadata: + type: method-name + before: sdk.Employee Employments.post-v1-employees-employee_id-terminations() + after: sdk.employeeEmployments.createTermination() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/webhook_subscriptions"]["get"] + update: + x-speakeasy-name-override: listSubscriptions + x-speakeasy-metadata: + type: method-name + before: sdk.Webhooks.get-v1-webhook-subscriptions() + after: sdk.webhooks.listSubscriptions() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/companies/{company_uuid}/departments"]["get"] + update: + x-speakeasy-name-override: list + x-speakeasy-metadata: + type: method-name + before: sdk.Departments.get-companies-departments() + after: sdk.departments.list() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/companies/{company_uuid}/paid_holidays"]["get"] + update: + x-speakeasy-group: holidayPayPolicies + x-speakeasy-name-override: previewHolidays + x-speakeasy-metadata: + type: method-name + before: sdk.Holiday Pay Policies.get-companies-company_uuid-paid_holidays() + after: sdk.holidayPayPolicies.previewHolidays() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/contractors/{contractor_uuid}"]["get"] + update: + x-speakeasy-name-override: get + x-speakeasy-metadata: + type: method-name + before: sdk.Contractors.get-v1-contractors-contractor_uuid() + after: sdk.contractors.get() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/companies/{company_uuid}/time_off_policies"]["get"] + update: + x-speakeasy-group: timeOffPolicies + x-speakeasy-name-override: get + x-speakeasy-metadata: + type: method-name + before: sdk.Time Off Policies.get-companies-company_uuid-time_off_policies() + after: sdk.timeOffPolicies.get() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/payrolls/{payroll_uuid}/gross_up"]["post"] + update: + x-speakeasy-name-override: calculateGrossUp + x-speakeasy-metadata: + type: method-name + before: sdk.Payrolls.post-payrolls-gross-up-payroll_uuid() + after: sdk.payrolls.calculateGrossUp() + reviewed_at: 1737756176193 + created_at: 1737756172202 + - target: $["paths"]["/v1/companies/{company_id}/company_benefits"]["post"] + update: + x-speakeasy-group: companyBenefits + x-speakeasy-name-override: create + x-speakeasy-metadata: + type: method-name + before: sdk.Company Benefits.post-v1-companies-company_id-company_benefits() + after: sdk.companyBenefits.create() + reviewed_at: 1737756176193 + created_at: 1737756172204 + - target: $["paths"]["/v1/webhook_subscriptions/{webhook_subscription_uuid}/verify"]["put"] + update: + x-speakeasy-name-override: verifySubscription + x-speakeasy-metadata: + type: method-name + before: sdk.Webhooks.put-v1-verify-webhook-subscription-uuid() + after: sdk.webhooks.verifySubscription() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/companies/{company_id}/pay_schedules/{pay_schedule_id}"]["put"] + update: + x-speakeasy-group: paySchedules + x-speakeasy-name-override: update + x-speakeasy-metadata: + type: method-name + before: sdk.Pay Schedules.put-v1-companies-company_id-pay_schedules-pay_schedule_id() + after: sdk.paySchedules.update() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/companies/{company_uuid}/holiday_pay_policy"]["post"] + update: + x-speakeasy-group: holidayPayPolicies + x-speakeasy-name-override: create + x-speakeasy-metadata: + type: method-name + before: sdk.Holiday Pay Policies.post-companies-company_uuid-holiday_pay_policy() + after: sdk.holidayPayPolicies.create() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/garnishments/{garnishment_id}"]["put"] + update: + x-speakeasy-name-override: update + x-speakeasy-metadata: + type: method-name + before: sdk.Garnishments.put-v1-garnishments-garnishment_id() + after: sdk.garnishments.update() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/companies/{company_id}/bank_accounts"]["post"] + update: + x-speakeasy-group: bankAccounts + x-speakeasy-name-override: create + x-speakeasy-metadata: + type: method-name + before: sdk.Bank Accounts.post-v1-companies-company_id-bank-accounts() + after: sdk.bankAccounts.create() + reviewed_at: 1737756176193 + created_at: 1737756172204 + - target: $["paths"]["/v1/companies/{company_uuid}/onboarding_status"]["get"] + update: + x-speakeasy-name-override: getOnboardingStatus + x-speakeasy-metadata: + type: method-name + before: sdk.Companies.get-v1-company-onboarding-status() + after: sdk.companies.getOnboardingStatus() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/contractors/{contractor_uuid}/bank_accounts"]["get"] + update: + x-speakeasy-group: contractorPaymentMethod + x-speakeasy-name-override: getBankAccounts + x-speakeasy-metadata: + type: method-name + before: sdk.Contractor Payment Method.get-v1-contractors-contractor_uuid-bank_accounts() + after: sdk.contractorPaymentMethod.getBankAccounts() + reviewed_at: 1737756176193 + created_at: 1737756172204 + - target: $["paths"]["/v1/companies/{company_id}/earning_types"]["post"] + update: + x-speakeasy-group: earningTypes + x-speakeasy-name-override: create + x-speakeasy-metadata: + type: method-name + before: sdk.Earning Types.post-v1-companies-company_id-earning_types() + after: sdk.earningTypes.create() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/webhook_subscriptions/{webhook_subscription_uuid}"]["get"] + update: + x-speakeasy-name-override: get + x-speakeasy-metadata: + type: method-name + before: sdk.Webhooks.get-v1-webhook-subscription-uuid() + after: sdk.webhooks.get() + reviewed_at: 1737756176193 + created_at: 1737756172202 + - target: $["paths"]["/v1/forms/{form_id}"]["get"] + update: + x-speakeasy-group: companyForms + x-speakeasy-name-override: get + x-speakeasy-metadata: + type: method-name + before: sdk.Company Forms.get-v1-company-form() + after: sdk.companyForms.get() + reviewed_at: 1737756176193 + created_at: 1737756172204 + - target: $["paths"]["/v1/companies/{company_id}/payrolls/{payroll_id}/prepare"]["put"] + update: + x-speakeasy-name-override: prepareForUpdate + x-speakeasy-metadata: + type: method-name + before: sdk.Payrolls.put-v1-companies-company_id-payrolls-payroll_id-prepare() + after: sdk.payrolls.prepareForUpdate() + reviewed_at: 1737756176193 + created_at: 1737756172202 + - target: $["paths"]["/v1/companies/{company_id}/payrolls"]["get"] + update: + x-speakeasy-name-override: getAll + x-speakeasy-metadata: + type: method-name + before: sdk.Payrolls.get-v1-companies-company_id-payrolls() + after: sdk.payrolls.getAll() + reviewed_at: 1737756176193 + created_at: 1737756172202 + - target: $["paths"]["/v1/contractors/{contractor_uuid}"]["put"] + update: + x-speakeasy-name-override: update + x-speakeasy-metadata: + type: method-name + before: sdk.Contractors.put-v1-contractors-contractor_uuid() + after: sdk.contractors.update() + reviewed_at: 1737756176193 + created_at: 1737756172202 + - target: $["paths"]["/v1/contractors/{contractor_uuid}/forms/{form_id}/pdf"]["get"] + update: + x-speakeasy-group: contractorForms + x-speakeasy-name-override: getPdf + x-speakeasy-metadata: + type: method-name + before: sdk.Contractor Forms.get-v1-contractor-form-pdf() + after: sdk.contractorForms.getPdf() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/events"]["get"] + update: + x-speakeasy-name-override: list + x-speakeasy-metadata: + type: method-name + before: sdk.Events.get-events() + after: sdk.events.list() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/companies/{company_id}/contractor_payments/{contractor_payment_id}"]["delete"] + update: + x-speakeasy-group: contractorPayments + x-speakeasy-name-override: cancel + x-speakeasy-metadata: + type: method-name + before: sdk.Contractor Payments.delete-v1-companies-company_id-contractor_payment-contractor-payment() + after: sdk.contractorPayments.cancel() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/companies/{company_uuid}/signatories"]["get"] + update: + x-speakeasy-name-override: get + x-speakeasy-metadata: + type: method-name + before: sdk.Signatories.get-v1-companies-company_uuid-signatories() + after: sdk.signatories.get() + reviewed_at: 1737756176193 + created_at: 1737756172204 + - target: $["paths"]["/v1/employees/{employee_id}/employee_benefits"]["post"] + update: + x-speakeasy-group: employeeBenefits + x-speakeasy-name-override: createBenefit + x-speakeasy-metadata: + type: method-name + before: sdk.Employee Benefits.post-v1-employees-employee_id-employee_benefits() + after: sdk.employeeBenefits.createBenefit() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/companies/{company_uuid}/tax_requirements/{state}"]["get"] + update: + x-speakeasy-group: taxRequirements + x-speakeasy-name-override: getByState + x-speakeasy-metadata: + type: method-name + before: sdk.Tax Requirements.get-v1-companies-company_uuid-tax_requirements-state() + after: sdk.taxRequirements.getByState() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/companies/{company_id}/federal_tax_details"]["put"] + update: + x-speakeasy-group: federalTaxDetails + x-speakeasy-name-override: update + x-speakeasy-metadata: + type: method-name + before: sdk.Federal Tax Details.put-v1-companies-company_id-federal_tax_details() + after: sdk.federalTaxDetails.update() + reviewed_at: 1737756176193 + created_at: 1737756172202 + - target: $["paths"]["/v1/employees/{employee_id}/bank_accounts"]["get"] + update: + x-speakeasy-group: employeePaymentMethods + x-speakeasy-name-override: getBankAccounts + x-speakeasy-metadata: + type: method-name + before: sdk.Employee Payment Method.get-v1-employees-employee_id-bank_accounts() + after: sdk.employeePaymentMethods.getBankAccounts() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/compensations/{compensation_id}"]["put"] + update: + x-speakeasy-group: jobsAndCompensations + x-speakeasy-name-override: updateCompensation + x-speakeasy-metadata: + type: method-name + before: sdk.Jobs and Compensations.put-v1-compensations-compensation_id() + after: sdk.jobsAndCompensations.updateCompensation() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/employee_benefits/{employee_benefit_id}"]["get"] + update: + x-speakeasy-group: employeeBenefits + x-speakeasy-name-override: get + x-speakeasy-metadata: + type: method-name + before: sdk.Employee Benefits.get-v1-employee_benefits-employee_benefit_id() + after: sdk.employeeBenefits.get() + reviewed_at: 1737756176193 + created_at: 1737756172202 + - target: $["paths"]["/v1/jobs/{job_id}/compensations"]["get"] + update: + x-speakeasy-group: jobsAndCompensations + x-speakeasy-name-override: getCompensations + x-speakeasy-metadata: + type: method-name + before: sdk.Jobs and Compensations.get-v1-jobs-job_id-compensations() + after: sdk.jobsAndCompensations.getCompensations() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/companies/{company_id}/attachments"]["get"] + update: + x-speakeasy-group: companyAttachments + x-speakeasy-name-override: getAll + x-speakeasy-metadata: + type: method-name + before: sdk.Company Attachment.get-v1-companies-attachments() + after: sdk.companyAttachments.getAll() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/contractors/{contractor_uuid}/documents"]["get"] + update: + x-speakeasy-group: contractorDocuments + x-speakeasy-name-override: list + x-speakeasy-metadata: + type: method-name + before: sdk.Contractor Documents.get-v1-contractor-documents() + after: sdk.contractorDocuments.list() + reviewed_at: 1737756176193 + created_at: 1737756172204 + - target: $["paths"]["/v1/employees/{employee_id}/bank_accounts/{bank_account_uuid}"]["put"] + update: + x-speakeasy-group: employeePaymentMethod + x-speakeasy-name-override: updateBankAccount + x-speakeasy-metadata: + type: method-name + before: sdk.Employee Payment Method.put-v1-employees-employee_id-bank_accounts() + after: sdk.employeePaymentMethod.updateBankAccount() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/companies/{company_id}/contractor_payment_groups"]["get"] + update: + x-speakeasy-group: contractorPaymentGroups + x-speakeasy-name-override: list + x-speakeasy-metadata: + type: method-name + before: sdk.Contractor Payment Groups.get-v1-companies-company_id-contractor_payment_groups() + after: sdk.contractorPaymentGroups.list() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/garnishments/{garnishment_id}"]["get"] + update: + x-speakeasy-name-override: fetch + x-speakeasy-metadata: + type: method-name + before: sdk.Garnishments.get-v1-garnishments-garnishment_id() + after: sdk.garnishments.fetch() + reviewed_at: 1737756176193 + created_at: 1737756172204 + - target: $["paths"]["/v1/forms/{form_id}/sign"]["put"] + update: + x-speakeasy-group: companyForms + x-speakeasy-name-override: sign + x-speakeasy-metadata: + type: method-name + before: sdk.Company Forms.put-v1-company-form-sign() + after: sdk.companyForms.sign() + reviewed_at: 1737756176193 + created_at: 1737756172204 + - target: $["paths"]["/v1/wire_in_requests/{wire_in_request_uuid}"]["put"] + update: + x-speakeasy-group: wireInRequests + x-speakeasy-name-override: submitRequest + x-speakeasy-metadata: + type: method-name + before: sdk.Wire In Requests.put-wire_in_requests-wire_in_request_uuid() + after: sdk.wireInRequests.submitRequest() + reviewed_at: 1737756176193 + created_at: 1737756172204 + - target: $["paths"]["/v1/employees/{employee_id}"]["delete"] + update: + x-speakeasy-name-override: delete + x-speakeasy-metadata: + type: method-name + before: sdk.Employees.delete-v1-employee() + after: sdk.employees.delete() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/companies/{company_id}/earning_types"]["get"] + update: + x-speakeasy-group: earningTypes + x-speakeasy-name-override: getAll + x-speakeasy-metadata: + type: method-name + before: sdk.Earning Types.get-v1-companies-company_id-earning_types() + after: sdk.earningTypes.getAll() + reviewed_at: 1737756176193 + created_at: 1737756172204 + - target: $["paths"]["/v1/companies/{company_uuid}/contractors"]["post"] + update: + x-speakeasy-name-override: create + x-speakeasy-metadata: + type: method-name + before: sdk.Contractors.post-v1-companies-company_uuid-contractors() + after: sdk.contractors.create() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/companies/{company_id}/payroll_reversals"]["get"] + update: + x-speakeasy-name-override: getReversals + x-speakeasy-metadata: + type: method-name + before: sdk.Payrolls.get-v1-companies-company_id-payroll_reversals() + after: sdk.payrolls.getReversals() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/departments/{department_uuid}"]["get"] + update: + x-speakeasy-name-override: get + x-speakeasy-metadata: + type: method-name + before: sdk.Departments.get-department() + after: sdk.departments.get() + reviewed_at: 1737756176193 + created_at: 1737756172204 + - target: $["paths"]["/v1/payrolls/{payroll_id}/employees/{employee_id}/pay_stub"]["get"] + update: + x-speakeasy-name-override: getPayStub + x-speakeasy-metadata: + type: method-name + before: sdk.Payrolls.get-v1-payrolls-payroll_uuid-employees-employee_uuid-pay_stub() + after: sdk.payrolls.getPayStub() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/home_addresses/{home_address_uuid}"]["get"] + update: + x-speakeasy-group: employeeAddresses + x-speakeasy-name-override: getHomeAddress + x-speakeasy-metadata: + type: method-name + before: sdk.Employee Addresses.get-v1-home_addresses-home_address_uuid() + after: sdk.employeeAddresses.getHomeAddress() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/companies/{company_id}/pay_schedules/assignments"]["get"] + update: + x-speakeasy-group: paySchedules + x-speakeasy-name-override: getAssignments + x-speakeasy-metadata: + type: method-name + before: sdk.Pay Schedules.get-v1-companies-company_id-pay_schedules-assignments() + after: sdk.paySchedules.getAssignments() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/employees/{employee_id}/onboarding_status"]["get"] + update: + x-speakeasy-name-override: getOnboardingStatus + x-speakeasy-metadata: + type: method-name + before: sdk.Employees.get-v1-employees-employee_id-onboarding_status() + after: sdk.employees.getOnboardingStatus() + reviewed_at: 1737756176193 + created_at: 1737756172202 + - target: $["paths"]["/v1/employees/{employee_id}/employee_benefits"]["get"] + update: + x-speakeasy-group: employeeBenefits + x-speakeasy-name-override: getAll + x-speakeasy-metadata: + type: method-name + before: sdk.Employee Benefits.get-v1-employees-employee_id-employee_benefits() + after: sdk.employeeBenefits.getAll() + reviewed_at: 1737756176193 + created_at: 1737756172202 + - target: $["paths"]["/v1/companies/{company_id}/pay_schedules/assignment_preview"]["post"] + update: + x-speakeasy-group: paySchedules + x-speakeasy-name-override: previewAssignment + x-speakeasy-metadata: + type: method-name + before: sdk.Pay Schedules.post-v1-companies-company_id-pay_schedules-assignment_preview() + after: sdk.paySchedules.previewAssignment() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/employees/{employee_id}/i9_authorization/employer_sign"]["put"] + update: + x-speakeasy-group: i9Verification + x-speakeasy-name-override: employerSign + x-speakeasy-metadata: + type: method-name + before: sdk.I-9 Verification.put-v1-employees-employee_id-i9_authorization-employer_sign() + after: sdk.i9Verification.employerSign() + reviewed_at: 1737756176193 + created_at: 1737756172204 + - target: $["paths"]["/v1/companies/{company_id}/contractor_payments"]["post"] + update: + x-speakeasy-group: contractorPayments + x-speakeasy-name-override: create + x-speakeasy-metadata: + type: method-name + before: sdk.Contractor Payments.post-v1-companies-company_id-contractor_payments() + after: sdk.contractorPayments.create() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/documents/{document_uuid}/sign"]["put"] + update: + x-speakeasy-group: contractorDocuments + x-speakeasy-name-override: sign + x-speakeasy-metadata: + type: method-name + before: sdk.Contractor Documents.put-v1-contractor-document-sign() + after: sdk.contractorDocuments.sign() + reviewed_at: 1737756176193 + created_at: 1737756172202 + - target: $["paths"]["/v1/employees/{employee_id}"]["put"] + update: + x-speakeasy-name-override: update + x-speakeasy-metadata: + type: method-name + before: sdk.Employees.put-v1-employees() + after: sdk.employees.update() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/employees/{employee_id}/onboarding_documents_config"]["put"] + update: + x-speakeasy-name-override: updateOnboardingDocumentsConfig + x-speakeasy-metadata: + type: method-name + before: sdk.Employees.put-v1-employees-employee_id-onboarding_documents_config() + after: sdk.employees.updateOnboardingDocumentsConfig() + reviewed_at: 1737756176193 + created_at: 1737756172202 + - target: $["paths"]["/v1/companies/{company_uuid}/tax_requirements/{state}"]["put"] + update: + x-speakeasy-group: taxRequirements + x-speakeasy-name-override: update + x-speakeasy-metadata: + type: method-name + before: sdk.Tax Requirements.put-v1-companies-company_uuid-tax_requirements-state() + after: sdk.taxRequirements.update() + reviewed_at: 1737756176193 + created_at: 1737756172204 + - target: $["paths"]["/v1/departments/{department_uuid}"]["delete"] + update: + x-speakeasy-name-override: delete + x-speakeasy-metadata: + type: method-name + before: sdk.Departments.delete-department() + after: sdk.departments.delete() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/employees/{employee_id}/rehire"]["get"] + update: + x-speakeasy-group: employeeEmployments + x-speakeasy-name-override: getRehire + x-speakeasy-metadata: + type: method-name + before: sdk.Employee Employments.get-v1-employees-employee_id-rehire() + after: sdk.employeeEmployments.getRehire() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/companies/{company_id}/payrolls/{payroll_id}"]["delete"] + update: + x-speakeasy-name-override: delete + x-speakeasy-metadata: + type: method-name + before: sdk.Payrolls.delete-v1-companies-company_id-payrolls() + after: sdk.payrolls.delete() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/companies/{company_uuid}/tax_requirements"]["get"] + update: + x-speakeasy-group: taxRequirements + x-speakeasy-name-override: getAll + x-speakeasy-metadata: + type: method-name + before: sdk.Tax Requirements.get-v1-companies-company_uuid-tax_requirements() + after: sdk.taxRequirements.getAll() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/companies/{company_id}/attachments/{company_attachment_uuid}/download_url"]["get"] + update: + x-speakeasy-group: companyAttachment + x-speakeasy-name-override: getDownloadUrl + x-speakeasy-metadata: + type: method-name + before: sdk.Company Attachment.get-v1-companies-attachment-url() + after: sdk.companyAttachment.getDownloadUrl() + reviewed_at: 1737756176193 + created_at: 1737756172202 + - target: $["paths"]["/v1/companies/{company_uuid}/departments"]["post"] + update: + x-speakeasy-name-override: create + x-speakeasy-metadata: + type: method-name + before: sdk.Departments.post-departments() + after: sdk.departments.create() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/companies/{company_uuid}/wire_in_requests"]["get"] + update: + x-speakeasy-group: wireInRequests + x-speakeasy-name-override: getAll + x-speakeasy-metadata: + type: method-name + before: sdk.Wire In Requests.get-companies-company_uuid-wire_in_request_uuid() + after: sdk.wireInRequests.getAll() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/employees/{employee_id}/onboarding_status"]["put"] + update: + x-speakeasy-name-override: updateOnboardingStatus + x-speakeasy-metadata: + type: method-name + before: sdk.Employees.put-v1-employees-employee_id-onboarding_status() + after: sdk.employees.updateOnboardingStatus() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/companies/{company_id}/custom_fields"]["get"] + update: + x-speakeasy-name-override: getCustomFields + x-speakeasy-metadata: + type: method-name + before: sdk.Companies.get-v1-companies-company_id-custom_fields() + after: sdk.companies.getCustomFields() + reviewed_at: 1737756176193 + created_at: 1737756172202 + - target: $["paths"]["/v1/home_addresses/{home_address_uuid}"]["put"] + update: + x-speakeasy-group: employeeAddresses + x-speakeasy-name-override: updateHomeAddress + x-speakeasy-metadata: + type: method-name + before: sdk.Employee Addresses.put-v1-home_addresses-home_address_uuid() + after: sdk.employeeAddresses.updateHomeAddress() + reviewed_at: 1737756176193 + created_at: 1737756172202 + - target: $["paths"]["/v1/recovery_cases/{recovery_case_uuid}/redebit"]["put"] + update: + x-speakeasy-group: recoveryCases + x-speakeasy-name-override: redebit + x-speakeasy-metadata: + type: method-name + before: sdk.Recovery Cases.redebit-recovery-case() + after: sdk.recoveryCases.redebit() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/benefits/{benefit_id}/requirements"]["get"] + update: + x-speakeasy-group: companyBenefits + x-speakeasy-name-override: getRequirements + x-speakeasy-metadata: + type: method-name + before: sdk.Company Benefits.get-v1-benefits-benefits_id-requirements() + after: sdk.companyBenefits.getRequirements() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/employees/{employee_id}/home_addresses"]["post"] + update: + x-speakeasy-group: employeeAddresses + x-speakeasy-name-override: create + x-speakeasy-metadata: + type: method-name + before: sdk.Employee Addresses.post-v1-employees-employee_id-home_addresses() + after: sdk.employeeAddresses.create() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/companies/{company_id}/employees"]["get"] + update: + x-speakeasy-name-override: get + x-speakeasy-metadata: + type: method-name + before: sdk.Employees.get-v1-companies-company_id-employees() + after: sdk.employees.get() + reviewed_at: 1737756176193 + created_at: 1737756172202 + - target: $["paths"]["/v1/employees/{employee_id}/rehire"]["post"] + update: + x-speakeasy-group: employeeEmployments + x-speakeasy-name-override: createRehire + x-speakeasy-metadata: + type: method-name + before: sdk.Employee Employments.post-v1-employees-employee_id-rehire() + after: sdk.employeeEmployments.createRehire() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/employees/{employee_id}/forms/{form_id}/pdf"]["get"] + update: + x-speakeasy-group: employeeForms + x-speakeasy-name-override: getPdf + x-speakeasy-metadata: + type: method-name + before: sdk.Employee Forms.get-v1-employee-form-pdf() + after: sdk.employeeForms.getPdf() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/contractor_payment_groups/{contractor_payment_group_uuid}"]["get"] + update: + x-speakeasy-group: contractorPaymentGroups + x-speakeasy-name-override: get + x-speakeasy-metadata: + type: method-name + before: sdk.Contractor Payment Groups.get-v1-contractor_payment_groups-contractor_payment_group_id() + after: sdk.contractorPaymentGroups.get() + reviewed_at: 1737756176193 + created_at: 1737756172202 + - target: $["paths"]["/v1/time_off_policies/{time_off_policy_uuid}"]["put"] + update: + x-speakeasy-group: timeOffPolicies + x-speakeasy-name-override: update + x-speakeasy-metadata: + type: method-name + before: sdk.Time Off Policies.put-time_off_policies-time_off_policy_uuid() + after: sdk.timeOffPolicies.update() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/compensations/{compensation_id}"]["delete"] + update: + x-speakeasy-group: jobsAndCompensations + x-speakeasy-name-override: deleteCompensation + x-speakeasy-metadata: + type: method-name + before: sdk.Jobs and Compensations.delete-v1-compensations-compensation_id() + after: sdk.jobsAndCompensations.deleteCompensation() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/companies/{company_uuid}/flows"]["post"] + update: + x-speakeasy-name-override: create + x-speakeasy-metadata: + type: method-name + before: sdk.Flows.post-v1-company-flows() + after: sdk.flows.create() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/contractors/{contractor_uuid}/forms/{form_id}"]["get"] + update: + x-speakeasy-group: contractorForms + x-speakeasy-name-override: get + x-speakeasy-metadata: + type: method-name + before: sdk.Contractor Forms.get-v1-contractor-form() + after: sdk.contractorForms.get() + reviewed_at: 1737756176193 + created_at: 1737756172204 + - target: $["paths"]["/v1/companies/{company_uuid}/holiday_pay_policy"]["delete"] + update: + x-speakeasy-group: holidayPayPolicies + x-speakeasy-name-override: delete + x-speakeasy-metadata: + type: method-name + before: sdk.Holiday Pay Policies.delete-companies-company_uuid-holiday_pay_policy() + after: sdk.holidayPayPolicies.delete() + reviewed_at: 1737756176193 + created_at: 1737756172202 + - target: $["paths"]["/v1/companies/{company_uuid}/holiday_pay_policy/remove"]["put"] + update: + x-speakeasy-group: holidayPayPolicies + x-speakeasy-name-override: removeEmployees + x-speakeasy-metadata: + type: method-name + before: sdk.Holiday Pay Policies.put-companies-company_uuid-holiday_pay_policy-remove() + after: sdk.holidayPayPolicies.removeEmployees() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/employees/{employee_id}/terminations"]["get"] + update: + x-speakeasy-group: employeeEmployments + x-speakeasy-name-override: getTermination + x-speakeasy-metadata: + type: method-name + before: sdk.Employee Employments.get-v1-employees-employee_id-terminations() + after: sdk.employeeEmployments.getTermination() + reviewed_at: 1737756176193 + created_at: 1737756172202 + - target: $["paths"]["/v1/contractors/{contractor_uuid}/payment_method"]["put"] + update: + x-speakeasy-group: contractorPaymentMethod + x-speakeasy-name-override: updatePaymentMethod + x-speakeasy-metadata: + type: method-name + before: sdk.Contractor Payment Method.put-v1-contractors-contractor_id-payment_method() + after: sdk.contractorPaymentMethod.updatePaymentMethod() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/locations/{location_uuid}/minimum_wages"]["get"] + update: + x-speakeasy-name-override: getMinimumWages + x-speakeasy-metadata: + type: method-name + before: sdk.Locations.get-v1-locations-location_uuid-minimum_wages() + after: sdk.locations.getMinimumWages() + reviewed_at: 1737756176193 + created_at: 1737756172202 + - target: $["paths"]["/v1/token_info"]["get"] + update: + x-speakeasy-name-override: getTokenInfo + x-speakeasy-metadata: + type: method-name + before: sdk.Introspection.get-v1-token-info() + after: sdk.introspection.getTokenInfo() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/jobs/{job_id}"]["put"] + update: + x-speakeasy-group: jobsAndCompensations + x-speakeasy-name-override: update + x-speakeasy-metadata: + type: method-name + before: sdk.Jobs and Compensations.put-v1-jobs-job_id() + after: sdk.jobsAndCompensations.update() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/employees/{employee_uuid}/federal_taxes"]["get"] + update: + x-speakeasy-group: employeeTaxSetup + x-speakeasy-name-override: getFederalTaxes + x-speakeasy-metadata: + type: method-name + before: sdk.Employee Tax Setup.get-v1-employees-employee_id-federal_taxes() + after: sdk.employeeTaxSetup.getFederalTaxes() + reviewed_at: 1737756176193 + created_at: 1737756172202 + - target: $["paths"]["/v1/employees/{employee_id}/forms"]["get"] + update: + x-speakeasy-group: employeeForms + x-speakeasy-name-override: getAll + x-speakeasy-metadata: + type: method-name + before: sdk.Employee Forms.get-v1-employee-forms() + after: sdk.employeeForms.getAll() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/companies/{company_uuid}/signatories/{signatory_uuid}"]["delete"] + update: + x-speakeasy-name-override: delete + x-speakeasy-metadata: + type: method-name + before: sdk.Signatories.delete-v1-companies-company_uuid-signatories-signatory_uuid() + after: sdk.signatories.delete() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/employees/{employee_id}/pay_stubs"]["get"] + update: + x-speakeasy-name-override: getPayStubs + x-speakeasy-metadata: + type: method-name + before: sdk.Payrolls.get-v1-employees-employee_uuid-pay_stubs() + after: sdk.payrolls.getPayStubs() + reviewed_at: 1737756176193 + created_at: 1737756172202 + - target: $["paths"]["/v1/companies/{company_id}/forms"]["get"] + update: + x-speakeasy-group: companies.forms + x-speakeasy-name-override: list + x-speakeasy-metadata: + type: method-name + before: sdk.Company Forms.get-v1-company-forms() + after: sdk.companies.forms.list() + reviewed_at: 1737756176193 + created_at: 1737756172202 + - target: $["paths"]["/v1/companies/{company_id}/payrolls/{payroll_id}"]["put"] + update: + x-speakeasy-name-override: update + x-speakeasy-metadata: + type: method-name + before: sdk.Payrolls.put-v1-companies-company_id-payrolls() + after: sdk.payrolls.update() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/forms/{form_id}/pdf"]["get"] + update: + x-speakeasy-group: companyForms + x-speakeasy-name-override: getPdf + x-speakeasy-metadata: + type: method-name + before: sdk.Company Forms.get-v1-company-form-pdf() + after: sdk.companyForms.getPdf() + reviewed_at: 1737756176193 + created_at: 1737756172202 + - target: $["paths"]["/v1/employees/{employee_id}/home_addresses"]["get"] + update: + x-speakeasy-group: employeeAddresses + x-speakeasy-name-override: getHomeAddresses + x-speakeasy-metadata: + type: method-name + before: sdk.Employee Addresses.get-v1-employees-employee_id-home_addresses() + after: sdk.employeeAddresses.getHomeAddresses() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/contractors/{contractor_uuid}/onboarding_status"]["put"] + update: + x-speakeasy-name-override: updateOnboardingStatus + x-speakeasy-metadata: + type: method-name + before: sdk.Contractors.put-v1-contractors-contractor_uuid-onboarding_status() + after: sdk.contractors.updateOnboardingStatus() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/locations/{location_id}"]["put"] + update: + x-speakeasy-name-override: update + x-speakeasy-metadata: + type: method-name + before: sdk.Locations.put-v1-locations-location_id() + after: sdk.locations.update() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/companies/{company_uuid}/external_payrolls/{external_payroll_id}/calculate_taxes"]["get"] + update: + x-speakeasy-group: externalPayrolls + x-speakeasy-name-override: getTaxSuggestions + x-speakeasy-metadata: + type: method-name + before: sdk.External Payrolls.get-v1-external-payroll-calculate-taxes() + after: sdk.externalPayrolls.getTaxSuggestions() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/contractor_payments/{contractor_payment_uuid}/receipt"]["get"] + update: + x-speakeasy-group: contractorPayments + x-speakeasy-name-override: getReceipt + x-speakeasy-metadata: + type: method-name + before: sdk.Contractor Payments.get-v1-contractor_payments-contractor_payment_uuid-receipt() + after: sdk.contractorPayments.getReceipt() + reviewed_at: 1737756176193 + created_at: 1737756172202 + - target: $["paths"]["/v1/webhook_subscriptions/{webhook_subscription_uuid}/request_verification_token"]["get"] + update: + x-speakeasy-name-override: requestVerificationToken + x-speakeasy-metadata: + type: method-name + before: sdk.Webhooks.get-v1-webhook-subscription-verification-token-uuid() + after: sdk.webhooks.requestVerificationToken() + reviewed_at: 1737756176193 + created_at: 1737756172202 + - target: $["paths"]["/v1/generated_documents/{document_type}/{request_uuid}"]["get"] + update: + x-speakeasy-group: generatedDocuments + x-speakeasy-name-override: get + x-speakeasy-metadata: + type: method-name + before: sdk.Generated Documents.get-v1-generated_documents-document_type-request_uuid() + after: sdk.generatedDocuments.get() + reviewed_at: 1737756176193 + created_at: 1737756172204 + - target: $["paths"]["/v1/payrolls/{payroll_id}/employees/{employee_id}/calculate_accruing_time_off_hours"]["post"] + update: + x-speakeasy-group: timeOffPolicies + x-speakeasy-name-override: calculateAccruingHours + x-speakeasy-metadata: + type: method-name + before: sdk.Time Off Policies.post-v1-payrolls-payroll_id-calculate_accruing_time_off_hours() + after: sdk.timeOffPolicies.calculateAccruingHours() + reviewed_at: 1737756176193 + created_at: 1737756172202 + - target: $["paths"]["/v1/companies/{company_uuid}/external_payrolls/tax_liabilities"]["get"] + update: + x-speakeasy-group: externalPayrolls + x-speakeasy-name-override: getTaxLiabilities + x-speakeasy-metadata: + type: method-name + before: sdk.External Payrolls.get-v1-tax-liabilities() + after: sdk.externalPayrolls.getTaxLiabilities() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/employees/{employee_id}/i9_authorization/documents"]["put"] + update: + x-speakeasy-group: i9Verification + x-speakeasy-name-override: createDocuments + x-speakeasy-metadata: + type: method-name + before: sdk.I-9 Verification.put-v1-employees-employee_id-i9_authorization-documents() + after: sdk.i9Verification.createDocuments() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/companies/{company_id}/federal_tax_details"]["get"] + update: + x-speakeasy-group: federalTaxDetails + x-speakeasy-name-override: get + x-speakeasy-metadata: + type: method-name + before: sdk.Federal Tax Details.get-v1-companies-company_id-federal_tax_details() + after: sdk.federalTaxDetails.get() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/employees/{employee_uuid}/state_taxes"]["get"] + update: + x-speakeasy-group: employeeTaxSetup + x-speakeasy-name-override: getStateTaxes + x-speakeasy-metadata: + type: method-name + before: sdk.Employee Tax Setup.get-v1-employees-employee_id-state_taxes() + after: sdk.employeeTaxSetup.getStateTaxes() + reviewed_at: 1737756176193 + created_at: 1737756172202 + - target: $["paths"]["/v1/employees/{employee_id}/rehire"]["put"] + update: + x-speakeasy-group: employeeEmployments + x-speakeasy-name-override: updateRehire + x-speakeasy-metadata: + type: method-name + before: sdk.Employee Employments.put-v1-employees-employee_id-rehire() + after: sdk.employeeEmployments.updateRehire() + reviewed_at: 1737756176193 + created_at: 1737756172202 + - target: $["paths"]["/v1/companies/{company_uuid}/signatories/invite"]["post"] + update: + x-speakeasy-name-override: invite + x-speakeasy-metadata: + type: method-name + before: sdk.Signatories.post-v1-companies-company_uuid-signatories-invite() + after: sdk.signatories.invite() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/invoices/{invoice_period}"]["get"] + update: + x-speakeasy-name-override: get + x-speakeasy-metadata: + type: method-name + before: sdk.Invoices.get-invoices-invoice-period() + after: sdk.invoices.get() + reviewed_at: 1737756176193 + created_at: 1737756172204 + - target: $["paths"]["/v1/contractor_payment_groups/{contractor_payment_group_uuid}"]["delete"] + update: + x-speakeasy-group: contractorPaymentGroups + x-speakeasy-name-override: delete + x-speakeasy-metadata: + type: method-name + before: sdk.Contractor Payment Groups.delete-v1-contractor_payment_groups-contractor_payment_group_id() + after: sdk.contractorPaymentGroups.delete() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/webhook_subscriptions"]["post"] + update: + x-speakeasy-name-override: createSubscription + x-speakeasy-metadata: + type: method-name + before: sdk.Webhooks.post-v1-webhook-subscription() + after: sdk.webhooks.createSubscription() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/plaid/processor_token"]["post"] + update: + x-speakeasy-group: bankAccounts + x-speakeasy-name-override: createFromProcessorToken + x-speakeasy-metadata: + type: method-name + before: sdk.Bank Accounts.post-v1-plaid-processor_token() + after: sdk.bankAccounts.createFromProcessorToken() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/companies/{company_uuid}/recovery_cases"]["get"] + update: + x-speakeasy-group: recoveryCases + x-speakeasy-name-override: getAll + x-speakeasy-metadata: + type: method-name + before: sdk.Recovery Cases.get-recovery-cases() + after: sdk.recoveryCases.getAll() + reviewed_at: 1737756176193 + created_at: 1737756172202 + - target: $["paths"]["/v1/employees/{employee_id}/payment_method"]["get"] + update: + x-speakeasy-group: employeePaymentMethod + x-speakeasy-name-override: get + x-speakeasy-metadata: + type: method-name + before: sdk.Employee Payment Method.get-v1-employees-employee_id-payment_method() + after: sdk.employeePaymentMethod.get() + reviewed_at: 1737756176193 + created_at: 1737756172202 + - target: $["paths"]["/v1/companies/{company_uuid}/reports"]["post"] + update: + x-speakeasy-name-override: create + x-speakeasy-metadata: + type: method-name + before: sdk.Reports.post-companies-company_uuid-reports() + after: sdk.reports.create() + reviewed_at: 1737756176193 + created_at: 1737756172202 + - target: $["paths"]["/v1/departments/{department_uuid}/remove"]["put"] + update: + x-speakeasy-name-override: removePeople + x-speakeasy-metadata: + type: method-name + before: sdk.Departments.put-remove-people-from-department() + after: sdk.departments.removePeople() + reviewed_at: 1737756176193 + created_at: 1737756172204 + - target: $["paths"]["/v1/time_off_policies/{time_off_policy_uuid}/remove_employees"]["put"] + update: + x-speakeasy-group: timeOffPolicies + x-speakeasy-name-override: removeEmployees + x-speakeasy-metadata: + type: method-name + before: sdk.Time Off Policies.put-v1-time_off_policies-time_off_policy_uuid-remove_employees() + after: sdk.timeOffPolicies.removeEmployees() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/companies/{company_uuid}/external_payrolls/{external_payroll_id}"]["put"] + update: + x-speakeasy-group: externalPayrolls + x-speakeasy-name-override: update + x-speakeasy-metadata: + type: method-name + before: sdk.External Payrolls.put-v1-external-payroll() + after: sdk.externalPayrolls.update() + reviewed_at: 1737756176193 + created_at: 1737756172202 + - target: $["paths"]["/v1/contractors/{contractor_uuid}/bank_accounts"]["post"] + update: + x-speakeasy-group: contractorPaymentMethod + x-speakeasy-name-override: createBankAccount + x-speakeasy-metadata: + type: method-name + before: sdk.Contractor Payment Method.post-v1-contractors-contractor_uuid-bank_accounts() + after: sdk.contractorPaymentMethod.createBankAccount() + reviewed_at: 1737756176193 + created_at: 1737756172202 + - target: $["paths"]["/v1/employees/{employee_id}/terminations"]["delete"] + update: + x-speakeasy-group: employeeEmployments + x-speakeasy-name-override: deleteTermination + x-speakeasy-metadata: + type: method-name + before: sdk.Employee Employments.delete-v1-employees-employee_id-terminations() + after: sdk.employeeEmployments.deleteTermination() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/oauth/token"]["post"] + update: + x-speakeasy-name-override: refreshAccessToken + x-speakeasy-metadata: + type: method-name + before: sdk.Introspection.refresh-access-token() + after: sdk.introspection.refreshAccessToken() + reviewed_at: 1737756176193 + created_at: 1737756172202 + - target: $["paths"]["/v1/companies/{company_id}/pay_schedules/preview"]["get"] + update: + x-speakeasy-group: paySchedules + x-speakeasy-name-override: preview + x-speakeasy-metadata: + type: method-name + before: sdk.Pay Schedules.get-v1-companies-company_id-pay_schedules-preview() + after: sdk.paySchedules.preview() + reviewed_at: 1737756176193 + created_at: 1737756172202 + - target: $["paths"]["/v1/employees/{employee_id}/forms/{form_id}"]["get"] + update: + x-speakeasy-group: employeeForms + x-speakeasy-name-override: getForm + x-speakeasy-metadata: + type: method-name + before: sdk.Employee Forms.get-v1-employee-form() + after: sdk.employeeForms.getForm() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/partner_managed_companies/{company_uuid}/migrate"]["put"] + update: + x-speakeasy-name-override: migrate + x-speakeasy-metadata: + type: method-name + before: sdk.Companies.put-v1-partner-managed-companies-company-uuid-migrate() + after: sdk.companies.migrate() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/companies/{company_id}/company_benefits"]["get"] + update: + x-speakeasy-group: companies.benefits + x-speakeasy-name-override: list + x-speakeasy-metadata: + type: method-name + before: sdk.Company Benefits.get-v1-companies-company_id-company_benefits() + after: sdk.companies.benefits.list() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/time_off_policies/{time_off_policy_uuid}"]["get"] + update: + x-speakeasy-group: timeOffPolicies + x-speakeasy-name-override: retrieve + x-speakeasy-metadata: + type: method-name + before: sdk.Time Off Policies.get-time_off_policies-time_off_policy_uuid() + after: sdk.timeOffPolicies.retrieve() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/companies/{company_uuid}/external_payrolls/tax_liabilities"]["put"] + update: + x-speakeasy-group: externalPayrolls + x-speakeasy-name-override: updateTaxLiabilities + x-speakeasy-metadata: + type: method-name + before: sdk.External Payrolls.put-v1-tax-liabilities() + after: sdk.externalPayrolls.updateTaxLiabilities() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/departments/{department_uuid}/add"]["put"] + update: + x-speakeasy-name-override: addPeople + x-speakeasy-metadata: + type: method-name + before: sdk.Departments.put-add-people-to-department() + after: sdk.departments.addPeople() + reviewed_at: 1737756176193 + created_at: 1737756172204 + - target: $["paths"]["/v1/companies/{company_uuid}/external_payrolls"]["get"] + update: + x-speakeasy-group: externalPayrolls + x-speakeasy-name-override: list + x-speakeasy-metadata: + type: method-name + before: sdk.External Payrolls.get-v1-company-external-payrolls() + after: sdk.externalPayrolls.list() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/jobs/{job_id}/compensations"]["post"] + update: + x-speakeasy-group: jobsAndCompensations + x-speakeasy-name-override: createCompensation + x-speakeasy-metadata: + type: method-name + before: sdk.Jobs and Compensations.post-v1-compensations-compensation_id() + after: sdk.jobsAndCompensations.createCompensation() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/companies/{company_id}/attachments"]["post"] + update: + x-speakeasy-group: companyAttachments + x-speakeasy-name-override: create + x-speakeasy-metadata: + type: method-name + before: sdk.Company Attachment.post-v1-companies-attachment() + after: sdk.companyAttachments.create() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/employees/{employee_id}/employment_history"]["get"] + update: + x-speakeasy-group: employeeEmployments + x-speakeasy-name-override: getHistory + x-speakeasy-metadata: + type: method-name + before: sdk.Employee Employments.get-v1-employees-employee_id-employment_history() + after: sdk.employeeEmployments.getHistory() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/work_addresses/{work_address_uuid}"]["delete"] + update: + x-speakeasy-group: employeeAddresses + x-speakeasy-name-override: delete + x-speakeasy-metadata: + type: method-name + before: sdk.Employee Addresses.delete-v1-work_addresses-work_address_uuid() + after: sdk.employeeAddresses.delete() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/employees/{employee_id}/bank_accounts/{bank_account_uuid}"]["delete"] + update: + x-speakeasy-group: employeePaymentMethod + x-speakeasy-name-override: deleteBankAccount + x-speakeasy-metadata: + type: method-name + before: sdk.Employee Payment Method.delete-v1-employees-employee_id-bank_accounts-bank_account_id() + after: sdk.employeePaymentMethod.deleteBankAccount() + reviewed_at: 1737756176193 + created_at: 1737756172202 + - target: $["paths"]["/v1/webhook_subscriptions/{webhook_subscription_uuid}"]["delete"] + update: + x-speakeasy-name-override: delete + x-speakeasy-metadata: + type: method-name + before: sdk.Webhooks.delete-v1-webhook-subscription-uuid() + after: sdk.webhooks.delete() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/companies/{company_uuid}/external_payrolls/tax_liabilities/finish"]["put"] + update: + x-speakeasy-group: externalPayrolls + x-speakeasy-name-override: finalizeTaxLiabilities + x-speakeasy-metadata: + type: method-name + before: sdk.External Payrolls.put-v1-tax-liabilities-finish() + after: sdk.externalPayrolls.finalizeTaxLiabilities() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/companies/{company_uuid}/holiday_pay_policy"]["put"] + update: + x-speakeasy-group: holidayPayPolicies + x-speakeasy-name-override: update + x-speakeasy-metadata: + type: method-name + before: sdk.Holiday Pay Policies.put-companies-company_uuid-holiday_pay_policy() + after: sdk.holidayPayPolicies.update() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/companies/{company_uuid}/contractors"]["get"] + update: + x-speakeasy-name-override: list + x-speakeasy-metadata: + type: method-name + before: sdk.Contractors.get-v1-companies-company_uuid-contractors() + after: sdk.contractors.list() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/companies/{company_uuid}/historical_employees/{historical_employee_uuid}"]["put"] + update: + x-speakeasy-name-override: updateHistorical + x-speakeasy-metadata: + type: method-name + before: sdk.Employees.put-v1-historical_employees() + after: sdk.employees.updateHistorical() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/companies/{company_id}/payrolls/{payroll_id}/cancel"]["put"] + update: + x-speakeasy-name-override: cancel + x-speakeasy-metadata: + type: method-name + before: sdk.Payrolls.put-api-v1-companies-company_id-payrolls-payroll_id-cancel() + after: sdk.payrolls.cancel() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/contractors/{contractor_uuid}/address"]["put"] + update: + x-speakeasy-name-override: updateAddress + x-speakeasy-metadata: + type: method-name + before: sdk.Contractors.put-v1-contractors-contractor_uuid-address() + after: sdk.contractors.updateAddress() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/locations/{location_id}"]["get"] + update: + x-speakeasy-name-override: get + x-speakeasy-metadata: + type: method-name + before: sdk.Locations.get-v1-locations-location_id() + after: sdk.locations.get() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/home_addresses/{home_address_uuid}"]["delete"] + update: + x-speakeasy-group: employeeAddresses + x-speakeasy-name-override: removeHomeAddress + x-speakeasy-metadata: + type: method-name + before: sdk.Employee Addresses.delete-v1-home_addresses-home_address_uuid() + after: sdk.employeeAddresses.removeHomeAddress() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/companies/{company_uuid}/finish_onboarding"]["put"] + update: + x-speakeasy-name-override: finishOnboarding + x-speakeasy-metadata: + type: method-name + before: sdk.Companies.get-v1-company-finish-onboarding() + after: sdk.companies.finishOnboarding() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/companies/{company_id}/admins"]["get"] + update: + x-speakeasy-name-override: getAdmins + x-speakeasy-metadata: + type: method-name + before: sdk.Companies.get-v1-companies-company_id-admins() + after: sdk.companies.getAdmins() + reviewed_at: 1737756176193 + created_at: 1737756172202 + - target: $["paths"]["/v1/payrolls/{payroll_uuid}/generated_documents/printable_payroll_checks"]["post"] + update: + x-speakeasy-name-override: generatePrintableChecks + x-speakeasy-metadata: + type: method-name + before: sdk.Payrolls.post-v1-payrolls-payroll_uuid-generated_documents-printable_payroll_checks() + after: sdk.payrolls.generatePrintableChecks() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/jobs/{job_id}"]["get"] + update: + x-speakeasy-group: jobsAndCompensations + x-speakeasy-name-override: getJob + x-speakeasy-metadata: + type: method-name + before: sdk.Jobs and Compensations.get-v1-jobs-job_id() + after: sdk.jobsAndCompensations.getJob() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/company_benefits/{company_benefit_id}"]["put"] + update: + x-speakeasy-group: companyBenefits + x-speakeasy-name-override: update + x-speakeasy-metadata: + type: method-name + before: sdk.Company Benefits.put-v1-company_benefits-company_benefit_id() + after: sdk.companyBenefits.update() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/companies/{company_uuid}/payrolls/skip"]["post"] + update: + x-speakeasy-name-override: skip + x-speakeasy-metadata: + type: method-name + before: sdk.Payrolls.post-companies-payroll-skip-company_uuid() + after: sdk.payrolls.skip() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/time_off_policies/{time_off_policy_uuid}/balance"]["put"] + update: + x-speakeasy-group: timeOffPolicies + x-speakeasy-name-override: updateBalance + x-speakeasy-metadata: + type: method-name + before: sdk.Time Off Policies.put-version-time_off_policies-time_off_policy_uuid-balance() + after: sdk.timeOffPolicies.updateBalance() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/jobs/{job_id}"]["delete"] + update: + x-speakeasy-group: jobsAndCompensations + x-speakeasy-name-override: deleteJob + x-speakeasy-metadata: + type: method-name + before: sdk.Jobs and Compensations.delete-v1-jobs-job_id() + after: sdk.jobsAndCompensations.deleteJob() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/employees/{employee_id}/jobs"]["post"] + update: + x-speakeasy-group: jobsAndCompensations + x-speakeasy-name-override: createJob + x-speakeasy-metadata: + type: method-name + before: sdk.Jobs and Compensations.post-v1-jobs-job_id() + after: sdk.jobsAndCompensations.createJob() + reviewed_at: 1737756176193 + created_at: 1737756172202 + - target: $["paths"]["/v1/company_benefits/{company_benefit_id}/employee_benefits"]["put"] + update: + x-speakeasy-group: companyBenefits + x-speakeasy-name-override: bulkUpdateEmployeeBenefits + x-speakeasy-metadata: + type: method-name + before: sdk.Company Benefits.put-v1-company_benefits-company_benefit_id-employee_benefits() + after: sdk.companyBenefits.bulkUpdateEmployeeBenefits() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/companies/{company_uuid}/time_off_policies"]["post"] + update: + x-speakeasy-group: timeOffPolicies + x-speakeasy-name-override: create + x-speakeasy-metadata: + type: method-name + before: sdk.Time Off Policies.post-companies-company_uuid-time_off_policies() + after: sdk.timeOffPolicies.create() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/webhook_subscriptions/{webhook_subscription_uuid}"]["put"] + update: + x-speakeasy-name-override: updateSubscription + x-speakeasy-metadata: + type: method-name + before: sdk.Webhooks.put-v1-webhook-subscription-uuid() + after: sdk.webhooks.updateSubscription() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/employees/{employee_id}/i9_authorization/documents"]["get"] + update: + x-speakeasy-group: i9Verification + x-speakeasy-name-override: getDocuments + x-speakeasy-metadata: + type: method-name + before: sdk.I-9 Verification.get-v1-employees-employee_id-i9_authorization-documents() + after: sdk.i9Verification.getDocuments() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/contractor_payments/{contractor_payment_uuid}/fund"]["put"] + update: + x-speakeasy-group: contractorPayments + x-speakeasy-name-override: fund + x-speakeasy-metadata: + type: method-name + before: sdk.Contractor Payments.get-v1-contractor_payments-contractor_payment_uuid-fund() + after: sdk.contractorPayments.fund() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/employees/{employee_id}/payment_method"]["put"] + update: + x-speakeasy-group: employeePaymentMethod + x-speakeasy-name-override: update + x-speakeasy-metadata: + type: method-name + before: sdk.Employee Payment Method.put-v1-employees-employee_id-payment_method() + after: sdk.employeePaymentMethod.update() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/partner_managed_companies/{company_uuid}/retrieve_terms_of_service"]["post"] + update: + x-speakeasy-name-override: retrieveTermsOfService + x-speakeasy-metadata: + type: method-name + before: sdk.Companies.post-partner-managed-companies-company_uuid-retrieve_terms_of_service() + after: sdk.companies.retrieveTermsOfService() + reviewed_at: 1737756176193 + created_at: 1737756172202 + - target: $["paths"]["/v1/contractors/{contractor_uuid}"]["delete"] + update: + x-speakeasy-name-override: delete + x-speakeasy-metadata: + type: method-name + before: sdk.Contractors.delete-v1-contractors-contractor_uuid() + after: sdk.contractors.delete() + reviewed_at: 1737756176193 + created_at: 1737756172202 + - target: $["paths"]["/v1/companies/{company_uuid}/payment_configs"]["put"] + update: + x-speakeasy-group: paymentConfigs + x-speakeasy-name-override: update + x-speakeasy-metadata: + type: method-name + before: sdk.Payment Configs.put-v1-company-payment-configs() + after: sdk.paymentConfigs.update() + reviewed_at: 1737756176193 + created_at: 1737756172202 + - target: $["paths"]["/v1/employee_benefits/{employee_benefit_id}"]["put"] + update: + x-speakeasy-group: employeeBenefits + x-speakeasy-name-override: update + x-speakeasy-metadata: + type: method-name + before: sdk.Employee Benefits.put-v1-employee_benefits-employee_benefit_id() + after: sdk.employeeBenefits.update() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/companies/{company_uuid}/holiday_pay_policy"]["get"] + update: + x-speakeasy-group: holidayPayPolicies + x-speakeasy-name-override: get + x-speakeasy-metadata: + type: method-name + before: sdk.Holiday Pay Policies.get-companies-company_uuid-holiday_pay_policy() + after: sdk.holidayPayPolicies.get() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/benefits"]["get"] + update: + x-speakeasy-group: companyBenefits + x-speakeasy-name-override: getAll + x-speakeasy-metadata: + type: method-name + before: sdk.Company Benefits.get-v1-benefits() + after: sdk.companyBenefits.getAll() + reviewed_at: 1737756176193 + created_at: 1737756172204 + - target: $["paths"]["/v1/sandbox/generate_w2"]["post"] + update: + x-speakeasy-group: employeeForms + x-speakeasy-name-override: generateW2 + x-speakeasy-metadata: + type: method-name + before: sdk.Employee Forms.post-v1-sandbox-generate_w2() + after: sdk.employeeForms.generateW2() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/notifications/{notification_uuid}"]["get"] + update: + x-speakeasy-name-override: get + x-speakeasy-metadata: + type: method-name + before: sdk.Notifications.get-notifications-notification_uuid() + after: sdk.notifications.get() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/companies/{company_id}/pay_periods/unprocessed_termination_pay_periods"]["get"] + update: + x-speakeasy-group: paySchedules + x-speakeasy-name-override: listUnprocessedTerminationPeriods + x-speakeasy-metadata: + type: method-name + before: sdk.Pay Schedules.get-v1-companies-company_id-unprocessed_termination_pay_periods() + after: sdk.paySchedules.listUnprocessedTerminationPeriods() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/garnishments/child_support"]["get"] + update: + x-speakeasy-name-override: getChildSupport + x-speakeasy-metadata: + type: method-name + before: sdk.Garnishments.get-v1-garnishments-child_support() + after: sdk.garnishments.getChildSupport() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/departments/{department_uuid}"]["put"] + update: + x-speakeasy-name-override: update + x-speakeasy-metadata: + type: method-name + before: sdk.Departments.put-departments() + after: sdk.departments.update() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/employees/{employee_id}/garnishments"]["get"] + update: + x-speakeasy-name-override: get + x-speakeasy-metadata: + type: method-name + before: sdk.Garnishments.get-v1-employees-employee_id-garnishments() + after: sdk.garnishments.get() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/companies/{company_id}/payrolls/{payroll_id}/submit"]["put"] + update: + x-speakeasy-name-override: submit + x-speakeasy-metadata: + type: method-name + before: sdk.Payrolls.put-v1-companies-company_id-payrolls-payroll_id-submit() + after: sdk.payrolls.submit() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/companies/{company_id}/contractor_payments"]["get"] + update: + x-speakeasy-group: contractorPayments + x-speakeasy-name-override: getPayments + x-speakeasy-metadata: + type: method-name + before: sdk.Contractor Payments.get-v1-companies-company_id-contractor_payments() + after: sdk.contractorPayments.getPayments() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/employees/{employee_id}/garnishments"]["post"] + update: + x-speakeasy-name-override: create + x-speakeasy-metadata: + type: method-name + before: sdk.Garnishments.post-v1-employees-employee_id-garnishments() + after: sdk.garnishments.create() + reviewed_at: 1737756176193 + created_at: 1737756172202 + - target: $["paths"]["/v1/terminations/{employee_id}"]["put"] + update: + x-speakeasy-group: employeeEmployments + x-speakeasy-name-override: updateTermination + x-speakeasy-metadata: + type: method-name + before: sdk.Employee Employments.put-v1-terminations-employee_id() + after: sdk.employeeEmployments.updateTermination() + reviewed_at: 1737756176193 + created_at: 1737756172202 + - target: $["paths"]["/v1/contractors/{contractor_uuid}/forms"]["get"] + update: + x-speakeasy-group: contractorForms + x-speakeasy-name-override: getAll + x-speakeasy-metadata: + type: method-name + before: sdk.Contractor Forms.get-v1-contractor-forms() + after: sdk.contractorForms.getAll() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/employees/{employee_id}/work_addresses"]["post"] + update: + x-speakeasy-group: employeeAddresses.workAddresses + x-speakeasy-name-override: create + x-speakeasy-metadata: + type: method-name + before: sdk.Employee Addresses.post-v1-employees-employee_id-work_addresses() + after: sdk.employeeAddresses.workAddresses.create() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/companies/{company_id}/employees"]["post"] + update: + x-speakeasy-name-override: create + x-speakeasy-metadata: + type: method-name + before: sdk.Employees.post-v1-employees() + after: sdk.employees.create() + reviewed_at: 1737756176193 + created_at: 1737756172202 + - target: $["paths"]["/v1/companies/{company_uuid}/external_payrolls"]["post"] + update: + x-speakeasy-group: externalPayrolls + x-speakeasy-name-override: create + x-speakeasy-metadata: + type: method-name + before: sdk.External Payrolls.post-v1-external-payroll() + after: sdk.externalPayrolls.create() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/partner_managed_companies"]["post"] + update: + x-speakeasy-name-override: createPartnerManaged + x-speakeasy-metadata: + type: method-name + before: sdk.Companies.post-v1-partner-managed-companies() + after: sdk.companies.createPartnerManaged() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/companies/{company_id}/contractor_payments/{contractor_payment_id}"]["get"] + update: + x-speakeasy-group: contractorPayments + x-speakeasy-name-override: get + x-speakeasy-metadata: + type: method-name + before: sdk.Contractor Payments.get-v1-companies-company_id-contractor_payment-contractor-payment() + after: sdk.contractorPayments.get() + reviewed_at: 1737756176193 + created_at: 1737756172204 + - target: $["paths"]["/v1/companies/{company_uuid}/signatories/{signatory_uuid}"]["put"] + update: + x-speakeasy-name-override: update + x-speakeasy-metadata: + type: method-name + before: sdk.Signatories.put-v1-companies-company_uuid-signatories-signatory_uuid() + after: sdk.signatories.update() + reviewed_at: 1737756176193 + created_at: 1737756172202 + - target: $["paths"]["/v1/companies/{company_id}/industry_selection"]["put"] + update: + x-speakeasy-group: industrySelection + x-speakeasy-name-override: update + x-speakeasy-metadata: + type: method-name + before: sdk.Industry Selection.put-v1-company-industry() + after: sdk.industrySelection.update() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/companies/{company_uuid}/payrolls/blockers"]["get"] + update: + x-speakeasy-name-override: getBlockers + x-speakeasy-metadata: + type: method-name + before: sdk.Payrolls.get-v1-companies-payroll-blockers-company_uuid() + after: sdk.payrolls.getBlockers() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/employees/{employee_id}/bank_accounts"]["post"] + update: + x-speakeasy-group: employeePaymentMethod + x-speakeasy-name-override: createBankAccount + x-speakeasy-metadata: + type: method-name + before: sdk.Employee Payment Method.post-v1-employees-employee_id-bank_accounts() + after: sdk.employeePaymentMethod.createBankAccount() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/companies/{company_id}/pay_schedules"]["post"] + update: + x-speakeasy-group: paySchedules + x-speakeasy-name-override: create + x-speakeasy-metadata: + type: method-name + before: sdk.Pay Schedules.post-v1-companies-company_id-pay_schedules() + after: sdk.paySchedules.create() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/contractors/{contractor_uuid}/payment_method"]["get"] + update: + x-speakeasy-group: contractorPaymentMethod + x-speakeasy-name-override: get + x-speakeasy-metadata: + type: method-name + before: sdk.Contractor Payment Method.get-v1-contractors-contractor_uuid-payment_method() + after: sdk.contractorPaymentMethod.get() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/companies/{company_uuid}/payment_configs"]["get"] + update: + x-speakeasy-group: paymentConfigs + x-speakeasy-name-override: get + x-speakeasy-metadata: + type: method-name + before: sdk.Payment Configs.get-v1-company-payment-configs() + after: sdk.paymentConfigs.get() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/work_addresses/{work_address_uuid}"]["get"] + update: + x-speakeasy-group: employeeAddresses + x-speakeasy-name-override: getWorkAddress + x-speakeasy-metadata: + type: method-name + before: sdk.Employee Addresses.get-v1-work_addresses-work_address_uuid() + after: sdk.employeeAddresses.getWorkAddress() + reviewed_at: 1737756176193 + created_at: 1737756172202 + - target: $["paths"]["/v1/employees/{employee_uuid}/federal_taxes"]["put"] + update: + x-speakeasy-group: employeeTaxSetup + x-speakeasy-name-override: updateFederalTaxes + x-speakeasy-metadata: + type: method-name + before: sdk.Employee Tax Setup.put-v1-employees-employee_id-federal_taxes() + after: sdk.employeeTaxSetup.updateFederalTaxes() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/payrolls/{payroll_uuid}/receipt"]["get"] + update: + x-speakeasy-name-override: getReceipt + x-speakeasy-metadata: + type: method-name + before: sdk.Payrolls.get-v1-payment-receipts-payrolls-payroll_uuid() + after: sdk.payrolls.getReceipt() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/companies/{company_id}/locations"]["get"] + update: + x-speakeasy-name-override: getAll + x-speakeasy-metadata: + type: method-name + before: sdk.Locations.get-v1-companies-company_id-locations() + after: sdk.locations.getAll() + reviewed_at: 1737756176193 + created_at: 1737756172202 + - target: $["paths"]["/v1/employees/{employee_id}/ytd_benefit_amounts_from_different_company"]["post"] + update: + x-speakeasy-group: employeeBenefits + x-speakeasy-name-override: createYtdAmountsFromDifferentCompany + x-speakeasy-metadata: + type: method-name + before: sdk.Employee Benefits.post-employee-ytd-benefit-amounts-from-different-company() + after: sdk.employeeBenefits.createYtdAmountsFromDifferentCompany() + reviewed_at: 1737756176193 + created_at: 1737756172204 + - target: $["paths"]["/v1/companies/{company_id}/earning_types/{earning_type_uuid}"]["delete"] + update: + x-speakeasy-group: earningTypes + x-speakeasy-name-override: deactivate + x-speakeasy-metadata: + type: method-name + before: sdk.Earning Types.delete-v1-companies-company_id-earning_types-earning_type_uuid() + after: sdk.earningTypes.deactivate() + reviewed_at: 1737756176193 + created_at: 1737756172202 + - target: $["paths"]["/v1/employees/{employee_uuid}/time_off_activities"]["get"] + update: + x-speakeasy-name-override: getTimeOffActivities + x-speakeasy-metadata: + type: method-name + before: sdk.Employees.get-version-employees-time_off_activities() + after: sdk.employees.getTimeOffActivities() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/companies/{company_uuid}/signatories"]["post"] + update: + x-speakeasy-name-override: create + x-speakeasy-metadata: + type: method-name + before: sdk.Signatories.post-v1-company-signatories() + after: sdk.signatories.create() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/employees/{employee_id}/i9_authorization/documents/{document_id}"]["delete"] + update: + x-speakeasy-group: i9Verification + x-speakeasy-name-override: deleteDocument + x-speakeasy-metadata: + type: method-name + before: sdk.I-9 Verification.delete-v1-employees-employee_id-i9_authorization-documents-document_id() + after: sdk.i9Verification.deleteDocument() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/sandbox/generate_1099"]["post"] + update: + x-speakeasy-group: contractorForms + x-speakeasy-name-override: generate1099 + x-speakeasy-metadata: + type: method-name + before: sdk.Contractor Forms.post-v1-sandbox-generate_1099() + after: sdk.contractorForms.generate1099() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/company_benefits/{company_benefit_id}"]["delete"] + update: + x-speakeasy-group: companyBenefits + x-speakeasy-name-override: delete + x-speakeasy-metadata: + type: method-name + before: sdk.Company Benefits.delete-v1-company_benefits-company_benefit_id() + after: sdk.companyBenefits.delete() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/contractors/{contractor_uuid}/onboarding_status"]["get"] + update: + x-speakeasy-name-override: getOnboardingStatus + x-speakeasy-metadata: + type: method-name + before: sdk.Contractors.get-v1-contractors-contractor_uuid-onboarding_status() + after: sdk.contractors.getOnboardingStatus() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/companies/{company_id}/pay_schedules"]["get"] + update: + x-speakeasy-group: paySchedules + x-speakeasy-name-override: getForCompany + x-speakeasy-metadata: + type: method-name + before: sdk.Pay Schedules.get-v1-companies-company_id-pay_schedules() + after: sdk.paySchedules.getForCompany() + reviewed_at: 1737756176193 + created_at: 1737756172202 + - target: $["paths"]["/v1/work_addresses/{work_address_uuid}"]["put"] + update: + x-speakeasy-group: employeeAddresses + x-speakeasy-name-override: updateWorkAddress + x-speakeasy-metadata: + type: method-name + before: sdk.Employee Addresses.put-v1-work_addresses-work_address_uuid() + after: sdk.employeeAddresses.updateWorkAddress() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/company_benefits/{company_benefit_id}"]["get"] + update: + x-speakeasy-group: companyBenefits + x-speakeasy-name-override: get + x-speakeasy-metadata: + type: method-name + before: sdk.Company Benefits.get-v1-company_benefits-company_benefit_id() + after: sdk.companyBenefits.get() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/employees/{employee_id}"]["get"] + update: + x-speakeasy-name-override: retrieve + x-speakeasy-metadata: + type: method-name + before: sdk.Employees.get-v1-employees() + after: sdk.employees.retrieve() + reviewed_at: 1737756176193 + created_at: 1737756172202 + - target: $["paths"]["/v1/companies/{company_id}/contractor_payment_groups/preview"]["post"] + update: + x-speakeasy-group: contractorPaymentGroups + x-speakeasy-name-override: preview + x-speakeasy-metadata: + type: method-name + before: sdk.Contractor Payment Groups.post-v1-companies-company_id-contractor_payment_groups-preview() + after: sdk.contractorPaymentGroups.preview() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/companies/{company_uuid}/historical_employees"]["post"] + update: + x-speakeasy-name-override: createHistorical + x-speakeasy-metadata: + type: method-name + before: sdk.Employees.post-v1-historical_employees() + after: sdk.employees.createHistorical() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/wire_in_requests/{wire_in_request_uuid}"]["get"] + update: + x-speakeasy-group: wireInRequests + x-speakeasy-name-override: get + x-speakeasy-metadata: + type: method-name + before: sdk.Wire In Requests.get-wire_in_requests-wire_in_request_uuid() + after: sdk.wireInRequests.get() + reviewed_at: 1737756176193 + created_at: 1737756172204 + - target: $["paths"]["/v1/companies/{company_id}/contractor_payment_groups"]["post"] + update: + x-speakeasy-group: contractorPaymentGroups + x-speakeasy-name-override: create + x-speakeasy-metadata: + type: method-name + before: sdk.Contractor Payment Groups.post-v1-companies-company_id-contractor_payment_groups() + after: sdk.contractorPaymentGroups.create() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/companies/{company_id}/locations"]["post"] + update: + x-speakeasy-name-override: create + x-speakeasy-metadata: + type: method-name + before: sdk.Locations.post-v1-companies-company_id-locations() + after: sdk.locations.create() + reviewed_at: 1737756176193 + created_at: 1737756172204 + - target: $["paths"]["/v1/companies/{company_uuid}/contractor_payments/preview"]["get"] + update: + x-speakeasy-group: contractorPayments + x-speakeasy-name-override: preview + x-speakeasy-metadata: + type: method-name + before: sdk.Contractor Payments.get-companies-company_uuid-contractor_payments-preview() + after: sdk.contractorPayments.preview() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/companies/{company_id}/pay_periods"]["get"] + update: + x-speakeasy-group: paySchedules + x-speakeasy-name-override: list + x-speakeasy-metadata: + type: method-name + before: sdk.Pay Schedules.get-v1-companies-company_id-pay_periods() + after: sdk.paySchedules.list() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/employees/{employee_id}/work_addresses"]["get"] + update: + x-speakeasy-group: employeeAddresses + x-speakeasy-name-override: get + x-speakeasy-metadata: + type: method-name + before: sdk.Employee Addresses.get-v1-employees-employee_id-work_addresses() + after: sdk.employeeAddresses.get() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/companies/{company_id}/payrolls"]["post"] + update: + x-speakeasy-name-override: create + x-speakeasy-metadata: + type: method-name + before: sdk.Payrolls.post-v1-companies-company_id-payrolls() + after: sdk.payrolls.create() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/employees/{employee_id}/forms/{form_id}/sign"]["put"] + update: + x-speakeasy-group: employeeForms + x-speakeasy-name-override: sign + x-speakeasy-metadata: + type: method-name + before: sdk.Employee Forms.put-v1-employee-form-sign() + after: sdk.employeeForms.sign() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/time_off_policies/{time_off_policy_uuid}/add_employees"]["put"] + update: + x-speakeasy-group: timeOffPolicies + x-speakeasy-name-override: addEmployees + x-speakeasy-metadata: + type: method-name + before: sdk.Time Off Policies.put-version-time_off_policies-time_off_policy_uuid-add_employees() + after: sdk.timeOffPolicies.addEmployees() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/company_benefits/{company_benefit_id}/summary"]["get"] + update: + x-speakeasy-group: companyBenefits + x-speakeasy-name-override: getSummary + x-speakeasy-metadata: + type: method-name + before: sdk.Company Benefits.get-v1-benefits-company_benefit_id-summary() + after: sdk.companyBenefits.getSummary() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/companies/{company_id}/earning_types/{earning_type_uuid}"]["put"] + update: + x-speakeasy-group: earningTypes + x-speakeasy-name-override: update + x-speakeasy-metadata: + type: method-name + before: sdk.Earning Types.put-v1-companies-company_id-earning_types-earning_type_uuid() + after: sdk.earningTypes.update() + reviewed_at: 1737756176193 + created_at: 1737756172204 + - target: $["paths"]["/v1/employees/{employee_id}/rehire"]["delete"] + update: + x-speakeasy-group: employeeEmployments + x-speakeasy-name-override: deleteRehire + x-speakeasy-metadata: + type: method-name + before: sdk.Employee Employments.delete-v1-employees-employee_id-rehire() + after: sdk.employeeEmployments.deleteRehire() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/contractors/{contractor_uuid}/address"]["get"] + update: + x-speakeasy-name-override: getAddress + x-speakeasy-metadata: + type: method-name + before: sdk.Contractors.get-v1-contractors-contractor_uuid-address() + after: sdk.contractors.getAddress() + reviewed_at: 1737756176193 + created_at: 1737756172204 + - target: $["paths"]["/v1/employees/{employee_uuid}/state_taxes"]["put"] + update: + x-speakeasy-group: employeeTaxSetup + x-speakeasy-name-override: updateStateTaxes + x-speakeasy-metadata: + type: method-name + before: sdk.Employee Tax Setup.put-v1-employees-employee_id-state_taxes() + after: sdk.employeeTaxSetup.updateStateTaxes() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/employees/{employee_id}/i9_authorization"]["put"] + update: + x-speakeasy-group: i9Verification + x-speakeasy-name-override: createOrUpdate + x-speakeasy-metadata: + type: method-name + before: sdk.I-9 Verification.put-v1-employees-employee_id-i9_authorization() + after: sdk.i9Verification.createOrUpdate() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/companies/{company_uuid}/holiday_pay_policy/add"]["put"] + update: + x-speakeasy-group: holidayPayPolicies + x-speakeasy-name-override: addEmployees + x-speakeasy-metadata: + type: method-name + before: sdk.Holiday Pay Policies.put-companies-company_uuid-holiday_pay_policy-add() + after: sdk.holidayPayPolicies.addEmployees() + reviewed_at: 1737756176193 + created_at: 1737756172204 + - target: $["paths"]["/v1/companies/{company_uuid}/report_templates/{report_type}"]["get"] + update: + x-speakeasy-name-override: getTemplate + x-speakeasy-metadata: + type: method-name + before: sdk.Reports.get-companies-company_uuid-report-templates-report_type() + after: sdk.reports.getTemplate() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/employees/{employee_id}/jobs"]["get"] + update: + x-speakeasy-group: jobsAndCompensations + x-speakeasy-name-override: getJobs + x-speakeasy-metadata: + type: method-name + before: sdk.Jobs and Compensations.get-v1-employees-employee_id-jobs() + after: sdk.jobsAndCompensations.getJobs() + reviewed_at: 1737756176193 + created_at: 1737756172202 + - target: $["paths"]["/v1/companies/{company_uuid}/ach_transactions"]["get"] + update: + x-speakeasy-group: achTransactions + x-speakeasy-name-override: get + x-speakeasy-metadata: + type: method-name + before: sdk.ACH Transactions.get-ach-transactions() + after: sdk.achTransactions.get() + reviewed_at: 1737756176193 + created_at: 1737756172202 + - target: $["paths"]["/v1/company_benefits/{company_benefit_id}/employee_benefits"]["get"] + update: + x-speakeasy-group: companyBenefits + x-speakeasy-name-override: getEmployeeBenefits + x-speakeasy-metadata: + type: method-name + before: sdk.Company Benefits.get-v1-company_benefits-company_benefit_id-employee_benefits() + after: sdk.companyBenefits.getEmployeeBenefits() + reviewed_at: 1737756176193 + created_at: 1737756172204 + - target: $["paths"]["/v1/companies/{company_id}"]["get"] + update: + x-speakeasy-name-override: get + x-speakeasy-metadata: + type: method-name + before: sdk.Companies.get-v1-companies() + after: sdk.companies.get() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/contractor_payment_groups/{contractor_payment_group_uuid}/fund"]["put"] + update: + x-speakeasy-group: contractorPaymentGroups + x-speakeasy-name-override: fund + x-speakeasy-metadata: + type: method-name + before: sdk.Contractor Payment Groups.put-v1-contractor_payment_groups-contractor_payment_group_id-fund() + after: sdk.contractorPaymentGroups.fund() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/reports/{report_uuid}"]["get"] + update: + x-speakeasy-name-override: get + x-speakeasy-metadata: + type: method-name + before: sdk.Reports.get-reports-report_uuid() + after: sdk.reports.get() + reviewed_at: 1737756176193 + created_at: 1737756172202 + - target: $["paths"]["/v1/companies/{company_id}/payrolls/{payroll_id}"]["get"] + update: + x-speakeasy-name-override: get + x-speakeasy-metadata: + type: method-name + before: sdk.Payrolls.get-v1-companies-company_id-payrolls-payroll_id() + after: sdk.payrolls.get() + reviewed_at: 1737756176193 + created_at: 1737756172202 + - target: $["paths"]["/v1/time_off_policies/{time_off_policy_uuid}/deactivate"]["put"] + update: + x-speakeasy-group: timeOffPolicies + x-speakeasy-name-override: deactivate + x-speakeasy-metadata: + type: method-name + before: sdk.Time Off Policies.put-v1-time_off_policies-time_off_policy_uuid-deactivate() + after: sdk.timeOffPolicies.deactivate() + reviewed_at: 1737756176193 + created_at: 1737756172202 + - target: $["paths"]["/v1/companies/{company_id}/pay_schedules/{pay_schedule_id}"]["get"] + update: + x-speakeasy-group: paySchedules + x-speakeasy-name-override: get + x-speakeasy-metadata: + type: method-name + before: sdk.Pay Schedules.get-v1-companies-company_id-pay_schedules-pay_schedule_id() + after: sdk.paySchedules.get() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/companies/{company_uuid}/external_payrolls/{external_payroll_id}"]["get"] + update: + x-speakeasy-group: externalPayrolls + x-speakeasy-name-override: get + x-speakeasy-metadata: + type: method-name + before: sdk.External Payrolls.get-v1-external-payroll() + after: sdk.externalPayrolls.get() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/employees/{employee_id}/custom_fields"]["get"] + update: + x-speakeasy-name-override: getCustomFields + x-speakeasy-metadata: + type: method-name + before: sdk.Employees.get-v1-employees-employee_id-custom_fields() + after: sdk.employees.getCustomFields() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/companies/{company_id}"]["put"] + update: + x-speakeasy-name-override: update + x-speakeasy-metadata: + type: method-name + before: sdk.Companies.put-v1-companies() + after: sdk.companies.update() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/companies/{company_id}/admins"]["post"] + update: + x-speakeasy-name-override: createAdmin + x-speakeasy-metadata: + type: method-name + before: sdk.Companies.post-v1-companies-company_id-admins() + after: sdk.companies.createAdmin() + reviewed_at: 1737756176193 + created_at: 1737756172202 + - target: $["paths"]["/v1/companies/{company_id}/payrolls/{payroll_id}/calculate"]["put"] + update: + x-speakeasy-name-override: calculate + x-speakeasy-metadata: + type: method-name + before: sdk.Payrolls.put-v1-companies-company_id-payrolls-payroll_id-calculate() + after: sdk.payrolls.calculate() + reviewed_at: 1737756176193 + created_at: 1737756172202 + - target: $["paths"]["/v1/employees/{employee_id}/i9_authorization"]["get"] + update: + x-speakeasy-group: i9Verification + x-speakeasy-name-override: getAuthorization + x-speakeasy-metadata: + type: method-name + before: sdk.I-9 Verification.get-v1-employees-employee_id-i9_authorization() + after: sdk.i9Verification.getAuthorization() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/documents/{document_uuid}/pdf"]["get"] + update: + x-speakeasy-group: contractorDocuments + x-speakeasy-name-override: getPdf + x-speakeasy-metadata: + type: method-name + before: sdk.Contractor Documents.get-v1-contractor-document-pdf() + after: sdk.contractorDocuments.getPdf() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/benefits/{benefit_id}"]["get"] + update: + x-speakeasy-group: companyBenefits + x-speakeasy-name-override: getSupportedBenefit + x-speakeasy-metadata: + type: method-name + before: sdk.Company Benefits.get-v1-benefits-benefit_id() + after: sdk.companyBenefits.getSupportedBenefit() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/companies/{company_uuid}/external_payrolls/{external_payroll_id}"]["delete"] + update: + x-speakeasy-group: externalPayrolls + x-speakeasy-name-override: delete + x-speakeasy-metadata: + type: method-name + before: sdk.External Payrolls.delete-v1-external-payroll() + after: sdk.externalPayrolls.delete() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/compensations/{compensation_id}"]["get"] + update: + x-speakeasy-group: jobsAndCompensations + x-speakeasy-name-override: getCompensation + x-speakeasy-metadata: + type: method-name + before: sdk.Jobs and Compensations.get-v1-compensations-compensation_id() + after: sdk.jobsAndCompensations.getCompensation() + reviewed_at: 1737756176193 + created_at: 1737756172203 + - target: $["paths"]["/v1/documents/{document_uuid}"]["get"] + update: + x-speakeasy-group: contractorDocuments + x-speakeasy-name-override: get + x-speakeasy-metadata: + type: method-name + before: sdk.Contractor Documents.get-v1-contractor-document() + after: sdk.contractorDocuments.get() + reviewed_at: 1737756176193 + created_at: 1737756172203 diff --git a/gusto_embedded/src/hooks/clientcredentials.ts b/gusto_embedded/src/hooks/clientcredentials.ts index b5ce36cb..a6834e1e 100644 --- a/gusto_embedded/src/hooks/clientcredentials.ts +++ b/gusto_embedded/src/hooks/clientcredentials.ts @@ -18,7 +18,6 @@ import { type Credentials = { clientID: string; clientSecret: string; - tokenURL: string | undefined; }; type Session = { @@ -46,11 +45,6 @@ export class ClientCredentialsHook hookCtx: BeforeRequestContext, request: Request ): Promise { - if (!hookCtx.oAuth2Scopes) { - // OAuth2 not in use - return request; - } - const credentials = await this.getCredentials(hookCtx.securitySource); if (!credentials) { return request; @@ -61,12 +55,12 @@ export class ClientCredentialsHook let session = this.sessions[sessionKey]; if ( !session || - !this.hasRequiredScopes(session.scopes, hookCtx.oAuth2Scopes) || + !this.hasRequiredScopes(session.scopes, hookCtx.oAuth2Scopes || []) || this.hasTokenExpired(session.expiresAt) ) { session = await this.doTokenRequest( credentials, - this.getScopes(hookCtx.oAuth2Scopes, session) + this.getScopes(hookCtx.oAuth2Scopes || [], session) ); this.sessions[sessionKey] = session; @@ -82,11 +76,8 @@ export class ClientCredentialsHook response: Response | null, error: unknown ): Promise<{ response: Response | null; error: unknown }> { - if (!hookCtx.oAuth2Scopes) { - // OAuth2 not in use - return { response, error }; - } - + // TODO I wonder if this only works if we don't define a 401 error on each + // request if (error) { return { response, error }; } @@ -117,7 +108,7 @@ export class ClientCredentialsHook formData.append("scope", scopes.join(" ")); } - const tokenURL = new URL(credentials.tokenURL ?? "", this.baseURL ?? ""); + const tokenURL = `${this.baseURL}/oauth/token`; const request = new Request(tokenURL, { method: "POST", @@ -181,10 +172,12 @@ export class ClientCredentialsHook ); return { - clientID: out?.clientID ?? env().GUSTOEMBEDDED_CLIENT_ID ?? "", + clientID: + out?.SystemAccessAuth?.clientId ?? env().GUSTOEMBEDDED_CLIENT_ID ?? "", clientSecret: - out?.clientSecret ?? env().GUSTOEMBEDDED_CLIENT_SECRET ?? "", - tokenURL: out?.tokenURL ?? env().GUSTOEMBEDDED_TOKEN_URL ?? "", + out?.SystemAccessAuth?.clientSecret ?? + env().GUSTOEMBEDDED_CLIENT_SECRET ?? + "", }; } diff --git a/gusto_embedded/src/systemAuth.ts b/gusto_embedded/src/systemAuth.ts new file mode 100644 index 00000000..3553140c --- /dev/null +++ b/gusto_embedded/src/systemAuth.ts @@ -0,0 +1,109 @@ +import * as z from "zod"; +import { SDK_METADATA } from "./lib/config"; + +// TypeScript SDKs use Zod for runtime data validation. We can use Zod +// to describe the shape of the response from the OAuth token endpoint. If the +// response is valid, Speakeasy can safely access the token and its expiration time. +const tokenResponseSchema = z.object({ + access_token: z.string(), + expires_in: z.number().positive(), +}); + +// This is a rough value that adjusts when we consider an access token to be +// expired. It accounts for clock drift between the client and server +// and slow or unreliable networks. +const tolerance = 5 * 60 * 1000; + +/** + * A callback function that can be used to obtain an OAuth access token for use + * with SDKs that require OAuth security. A new token is requested from the + * OAuth provider when the current token has expired. + */ +export function withSystemAccess( + clientID: string, + clientSecret: string, + options: { tokenStore?: TokenStore; url?: string } = {} +) { + const { + tokenStore = new InMemoryTokenStore(), + // Replace this with your default OAuth provider's access token endpoint. + url = "https://api.gusto-demo.com/oauth/token", + } = options; + + // tokenStore.set({ token: accessToken, expires: 10 }); + + return async (): Promise => { + const session = await tokenStore.get(); + + // Return the current token if it has not expired yet. + if (session && session.expires > Date.now()) { + return session.token; + } + + try { + const response = await fetch(url, { + method: "POST", + headers: { + "content-type": "application/x-www-form-urlencoded", + // Include the SDK's user agent in the request so requests can be + // tracked using observability infrastructure. + "user-agent": SDK_METADATA.userAgent, + }, + body: new URLSearchParams({ + client_id: clientID, + client_secret: clientSecret, + grant_type: "system_access", + }), + }); + + if (!response.ok) { + throw new Error("Unexpected status code: " + response.status); + } + + const json = await response.json(); + const data = tokenResponseSchema.parse(json); + + await tokenStore.set({ + token: data.access_token, + expires: Date.now() + data.expires_in * 1000 - tolerance, + }); + + return data.access_token; + } catch (error) { + throw new Error("Failed to obtain OAuth token: " + error); + } + }; +} + +/** + * A TokenStore is used to save and retrieve OAuth tokens for use across SDK + * method calls. This interface can be implemented to store tokens in memory, + * a shared cache like Redis or a database table. + */ +export interface TokenStore { + get(): Promise<{ token: string; expires: number } | undefined>; + set({ token, expires }: { token: string; expires: number }): Promise; +} + +/** + * InMemoryTokenStore holds OAuth access tokens in memory for use by SDKs and + * methods that require OAuth security. + */ +export class InMemoryTokenStore implements TokenStore { + private token = ""; + private expires = Date.now(); + + constructor() {} + + async get() { + return { + token: this.token, + expires: this.expires, + }; + } + + async set({ token, expires }: { token: string; expires: number }) { + this.token = token; + this.expires = expires; + } +} From b02a4d5a4fc968995be0ff3b70314b018817d2a8 Mon Sep 17 00:00:00 2001 From: Aaron Rosen Date: Tue, 4 Feb 2025 14:15:45 -0700 Subject: [PATCH 08/15] undo generated code changes --- .../components/historicalemployeebody.ts | 7 ++ .../operations/putv1historicalemployees.ts | 7 ++ gusto_embedded/src/systemAuth.ts | 109 ------------------ 3 files changed, 14 insertions(+), 109 deletions(-) delete mode 100644 gusto_embedded/src/systemAuth.ts diff --git a/gusto_embedded/src/models/components/historicalemployeebody.ts b/gusto_embedded/src/models/components/historicalemployeebody.ts index 0d6e5b5b..c43dd400 100644 --- a/gusto_embedded/src/models/components/historicalemployeebody.ts +++ b/gusto_embedded/src/models/components/historicalemployeebody.ts @@ -59,6 +59,10 @@ export type HistoricalEmployeeBody = { workAddress: WorkAddress; homeAddress: HistoricalEmployeeBodyHomeAddress; termination: HistoricalEmployeeBodyTermination; + /** + * Optional. If provided, the email address will be saved to the employee. + */ + email?: string | undefined; job: HistoricalEmployeeBodyJob; employeeStateTaxes?: EmployeeStateTaxes | undefined; }; @@ -409,6 +413,7 @@ export const HistoricalEmployeeBody$inboundSchema: z.ZodType< work_address: z.lazy(() => WorkAddress$inboundSchema), home_address: z.lazy(() => HistoricalEmployeeBodyHomeAddress$inboundSchema), termination: z.lazy(() => HistoricalEmployeeBodyTermination$inboundSchema), + email: z.string().optional(), job: z.lazy(() => HistoricalEmployeeBodyJob$inboundSchema), employee_state_taxes: z.lazy(() => EmployeeStateTaxes$inboundSchema) .optional(), @@ -436,6 +441,7 @@ export type HistoricalEmployeeBody$Outbound = { work_address: WorkAddress$Outbound; home_address: HistoricalEmployeeBodyHomeAddress$Outbound; termination: HistoricalEmployeeBodyTermination$Outbound; + email?: string | undefined; job: HistoricalEmployeeBodyJob$Outbound; employee_state_taxes?: EmployeeStateTaxes$Outbound | undefined; }; @@ -455,6 +461,7 @@ export const HistoricalEmployeeBody$outboundSchema: z.ZodType< workAddress: z.lazy(() => WorkAddress$outboundSchema), homeAddress: z.lazy(() => HistoricalEmployeeBodyHomeAddress$outboundSchema), termination: z.lazy(() => HistoricalEmployeeBodyTermination$outboundSchema), + email: z.string().optional(), job: z.lazy(() => HistoricalEmployeeBodyJob$outboundSchema), employeeStateTaxes: z.lazy(() => EmployeeStateTaxes$outboundSchema) .optional(), diff --git a/gusto_embedded/src/models/operations/putv1historicalemployees.ts b/gusto_embedded/src/models/operations/putv1historicalemployees.ts index f153aef9..d6d85079 100644 --- a/gusto_embedded/src/models/operations/putv1historicalemployees.ts +++ b/gusto_embedded/src/models/operations/putv1historicalemployees.ts @@ -83,6 +83,10 @@ export type PutV1HistoricalEmployeesRequestBody = { workAddress: WorkAddress; homeAddress: PutV1HistoricalEmployeesHomeAddress; termination: Termination; + /** + * Optional. If provided, the email address will be saved to the employee. + */ + email?: string | undefined; job: Job; employeeStateTaxes?: EmployeeStateTaxes | undefined; }; @@ -446,6 +450,7 @@ export const PutV1HistoricalEmployeesRequestBody$inboundSchema: z.ZodType< work_address: z.lazy(() => WorkAddress$inboundSchema), home_address: z.lazy(() => PutV1HistoricalEmployeesHomeAddress$inboundSchema), termination: z.lazy(() => Termination$inboundSchema), + email: z.string().optional(), job: z.lazy(() => Job$inboundSchema), employee_state_taxes: z.lazy(() => EmployeeStateTaxes$inboundSchema) .optional(), @@ -474,6 +479,7 @@ export type PutV1HistoricalEmployeesRequestBody$Outbound = { work_address: WorkAddress$Outbound; home_address: PutV1HistoricalEmployeesHomeAddress$Outbound; termination: Termination$Outbound; + email?: string | undefined; job: Job$Outbound; employee_state_taxes?: EmployeeStateTaxes$Outbound | undefined; }; @@ -494,6 +500,7 @@ export const PutV1HistoricalEmployeesRequestBody$outboundSchema: z.ZodType< workAddress: z.lazy(() => WorkAddress$outboundSchema), homeAddress: z.lazy(() => PutV1HistoricalEmployeesHomeAddress$outboundSchema), termination: z.lazy(() => Termination$outboundSchema), + email: z.string().optional(), job: z.lazy(() => Job$outboundSchema), employeeStateTaxes: z.lazy(() => EmployeeStateTaxes$outboundSchema) .optional(), diff --git a/gusto_embedded/src/systemAuth.ts b/gusto_embedded/src/systemAuth.ts deleted file mode 100644 index 3553140c..00000000 --- a/gusto_embedded/src/systemAuth.ts +++ /dev/null @@ -1,109 +0,0 @@ -import * as z from "zod"; -import { SDK_METADATA } from "./lib/config"; - -// TypeScript SDKs use Zod for runtime data validation. We can use Zod -// to describe the shape of the response from the OAuth token endpoint. If the -// response is valid, Speakeasy can safely access the token and its expiration time. -const tokenResponseSchema = z.object({ - access_token: z.string(), - expires_in: z.number().positive(), -}); - -// This is a rough value that adjusts when we consider an access token to be -// expired. It accounts for clock drift between the client and server -// and slow or unreliable networks. -const tolerance = 5 * 60 * 1000; - -/** - * A callback function that can be used to obtain an OAuth access token for use - * with SDKs that require OAuth security. A new token is requested from the - * OAuth provider when the current token has expired. - */ -export function withSystemAccess( - clientID: string, - clientSecret: string, - options: { tokenStore?: TokenStore; url?: string } = {} -) { - const { - tokenStore = new InMemoryTokenStore(), - // Replace this with your default OAuth provider's access token endpoint. - url = "https://api.gusto-demo.com/oauth/token", - } = options; - - // tokenStore.set({ token: accessToken, expires: 10 }); - - return async (): Promise => { - const session = await tokenStore.get(); - - // Return the current token if it has not expired yet. - if (session && session.expires > Date.now()) { - return session.token; - } - - try { - const response = await fetch(url, { - method: "POST", - headers: { - "content-type": "application/x-www-form-urlencoded", - // Include the SDK's user agent in the request so requests can be - // tracked using observability infrastructure. - "user-agent": SDK_METADATA.userAgent, - }, - body: new URLSearchParams({ - client_id: clientID, - client_secret: clientSecret, - grant_type: "system_access", - }), - }); - - if (!response.ok) { - throw new Error("Unexpected status code: " + response.status); - } - - const json = await response.json(); - const data = tokenResponseSchema.parse(json); - - await tokenStore.set({ - token: data.access_token, - expires: Date.now() + data.expires_in * 1000 - tolerance, - }); - - return data.access_token; - } catch (error) { - throw new Error("Failed to obtain OAuth token: " + error); - } - }; -} - -/** - * A TokenStore is used to save and retrieve OAuth tokens for use across SDK - * method calls. This interface can be implemented to store tokens in memory, - * a shared cache like Redis or a database table. - */ -export interface TokenStore { - get(): Promise<{ token: string; expires: number } | undefined>; - set({ token, expires }: { token: string; expires: number }): Promise; -} - -/** - * InMemoryTokenStore holds OAuth access tokens in memory for use by SDKs and - * methods that require OAuth security. - */ -export class InMemoryTokenStore implements TokenStore { - private token = ""; - private expires = Date.now(); - - constructor() {} - - async get() { - return { - token: this.token, - expires: this.expires, - }; - } - - async set({ token, expires }: { token: string; expires: number }) { - this.token = token; - this.expires = expires; - } -} From 05d935f75d0eda5705726cf3e1fdceb23213fd1d Mon Sep 17 00:00:00 2001 From: Aaron Rosen Date: Wed, 12 Mar 2025 14:39:10 -0600 Subject: [PATCH 09/15] update clientcredentials hook --- .speakeasy/workflow.yaml | 9 + .../speakeasy-modifications-overlay.yaml | 2383 ----------------- gusto_embedded/src/companyAuth.ts | 2 +- gusto_embedded/src/hooks/clientcredentials.ts | 16 +- gusto_embedded/src/hooks/registration.ts | 23 +- 5 files changed, 38 insertions(+), 2395 deletions(-) diff --git a/.speakeasy/workflow.yaml b/.speakeasy/workflow.yaml index a1ca7eb1..1e4936ea 100644 --- a/.speakeasy/workflow.yaml +++ b/.speakeasy/workflow.yaml @@ -10,8 +10,17 @@ sources: - location: https://raw.githubusercontent.com/Gusto/Gusto-Partner-API/refs/heads/main/.speakeasy/speakeasy-modifications-overlay.yaml authHeader: Authorization authSecret: $openapi_doc_auth_token + - location: gusto_embedded/.speakeasy/speakeasy-modifications-overlay.yaml registry: location: registry.speakeasyapi.dev/gusto/ruby-sdk/gusto-embedded-oas + GustoEmbedded-local: + inputs: + - location: ../Gusto-Partner-API/generated/embedded/api.v2024-04-01.embedded.yaml + overlays: + - location: ../Gusto-Partner-API/.speakeasy/speakeasy-modifications-overlay.yaml + - location: gusto_embedded/.speakeasy/speakeasy-modifications-overlay.yaml + registry: + location: registry.speakeasyapi.dev/gusto/ruby-sdk/gusto-embedded-local targets: gusto-embedded: target: typescript diff --git a/gusto_embedded/.speakeasy/speakeasy-modifications-overlay.yaml b/gusto_embedded/.speakeasy/speakeasy-modifications-overlay.yaml index 130ff9eb..dcb0cf05 100644 --- a/gusto_embedded/.speakeasy/speakeasy-modifications-overlay.yaml +++ b/gusto_embedded/.speakeasy/speakeasy-modifications-overlay.yaml @@ -22,2386 +22,3 @@ actions: required: - clientId - clientSecret - - target: $["paths"]["/v1/companies/{company_id}/bank_accounts/{bank_account_uuid}/verify"]["put"] - update: - x-speakeasy-group: bankAccounts - x-speakeasy-name-override: verify - x-speakeasy-metadata: - type: method-name - before: sdk.Bank Accounts.put-v1-companies-company_id-bank-accounts-verify() - after: sdk.bankAccounts.verify() - reviewed_at: 1737756176193 - created_at: 1737756172202 - - target: $["paths"]["/v1/companies/{company_id}/attachments/{company_attachment_uuid}"]["get"] - update: - x-speakeasy-group: companyAttachments - x-speakeasy-name-override: getDetails - x-speakeasy-metadata: - type: method-name - before: sdk.Company Attachment.get-v1-companies-attachment() - after: sdk.companyAttachments.getDetails() - reviewed_at: 1737756176193 - created_at: 1737756172204 - - target: $["paths"]["/v1/companies/{company_id}/bank_accounts"]["get"] - update: - x-speakeasy-group: bankAccounts - x-speakeasy-name-override: list - x-speakeasy-metadata: - type: method-name - before: sdk.Bank Accounts.get-v1-companies-company_id-bank-accounts() - after: sdk.bankAccounts.list() - reviewed_at: 1737756176193 - created_at: 1737756172202 - - target: $["paths"]["/v1/employees/{employee_id}/i9_authorization/document_options"]["get"] - update: - x-speakeasy-group: i9Verification - x-speakeasy-name-override: getDocumentOptions - x-speakeasy-metadata: - type: method-name - before: sdk.I-9 Verification.get-v1-employees-employee_id-i9_authorization-document_options() - after: sdk.i9Verification.getDocumentOptions() - reviewed_at: 1737756176193 - created_at: 1737756172202 - - target: $["paths"]["/v1/companies/{company_id}/industry_selection"]["get"] - update: - x-speakeasy-group: industrySelection - x-speakeasy-name-override: get - x-speakeasy-metadata: - type: method-name - before: sdk.Industry Selection.get-v1-company-industry() - after: sdk.industrySelection.get() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/companies/{company_id}/pay_schedules/assign"]["post"] - update: - x-speakeasy-group: paySchedules - x-speakeasy-name-override: assign - x-speakeasy-metadata: - type: method-name - before: sdk.Pay Schedules.post-v1-companies-company_id-pay_schedules-assign() - after: sdk.paySchedules.assign() - reviewed_at: 1737756176193 - created_at: 1737756172202 - - target: $["paths"]["/v1/partner_managed_companies/{company_uuid}/accept_terms_of_service"]["post"] - update: - x-speakeasy-name-override: acceptTermsOfService - x-speakeasy-metadata: - type: method-name - before: sdk.Companies.post-partner-managed-companies-company_uuid-accept_terms_of_service() - after: sdk.companies.acceptTermsOfService() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/employee_benefits/{employee_benefit_id}"]["delete"] - update: - x-speakeasy-group: employeeBenefits - x-speakeasy-name-override: delete - x-speakeasy-metadata: - type: method-name - before: sdk.Employee Benefits.delete-v1-employee_benefits-employee_benefit_id() - after: sdk.employeeBenefits.delete() - reviewed_at: 1737756176193 - created_at: 1737756172204 - - target: $["paths"]["/v1/employees/{employee_id}/terminations"]["post"] - update: - x-speakeasy-group: employeeEmployments - x-speakeasy-name-override: createTermination - x-speakeasy-metadata: - type: method-name - before: sdk.Employee Employments.post-v1-employees-employee_id-terminations() - after: sdk.employeeEmployments.createTermination() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/webhook_subscriptions"]["get"] - update: - x-speakeasy-name-override: listSubscriptions - x-speakeasy-metadata: - type: method-name - before: sdk.Webhooks.get-v1-webhook-subscriptions() - after: sdk.webhooks.listSubscriptions() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/companies/{company_uuid}/departments"]["get"] - update: - x-speakeasy-name-override: list - x-speakeasy-metadata: - type: method-name - before: sdk.Departments.get-companies-departments() - after: sdk.departments.list() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/companies/{company_uuid}/paid_holidays"]["get"] - update: - x-speakeasy-group: holidayPayPolicies - x-speakeasy-name-override: previewHolidays - x-speakeasy-metadata: - type: method-name - before: sdk.Holiday Pay Policies.get-companies-company_uuid-paid_holidays() - after: sdk.holidayPayPolicies.previewHolidays() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/contractors/{contractor_uuid}"]["get"] - update: - x-speakeasy-name-override: get - x-speakeasy-metadata: - type: method-name - before: sdk.Contractors.get-v1-contractors-contractor_uuid() - after: sdk.contractors.get() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/companies/{company_uuid}/time_off_policies"]["get"] - update: - x-speakeasy-group: timeOffPolicies - x-speakeasy-name-override: get - x-speakeasy-metadata: - type: method-name - before: sdk.Time Off Policies.get-companies-company_uuid-time_off_policies() - after: sdk.timeOffPolicies.get() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/payrolls/{payroll_uuid}/gross_up"]["post"] - update: - x-speakeasy-name-override: calculateGrossUp - x-speakeasy-metadata: - type: method-name - before: sdk.Payrolls.post-payrolls-gross-up-payroll_uuid() - after: sdk.payrolls.calculateGrossUp() - reviewed_at: 1737756176193 - created_at: 1737756172202 - - target: $["paths"]["/v1/companies/{company_id}/company_benefits"]["post"] - update: - x-speakeasy-group: companyBenefits - x-speakeasy-name-override: create - x-speakeasy-metadata: - type: method-name - before: sdk.Company Benefits.post-v1-companies-company_id-company_benefits() - after: sdk.companyBenefits.create() - reviewed_at: 1737756176193 - created_at: 1737756172204 - - target: $["paths"]["/v1/webhook_subscriptions/{webhook_subscription_uuid}/verify"]["put"] - update: - x-speakeasy-name-override: verifySubscription - x-speakeasy-metadata: - type: method-name - before: sdk.Webhooks.put-v1-verify-webhook-subscription-uuid() - after: sdk.webhooks.verifySubscription() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/companies/{company_id}/pay_schedules/{pay_schedule_id}"]["put"] - update: - x-speakeasy-group: paySchedules - x-speakeasy-name-override: update - x-speakeasy-metadata: - type: method-name - before: sdk.Pay Schedules.put-v1-companies-company_id-pay_schedules-pay_schedule_id() - after: sdk.paySchedules.update() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/companies/{company_uuid}/holiday_pay_policy"]["post"] - update: - x-speakeasy-group: holidayPayPolicies - x-speakeasy-name-override: create - x-speakeasy-metadata: - type: method-name - before: sdk.Holiday Pay Policies.post-companies-company_uuid-holiday_pay_policy() - after: sdk.holidayPayPolicies.create() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/garnishments/{garnishment_id}"]["put"] - update: - x-speakeasy-name-override: update - x-speakeasy-metadata: - type: method-name - before: sdk.Garnishments.put-v1-garnishments-garnishment_id() - after: sdk.garnishments.update() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/companies/{company_id}/bank_accounts"]["post"] - update: - x-speakeasy-group: bankAccounts - x-speakeasy-name-override: create - x-speakeasy-metadata: - type: method-name - before: sdk.Bank Accounts.post-v1-companies-company_id-bank-accounts() - after: sdk.bankAccounts.create() - reviewed_at: 1737756176193 - created_at: 1737756172204 - - target: $["paths"]["/v1/companies/{company_uuid}/onboarding_status"]["get"] - update: - x-speakeasy-name-override: getOnboardingStatus - x-speakeasy-metadata: - type: method-name - before: sdk.Companies.get-v1-company-onboarding-status() - after: sdk.companies.getOnboardingStatus() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/contractors/{contractor_uuid}/bank_accounts"]["get"] - update: - x-speakeasy-group: contractorPaymentMethod - x-speakeasy-name-override: getBankAccounts - x-speakeasy-metadata: - type: method-name - before: sdk.Contractor Payment Method.get-v1-contractors-contractor_uuid-bank_accounts() - after: sdk.contractorPaymentMethod.getBankAccounts() - reviewed_at: 1737756176193 - created_at: 1737756172204 - - target: $["paths"]["/v1/companies/{company_id}/earning_types"]["post"] - update: - x-speakeasy-group: earningTypes - x-speakeasy-name-override: create - x-speakeasy-metadata: - type: method-name - before: sdk.Earning Types.post-v1-companies-company_id-earning_types() - after: sdk.earningTypes.create() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/webhook_subscriptions/{webhook_subscription_uuid}"]["get"] - update: - x-speakeasy-name-override: get - x-speakeasy-metadata: - type: method-name - before: sdk.Webhooks.get-v1-webhook-subscription-uuid() - after: sdk.webhooks.get() - reviewed_at: 1737756176193 - created_at: 1737756172202 - - target: $["paths"]["/v1/forms/{form_id}"]["get"] - update: - x-speakeasy-group: companyForms - x-speakeasy-name-override: get - x-speakeasy-metadata: - type: method-name - before: sdk.Company Forms.get-v1-company-form() - after: sdk.companyForms.get() - reviewed_at: 1737756176193 - created_at: 1737756172204 - - target: $["paths"]["/v1/companies/{company_id}/payrolls/{payroll_id}/prepare"]["put"] - update: - x-speakeasy-name-override: prepareForUpdate - x-speakeasy-metadata: - type: method-name - before: sdk.Payrolls.put-v1-companies-company_id-payrolls-payroll_id-prepare() - after: sdk.payrolls.prepareForUpdate() - reviewed_at: 1737756176193 - created_at: 1737756172202 - - target: $["paths"]["/v1/companies/{company_id}/payrolls"]["get"] - update: - x-speakeasy-name-override: getAll - x-speakeasy-metadata: - type: method-name - before: sdk.Payrolls.get-v1-companies-company_id-payrolls() - after: sdk.payrolls.getAll() - reviewed_at: 1737756176193 - created_at: 1737756172202 - - target: $["paths"]["/v1/contractors/{contractor_uuid}"]["put"] - update: - x-speakeasy-name-override: update - x-speakeasy-metadata: - type: method-name - before: sdk.Contractors.put-v1-contractors-contractor_uuid() - after: sdk.contractors.update() - reviewed_at: 1737756176193 - created_at: 1737756172202 - - target: $["paths"]["/v1/contractors/{contractor_uuid}/forms/{form_id}/pdf"]["get"] - update: - x-speakeasy-group: contractorForms - x-speakeasy-name-override: getPdf - x-speakeasy-metadata: - type: method-name - before: sdk.Contractor Forms.get-v1-contractor-form-pdf() - after: sdk.contractorForms.getPdf() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/events"]["get"] - update: - x-speakeasy-name-override: list - x-speakeasy-metadata: - type: method-name - before: sdk.Events.get-events() - after: sdk.events.list() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/companies/{company_id}/contractor_payments/{contractor_payment_id}"]["delete"] - update: - x-speakeasy-group: contractorPayments - x-speakeasy-name-override: cancel - x-speakeasy-metadata: - type: method-name - before: sdk.Contractor Payments.delete-v1-companies-company_id-contractor_payment-contractor-payment() - after: sdk.contractorPayments.cancel() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/companies/{company_uuid}/signatories"]["get"] - update: - x-speakeasy-name-override: get - x-speakeasy-metadata: - type: method-name - before: sdk.Signatories.get-v1-companies-company_uuid-signatories() - after: sdk.signatories.get() - reviewed_at: 1737756176193 - created_at: 1737756172204 - - target: $["paths"]["/v1/employees/{employee_id}/employee_benefits"]["post"] - update: - x-speakeasy-group: employeeBenefits - x-speakeasy-name-override: createBenefit - x-speakeasy-metadata: - type: method-name - before: sdk.Employee Benefits.post-v1-employees-employee_id-employee_benefits() - after: sdk.employeeBenefits.createBenefit() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/companies/{company_uuid}/tax_requirements/{state}"]["get"] - update: - x-speakeasy-group: taxRequirements - x-speakeasy-name-override: getByState - x-speakeasy-metadata: - type: method-name - before: sdk.Tax Requirements.get-v1-companies-company_uuid-tax_requirements-state() - after: sdk.taxRequirements.getByState() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/companies/{company_id}/federal_tax_details"]["put"] - update: - x-speakeasy-group: federalTaxDetails - x-speakeasy-name-override: update - x-speakeasy-metadata: - type: method-name - before: sdk.Federal Tax Details.put-v1-companies-company_id-federal_tax_details() - after: sdk.federalTaxDetails.update() - reviewed_at: 1737756176193 - created_at: 1737756172202 - - target: $["paths"]["/v1/employees/{employee_id}/bank_accounts"]["get"] - update: - x-speakeasy-group: employeePaymentMethods - x-speakeasy-name-override: getBankAccounts - x-speakeasy-metadata: - type: method-name - before: sdk.Employee Payment Method.get-v1-employees-employee_id-bank_accounts() - after: sdk.employeePaymentMethods.getBankAccounts() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/compensations/{compensation_id}"]["put"] - update: - x-speakeasy-group: jobsAndCompensations - x-speakeasy-name-override: updateCompensation - x-speakeasy-metadata: - type: method-name - before: sdk.Jobs and Compensations.put-v1-compensations-compensation_id() - after: sdk.jobsAndCompensations.updateCompensation() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/employee_benefits/{employee_benefit_id}"]["get"] - update: - x-speakeasy-group: employeeBenefits - x-speakeasy-name-override: get - x-speakeasy-metadata: - type: method-name - before: sdk.Employee Benefits.get-v1-employee_benefits-employee_benefit_id() - after: sdk.employeeBenefits.get() - reviewed_at: 1737756176193 - created_at: 1737756172202 - - target: $["paths"]["/v1/jobs/{job_id}/compensations"]["get"] - update: - x-speakeasy-group: jobsAndCompensations - x-speakeasy-name-override: getCompensations - x-speakeasy-metadata: - type: method-name - before: sdk.Jobs and Compensations.get-v1-jobs-job_id-compensations() - after: sdk.jobsAndCompensations.getCompensations() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/companies/{company_id}/attachments"]["get"] - update: - x-speakeasy-group: companyAttachments - x-speakeasy-name-override: getAll - x-speakeasy-metadata: - type: method-name - before: sdk.Company Attachment.get-v1-companies-attachments() - after: sdk.companyAttachments.getAll() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/contractors/{contractor_uuid}/documents"]["get"] - update: - x-speakeasy-group: contractorDocuments - x-speakeasy-name-override: list - x-speakeasy-metadata: - type: method-name - before: sdk.Contractor Documents.get-v1-contractor-documents() - after: sdk.contractorDocuments.list() - reviewed_at: 1737756176193 - created_at: 1737756172204 - - target: $["paths"]["/v1/employees/{employee_id}/bank_accounts/{bank_account_uuid}"]["put"] - update: - x-speakeasy-group: employeePaymentMethod - x-speakeasy-name-override: updateBankAccount - x-speakeasy-metadata: - type: method-name - before: sdk.Employee Payment Method.put-v1-employees-employee_id-bank_accounts() - after: sdk.employeePaymentMethod.updateBankAccount() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/companies/{company_id}/contractor_payment_groups"]["get"] - update: - x-speakeasy-group: contractorPaymentGroups - x-speakeasy-name-override: list - x-speakeasy-metadata: - type: method-name - before: sdk.Contractor Payment Groups.get-v1-companies-company_id-contractor_payment_groups() - after: sdk.contractorPaymentGroups.list() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/garnishments/{garnishment_id}"]["get"] - update: - x-speakeasy-name-override: fetch - x-speakeasy-metadata: - type: method-name - before: sdk.Garnishments.get-v1-garnishments-garnishment_id() - after: sdk.garnishments.fetch() - reviewed_at: 1737756176193 - created_at: 1737756172204 - - target: $["paths"]["/v1/forms/{form_id}/sign"]["put"] - update: - x-speakeasy-group: companyForms - x-speakeasy-name-override: sign - x-speakeasy-metadata: - type: method-name - before: sdk.Company Forms.put-v1-company-form-sign() - after: sdk.companyForms.sign() - reviewed_at: 1737756176193 - created_at: 1737756172204 - - target: $["paths"]["/v1/wire_in_requests/{wire_in_request_uuid}"]["put"] - update: - x-speakeasy-group: wireInRequests - x-speakeasy-name-override: submitRequest - x-speakeasy-metadata: - type: method-name - before: sdk.Wire In Requests.put-wire_in_requests-wire_in_request_uuid() - after: sdk.wireInRequests.submitRequest() - reviewed_at: 1737756176193 - created_at: 1737756172204 - - target: $["paths"]["/v1/employees/{employee_id}"]["delete"] - update: - x-speakeasy-name-override: delete - x-speakeasy-metadata: - type: method-name - before: sdk.Employees.delete-v1-employee() - after: sdk.employees.delete() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/companies/{company_id}/earning_types"]["get"] - update: - x-speakeasy-group: earningTypes - x-speakeasy-name-override: getAll - x-speakeasy-metadata: - type: method-name - before: sdk.Earning Types.get-v1-companies-company_id-earning_types() - after: sdk.earningTypes.getAll() - reviewed_at: 1737756176193 - created_at: 1737756172204 - - target: $["paths"]["/v1/companies/{company_uuid}/contractors"]["post"] - update: - x-speakeasy-name-override: create - x-speakeasy-metadata: - type: method-name - before: sdk.Contractors.post-v1-companies-company_uuid-contractors() - after: sdk.contractors.create() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/companies/{company_id}/payroll_reversals"]["get"] - update: - x-speakeasy-name-override: getReversals - x-speakeasy-metadata: - type: method-name - before: sdk.Payrolls.get-v1-companies-company_id-payroll_reversals() - after: sdk.payrolls.getReversals() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/departments/{department_uuid}"]["get"] - update: - x-speakeasy-name-override: get - x-speakeasy-metadata: - type: method-name - before: sdk.Departments.get-department() - after: sdk.departments.get() - reviewed_at: 1737756176193 - created_at: 1737756172204 - - target: $["paths"]["/v1/payrolls/{payroll_id}/employees/{employee_id}/pay_stub"]["get"] - update: - x-speakeasy-name-override: getPayStub - x-speakeasy-metadata: - type: method-name - before: sdk.Payrolls.get-v1-payrolls-payroll_uuid-employees-employee_uuid-pay_stub() - after: sdk.payrolls.getPayStub() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/home_addresses/{home_address_uuid}"]["get"] - update: - x-speakeasy-group: employeeAddresses - x-speakeasy-name-override: getHomeAddress - x-speakeasy-metadata: - type: method-name - before: sdk.Employee Addresses.get-v1-home_addresses-home_address_uuid() - after: sdk.employeeAddresses.getHomeAddress() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/companies/{company_id}/pay_schedules/assignments"]["get"] - update: - x-speakeasy-group: paySchedules - x-speakeasy-name-override: getAssignments - x-speakeasy-metadata: - type: method-name - before: sdk.Pay Schedules.get-v1-companies-company_id-pay_schedules-assignments() - after: sdk.paySchedules.getAssignments() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/employees/{employee_id}/onboarding_status"]["get"] - update: - x-speakeasy-name-override: getOnboardingStatus - x-speakeasy-metadata: - type: method-name - before: sdk.Employees.get-v1-employees-employee_id-onboarding_status() - after: sdk.employees.getOnboardingStatus() - reviewed_at: 1737756176193 - created_at: 1737756172202 - - target: $["paths"]["/v1/employees/{employee_id}/employee_benefits"]["get"] - update: - x-speakeasy-group: employeeBenefits - x-speakeasy-name-override: getAll - x-speakeasy-metadata: - type: method-name - before: sdk.Employee Benefits.get-v1-employees-employee_id-employee_benefits() - after: sdk.employeeBenefits.getAll() - reviewed_at: 1737756176193 - created_at: 1737756172202 - - target: $["paths"]["/v1/companies/{company_id}/pay_schedules/assignment_preview"]["post"] - update: - x-speakeasy-group: paySchedules - x-speakeasy-name-override: previewAssignment - x-speakeasy-metadata: - type: method-name - before: sdk.Pay Schedules.post-v1-companies-company_id-pay_schedules-assignment_preview() - after: sdk.paySchedules.previewAssignment() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/employees/{employee_id}/i9_authorization/employer_sign"]["put"] - update: - x-speakeasy-group: i9Verification - x-speakeasy-name-override: employerSign - x-speakeasy-metadata: - type: method-name - before: sdk.I-9 Verification.put-v1-employees-employee_id-i9_authorization-employer_sign() - after: sdk.i9Verification.employerSign() - reviewed_at: 1737756176193 - created_at: 1737756172204 - - target: $["paths"]["/v1/companies/{company_id}/contractor_payments"]["post"] - update: - x-speakeasy-group: contractorPayments - x-speakeasy-name-override: create - x-speakeasy-metadata: - type: method-name - before: sdk.Contractor Payments.post-v1-companies-company_id-contractor_payments() - after: sdk.contractorPayments.create() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/documents/{document_uuid}/sign"]["put"] - update: - x-speakeasy-group: contractorDocuments - x-speakeasy-name-override: sign - x-speakeasy-metadata: - type: method-name - before: sdk.Contractor Documents.put-v1-contractor-document-sign() - after: sdk.contractorDocuments.sign() - reviewed_at: 1737756176193 - created_at: 1737756172202 - - target: $["paths"]["/v1/employees/{employee_id}"]["put"] - update: - x-speakeasy-name-override: update - x-speakeasy-metadata: - type: method-name - before: sdk.Employees.put-v1-employees() - after: sdk.employees.update() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/employees/{employee_id}/onboarding_documents_config"]["put"] - update: - x-speakeasy-name-override: updateOnboardingDocumentsConfig - x-speakeasy-metadata: - type: method-name - before: sdk.Employees.put-v1-employees-employee_id-onboarding_documents_config() - after: sdk.employees.updateOnboardingDocumentsConfig() - reviewed_at: 1737756176193 - created_at: 1737756172202 - - target: $["paths"]["/v1/companies/{company_uuid}/tax_requirements/{state}"]["put"] - update: - x-speakeasy-group: taxRequirements - x-speakeasy-name-override: update - x-speakeasy-metadata: - type: method-name - before: sdk.Tax Requirements.put-v1-companies-company_uuid-tax_requirements-state() - after: sdk.taxRequirements.update() - reviewed_at: 1737756176193 - created_at: 1737756172204 - - target: $["paths"]["/v1/departments/{department_uuid}"]["delete"] - update: - x-speakeasy-name-override: delete - x-speakeasy-metadata: - type: method-name - before: sdk.Departments.delete-department() - after: sdk.departments.delete() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/employees/{employee_id}/rehire"]["get"] - update: - x-speakeasy-group: employeeEmployments - x-speakeasy-name-override: getRehire - x-speakeasy-metadata: - type: method-name - before: sdk.Employee Employments.get-v1-employees-employee_id-rehire() - after: sdk.employeeEmployments.getRehire() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/companies/{company_id}/payrolls/{payroll_id}"]["delete"] - update: - x-speakeasy-name-override: delete - x-speakeasy-metadata: - type: method-name - before: sdk.Payrolls.delete-v1-companies-company_id-payrolls() - after: sdk.payrolls.delete() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/companies/{company_uuid}/tax_requirements"]["get"] - update: - x-speakeasy-group: taxRequirements - x-speakeasy-name-override: getAll - x-speakeasy-metadata: - type: method-name - before: sdk.Tax Requirements.get-v1-companies-company_uuid-tax_requirements() - after: sdk.taxRequirements.getAll() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/companies/{company_id}/attachments/{company_attachment_uuid}/download_url"]["get"] - update: - x-speakeasy-group: companyAttachment - x-speakeasy-name-override: getDownloadUrl - x-speakeasy-metadata: - type: method-name - before: sdk.Company Attachment.get-v1-companies-attachment-url() - after: sdk.companyAttachment.getDownloadUrl() - reviewed_at: 1737756176193 - created_at: 1737756172202 - - target: $["paths"]["/v1/companies/{company_uuid}/departments"]["post"] - update: - x-speakeasy-name-override: create - x-speakeasy-metadata: - type: method-name - before: sdk.Departments.post-departments() - after: sdk.departments.create() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/companies/{company_uuid}/wire_in_requests"]["get"] - update: - x-speakeasy-group: wireInRequests - x-speakeasy-name-override: getAll - x-speakeasy-metadata: - type: method-name - before: sdk.Wire In Requests.get-companies-company_uuid-wire_in_request_uuid() - after: sdk.wireInRequests.getAll() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/employees/{employee_id}/onboarding_status"]["put"] - update: - x-speakeasy-name-override: updateOnboardingStatus - x-speakeasy-metadata: - type: method-name - before: sdk.Employees.put-v1-employees-employee_id-onboarding_status() - after: sdk.employees.updateOnboardingStatus() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/companies/{company_id}/custom_fields"]["get"] - update: - x-speakeasy-name-override: getCustomFields - x-speakeasy-metadata: - type: method-name - before: sdk.Companies.get-v1-companies-company_id-custom_fields() - after: sdk.companies.getCustomFields() - reviewed_at: 1737756176193 - created_at: 1737756172202 - - target: $["paths"]["/v1/home_addresses/{home_address_uuid}"]["put"] - update: - x-speakeasy-group: employeeAddresses - x-speakeasy-name-override: updateHomeAddress - x-speakeasy-metadata: - type: method-name - before: sdk.Employee Addresses.put-v1-home_addresses-home_address_uuid() - after: sdk.employeeAddresses.updateHomeAddress() - reviewed_at: 1737756176193 - created_at: 1737756172202 - - target: $["paths"]["/v1/recovery_cases/{recovery_case_uuid}/redebit"]["put"] - update: - x-speakeasy-group: recoveryCases - x-speakeasy-name-override: redebit - x-speakeasy-metadata: - type: method-name - before: sdk.Recovery Cases.redebit-recovery-case() - after: sdk.recoveryCases.redebit() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/benefits/{benefit_id}/requirements"]["get"] - update: - x-speakeasy-group: companyBenefits - x-speakeasy-name-override: getRequirements - x-speakeasy-metadata: - type: method-name - before: sdk.Company Benefits.get-v1-benefits-benefits_id-requirements() - after: sdk.companyBenefits.getRequirements() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/employees/{employee_id}/home_addresses"]["post"] - update: - x-speakeasy-group: employeeAddresses - x-speakeasy-name-override: create - x-speakeasy-metadata: - type: method-name - before: sdk.Employee Addresses.post-v1-employees-employee_id-home_addresses() - after: sdk.employeeAddresses.create() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/companies/{company_id}/employees"]["get"] - update: - x-speakeasy-name-override: get - x-speakeasy-metadata: - type: method-name - before: sdk.Employees.get-v1-companies-company_id-employees() - after: sdk.employees.get() - reviewed_at: 1737756176193 - created_at: 1737756172202 - - target: $["paths"]["/v1/employees/{employee_id}/rehire"]["post"] - update: - x-speakeasy-group: employeeEmployments - x-speakeasy-name-override: createRehire - x-speakeasy-metadata: - type: method-name - before: sdk.Employee Employments.post-v1-employees-employee_id-rehire() - after: sdk.employeeEmployments.createRehire() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/employees/{employee_id}/forms/{form_id}/pdf"]["get"] - update: - x-speakeasy-group: employeeForms - x-speakeasy-name-override: getPdf - x-speakeasy-metadata: - type: method-name - before: sdk.Employee Forms.get-v1-employee-form-pdf() - after: sdk.employeeForms.getPdf() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/contractor_payment_groups/{contractor_payment_group_uuid}"]["get"] - update: - x-speakeasy-group: contractorPaymentGroups - x-speakeasy-name-override: get - x-speakeasy-metadata: - type: method-name - before: sdk.Contractor Payment Groups.get-v1-contractor_payment_groups-contractor_payment_group_id() - after: sdk.contractorPaymentGroups.get() - reviewed_at: 1737756176193 - created_at: 1737756172202 - - target: $["paths"]["/v1/time_off_policies/{time_off_policy_uuid}"]["put"] - update: - x-speakeasy-group: timeOffPolicies - x-speakeasy-name-override: update - x-speakeasy-metadata: - type: method-name - before: sdk.Time Off Policies.put-time_off_policies-time_off_policy_uuid() - after: sdk.timeOffPolicies.update() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/compensations/{compensation_id}"]["delete"] - update: - x-speakeasy-group: jobsAndCompensations - x-speakeasy-name-override: deleteCompensation - x-speakeasy-metadata: - type: method-name - before: sdk.Jobs and Compensations.delete-v1-compensations-compensation_id() - after: sdk.jobsAndCompensations.deleteCompensation() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/companies/{company_uuid}/flows"]["post"] - update: - x-speakeasy-name-override: create - x-speakeasy-metadata: - type: method-name - before: sdk.Flows.post-v1-company-flows() - after: sdk.flows.create() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/contractors/{contractor_uuid}/forms/{form_id}"]["get"] - update: - x-speakeasy-group: contractorForms - x-speakeasy-name-override: get - x-speakeasy-metadata: - type: method-name - before: sdk.Contractor Forms.get-v1-contractor-form() - after: sdk.contractorForms.get() - reviewed_at: 1737756176193 - created_at: 1737756172204 - - target: $["paths"]["/v1/companies/{company_uuid}/holiday_pay_policy"]["delete"] - update: - x-speakeasy-group: holidayPayPolicies - x-speakeasy-name-override: delete - x-speakeasy-metadata: - type: method-name - before: sdk.Holiday Pay Policies.delete-companies-company_uuid-holiday_pay_policy() - after: sdk.holidayPayPolicies.delete() - reviewed_at: 1737756176193 - created_at: 1737756172202 - - target: $["paths"]["/v1/companies/{company_uuid}/holiday_pay_policy/remove"]["put"] - update: - x-speakeasy-group: holidayPayPolicies - x-speakeasy-name-override: removeEmployees - x-speakeasy-metadata: - type: method-name - before: sdk.Holiday Pay Policies.put-companies-company_uuid-holiday_pay_policy-remove() - after: sdk.holidayPayPolicies.removeEmployees() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/employees/{employee_id}/terminations"]["get"] - update: - x-speakeasy-group: employeeEmployments - x-speakeasy-name-override: getTermination - x-speakeasy-metadata: - type: method-name - before: sdk.Employee Employments.get-v1-employees-employee_id-terminations() - after: sdk.employeeEmployments.getTermination() - reviewed_at: 1737756176193 - created_at: 1737756172202 - - target: $["paths"]["/v1/contractors/{contractor_uuid}/payment_method"]["put"] - update: - x-speakeasy-group: contractorPaymentMethod - x-speakeasy-name-override: updatePaymentMethod - x-speakeasy-metadata: - type: method-name - before: sdk.Contractor Payment Method.put-v1-contractors-contractor_id-payment_method() - after: sdk.contractorPaymentMethod.updatePaymentMethod() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/locations/{location_uuid}/minimum_wages"]["get"] - update: - x-speakeasy-name-override: getMinimumWages - x-speakeasy-metadata: - type: method-name - before: sdk.Locations.get-v1-locations-location_uuid-minimum_wages() - after: sdk.locations.getMinimumWages() - reviewed_at: 1737756176193 - created_at: 1737756172202 - - target: $["paths"]["/v1/token_info"]["get"] - update: - x-speakeasy-name-override: getTokenInfo - x-speakeasy-metadata: - type: method-name - before: sdk.Introspection.get-v1-token-info() - after: sdk.introspection.getTokenInfo() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/jobs/{job_id}"]["put"] - update: - x-speakeasy-group: jobsAndCompensations - x-speakeasy-name-override: update - x-speakeasy-metadata: - type: method-name - before: sdk.Jobs and Compensations.put-v1-jobs-job_id() - after: sdk.jobsAndCompensations.update() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/employees/{employee_uuid}/federal_taxes"]["get"] - update: - x-speakeasy-group: employeeTaxSetup - x-speakeasy-name-override: getFederalTaxes - x-speakeasy-metadata: - type: method-name - before: sdk.Employee Tax Setup.get-v1-employees-employee_id-federal_taxes() - after: sdk.employeeTaxSetup.getFederalTaxes() - reviewed_at: 1737756176193 - created_at: 1737756172202 - - target: $["paths"]["/v1/employees/{employee_id}/forms"]["get"] - update: - x-speakeasy-group: employeeForms - x-speakeasy-name-override: getAll - x-speakeasy-metadata: - type: method-name - before: sdk.Employee Forms.get-v1-employee-forms() - after: sdk.employeeForms.getAll() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/companies/{company_uuid}/signatories/{signatory_uuid}"]["delete"] - update: - x-speakeasy-name-override: delete - x-speakeasy-metadata: - type: method-name - before: sdk.Signatories.delete-v1-companies-company_uuid-signatories-signatory_uuid() - after: sdk.signatories.delete() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/employees/{employee_id}/pay_stubs"]["get"] - update: - x-speakeasy-name-override: getPayStubs - x-speakeasy-metadata: - type: method-name - before: sdk.Payrolls.get-v1-employees-employee_uuid-pay_stubs() - after: sdk.payrolls.getPayStubs() - reviewed_at: 1737756176193 - created_at: 1737756172202 - - target: $["paths"]["/v1/companies/{company_id}/forms"]["get"] - update: - x-speakeasy-group: companies.forms - x-speakeasy-name-override: list - x-speakeasy-metadata: - type: method-name - before: sdk.Company Forms.get-v1-company-forms() - after: sdk.companies.forms.list() - reviewed_at: 1737756176193 - created_at: 1737756172202 - - target: $["paths"]["/v1/companies/{company_id}/payrolls/{payroll_id}"]["put"] - update: - x-speakeasy-name-override: update - x-speakeasy-metadata: - type: method-name - before: sdk.Payrolls.put-v1-companies-company_id-payrolls() - after: sdk.payrolls.update() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/forms/{form_id}/pdf"]["get"] - update: - x-speakeasy-group: companyForms - x-speakeasy-name-override: getPdf - x-speakeasy-metadata: - type: method-name - before: sdk.Company Forms.get-v1-company-form-pdf() - after: sdk.companyForms.getPdf() - reviewed_at: 1737756176193 - created_at: 1737756172202 - - target: $["paths"]["/v1/employees/{employee_id}/home_addresses"]["get"] - update: - x-speakeasy-group: employeeAddresses - x-speakeasy-name-override: getHomeAddresses - x-speakeasy-metadata: - type: method-name - before: sdk.Employee Addresses.get-v1-employees-employee_id-home_addresses() - after: sdk.employeeAddresses.getHomeAddresses() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/contractors/{contractor_uuid}/onboarding_status"]["put"] - update: - x-speakeasy-name-override: updateOnboardingStatus - x-speakeasy-metadata: - type: method-name - before: sdk.Contractors.put-v1-contractors-contractor_uuid-onboarding_status() - after: sdk.contractors.updateOnboardingStatus() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/locations/{location_id}"]["put"] - update: - x-speakeasy-name-override: update - x-speakeasy-metadata: - type: method-name - before: sdk.Locations.put-v1-locations-location_id() - after: sdk.locations.update() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/companies/{company_uuid}/external_payrolls/{external_payroll_id}/calculate_taxes"]["get"] - update: - x-speakeasy-group: externalPayrolls - x-speakeasy-name-override: getTaxSuggestions - x-speakeasy-metadata: - type: method-name - before: sdk.External Payrolls.get-v1-external-payroll-calculate-taxes() - after: sdk.externalPayrolls.getTaxSuggestions() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/contractor_payments/{contractor_payment_uuid}/receipt"]["get"] - update: - x-speakeasy-group: contractorPayments - x-speakeasy-name-override: getReceipt - x-speakeasy-metadata: - type: method-name - before: sdk.Contractor Payments.get-v1-contractor_payments-contractor_payment_uuid-receipt() - after: sdk.contractorPayments.getReceipt() - reviewed_at: 1737756176193 - created_at: 1737756172202 - - target: $["paths"]["/v1/webhook_subscriptions/{webhook_subscription_uuid}/request_verification_token"]["get"] - update: - x-speakeasy-name-override: requestVerificationToken - x-speakeasy-metadata: - type: method-name - before: sdk.Webhooks.get-v1-webhook-subscription-verification-token-uuid() - after: sdk.webhooks.requestVerificationToken() - reviewed_at: 1737756176193 - created_at: 1737756172202 - - target: $["paths"]["/v1/generated_documents/{document_type}/{request_uuid}"]["get"] - update: - x-speakeasy-group: generatedDocuments - x-speakeasy-name-override: get - x-speakeasy-metadata: - type: method-name - before: sdk.Generated Documents.get-v1-generated_documents-document_type-request_uuid() - after: sdk.generatedDocuments.get() - reviewed_at: 1737756176193 - created_at: 1737756172204 - - target: $["paths"]["/v1/payrolls/{payroll_id}/employees/{employee_id}/calculate_accruing_time_off_hours"]["post"] - update: - x-speakeasy-group: timeOffPolicies - x-speakeasy-name-override: calculateAccruingHours - x-speakeasy-metadata: - type: method-name - before: sdk.Time Off Policies.post-v1-payrolls-payroll_id-calculate_accruing_time_off_hours() - after: sdk.timeOffPolicies.calculateAccruingHours() - reviewed_at: 1737756176193 - created_at: 1737756172202 - - target: $["paths"]["/v1/companies/{company_uuid}/external_payrolls/tax_liabilities"]["get"] - update: - x-speakeasy-group: externalPayrolls - x-speakeasy-name-override: getTaxLiabilities - x-speakeasy-metadata: - type: method-name - before: sdk.External Payrolls.get-v1-tax-liabilities() - after: sdk.externalPayrolls.getTaxLiabilities() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/employees/{employee_id}/i9_authorization/documents"]["put"] - update: - x-speakeasy-group: i9Verification - x-speakeasy-name-override: createDocuments - x-speakeasy-metadata: - type: method-name - before: sdk.I-9 Verification.put-v1-employees-employee_id-i9_authorization-documents() - after: sdk.i9Verification.createDocuments() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/companies/{company_id}/federal_tax_details"]["get"] - update: - x-speakeasy-group: federalTaxDetails - x-speakeasy-name-override: get - x-speakeasy-metadata: - type: method-name - before: sdk.Federal Tax Details.get-v1-companies-company_id-federal_tax_details() - after: sdk.federalTaxDetails.get() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/employees/{employee_uuid}/state_taxes"]["get"] - update: - x-speakeasy-group: employeeTaxSetup - x-speakeasy-name-override: getStateTaxes - x-speakeasy-metadata: - type: method-name - before: sdk.Employee Tax Setup.get-v1-employees-employee_id-state_taxes() - after: sdk.employeeTaxSetup.getStateTaxes() - reviewed_at: 1737756176193 - created_at: 1737756172202 - - target: $["paths"]["/v1/employees/{employee_id}/rehire"]["put"] - update: - x-speakeasy-group: employeeEmployments - x-speakeasy-name-override: updateRehire - x-speakeasy-metadata: - type: method-name - before: sdk.Employee Employments.put-v1-employees-employee_id-rehire() - after: sdk.employeeEmployments.updateRehire() - reviewed_at: 1737756176193 - created_at: 1737756172202 - - target: $["paths"]["/v1/companies/{company_uuid}/signatories/invite"]["post"] - update: - x-speakeasy-name-override: invite - x-speakeasy-metadata: - type: method-name - before: sdk.Signatories.post-v1-companies-company_uuid-signatories-invite() - after: sdk.signatories.invite() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/invoices/{invoice_period}"]["get"] - update: - x-speakeasy-name-override: get - x-speakeasy-metadata: - type: method-name - before: sdk.Invoices.get-invoices-invoice-period() - after: sdk.invoices.get() - reviewed_at: 1737756176193 - created_at: 1737756172204 - - target: $["paths"]["/v1/contractor_payment_groups/{contractor_payment_group_uuid}"]["delete"] - update: - x-speakeasy-group: contractorPaymentGroups - x-speakeasy-name-override: delete - x-speakeasy-metadata: - type: method-name - before: sdk.Contractor Payment Groups.delete-v1-contractor_payment_groups-contractor_payment_group_id() - after: sdk.contractorPaymentGroups.delete() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/webhook_subscriptions"]["post"] - update: - x-speakeasy-name-override: createSubscription - x-speakeasy-metadata: - type: method-name - before: sdk.Webhooks.post-v1-webhook-subscription() - after: sdk.webhooks.createSubscription() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/plaid/processor_token"]["post"] - update: - x-speakeasy-group: bankAccounts - x-speakeasy-name-override: createFromProcessorToken - x-speakeasy-metadata: - type: method-name - before: sdk.Bank Accounts.post-v1-plaid-processor_token() - after: sdk.bankAccounts.createFromProcessorToken() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/companies/{company_uuid}/recovery_cases"]["get"] - update: - x-speakeasy-group: recoveryCases - x-speakeasy-name-override: getAll - x-speakeasy-metadata: - type: method-name - before: sdk.Recovery Cases.get-recovery-cases() - after: sdk.recoveryCases.getAll() - reviewed_at: 1737756176193 - created_at: 1737756172202 - - target: $["paths"]["/v1/employees/{employee_id}/payment_method"]["get"] - update: - x-speakeasy-group: employeePaymentMethod - x-speakeasy-name-override: get - x-speakeasy-metadata: - type: method-name - before: sdk.Employee Payment Method.get-v1-employees-employee_id-payment_method() - after: sdk.employeePaymentMethod.get() - reviewed_at: 1737756176193 - created_at: 1737756172202 - - target: $["paths"]["/v1/companies/{company_uuid}/reports"]["post"] - update: - x-speakeasy-name-override: create - x-speakeasy-metadata: - type: method-name - before: sdk.Reports.post-companies-company_uuid-reports() - after: sdk.reports.create() - reviewed_at: 1737756176193 - created_at: 1737756172202 - - target: $["paths"]["/v1/departments/{department_uuid}/remove"]["put"] - update: - x-speakeasy-name-override: removePeople - x-speakeasy-metadata: - type: method-name - before: sdk.Departments.put-remove-people-from-department() - after: sdk.departments.removePeople() - reviewed_at: 1737756176193 - created_at: 1737756172204 - - target: $["paths"]["/v1/time_off_policies/{time_off_policy_uuid}/remove_employees"]["put"] - update: - x-speakeasy-group: timeOffPolicies - x-speakeasy-name-override: removeEmployees - x-speakeasy-metadata: - type: method-name - before: sdk.Time Off Policies.put-v1-time_off_policies-time_off_policy_uuid-remove_employees() - after: sdk.timeOffPolicies.removeEmployees() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/companies/{company_uuid}/external_payrolls/{external_payroll_id}"]["put"] - update: - x-speakeasy-group: externalPayrolls - x-speakeasy-name-override: update - x-speakeasy-metadata: - type: method-name - before: sdk.External Payrolls.put-v1-external-payroll() - after: sdk.externalPayrolls.update() - reviewed_at: 1737756176193 - created_at: 1737756172202 - - target: $["paths"]["/v1/contractors/{contractor_uuid}/bank_accounts"]["post"] - update: - x-speakeasy-group: contractorPaymentMethod - x-speakeasy-name-override: createBankAccount - x-speakeasy-metadata: - type: method-name - before: sdk.Contractor Payment Method.post-v1-contractors-contractor_uuid-bank_accounts() - after: sdk.contractorPaymentMethod.createBankAccount() - reviewed_at: 1737756176193 - created_at: 1737756172202 - - target: $["paths"]["/v1/employees/{employee_id}/terminations"]["delete"] - update: - x-speakeasy-group: employeeEmployments - x-speakeasy-name-override: deleteTermination - x-speakeasy-metadata: - type: method-name - before: sdk.Employee Employments.delete-v1-employees-employee_id-terminations() - after: sdk.employeeEmployments.deleteTermination() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/oauth/token"]["post"] - update: - x-speakeasy-name-override: refreshAccessToken - x-speakeasy-metadata: - type: method-name - before: sdk.Introspection.refresh-access-token() - after: sdk.introspection.refreshAccessToken() - reviewed_at: 1737756176193 - created_at: 1737756172202 - - target: $["paths"]["/v1/companies/{company_id}/pay_schedules/preview"]["get"] - update: - x-speakeasy-group: paySchedules - x-speakeasy-name-override: preview - x-speakeasy-metadata: - type: method-name - before: sdk.Pay Schedules.get-v1-companies-company_id-pay_schedules-preview() - after: sdk.paySchedules.preview() - reviewed_at: 1737756176193 - created_at: 1737756172202 - - target: $["paths"]["/v1/employees/{employee_id}/forms/{form_id}"]["get"] - update: - x-speakeasy-group: employeeForms - x-speakeasy-name-override: getForm - x-speakeasy-metadata: - type: method-name - before: sdk.Employee Forms.get-v1-employee-form() - after: sdk.employeeForms.getForm() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/partner_managed_companies/{company_uuid}/migrate"]["put"] - update: - x-speakeasy-name-override: migrate - x-speakeasy-metadata: - type: method-name - before: sdk.Companies.put-v1-partner-managed-companies-company-uuid-migrate() - after: sdk.companies.migrate() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/companies/{company_id}/company_benefits"]["get"] - update: - x-speakeasy-group: companies.benefits - x-speakeasy-name-override: list - x-speakeasy-metadata: - type: method-name - before: sdk.Company Benefits.get-v1-companies-company_id-company_benefits() - after: sdk.companies.benefits.list() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/time_off_policies/{time_off_policy_uuid}"]["get"] - update: - x-speakeasy-group: timeOffPolicies - x-speakeasy-name-override: retrieve - x-speakeasy-metadata: - type: method-name - before: sdk.Time Off Policies.get-time_off_policies-time_off_policy_uuid() - after: sdk.timeOffPolicies.retrieve() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/companies/{company_uuid}/external_payrolls/tax_liabilities"]["put"] - update: - x-speakeasy-group: externalPayrolls - x-speakeasy-name-override: updateTaxLiabilities - x-speakeasy-metadata: - type: method-name - before: sdk.External Payrolls.put-v1-tax-liabilities() - after: sdk.externalPayrolls.updateTaxLiabilities() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/departments/{department_uuid}/add"]["put"] - update: - x-speakeasy-name-override: addPeople - x-speakeasy-metadata: - type: method-name - before: sdk.Departments.put-add-people-to-department() - after: sdk.departments.addPeople() - reviewed_at: 1737756176193 - created_at: 1737756172204 - - target: $["paths"]["/v1/companies/{company_uuid}/external_payrolls"]["get"] - update: - x-speakeasy-group: externalPayrolls - x-speakeasy-name-override: list - x-speakeasy-metadata: - type: method-name - before: sdk.External Payrolls.get-v1-company-external-payrolls() - after: sdk.externalPayrolls.list() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/jobs/{job_id}/compensations"]["post"] - update: - x-speakeasy-group: jobsAndCompensations - x-speakeasy-name-override: createCompensation - x-speakeasy-metadata: - type: method-name - before: sdk.Jobs and Compensations.post-v1-compensations-compensation_id() - after: sdk.jobsAndCompensations.createCompensation() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/companies/{company_id}/attachments"]["post"] - update: - x-speakeasy-group: companyAttachments - x-speakeasy-name-override: create - x-speakeasy-metadata: - type: method-name - before: sdk.Company Attachment.post-v1-companies-attachment() - after: sdk.companyAttachments.create() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/employees/{employee_id}/employment_history"]["get"] - update: - x-speakeasy-group: employeeEmployments - x-speakeasy-name-override: getHistory - x-speakeasy-metadata: - type: method-name - before: sdk.Employee Employments.get-v1-employees-employee_id-employment_history() - after: sdk.employeeEmployments.getHistory() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/work_addresses/{work_address_uuid}"]["delete"] - update: - x-speakeasy-group: employeeAddresses - x-speakeasy-name-override: delete - x-speakeasy-metadata: - type: method-name - before: sdk.Employee Addresses.delete-v1-work_addresses-work_address_uuid() - after: sdk.employeeAddresses.delete() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/employees/{employee_id}/bank_accounts/{bank_account_uuid}"]["delete"] - update: - x-speakeasy-group: employeePaymentMethod - x-speakeasy-name-override: deleteBankAccount - x-speakeasy-metadata: - type: method-name - before: sdk.Employee Payment Method.delete-v1-employees-employee_id-bank_accounts-bank_account_id() - after: sdk.employeePaymentMethod.deleteBankAccount() - reviewed_at: 1737756176193 - created_at: 1737756172202 - - target: $["paths"]["/v1/webhook_subscriptions/{webhook_subscription_uuid}"]["delete"] - update: - x-speakeasy-name-override: delete - x-speakeasy-metadata: - type: method-name - before: sdk.Webhooks.delete-v1-webhook-subscription-uuid() - after: sdk.webhooks.delete() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/companies/{company_uuid}/external_payrolls/tax_liabilities/finish"]["put"] - update: - x-speakeasy-group: externalPayrolls - x-speakeasy-name-override: finalizeTaxLiabilities - x-speakeasy-metadata: - type: method-name - before: sdk.External Payrolls.put-v1-tax-liabilities-finish() - after: sdk.externalPayrolls.finalizeTaxLiabilities() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/companies/{company_uuid}/holiday_pay_policy"]["put"] - update: - x-speakeasy-group: holidayPayPolicies - x-speakeasy-name-override: update - x-speakeasy-metadata: - type: method-name - before: sdk.Holiday Pay Policies.put-companies-company_uuid-holiday_pay_policy() - after: sdk.holidayPayPolicies.update() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/companies/{company_uuid}/contractors"]["get"] - update: - x-speakeasy-name-override: list - x-speakeasy-metadata: - type: method-name - before: sdk.Contractors.get-v1-companies-company_uuid-contractors() - after: sdk.contractors.list() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/companies/{company_uuid}/historical_employees/{historical_employee_uuid}"]["put"] - update: - x-speakeasy-name-override: updateHistorical - x-speakeasy-metadata: - type: method-name - before: sdk.Employees.put-v1-historical_employees() - after: sdk.employees.updateHistorical() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/companies/{company_id}/payrolls/{payroll_id}/cancel"]["put"] - update: - x-speakeasy-name-override: cancel - x-speakeasy-metadata: - type: method-name - before: sdk.Payrolls.put-api-v1-companies-company_id-payrolls-payroll_id-cancel() - after: sdk.payrolls.cancel() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/contractors/{contractor_uuid}/address"]["put"] - update: - x-speakeasy-name-override: updateAddress - x-speakeasy-metadata: - type: method-name - before: sdk.Contractors.put-v1-contractors-contractor_uuid-address() - after: sdk.contractors.updateAddress() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/locations/{location_id}"]["get"] - update: - x-speakeasy-name-override: get - x-speakeasy-metadata: - type: method-name - before: sdk.Locations.get-v1-locations-location_id() - after: sdk.locations.get() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/home_addresses/{home_address_uuid}"]["delete"] - update: - x-speakeasy-group: employeeAddresses - x-speakeasy-name-override: removeHomeAddress - x-speakeasy-metadata: - type: method-name - before: sdk.Employee Addresses.delete-v1-home_addresses-home_address_uuid() - after: sdk.employeeAddresses.removeHomeAddress() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/companies/{company_uuid}/finish_onboarding"]["put"] - update: - x-speakeasy-name-override: finishOnboarding - x-speakeasy-metadata: - type: method-name - before: sdk.Companies.get-v1-company-finish-onboarding() - after: sdk.companies.finishOnboarding() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/companies/{company_id}/admins"]["get"] - update: - x-speakeasy-name-override: getAdmins - x-speakeasy-metadata: - type: method-name - before: sdk.Companies.get-v1-companies-company_id-admins() - after: sdk.companies.getAdmins() - reviewed_at: 1737756176193 - created_at: 1737756172202 - - target: $["paths"]["/v1/payrolls/{payroll_uuid}/generated_documents/printable_payroll_checks"]["post"] - update: - x-speakeasy-name-override: generatePrintableChecks - x-speakeasy-metadata: - type: method-name - before: sdk.Payrolls.post-v1-payrolls-payroll_uuid-generated_documents-printable_payroll_checks() - after: sdk.payrolls.generatePrintableChecks() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/jobs/{job_id}"]["get"] - update: - x-speakeasy-group: jobsAndCompensations - x-speakeasy-name-override: getJob - x-speakeasy-metadata: - type: method-name - before: sdk.Jobs and Compensations.get-v1-jobs-job_id() - after: sdk.jobsAndCompensations.getJob() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/company_benefits/{company_benefit_id}"]["put"] - update: - x-speakeasy-group: companyBenefits - x-speakeasy-name-override: update - x-speakeasy-metadata: - type: method-name - before: sdk.Company Benefits.put-v1-company_benefits-company_benefit_id() - after: sdk.companyBenefits.update() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/companies/{company_uuid}/payrolls/skip"]["post"] - update: - x-speakeasy-name-override: skip - x-speakeasy-metadata: - type: method-name - before: sdk.Payrolls.post-companies-payroll-skip-company_uuid() - after: sdk.payrolls.skip() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/time_off_policies/{time_off_policy_uuid}/balance"]["put"] - update: - x-speakeasy-group: timeOffPolicies - x-speakeasy-name-override: updateBalance - x-speakeasy-metadata: - type: method-name - before: sdk.Time Off Policies.put-version-time_off_policies-time_off_policy_uuid-balance() - after: sdk.timeOffPolicies.updateBalance() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/jobs/{job_id}"]["delete"] - update: - x-speakeasy-group: jobsAndCompensations - x-speakeasy-name-override: deleteJob - x-speakeasy-metadata: - type: method-name - before: sdk.Jobs and Compensations.delete-v1-jobs-job_id() - after: sdk.jobsAndCompensations.deleteJob() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/employees/{employee_id}/jobs"]["post"] - update: - x-speakeasy-group: jobsAndCompensations - x-speakeasy-name-override: createJob - x-speakeasy-metadata: - type: method-name - before: sdk.Jobs and Compensations.post-v1-jobs-job_id() - after: sdk.jobsAndCompensations.createJob() - reviewed_at: 1737756176193 - created_at: 1737756172202 - - target: $["paths"]["/v1/company_benefits/{company_benefit_id}/employee_benefits"]["put"] - update: - x-speakeasy-group: companyBenefits - x-speakeasy-name-override: bulkUpdateEmployeeBenefits - x-speakeasy-metadata: - type: method-name - before: sdk.Company Benefits.put-v1-company_benefits-company_benefit_id-employee_benefits() - after: sdk.companyBenefits.bulkUpdateEmployeeBenefits() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/companies/{company_uuid}/time_off_policies"]["post"] - update: - x-speakeasy-group: timeOffPolicies - x-speakeasy-name-override: create - x-speakeasy-metadata: - type: method-name - before: sdk.Time Off Policies.post-companies-company_uuid-time_off_policies() - after: sdk.timeOffPolicies.create() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/webhook_subscriptions/{webhook_subscription_uuid}"]["put"] - update: - x-speakeasy-name-override: updateSubscription - x-speakeasy-metadata: - type: method-name - before: sdk.Webhooks.put-v1-webhook-subscription-uuid() - after: sdk.webhooks.updateSubscription() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/employees/{employee_id}/i9_authorization/documents"]["get"] - update: - x-speakeasy-group: i9Verification - x-speakeasy-name-override: getDocuments - x-speakeasy-metadata: - type: method-name - before: sdk.I-9 Verification.get-v1-employees-employee_id-i9_authorization-documents() - after: sdk.i9Verification.getDocuments() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/contractor_payments/{contractor_payment_uuid}/fund"]["put"] - update: - x-speakeasy-group: contractorPayments - x-speakeasy-name-override: fund - x-speakeasy-metadata: - type: method-name - before: sdk.Contractor Payments.get-v1-contractor_payments-contractor_payment_uuid-fund() - after: sdk.contractorPayments.fund() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/employees/{employee_id}/payment_method"]["put"] - update: - x-speakeasy-group: employeePaymentMethod - x-speakeasy-name-override: update - x-speakeasy-metadata: - type: method-name - before: sdk.Employee Payment Method.put-v1-employees-employee_id-payment_method() - after: sdk.employeePaymentMethod.update() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/partner_managed_companies/{company_uuid}/retrieve_terms_of_service"]["post"] - update: - x-speakeasy-name-override: retrieveTermsOfService - x-speakeasy-metadata: - type: method-name - before: sdk.Companies.post-partner-managed-companies-company_uuid-retrieve_terms_of_service() - after: sdk.companies.retrieveTermsOfService() - reviewed_at: 1737756176193 - created_at: 1737756172202 - - target: $["paths"]["/v1/contractors/{contractor_uuid}"]["delete"] - update: - x-speakeasy-name-override: delete - x-speakeasy-metadata: - type: method-name - before: sdk.Contractors.delete-v1-contractors-contractor_uuid() - after: sdk.contractors.delete() - reviewed_at: 1737756176193 - created_at: 1737756172202 - - target: $["paths"]["/v1/companies/{company_uuid}/payment_configs"]["put"] - update: - x-speakeasy-group: paymentConfigs - x-speakeasy-name-override: update - x-speakeasy-metadata: - type: method-name - before: sdk.Payment Configs.put-v1-company-payment-configs() - after: sdk.paymentConfigs.update() - reviewed_at: 1737756176193 - created_at: 1737756172202 - - target: $["paths"]["/v1/employee_benefits/{employee_benefit_id}"]["put"] - update: - x-speakeasy-group: employeeBenefits - x-speakeasy-name-override: update - x-speakeasy-metadata: - type: method-name - before: sdk.Employee Benefits.put-v1-employee_benefits-employee_benefit_id() - after: sdk.employeeBenefits.update() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/companies/{company_uuid}/holiday_pay_policy"]["get"] - update: - x-speakeasy-group: holidayPayPolicies - x-speakeasy-name-override: get - x-speakeasy-metadata: - type: method-name - before: sdk.Holiday Pay Policies.get-companies-company_uuid-holiday_pay_policy() - after: sdk.holidayPayPolicies.get() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/benefits"]["get"] - update: - x-speakeasy-group: companyBenefits - x-speakeasy-name-override: getAll - x-speakeasy-metadata: - type: method-name - before: sdk.Company Benefits.get-v1-benefits() - after: sdk.companyBenefits.getAll() - reviewed_at: 1737756176193 - created_at: 1737756172204 - - target: $["paths"]["/v1/sandbox/generate_w2"]["post"] - update: - x-speakeasy-group: employeeForms - x-speakeasy-name-override: generateW2 - x-speakeasy-metadata: - type: method-name - before: sdk.Employee Forms.post-v1-sandbox-generate_w2() - after: sdk.employeeForms.generateW2() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/notifications/{notification_uuid}"]["get"] - update: - x-speakeasy-name-override: get - x-speakeasy-metadata: - type: method-name - before: sdk.Notifications.get-notifications-notification_uuid() - after: sdk.notifications.get() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/companies/{company_id}/pay_periods/unprocessed_termination_pay_periods"]["get"] - update: - x-speakeasy-group: paySchedules - x-speakeasy-name-override: listUnprocessedTerminationPeriods - x-speakeasy-metadata: - type: method-name - before: sdk.Pay Schedules.get-v1-companies-company_id-unprocessed_termination_pay_periods() - after: sdk.paySchedules.listUnprocessedTerminationPeriods() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/garnishments/child_support"]["get"] - update: - x-speakeasy-name-override: getChildSupport - x-speakeasy-metadata: - type: method-name - before: sdk.Garnishments.get-v1-garnishments-child_support() - after: sdk.garnishments.getChildSupport() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/departments/{department_uuid}"]["put"] - update: - x-speakeasy-name-override: update - x-speakeasy-metadata: - type: method-name - before: sdk.Departments.put-departments() - after: sdk.departments.update() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/employees/{employee_id}/garnishments"]["get"] - update: - x-speakeasy-name-override: get - x-speakeasy-metadata: - type: method-name - before: sdk.Garnishments.get-v1-employees-employee_id-garnishments() - after: sdk.garnishments.get() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/companies/{company_id}/payrolls/{payroll_id}/submit"]["put"] - update: - x-speakeasy-name-override: submit - x-speakeasy-metadata: - type: method-name - before: sdk.Payrolls.put-v1-companies-company_id-payrolls-payroll_id-submit() - after: sdk.payrolls.submit() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/companies/{company_id}/contractor_payments"]["get"] - update: - x-speakeasy-group: contractorPayments - x-speakeasy-name-override: getPayments - x-speakeasy-metadata: - type: method-name - before: sdk.Contractor Payments.get-v1-companies-company_id-contractor_payments() - after: sdk.contractorPayments.getPayments() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/employees/{employee_id}/garnishments"]["post"] - update: - x-speakeasy-name-override: create - x-speakeasy-metadata: - type: method-name - before: sdk.Garnishments.post-v1-employees-employee_id-garnishments() - after: sdk.garnishments.create() - reviewed_at: 1737756176193 - created_at: 1737756172202 - - target: $["paths"]["/v1/terminations/{employee_id}"]["put"] - update: - x-speakeasy-group: employeeEmployments - x-speakeasy-name-override: updateTermination - x-speakeasy-metadata: - type: method-name - before: sdk.Employee Employments.put-v1-terminations-employee_id() - after: sdk.employeeEmployments.updateTermination() - reviewed_at: 1737756176193 - created_at: 1737756172202 - - target: $["paths"]["/v1/contractors/{contractor_uuid}/forms"]["get"] - update: - x-speakeasy-group: contractorForms - x-speakeasy-name-override: getAll - x-speakeasy-metadata: - type: method-name - before: sdk.Contractor Forms.get-v1-contractor-forms() - after: sdk.contractorForms.getAll() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/employees/{employee_id}/work_addresses"]["post"] - update: - x-speakeasy-group: employeeAddresses.workAddresses - x-speakeasy-name-override: create - x-speakeasy-metadata: - type: method-name - before: sdk.Employee Addresses.post-v1-employees-employee_id-work_addresses() - after: sdk.employeeAddresses.workAddresses.create() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/companies/{company_id}/employees"]["post"] - update: - x-speakeasy-name-override: create - x-speakeasy-metadata: - type: method-name - before: sdk.Employees.post-v1-employees() - after: sdk.employees.create() - reviewed_at: 1737756176193 - created_at: 1737756172202 - - target: $["paths"]["/v1/companies/{company_uuid}/external_payrolls"]["post"] - update: - x-speakeasy-group: externalPayrolls - x-speakeasy-name-override: create - x-speakeasy-metadata: - type: method-name - before: sdk.External Payrolls.post-v1-external-payroll() - after: sdk.externalPayrolls.create() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/partner_managed_companies"]["post"] - update: - x-speakeasy-name-override: createPartnerManaged - x-speakeasy-metadata: - type: method-name - before: sdk.Companies.post-v1-partner-managed-companies() - after: sdk.companies.createPartnerManaged() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/companies/{company_id}/contractor_payments/{contractor_payment_id}"]["get"] - update: - x-speakeasy-group: contractorPayments - x-speakeasy-name-override: get - x-speakeasy-metadata: - type: method-name - before: sdk.Contractor Payments.get-v1-companies-company_id-contractor_payment-contractor-payment() - after: sdk.contractorPayments.get() - reviewed_at: 1737756176193 - created_at: 1737756172204 - - target: $["paths"]["/v1/companies/{company_uuid}/signatories/{signatory_uuid}"]["put"] - update: - x-speakeasy-name-override: update - x-speakeasy-metadata: - type: method-name - before: sdk.Signatories.put-v1-companies-company_uuid-signatories-signatory_uuid() - after: sdk.signatories.update() - reviewed_at: 1737756176193 - created_at: 1737756172202 - - target: $["paths"]["/v1/companies/{company_id}/industry_selection"]["put"] - update: - x-speakeasy-group: industrySelection - x-speakeasy-name-override: update - x-speakeasy-metadata: - type: method-name - before: sdk.Industry Selection.put-v1-company-industry() - after: sdk.industrySelection.update() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/companies/{company_uuid}/payrolls/blockers"]["get"] - update: - x-speakeasy-name-override: getBlockers - x-speakeasy-metadata: - type: method-name - before: sdk.Payrolls.get-v1-companies-payroll-blockers-company_uuid() - after: sdk.payrolls.getBlockers() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/employees/{employee_id}/bank_accounts"]["post"] - update: - x-speakeasy-group: employeePaymentMethod - x-speakeasy-name-override: createBankAccount - x-speakeasy-metadata: - type: method-name - before: sdk.Employee Payment Method.post-v1-employees-employee_id-bank_accounts() - after: sdk.employeePaymentMethod.createBankAccount() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/companies/{company_id}/pay_schedules"]["post"] - update: - x-speakeasy-group: paySchedules - x-speakeasy-name-override: create - x-speakeasy-metadata: - type: method-name - before: sdk.Pay Schedules.post-v1-companies-company_id-pay_schedules() - after: sdk.paySchedules.create() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/contractors/{contractor_uuid}/payment_method"]["get"] - update: - x-speakeasy-group: contractorPaymentMethod - x-speakeasy-name-override: get - x-speakeasy-metadata: - type: method-name - before: sdk.Contractor Payment Method.get-v1-contractors-contractor_uuid-payment_method() - after: sdk.contractorPaymentMethod.get() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/companies/{company_uuid}/payment_configs"]["get"] - update: - x-speakeasy-group: paymentConfigs - x-speakeasy-name-override: get - x-speakeasy-metadata: - type: method-name - before: sdk.Payment Configs.get-v1-company-payment-configs() - after: sdk.paymentConfigs.get() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/work_addresses/{work_address_uuid}"]["get"] - update: - x-speakeasy-group: employeeAddresses - x-speakeasy-name-override: getWorkAddress - x-speakeasy-metadata: - type: method-name - before: sdk.Employee Addresses.get-v1-work_addresses-work_address_uuid() - after: sdk.employeeAddresses.getWorkAddress() - reviewed_at: 1737756176193 - created_at: 1737756172202 - - target: $["paths"]["/v1/employees/{employee_uuid}/federal_taxes"]["put"] - update: - x-speakeasy-group: employeeTaxSetup - x-speakeasy-name-override: updateFederalTaxes - x-speakeasy-metadata: - type: method-name - before: sdk.Employee Tax Setup.put-v1-employees-employee_id-federal_taxes() - after: sdk.employeeTaxSetup.updateFederalTaxes() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/payrolls/{payroll_uuid}/receipt"]["get"] - update: - x-speakeasy-name-override: getReceipt - x-speakeasy-metadata: - type: method-name - before: sdk.Payrolls.get-v1-payment-receipts-payrolls-payroll_uuid() - after: sdk.payrolls.getReceipt() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/companies/{company_id}/locations"]["get"] - update: - x-speakeasy-name-override: getAll - x-speakeasy-metadata: - type: method-name - before: sdk.Locations.get-v1-companies-company_id-locations() - after: sdk.locations.getAll() - reviewed_at: 1737756176193 - created_at: 1737756172202 - - target: $["paths"]["/v1/employees/{employee_id}/ytd_benefit_amounts_from_different_company"]["post"] - update: - x-speakeasy-group: employeeBenefits - x-speakeasy-name-override: createYtdAmountsFromDifferentCompany - x-speakeasy-metadata: - type: method-name - before: sdk.Employee Benefits.post-employee-ytd-benefit-amounts-from-different-company() - after: sdk.employeeBenefits.createYtdAmountsFromDifferentCompany() - reviewed_at: 1737756176193 - created_at: 1737756172204 - - target: $["paths"]["/v1/companies/{company_id}/earning_types/{earning_type_uuid}"]["delete"] - update: - x-speakeasy-group: earningTypes - x-speakeasy-name-override: deactivate - x-speakeasy-metadata: - type: method-name - before: sdk.Earning Types.delete-v1-companies-company_id-earning_types-earning_type_uuid() - after: sdk.earningTypes.deactivate() - reviewed_at: 1737756176193 - created_at: 1737756172202 - - target: $["paths"]["/v1/employees/{employee_uuid}/time_off_activities"]["get"] - update: - x-speakeasy-name-override: getTimeOffActivities - x-speakeasy-metadata: - type: method-name - before: sdk.Employees.get-version-employees-time_off_activities() - after: sdk.employees.getTimeOffActivities() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/companies/{company_uuid}/signatories"]["post"] - update: - x-speakeasy-name-override: create - x-speakeasy-metadata: - type: method-name - before: sdk.Signatories.post-v1-company-signatories() - after: sdk.signatories.create() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/employees/{employee_id}/i9_authorization/documents/{document_id}"]["delete"] - update: - x-speakeasy-group: i9Verification - x-speakeasy-name-override: deleteDocument - x-speakeasy-metadata: - type: method-name - before: sdk.I-9 Verification.delete-v1-employees-employee_id-i9_authorization-documents-document_id() - after: sdk.i9Verification.deleteDocument() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/sandbox/generate_1099"]["post"] - update: - x-speakeasy-group: contractorForms - x-speakeasy-name-override: generate1099 - x-speakeasy-metadata: - type: method-name - before: sdk.Contractor Forms.post-v1-sandbox-generate_1099() - after: sdk.contractorForms.generate1099() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/company_benefits/{company_benefit_id}"]["delete"] - update: - x-speakeasy-group: companyBenefits - x-speakeasy-name-override: delete - x-speakeasy-metadata: - type: method-name - before: sdk.Company Benefits.delete-v1-company_benefits-company_benefit_id() - after: sdk.companyBenefits.delete() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/contractors/{contractor_uuid}/onboarding_status"]["get"] - update: - x-speakeasy-name-override: getOnboardingStatus - x-speakeasy-metadata: - type: method-name - before: sdk.Contractors.get-v1-contractors-contractor_uuid-onboarding_status() - after: sdk.contractors.getOnboardingStatus() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/companies/{company_id}/pay_schedules"]["get"] - update: - x-speakeasy-group: paySchedules - x-speakeasy-name-override: getForCompany - x-speakeasy-metadata: - type: method-name - before: sdk.Pay Schedules.get-v1-companies-company_id-pay_schedules() - after: sdk.paySchedules.getForCompany() - reviewed_at: 1737756176193 - created_at: 1737756172202 - - target: $["paths"]["/v1/work_addresses/{work_address_uuid}"]["put"] - update: - x-speakeasy-group: employeeAddresses - x-speakeasy-name-override: updateWorkAddress - x-speakeasy-metadata: - type: method-name - before: sdk.Employee Addresses.put-v1-work_addresses-work_address_uuid() - after: sdk.employeeAddresses.updateWorkAddress() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/company_benefits/{company_benefit_id}"]["get"] - update: - x-speakeasy-group: companyBenefits - x-speakeasy-name-override: get - x-speakeasy-metadata: - type: method-name - before: sdk.Company Benefits.get-v1-company_benefits-company_benefit_id() - after: sdk.companyBenefits.get() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/employees/{employee_id}"]["get"] - update: - x-speakeasy-name-override: retrieve - x-speakeasy-metadata: - type: method-name - before: sdk.Employees.get-v1-employees() - after: sdk.employees.retrieve() - reviewed_at: 1737756176193 - created_at: 1737756172202 - - target: $["paths"]["/v1/companies/{company_id}/contractor_payment_groups/preview"]["post"] - update: - x-speakeasy-group: contractorPaymentGroups - x-speakeasy-name-override: preview - x-speakeasy-metadata: - type: method-name - before: sdk.Contractor Payment Groups.post-v1-companies-company_id-contractor_payment_groups-preview() - after: sdk.contractorPaymentGroups.preview() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/companies/{company_uuid}/historical_employees"]["post"] - update: - x-speakeasy-name-override: createHistorical - x-speakeasy-metadata: - type: method-name - before: sdk.Employees.post-v1-historical_employees() - after: sdk.employees.createHistorical() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/wire_in_requests/{wire_in_request_uuid}"]["get"] - update: - x-speakeasy-group: wireInRequests - x-speakeasy-name-override: get - x-speakeasy-metadata: - type: method-name - before: sdk.Wire In Requests.get-wire_in_requests-wire_in_request_uuid() - after: sdk.wireInRequests.get() - reviewed_at: 1737756176193 - created_at: 1737756172204 - - target: $["paths"]["/v1/companies/{company_id}/contractor_payment_groups"]["post"] - update: - x-speakeasy-group: contractorPaymentGroups - x-speakeasy-name-override: create - x-speakeasy-metadata: - type: method-name - before: sdk.Contractor Payment Groups.post-v1-companies-company_id-contractor_payment_groups() - after: sdk.contractorPaymentGroups.create() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/companies/{company_id}/locations"]["post"] - update: - x-speakeasy-name-override: create - x-speakeasy-metadata: - type: method-name - before: sdk.Locations.post-v1-companies-company_id-locations() - after: sdk.locations.create() - reviewed_at: 1737756176193 - created_at: 1737756172204 - - target: $["paths"]["/v1/companies/{company_uuid}/contractor_payments/preview"]["get"] - update: - x-speakeasy-group: contractorPayments - x-speakeasy-name-override: preview - x-speakeasy-metadata: - type: method-name - before: sdk.Contractor Payments.get-companies-company_uuid-contractor_payments-preview() - after: sdk.contractorPayments.preview() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/companies/{company_id}/pay_periods"]["get"] - update: - x-speakeasy-group: paySchedules - x-speakeasy-name-override: list - x-speakeasy-metadata: - type: method-name - before: sdk.Pay Schedules.get-v1-companies-company_id-pay_periods() - after: sdk.paySchedules.list() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/employees/{employee_id}/work_addresses"]["get"] - update: - x-speakeasy-group: employeeAddresses - x-speakeasy-name-override: get - x-speakeasy-metadata: - type: method-name - before: sdk.Employee Addresses.get-v1-employees-employee_id-work_addresses() - after: sdk.employeeAddresses.get() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/companies/{company_id}/payrolls"]["post"] - update: - x-speakeasy-name-override: create - x-speakeasy-metadata: - type: method-name - before: sdk.Payrolls.post-v1-companies-company_id-payrolls() - after: sdk.payrolls.create() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/employees/{employee_id}/forms/{form_id}/sign"]["put"] - update: - x-speakeasy-group: employeeForms - x-speakeasy-name-override: sign - x-speakeasy-metadata: - type: method-name - before: sdk.Employee Forms.put-v1-employee-form-sign() - after: sdk.employeeForms.sign() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/time_off_policies/{time_off_policy_uuid}/add_employees"]["put"] - update: - x-speakeasy-group: timeOffPolicies - x-speakeasy-name-override: addEmployees - x-speakeasy-metadata: - type: method-name - before: sdk.Time Off Policies.put-version-time_off_policies-time_off_policy_uuid-add_employees() - after: sdk.timeOffPolicies.addEmployees() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/company_benefits/{company_benefit_id}/summary"]["get"] - update: - x-speakeasy-group: companyBenefits - x-speakeasy-name-override: getSummary - x-speakeasy-metadata: - type: method-name - before: sdk.Company Benefits.get-v1-benefits-company_benefit_id-summary() - after: sdk.companyBenefits.getSummary() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/companies/{company_id}/earning_types/{earning_type_uuid}"]["put"] - update: - x-speakeasy-group: earningTypes - x-speakeasy-name-override: update - x-speakeasy-metadata: - type: method-name - before: sdk.Earning Types.put-v1-companies-company_id-earning_types-earning_type_uuid() - after: sdk.earningTypes.update() - reviewed_at: 1737756176193 - created_at: 1737756172204 - - target: $["paths"]["/v1/employees/{employee_id}/rehire"]["delete"] - update: - x-speakeasy-group: employeeEmployments - x-speakeasy-name-override: deleteRehire - x-speakeasy-metadata: - type: method-name - before: sdk.Employee Employments.delete-v1-employees-employee_id-rehire() - after: sdk.employeeEmployments.deleteRehire() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/contractors/{contractor_uuid}/address"]["get"] - update: - x-speakeasy-name-override: getAddress - x-speakeasy-metadata: - type: method-name - before: sdk.Contractors.get-v1-contractors-contractor_uuid-address() - after: sdk.contractors.getAddress() - reviewed_at: 1737756176193 - created_at: 1737756172204 - - target: $["paths"]["/v1/employees/{employee_uuid}/state_taxes"]["put"] - update: - x-speakeasy-group: employeeTaxSetup - x-speakeasy-name-override: updateStateTaxes - x-speakeasy-metadata: - type: method-name - before: sdk.Employee Tax Setup.put-v1-employees-employee_id-state_taxes() - after: sdk.employeeTaxSetup.updateStateTaxes() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/employees/{employee_id}/i9_authorization"]["put"] - update: - x-speakeasy-group: i9Verification - x-speakeasy-name-override: createOrUpdate - x-speakeasy-metadata: - type: method-name - before: sdk.I-9 Verification.put-v1-employees-employee_id-i9_authorization() - after: sdk.i9Verification.createOrUpdate() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/companies/{company_uuid}/holiday_pay_policy/add"]["put"] - update: - x-speakeasy-group: holidayPayPolicies - x-speakeasy-name-override: addEmployees - x-speakeasy-metadata: - type: method-name - before: sdk.Holiday Pay Policies.put-companies-company_uuid-holiday_pay_policy-add() - after: sdk.holidayPayPolicies.addEmployees() - reviewed_at: 1737756176193 - created_at: 1737756172204 - - target: $["paths"]["/v1/companies/{company_uuid}/report_templates/{report_type}"]["get"] - update: - x-speakeasy-name-override: getTemplate - x-speakeasy-metadata: - type: method-name - before: sdk.Reports.get-companies-company_uuid-report-templates-report_type() - after: sdk.reports.getTemplate() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/employees/{employee_id}/jobs"]["get"] - update: - x-speakeasy-group: jobsAndCompensations - x-speakeasy-name-override: getJobs - x-speakeasy-metadata: - type: method-name - before: sdk.Jobs and Compensations.get-v1-employees-employee_id-jobs() - after: sdk.jobsAndCompensations.getJobs() - reviewed_at: 1737756176193 - created_at: 1737756172202 - - target: $["paths"]["/v1/companies/{company_uuid}/ach_transactions"]["get"] - update: - x-speakeasy-group: achTransactions - x-speakeasy-name-override: get - x-speakeasy-metadata: - type: method-name - before: sdk.ACH Transactions.get-ach-transactions() - after: sdk.achTransactions.get() - reviewed_at: 1737756176193 - created_at: 1737756172202 - - target: $["paths"]["/v1/company_benefits/{company_benefit_id}/employee_benefits"]["get"] - update: - x-speakeasy-group: companyBenefits - x-speakeasy-name-override: getEmployeeBenefits - x-speakeasy-metadata: - type: method-name - before: sdk.Company Benefits.get-v1-company_benefits-company_benefit_id-employee_benefits() - after: sdk.companyBenefits.getEmployeeBenefits() - reviewed_at: 1737756176193 - created_at: 1737756172204 - - target: $["paths"]["/v1/companies/{company_id}"]["get"] - update: - x-speakeasy-name-override: get - x-speakeasy-metadata: - type: method-name - before: sdk.Companies.get-v1-companies() - after: sdk.companies.get() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/contractor_payment_groups/{contractor_payment_group_uuid}/fund"]["put"] - update: - x-speakeasy-group: contractorPaymentGroups - x-speakeasy-name-override: fund - x-speakeasy-metadata: - type: method-name - before: sdk.Contractor Payment Groups.put-v1-contractor_payment_groups-contractor_payment_group_id-fund() - after: sdk.contractorPaymentGroups.fund() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/reports/{report_uuid}"]["get"] - update: - x-speakeasy-name-override: get - x-speakeasy-metadata: - type: method-name - before: sdk.Reports.get-reports-report_uuid() - after: sdk.reports.get() - reviewed_at: 1737756176193 - created_at: 1737756172202 - - target: $["paths"]["/v1/companies/{company_id}/payrolls/{payroll_id}"]["get"] - update: - x-speakeasy-name-override: get - x-speakeasy-metadata: - type: method-name - before: sdk.Payrolls.get-v1-companies-company_id-payrolls-payroll_id() - after: sdk.payrolls.get() - reviewed_at: 1737756176193 - created_at: 1737756172202 - - target: $["paths"]["/v1/time_off_policies/{time_off_policy_uuid}/deactivate"]["put"] - update: - x-speakeasy-group: timeOffPolicies - x-speakeasy-name-override: deactivate - x-speakeasy-metadata: - type: method-name - before: sdk.Time Off Policies.put-v1-time_off_policies-time_off_policy_uuid-deactivate() - after: sdk.timeOffPolicies.deactivate() - reviewed_at: 1737756176193 - created_at: 1737756172202 - - target: $["paths"]["/v1/companies/{company_id}/pay_schedules/{pay_schedule_id}"]["get"] - update: - x-speakeasy-group: paySchedules - x-speakeasy-name-override: get - x-speakeasy-metadata: - type: method-name - before: sdk.Pay Schedules.get-v1-companies-company_id-pay_schedules-pay_schedule_id() - after: sdk.paySchedules.get() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/companies/{company_uuid}/external_payrolls/{external_payroll_id}"]["get"] - update: - x-speakeasy-group: externalPayrolls - x-speakeasy-name-override: get - x-speakeasy-metadata: - type: method-name - before: sdk.External Payrolls.get-v1-external-payroll() - after: sdk.externalPayrolls.get() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/employees/{employee_id}/custom_fields"]["get"] - update: - x-speakeasy-name-override: getCustomFields - x-speakeasy-metadata: - type: method-name - before: sdk.Employees.get-v1-employees-employee_id-custom_fields() - after: sdk.employees.getCustomFields() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/companies/{company_id}"]["put"] - update: - x-speakeasy-name-override: update - x-speakeasy-metadata: - type: method-name - before: sdk.Companies.put-v1-companies() - after: sdk.companies.update() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/companies/{company_id}/admins"]["post"] - update: - x-speakeasy-name-override: createAdmin - x-speakeasy-metadata: - type: method-name - before: sdk.Companies.post-v1-companies-company_id-admins() - after: sdk.companies.createAdmin() - reviewed_at: 1737756176193 - created_at: 1737756172202 - - target: $["paths"]["/v1/companies/{company_id}/payrolls/{payroll_id}/calculate"]["put"] - update: - x-speakeasy-name-override: calculate - x-speakeasy-metadata: - type: method-name - before: sdk.Payrolls.put-v1-companies-company_id-payrolls-payroll_id-calculate() - after: sdk.payrolls.calculate() - reviewed_at: 1737756176193 - created_at: 1737756172202 - - target: $["paths"]["/v1/employees/{employee_id}/i9_authorization"]["get"] - update: - x-speakeasy-group: i9Verification - x-speakeasy-name-override: getAuthorization - x-speakeasy-metadata: - type: method-name - before: sdk.I-9 Verification.get-v1-employees-employee_id-i9_authorization() - after: sdk.i9Verification.getAuthorization() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/documents/{document_uuid}/pdf"]["get"] - update: - x-speakeasy-group: contractorDocuments - x-speakeasy-name-override: getPdf - x-speakeasy-metadata: - type: method-name - before: sdk.Contractor Documents.get-v1-contractor-document-pdf() - after: sdk.contractorDocuments.getPdf() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/benefits/{benefit_id}"]["get"] - update: - x-speakeasy-group: companyBenefits - x-speakeasy-name-override: getSupportedBenefit - x-speakeasy-metadata: - type: method-name - before: sdk.Company Benefits.get-v1-benefits-benefit_id() - after: sdk.companyBenefits.getSupportedBenefit() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/companies/{company_uuid}/external_payrolls/{external_payroll_id}"]["delete"] - update: - x-speakeasy-group: externalPayrolls - x-speakeasy-name-override: delete - x-speakeasy-metadata: - type: method-name - before: sdk.External Payrolls.delete-v1-external-payroll() - after: sdk.externalPayrolls.delete() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/compensations/{compensation_id}"]["get"] - update: - x-speakeasy-group: jobsAndCompensations - x-speakeasy-name-override: getCompensation - x-speakeasy-metadata: - type: method-name - before: sdk.Jobs and Compensations.get-v1-compensations-compensation_id() - after: sdk.jobsAndCompensations.getCompensation() - reviewed_at: 1737756176193 - created_at: 1737756172203 - - target: $["paths"]["/v1/documents/{document_uuid}"]["get"] - update: - x-speakeasy-group: contractorDocuments - x-speakeasy-name-override: get - x-speakeasy-metadata: - type: method-name - before: sdk.Contractor Documents.get-v1-contractor-document() - after: sdk.contractorDocuments.get() - reviewed_at: 1737756176193 - created_at: 1737756172203 diff --git a/gusto_embedded/src/companyAuth.ts b/gusto_embedded/src/companyAuth.ts index 3ae1081c..6be0c113 100644 --- a/gusto_embedded/src/companyAuth.ts +++ b/gusto_embedded/src/companyAuth.ts @@ -1,5 +1,5 @@ import * as z from "zod"; -import { SDK_METADATA } from "./lib/config"; +import { SDK_METADATA } from "./lib/config.js"; // TypeScript SDKs use Zod for runtime data validation. We can use Zod // to describe the shape of the response from the OAuth token endpoint. If the diff --git a/gusto_embedded/src/hooks/clientcredentials.ts b/gusto_embedded/src/hooks/clientcredentials.ts index a6834e1e..073bffc0 100644 --- a/gusto_embedded/src/hooks/clientcredentials.ts +++ b/gusto_embedded/src/hooks/clientcredentials.ts @@ -2,10 +2,9 @@ import * as z from "zod"; import { stringToBase64 } from "../lib/base64.js"; -import { env } from "../lib/env.js"; import { HTTPClient } from "../lib/http.js"; import { parse } from "../lib/schemas.js"; -import * as components from "../models/components/index.js"; +import { PostV1PartnerManagedCompaniesSecurity$outboundSchema } from "../models/operations/postv1partnermanagedcompanies.js"; import { AfterErrorContext, AfterErrorHook, @@ -167,17 +166,16 @@ export class ClientCredentialsHook } const out = parse( security, - (val) => z.lazy(() => components.Security$outboundSchema).parse(val), + (val) => + z + .lazy(() => PostV1PartnerManagedCompaniesSecurity$outboundSchema) + .parse(val), "unexpected security type" ); return { - clientID: - out?.SystemAccessAuth?.clientId ?? env().GUSTOEMBEDDED_CLIENT_ID ?? "", - clientSecret: - out?.SystemAccessAuth?.clientSecret ?? - env().GUSTOEMBEDDED_CLIENT_SECRET ?? - "", + clientID: out.clientId ?? "", + clientSecret: out.clientSecret ?? "", }; } diff --git a/gusto_embedded/src/hooks/registration.ts b/gusto_embedded/src/hooks/registration.ts index 70649734..71d474fe 100644 --- a/gusto_embedded/src/hooks/registration.ts +++ b/gusto_embedded/src/hooks/registration.ts @@ -1,4 +1,5 @@ -import { Hooks } from "./types.js"; +import { Hooks, Hook } from "./types.js"; +import { ClientCredentialsHook } from "./clientcredentials.js"; /* * This file is only ever generated once on the first generation and then is free to be modified. @@ -6,9 +7,27 @@ import { Hooks } from "./types.js"; * in this file or in separate files in the hooks folder. */ -// @ts-expect-error remove this line when you add your first hook and hooks is used export function initHooks(hooks: Hooks) { // Add hooks by calling hooks.register{ClientInit/BeforeCreateRequest/BeforeRequest/AfterSuccess/AfterError}Hook // with an instance of a hook that implements that specific Hook interface // Hooks are registered per SDK instance, and are valid for the lifetime of the SDK instance + const presetHooks: Array = [new ClientCredentialsHook()]; + + for (const hook of presetHooks) { + if ("sdkInit" in hook) { + hooks.registerSDKInitHook(hook); + } + if ("beforeCreateRequest" in hook) { + hooks.registerBeforeCreateRequestHook(hook); + } + if ("beforeRequest" in hook) { + hooks.registerBeforeRequestHook(hook); + } + if ("afterSuccess" in hook) { + hooks.registerAfterSuccessHook(hook); + } + if ("afterError" in hook) { + hooks.registerAfterErrorHook(hook); + } + } } From e3b189b35114664a58f85d146025a52f3f4ce254 Mon Sep 17 00:00:00 2001 From: Aaron Rosen Date: Thu, 13 Mar 2025 10:37:00 -0600 Subject: [PATCH 10/15] create a wrapper function for instantiating a company auth'd client with token refresh --- .../src/CompanyAuthenticatedClient.ts | 59 +++++++++++++++++++ gusto_embedded/src/companyAuth.ts | 16 +++-- 2 files changed, 70 insertions(+), 5 deletions(-) create mode 100644 gusto_embedded/src/CompanyAuthenticatedClient.ts diff --git a/gusto_embedded/src/CompanyAuthenticatedClient.ts b/gusto_embedded/src/CompanyAuthenticatedClient.ts new file mode 100644 index 00000000..375365a5 --- /dev/null +++ b/gusto_embedded/src/CompanyAuthenticatedClient.ts @@ -0,0 +1,59 @@ +import { TokenRefreshOptions, withTokenRefresh } from "./companyAuth.js"; +import { GustoEmbeddedCore } from "./core.js"; +import { SDKOptions, ServerDemo, ServerList } from "./lib/config.js"; + +type ClientArguments = { + clientId: string; + clientSecret: string; + accessToken: string; + refreshToken: string; + expiresIn: number; + options: TokenRefreshOptions & SDKOptions; +}; + +export function CompanyAuthenticatedClient({ + clientId, + clientSecret, + accessToken, + refreshToken, + expiresIn, + options, +}: ClientArguments) { + const authUrl = constructAuthUrl(options); + + return new GustoEmbeddedCore({ + ...options, + companyAccessAuth: withTokenRefresh( + clientId, + clientSecret, + accessToken, + refreshToken, + expiresIn, + { + ...options, + url: authUrl, + } + ), + }); +} + +function constructAuthUrl( + options: TokenRefreshOptions & Pick +) { + const { server, serverURL, url } = options; + + if (server) { + const baseUrl = ServerList[server] || ""; + return `${baseUrl}/oauth/token`; + } + + if (serverURL) { + return `${serverURL}/oauth/token`; + } + + if (url) { + return url; + } + + return `${ServerList[ServerDemo]}/oauth/token`; +} diff --git a/gusto_embedded/src/companyAuth.ts b/gusto_embedded/src/companyAuth.ts index 6be0c113..466a1cf0 100644 --- a/gusto_embedded/src/companyAuth.ts +++ b/gusto_embedded/src/companyAuth.ts @@ -15,25 +15,31 @@ const tokenResponseSchema = z.object({ // and slow or unreliable networks. const tolerance = 5 * 60 * 1000; +export type TokenRefreshOptions = { tokenStore?: TokenStore; url?: string }; + /** * A callback function that can be used to obtain an OAuth access token for use * with SDKs that require OAuth security. A new token is requested from the * OAuth provider when the current token has expired. */ export function withTokenRefresh( - clientID: string, + clientId: string, clientSecret: string, accessToken: string, refreshToken: string, - options: { tokenStore?: TokenStore; url?: string } = {} + expiresIn: number, + options: TokenRefreshOptions = {} ) { const { tokenStore = new InMemoryTokenStore(), - // Replace this with your default OAuth provider's access token endpoint. url = "https://api.gusto-demo.com/oauth/token", } = options; - tokenStore.set({ token: accessToken, refreshToken, expires: 10 }); + tokenStore.set({ + token: accessToken, + refreshToken, + expires: Date.now() + expiresIn * 1000 - tolerance, + }); return async (): Promise => { const session = await tokenStore.get(); @@ -53,7 +59,7 @@ export function withTokenRefresh( "user-agent": SDK_METADATA.userAgent, }, body: new URLSearchParams({ - client_id: clientID, + client_id: clientId, client_secret: clientSecret, grant_type: "refresh_token", refresh_token: refreshToken, From 83b851b91d49ce52777d7f57b5053fb709648a49 Mon Sep 17 00:00:00 2001 From: Aaron Rosen Date: Thu, 13 Mar 2025 10:45:51 -0600 Subject: [PATCH 11/15] Custom usage example for new token refresh wrapper functions --- gusto_embedded/README.md | 59 ++++++++++++++++++++++++++++++++-------- 1 file changed, 47 insertions(+), 12 deletions(-) diff --git a/gusto_embedded/README.md b/gusto_embedded/README.md index dc660d37..550db38b 100644 --- a/gusto_embedded/README.md +++ b/gusto_embedded/README.md @@ -94,29 +94,62 @@ yarn add @tanstack/react-query react react-dom For supported JavaScript runtimes, please consult [RUNTIMES.md](RUNTIMES.md). - ## SDK Example Usage ### Example ```typescript import { GustoEmbedded } from "@gusto/embedded-api"; +import { CompanyAuthenticatedClient } = "@gusto/embedded-api/CompanyAuthenticatedClient"; -const gustoEmbedded = new GustoEmbedded({ - companyAccessAuth: process.env["GUSTOEMBEDDED_COMPANY_ACCESS_AUTH"] ?? "", -}); +const client = new GustoEmbedded(); +const clientId = process.env["GUSTOEMBEDDED_CLIENT_ID"] +const clientSecret = process.env["GUSTOEMBEDDED_CLIENT_SECRET"]; async function run() { - const result = await gustoEmbedded.introspection.getInfo({}); + const response = await client.companies.createPartnerManaged( + { + clientId, + clientSecret, + }, + { + requestBody: { + user: { + firstName: "Frank", + lastName: "Ocean", + email: "frank@example.com", + phone: "2345558899", + }, + company: { + name: "Frank's Ocean, LLC", + tradeName: "Frank’s Ocean", + ein: "123456789", + contractorOnly: false, + }, + }, + } + ); + + const { accessToken, refreshToken, companyUuid, expiresIn } = response.object; + + const companyAuthClient = CompanyAuthenticatedClient({ + clientId, + clientSecret, + accessToken, + refreshToken, + expiresIn, + options: { + server: "demo", + }, + }); - // Handle the result - console.log(result); + await companyAuthClient.companies.get({ companyId: companyUuid }); } run(); ``` - + ## Authentication @@ -158,7 +191,8 @@ const gustoEmbedded = new GustoEmbedded(); async function run() { const result = await gustoEmbedded.companies.createPartnerManaged({ - systemAccessAuth: process.env["GUSTOEMBEDDED_SYSTEM_ACCESS_AUTH"] ?? "", + clientId: process.env["GUSTOEMBEDDED_CLIENT_ID"] ?? "", + clientSecret: process.env["GUSTOEMBEDDED_CLIENT_SECRET"] ?? "", }, { requestBody: { user: { @@ -1262,7 +1296,8 @@ async function run() { let result; try { result = await gustoEmbedded.companies.createPartnerManaged({ - systemAccessAuth: process.env["GUSTOEMBEDDED_SYSTEM_ACCESS_AUTH"] ?? "", + clientId: process.env["GUSTOEMBEDDED_CLIENT_ID"] ?? "", + clientSecret: process.env["GUSTOEMBEDDED_CLIENT_SECRET"] ?? "", }, { requestBody: { user: { @@ -1458,7 +1493,7 @@ looking for the latest version. ## Contributions -While we value open-source contributions to this SDK, this library is generated programmatically. Any manual changes added to internal files will be overwritten on the next generation. -We look forward to hearing your feedback. Feel free to open a PR or an issue with a proof of concept and we'll do our best to include it in a future release. +While we value open-source contributions to this SDK, this library is generated programmatically. Any manual changes added to internal files will be overwritten on the next generation. +We look forward to hearing your feedback. Feel free to open a PR or an issue with a proof of concept and we'll do our best to include it in a future release. ### SDK Created by [Speakeasy](https://www.speakeasy.com/?utm_source=gusto-embedded&utm_campaign=typescript) From 10227385f8416b46a61b8ad4bd12f05cd909f6e2 Mon Sep 17 00:00:00 2001 From: Aaron Rosen Date: Thu, 13 Mar 2025 16:42:28 -0600 Subject: [PATCH 12/15] fix bugs in token refresh, add tokenStore example --- gusto_embedded/README.md | 30 +++++++ .../src/CompanyAuthenticatedClient.ts | 29 +++++- gusto_embedded/src/companyAuth.ts | 90 ++++++++++++------- gusto_embedded/src/hooks/clientcredentials.ts | 6 ++ 4 files changed, 118 insertions(+), 37 deletions(-) diff --git a/gusto_embedded/README.md b/gusto_embedded/README.md index 550db38b..c0fa5cb5 100644 --- a/gusto_embedded/README.md +++ b/gusto_embedded/README.md @@ -97,11 +97,38 @@ For supported JavaScript runtimes, please consult [RUNTIMES.md](RUNTIMES.md). ## SDK Example Usage ### Example +Automatic token refresh using a persistent data store. ```typescript import { GustoEmbedded } from "@gusto/embedded-api"; import { CompanyAuthenticatedClient } = "@gusto/embedded-api/CompanyAuthenticatedClient"; +class PersistentTokenStore implements TokenStore { + constructor() {} + + async get() { + const { token, expires, refreshToken } = retrieveToken(); + + return { + token, + expires, + refreshToken, + }; + } + + async set({ + token, + expires, + refreshToken, + }: { + token: string; + expires: number; + refreshToken: string; + }) { + saveToken(token, refreshToken, expires); + } +} + const client = new GustoEmbedded(); const clientId = process.env["GUSTOEMBEDDED_CLIENT_ID"] const clientSecret = process.env["GUSTOEMBEDDED_CLIENT_SECRET"]; @@ -132,6 +159,8 @@ async function run() { const { accessToken, refreshToken, companyUuid, expiresIn } = response.object; + const tokenStore = PersistentTokenStore(); + const companyAuthClient = CompanyAuthenticatedClient({ clientId, clientSecret, @@ -140,6 +169,7 @@ async function run() { expiresIn, options: { server: "demo", + tokenStore, }, }); diff --git a/gusto_embedded/src/CompanyAuthenticatedClient.ts b/gusto_embedded/src/CompanyAuthenticatedClient.ts index 375365a5..ab79e9f7 100644 --- a/gusto_embedded/src/CompanyAuthenticatedClient.ts +++ b/gusto_embedded/src/CompanyAuthenticatedClient.ts @@ -1,5 +1,11 @@ -import { TokenRefreshOptions, withTokenRefresh } from "./companyAuth.js"; -import { GustoEmbeddedCore } from "./core.js"; +import { HTTPClient } from "./lib/http.js"; +import { + InMemoryTokenStore, + refreshAndSaveAuthToken, + TokenRefreshOptions, + withTokenRefresh, +} from "./companyAuth.js"; +import { GustoEmbedded } from "./sdk/sdk.js"; import { SDKOptions, ServerDemo, ServerList } from "./lib/config.js"; type ClientArguments = { @@ -20,9 +26,25 @@ export function CompanyAuthenticatedClient({ options, }: ClientArguments) { const authUrl = constructAuthUrl(options); + const tokenStore = new InMemoryTokenStore(); - return new GustoEmbeddedCore({ + const httpClientWithTokenRefresh = new HTTPClient(); + + httpClientWithTokenRefresh.addHook("response", async (res) => { + if (res.status === 401) { + console.log("Unauthorized, attempting to refresh token"); + + await refreshAndSaveAuthToken( + authUrl, + { clientId, clientSecret, refreshToken }, + tokenStore + ); + } + }); + + return new GustoEmbedded({ ...options, + httpClient: httpClientWithTokenRefresh, companyAccessAuth: withTokenRefresh( clientId, clientSecret, @@ -30,6 +52,7 @@ export function CompanyAuthenticatedClient({ refreshToken, expiresIn, { + tokenStore, ...options, url: authUrl, } diff --git a/gusto_embedded/src/companyAuth.ts b/gusto_embedded/src/companyAuth.ts index 466a1cf0..a84e8f9c 100644 --- a/gusto_embedded/src/companyAuth.ts +++ b/gusto_embedded/src/companyAuth.ts @@ -49,43 +49,65 @@ export function withTokenRefresh( return session.token; } - try { - const response = await fetch(url, { - method: "POST", - headers: { - "content-type": "application/x-www-form-urlencoded", - // Include the SDK's user agent in the request so requests can be - // tracked using observability infrastructure. - "user-agent": SDK_METADATA.userAgent, - }, - body: new URLSearchParams({ - client_id: clientId, - client_secret: clientSecret, - grant_type: "refresh_token", - refresh_token: refreshToken, - }), - }); - - if (!response.ok) { - throw new Error("Unexpected status code: " + response.status); - } - - const json = await response.json(); - const data = tokenResponseSchema.parse(json); - - await tokenStore.set({ - token: data.access_token, - expires: Date.now() + data.expires_in * 1000 - tolerance, - refreshToken: data.refresh_token, - }); - - return data.access_token; - } catch (error) { - throw new Error("Failed to obtain OAuth token: " + error); - } + return await refreshAndSaveAuthToken( + url, + { + clientId, + clientSecret, + refreshToken: session?.refreshToken ?? refreshToken, + }, + tokenStore + ); }; } +export async function refreshAndSaveAuthToken( + authUrl: string, + refreshCredentials: { + clientId: string; + clientSecret: string; + refreshToken: string; + }, + tokenStore: TokenStore +): Promise { + const { clientId, clientSecret, refreshToken } = refreshCredentials; + + try { + const response = await fetch(authUrl, { + method: "POST", + headers: { + "content-type": "application/x-www-form-urlencoded", + // Include the SDK's user agent in the request so requests can be + // tracked using observability infrastructure. + "user-agent": SDK_METADATA.userAgent, + }, + body: new URLSearchParams({ + client_id: clientId, + client_secret: clientSecret, + grant_type: "refresh_token", + refresh_token: refreshToken, + }), + }); + + if (!response.ok) { + throw new Error("Unexpected status code: " + response.status); + } + + const json = await response.json(); + const data = tokenResponseSchema.parse(json); + + await tokenStore.set({ + token: data.access_token, + expires: Date.now() + data.expires_in * 1000 - tolerance, + refreshToken: data.refresh_token, + }); + + return data.access_token; + } catch (error) { + throw new Error("Failed to obtain OAuth token: " + error); + } +} + /** * A TokenStore is used to save and retrieve OAuth tokens for use across SDK * method calls. This interface can be implemented to store tokens in memory, diff --git a/gusto_embedded/src/hooks/clientcredentials.ts b/gusto_embedded/src/hooks/clientcredentials.ts index 073bffc0..8253a936 100644 --- a/gusto_embedded/src/hooks/clientcredentials.ts +++ b/gusto_embedded/src/hooks/clientcredentials.ts @@ -164,6 +164,12 @@ export class ClientCredentialsHook if (typeof source === "function") { security = await source(); } + + // The client was passed a raw access token, no need to fetch one. + if (typeof security === "string") { + return null; + } + const out = parse( security, (val) => From 27995bc4f22e14b64e4ed018c53c6dac28a5bf6c Mon Sep 17 00:00:00 2001 From: Aaron Rosen Date: Thu, 13 Mar 2025 16:53:02 -0600 Subject: [PATCH 13/15] remove local workflow --- .speakeasy/workflow.yaml | 19 ------------------- gusto_embedded/src/hooks/clientcredentials.ts | 2 -- 2 files changed, 21 deletions(-) diff --git a/.speakeasy/workflow.yaml b/.speakeasy/workflow.yaml index 1e4936ea..2932a89b 100644 --- a/.speakeasy/workflow.yaml +++ b/.speakeasy/workflow.yaml @@ -13,14 +13,6 @@ sources: - location: gusto_embedded/.speakeasy/speakeasy-modifications-overlay.yaml registry: location: registry.speakeasyapi.dev/gusto/ruby-sdk/gusto-embedded-oas - GustoEmbedded-local: - inputs: - - location: ../Gusto-Partner-API/generated/embedded/api.v2024-04-01.embedded.yaml - overlays: - - location: ../Gusto-Partner-API/.speakeasy/speakeasy-modifications-overlay.yaml - - location: gusto_embedded/.speakeasy/speakeasy-modifications-overlay.yaml - registry: - location: registry.speakeasyapi.dev/gusto/ruby-sdk/gusto-embedded-local targets: gusto-embedded: target: typescript @@ -34,14 +26,3 @@ targets: location: registry.speakeasyapi.dev/gusto/ruby-sdk/gusto-embedded-oas-typescript-code-samples labelOverride: fixedValue: Typescript (SDK) - blocking: false - local: - target: typescript - source: GustoEmbedded-local - output: ./gusto_embedded - codeSamples: - registry: - location: registry.speakeasyapi.dev/gusto/ruby-sdk/gusto-embedded-oas-typescript-code-samples - labelOverride: - fixedValue: Typescript (SDK) - blocking: false diff --git a/gusto_embedded/src/hooks/clientcredentials.ts b/gusto_embedded/src/hooks/clientcredentials.ts index 8253a936..7b455fb6 100644 --- a/gusto_embedded/src/hooks/clientcredentials.ts +++ b/gusto_embedded/src/hooks/clientcredentials.ts @@ -75,8 +75,6 @@ export class ClientCredentialsHook response: Response | null, error: unknown ): Promise<{ response: Response | null; error: unknown }> { - // TODO I wonder if this only works if we don't define a 401 error on each - // request if (error) { return { response, error }; } From d41a9a55b70b41aa3ecb4eaf06c56740bfd62a18 Mon Sep 17 00:00:00 2001 From: Aaron Rosen Date: Tue, 25 Mar 2025 10:01:05 -0600 Subject: [PATCH 14/15] support custom http client --- gusto_embedded/src/CompanyAuthenticatedClient.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gusto_embedded/src/CompanyAuthenticatedClient.ts b/gusto_embedded/src/CompanyAuthenticatedClient.ts index ab79e9f7..179f973b 100644 --- a/gusto_embedded/src/CompanyAuthenticatedClient.ts +++ b/gusto_embedded/src/CompanyAuthenticatedClient.ts @@ -28,7 +28,7 @@ export function CompanyAuthenticatedClient({ const authUrl = constructAuthUrl(options); const tokenStore = new InMemoryTokenStore(); - const httpClientWithTokenRefresh = new HTTPClient(); + const httpClientWithTokenRefresh = options.httpClient ?? new HTTPClient(); httpClientWithTokenRefresh.addHook("response", async (res) => { if (res.status === 401) { From 7edf49256007839d6432852e14ea4cee73d87ae9 Mon Sep 17 00:00:00 2001 From: Aaron Rosen Date: Mon, 31 Mar 2025 10:48:27 -0600 Subject: [PATCH 15/15] PR feedback --- gusto_embedded/src/CompanyAuthenticatedClient.ts | 10 +++------- gusto_embedded/src/companyAuth.ts | 3 ++- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/gusto_embedded/src/CompanyAuthenticatedClient.ts b/gusto_embedded/src/CompanyAuthenticatedClient.ts index 179f973b..30b98699 100644 --- a/gusto_embedded/src/CompanyAuthenticatedClient.ts +++ b/gusto_embedded/src/CompanyAuthenticatedClient.ts @@ -14,7 +14,7 @@ type ClientArguments = { accessToken: string; refreshToken: string; expiresIn: number; - options: TokenRefreshOptions & SDKOptions; + options?: TokenRefreshOptions & SDKOptions; }; export function CompanyAuthenticatedClient({ @@ -23,7 +23,7 @@ export function CompanyAuthenticatedClient({ accessToken, refreshToken, expiresIn, - options, + options = {}, }: ClientArguments) { const authUrl = constructAuthUrl(options); const tokenStore = new InMemoryTokenStore(); @@ -63,7 +63,7 @@ export function CompanyAuthenticatedClient({ function constructAuthUrl( options: TokenRefreshOptions & Pick ) { - const { server, serverURL, url } = options; + const { server, serverURL } = options; if (server) { const baseUrl = ServerList[server] || ""; @@ -74,9 +74,5 @@ function constructAuthUrl( return `${serverURL}/oauth/token`; } - if (url) { - return url; - } - return `${ServerList[ServerDemo]}/oauth/token`; } diff --git a/gusto_embedded/src/companyAuth.ts b/gusto_embedded/src/companyAuth.ts index a84e8f9c..a1a45342 100644 --- a/gusto_embedded/src/companyAuth.ts +++ b/gusto_embedded/src/companyAuth.ts @@ -1,5 +1,6 @@ import * as z from "zod"; import { SDK_METADATA } from "./lib/config.js"; +import { ServerDemo, ServerList } from "./lib/config.js"; // TypeScript SDKs use Zod for runtime data validation. We can use Zod // to describe the shape of the response from the OAuth token endpoint. If the @@ -32,7 +33,7 @@ export function withTokenRefresh( ) { const { tokenStore = new InMemoryTokenStore(), - url = "https://api.gusto-demo.com/oauth/token", + url = ServerList[ServerDemo], } = options; tokenStore.set({