/* * Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT. */ import * as z from "zod/v4-mini"; import { ModerationApiCore } from "../core.js"; import { encodeJSON, encodeSimple } from "../lib/encodings.js"; import { matchStatusCode } from "../lib/http.js"; import * as M from "../lib/matchers.js"; import { compactMap } from "../lib/primitives.js"; import { safeParse } from "../lib/schemas.js"; import { RequestOptions } from "../lib/sdks.js"; import { extractSecurity, resolveGlobalSecurity } from "../lib/security.js"; import { pathToFunc } from "../lib/url.js"; import { ConnectionError, InvalidRequestError, RequestAbortedError, RequestTimeoutError, UnexpectedClientError, } from "../models/errors/http-client-errors.js"; import * as errors from "../models/errors/index.js"; import { ModerationAPIError } from "../models/errors/moderation-api-error.js"; import { ResponseValidationError } from "../models/errors/response-validation-error.js"; import { SDKValidationError } from "../models/errors/sdk-validation-error.js"; import * as models from "../models/index.js"; import * as operations from "../models/operations/index.js"; import { APICall, APIPromise } from "../types/async.js"; import { Result } from "../types/fp.js"; /** * Duplicate a project * * @remarks * Copy a project's configuration into a new project: its settings, every channel with its policies, rules and wordlists, its moderation actions and its review queues. The copy gets its own secret API key. Webhooks, integrations, API keys and content are not copied. Needs the `projects:write` permission and a key that reaches all projects. */ export function projectsDuplicate( client: ModerationApiCore, id: string, body: operations.DuplicateProjectRequestBody, options?: RequestOptions, ): APIPromise< Result< models.ProjectWithKey, | errors.BadRequestError | errors.AuthenticationError | errors.PermissionDeniedError | errors.NotFoundError | errors.RateLimitError | ModerationAPIError | ResponseValidationError | ConnectionError | RequestAbortedError | RequestTimeoutError | InvalidRequestError | UnexpectedClientError | SDKValidationError > > { return new APIPromise($do( client, id, body, options, )); } async function $do( client: ModerationApiCore, id: string, body: operations.DuplicateProjectRequestBody, options?: RequestOptions, ): Promise< [ Result< models.ProjectWithKey, | errors.BadRequestError | errors.AuthenticationError | errors.PermissionDeniedError | errors.NotFoundError | errors.RateLimitError | ModerationAPIError | ResponseValidationError | ConnectionError | RequestAbortedError | RequestTimeoutError | InvalidRequestError | UnexpectedClientError | SDKValidationError >, APICall, ] > { const input: operations.DuplicateProjectRequest = { id: id, body: body, }; const parsed = safeParse( input, (value) => z.parse(operations.DuplicateProjectRequest$outboundSchema, value), "Input validation failed", ); if (!parsed.ok) { return [parsed, { status: "invalid" }]; } const payload = parsed.value; const body$ = encodeJSON("body", payload.body, { explode: true }); const pathParams = { id: encodeSimple("id", payload.id, { explode: false, charEncoding: "percent", }), }; const path = pathToFunc("/projects/{id}/duplicate")(pathParams); const headers = new Headers(compactMap({ "Content-Type": "application/json", Accept: "application/json", })); const secConfig = await extractSecurity(client._options.secretKey); const securityInput = secConfig == null ? {} : { secretKey: secConfig }; const requestSecurity = resolveGlobalSecurity(securityInput); const context = { options: client._options, baseURL: options?.serverURL ?? client._baseURL ?? "", operationID: "duplicateProject", oAuth2Scopes: null, resolvedSecurity: requestSecurity, securitySource: client._options.secretKey, retryConfig: options?.retries || client._options.retryConfig || { strategy: "none" }, retryCodes: options?.retryCodes || ["429", "500", "502", "503", "504"], }; const requestRes = client._createRequest(context, { security: requestSecurity, method: "POST", baseURL: options?.serverURL, path: path, headers: headers, body: body$, userAgent: client._options.userAgent, timeoutMs: options?.timeoutMs || client._options.timeoutMs || -1, }, options); if (!requestRes.ok) { return [requestRes, { status: "invalid" }]; } const req = requestRes.value; const doResult = await client._do(req, { context, isErrorStatusCode: (statusCode: number) => matchStatusCode({ status: statusCode } as Response, ["4XX", "5XX"]), retryConfig: context.retryConfig, retryCodes: context.retryCodes, }); if (!doResult.ok) { return [doResult, { status: "request-error", request: req }]; } const response = doResult.value; const responseFields = { HttpMeta: { Response: response, Request: req }, }; const [result] = await M.match< models.ProjectWithKey, | errors.BadRequestError | errors.AuthenticationError | errors.PermissionDeniedError | errors.NotFoundError | errors.RateLimitError | ModerationAPIError | ResponseValidationError | ConnectionError | RequestAbortedError | RequestTimeoutError | InvalidRequestError | UnexpectedClientError | SDKValidationError >( M.json(200, models.ProjectWithKey$inboundSchema), M.jsonErr(400, errors.BadRequestError$inboundSchema), M.jsonErr(401, errors.AuthenticationError$inboundSchema), M.jsonErr(403, errors.PermissionDeniedError$inboundSchema), M.jsonErr(404, errors.NotFoundError$inboundSchema), M.jsonErr(429, errors.RateLimitError$inboundSchema), M.fail("4XX"), M.fail("5XX"), )(response, req, { extraFields: responseFields }); if (!result.ok) { return [result, { status: "complete", request: req, response }]; } return [result, { status: "complete", request: req, response }]; }