From ef4e6c8303e7f565137a9bc74a37b62d61d12e98 Mon Sep 17 00:00:00 2001 From: Soren Martius Date: Thu, 24 Jul 2025 08:49:45 +0200 Subject: [PATCH] feat: add public terramate cloud api docs --- .vitepress/config.ts | 17 + .vitepress/theme/{index.js => index.ts} | 17 +- .vitepress/theme/openapi.json | 10470 ++++++++++++++++++++++ .vitepress/theme/openapi.yml | 7938 ++++++++++++++++ api/[operationId].md | 15 + api/[operationId].paths.ts | 20 + package.json | 5 +- pnpm-lock.yaml | 652 +- 8 files changed, 18896 insertions(+), 238 deletions(-) rename .vitepress/theme/{index.js => index.ts} (62%) create mode 100644 .vitepress/theme/openapi.json create mode 100644 .vitepress/theme/openapi.yml create mode 100644 api/[operationId].md create mode 100644 api/[operationId].paths.ts diff --git a/.vitepress/config.ts b/.vitepress/config.ts index 00e4e31..ab00407 100644 --- a/.vitepress/config.ts +++ b/.vitepress/config.ts @@ -1,5 +1,13 @@ import type { HeadConfig } from 'vitepress' import { defineConfig } from 'vitepress' +import { useSidebar } from 'vitepress-openapi' +import spec from './theme/openapi.json' with { type: 'json' } + +const sidebar = useSidebar({ + spec, + // Optionally, you can specify a link prefix for all generated sidebar items. + linkPrefix: '/api/', +}) function getPath(path: string) { const uri = path.replace(/(?:(^|\/)index)?\.md$/, '$1') @@ -519,7 +527,16 @@ export default defineConfig({ { text: 'API Keys', link: '/cloud/organization/api-keys' }, ], }, + { + text: 'API Reference', + collapsed: true, + items: [ + // ...sidebar.itemsByTags(), + ...sidebar.generateSidebarGroups(), + ], + }, ], + }, { diff --git a/.vitepress/theme/index.js b/.vitepress/theme/index.ts similarity index 62% rename from .vitepress/theme/index.js rename to .vitepress/theme/index.ts index 6bdd4d4..f171c78 100644 --- a/.vitepress/theme/index.js +++ b/.vitepress/theme/index.ts @@ -1,14 +1,25 @@ +import type { Theme } from 'vitepress' import mediumZoom from 'medium-zoom' import { useRoute } from 'vitepress' +import { theme, useOpenapi } from 'vitepress-openapi/client' import DefaultTheme from 'vitepress/theme' import { nextTick, onMounted, watch } from 'vue' +import spec from './openapi.json' +import 'vitepress-openapi/dist/style.css' import './vars.css' import './index.css' export default { - ...DefaultTheme, - + extends: DefaultTheme, + async enhanceApp(ctx) { + useOpenapi({ + spec, + config: { + }, + }) + theme.enhanceApp(ctx) + }, setup() { const route = useRoute() const initZoom = () => { @@ -23,4 +34,4 @@ export default { () => nextTick(() => initZoom()), ) }, -} +} satisfies Theme diff --git a/.vitepress/theme/openapi.json b/.vitepress/theme/openapi.json new file mode 100644 index 0000000..81761ab --- /dev/null +++ b/.vitepress/theme/openapi.json @@ -0,0 +1,10470 @@ +{ + "openapi": "3.1.0", + "info": { + "contact": { + "email": "hello@terramate.io", + "name": "Terramate", + "url": "https://terramate.io" + }, + "description": "Terramate Cloud API", + "title": "TMC API", + "version": "0.0.1" + }, + "servers": [ + { + "url": "http://localhost:8000", + "description": "Development server" + } + ], + "tags": [ + { + "name": "System", + "description": "functionality-independent system endpoints" + }, + { + "name": "Users", + "description": "Manage users" + }, + { + "name": "Organizations", + "description": "Manage organizations" + }, + { + "name": "Organization Members", + "description": "Manage organization members" + }, + { + "name": "Stacks", + "description": "Manage stacks" + }, + { + "name": "Drifts", + "description": "Manage drifts in stacks" + }, + { + "name": "Deployments", + "description": "Manage deployments in organizations and stacks" + }, + { + "name": "Review Requests", + "description": "Display review requests related to stacks" + }, + { + "name": "Previews", + "description": "Manage previews from stacks done in review requests" + }, + { + "name": "Alerts", + "description": "Manage alerts" + }, + { + "name": "Resources", + "description": "Display resources coming from stacks" + }, + { + "name": "Dashboard Data", + "description": "Provide data for display on dashboard" + }, + { + "name": "Filters", + "description": "Provide filter values for various paginated views" + }, + { + "name": "GitHub App", + "description": "Manage Connections to GitHub" + }, + { + "name": "Slack App", + "description": "Manage Connections to Slack" + }, + { + "name": "Gitlab", + "description": "Manage Gitlab integration" + }, + { + "name": "Reports", + "description": "Provide data for security and compliance purposes" + }, + { + "name": "Org API Keys", + "description": "Manage API keys for organizations" + } + ], + "paths": { + "/ping": { + "get": { + "tags": [ + "System" + ], + "summary": "check if the service is alive.", + "description": "This does not check dependencies like the database. No other response than 200 is possible, everything else will just time out.", + "operationId": "Ping", + "responses": { + "200": { + "description": "Service is alive and functional." + } + } + } + }, + "/healthcheck": { + "get": { + "tags": [ + "System" + ], + "summary": "Check if the service is well.", + "description": "Check if the service is well.", + "operationId": "HealthCheck", + "responses": { + "200": { + "description": "Service is healthy." + } + } + } + }, + "/.well-known/cli.json": { + "get": { + "tags": [ + "System" + ], + "summary": "Returns information for the Terramate CLI regarding\nsupported versions.\n", + "description": "Returns information for the Terramate CLI regarding\nsupported versions.\n", + "operationId": "WellKnownCLI", + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WellKnownCLI" + } + } + } + } + } + } + }, + "/v1/users": { + "get": { + "summary": "Returns a User from their user_id in the JWT.", + "description": "Returns a User from their user_id in the JWT.", + "operationId": "getCurrentUser", + "tags": [ + "Users" + ], + "responses": { + "200": { + "description": "Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserProfile" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GenericErrorResponseObject" + } + } + } + } + }, + "security": [ + { + "jwtToken": [] + } + ] + }, + "post": { + "summary": "Create the current User.", + "description": "Create the current User.", + "operationId": "CreateCurrentUser", + "tags": [ + "Users" + ], + "requestBody": { + "description": "Provide user display name and position (job title).", + "required": false, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PostUsersRequestObject" + } + } + } + }, + "responses": { + "201": { + "description": "Created", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserProfile" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "409": { + "description": "Conflict", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GenericErrorResponseObject" + } + } + } + } + }, + "security": [ + { + "jwtToken": [] + } + ] + } + }, + "/v1/user": { + "patch": { + "summary": "Update current logged in user", + "description": "Update current logged in user.\n\nOnly JWT tokens are supported by now.\n", + "operationId": "UpdateCurrentUser", + "tags": [ + "Users" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PostUsersRequestObject" + } + } + } + }, + "responses": { + "200": { + "description": "Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserProfile" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + }, + "security": [ + { + "jwtToken": [] + } + ] + } + }, + "/v1/user/links": { + "post": { + "summary": "Link any platform account to this user.", + "description": "This operation may create/delete one or more links with a user.", + "operationId": "CreateCurrentUserLinks", + "tags": [ + "Users" + ], + "parameters": [ + { + "in": "header", + "required": false, + "name": "Cluster-Location-Origin", + "description": "Define if the call is done from a TMC cluster.", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "description": "Expected list of platforms to get created.", + "required": [ + "platforms" + ], + "properties": { + "platforms": { + "type": "array", + "items": { + "$ref": "#/components/schemas/PlatformSlugName" + }, + "minItems": 1 + } + } + } + } + } + }, + "responses": { + "204": { + "description": "No Content" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + } + }, + "security": [ + { + "jwtToken": [] + } + ] + }, + "delete": { + "summary": "Unlink some platform accounts to this user.", + "description": "This operation may create/delete one or more links with a user.", + "operationId": "SyncCurrentUserLinks", + "tags": [ + "Users" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "description": "Expected list of platforms to get deleted.", + "required": [ + "platforms" + ], + "properties": { + "platforms": { + "type": "array", + "items": { + "$ref": "#/components/schemas/PlatformSlugName" + }, + "minItems": 1 + } + } + } + } + } + }, + "responses": { + "204": { + "description": "No Content" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + } + }, + "security": [ + { + "jwtToken": [] + } + ] + } + }, + "/v1/user/links/gitlab": { + "post": { + "summary": "Link a user with their Gitlab account using their JWT ID token.", + "description": "Link a user with their Gitlab account using their JWT ID token.", + "operationId": "CurrentUserLinkGitlab", + "tags": [ + "Users" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "id_token" + ], + "properties": { + "id_token": { + "description": "Base64 encoded JWT token coming from Gitlab with profile information.\nThe exact information provided by Gitlab is available at https://docs.gitlab.com/ee/integration/openid_connect_provider.html\n", + "type": "string" + } + } + } + } + } + }, + "responses": { + "204": { + "description": "No Content" + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + } + }, + "security": [ + { + "jwtToken": [] + } + ] + } + }, + "/v1/user/links/bitbucket/authorize": { + "get": { + "summary": "Generate a connection URL to BitBucket OAuth2 Code flow.", + "description": "Visiting this endpoint will attempt to ask for grant access to\nthe current user against Bitbucket Cloud to retrieve the requested\nscopes.\n", + "operationId": "ConnectBitbucketCurrentUserAuthorize", + "tags": [ + "Users" + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectBitbucketCurrentUserAuthorizeResponse" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "409": { + "$ref": "#/components/responses/Conflict" + }, + "501": { + "$ref": "#/components/responses/NotImplemented" + } + }, + "security": [ + { + "jwtToken": [] + } + ] + } + }, + "/v1/user/links/bitbucket/access": { + "get": { + "summary": "Landing page to end BitBucket User linking", + "description": "Bitbucket cloud will redirect to this endpoint, once the current user authorises\nthe OAuth2 customer to access the provided scopes.\nThis is going to perform the latest steps to link the\nlogged-in TMC user to that Bitbucket account.\nThe parameters sent along are used to verify the authenticity of this request.\na TMC org.\n", + "operationId": "ConnectBitbucketCurrentUserAccess", + "tags": [ + "Users" + ], + "parameters": [ + { + "in": "query", + "required": true, + "name": "code", + "description": "Temporary code to access", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "required": true, + "name": "state", + "description": "Forwarded state associated with the link attempt.", + "schema": { + "type": "string" + } + } + ], + "responses": { + "302": { + "description": "will redirect to Profile settings", + "headers": { + "Location": { + "required": true, + "description": "The profile frontend settings.", + "schema": { + "type": "string" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "501": { + "$ref": "#/components/responses/NotImplemented" + } + } + } + }, + "/v1/drifts/{org_uuid}": { + "post": { + "summary": "Create drift run for a stack.", + "description": "Create drift run for a stack.", + "operationId": "CreateDriftsForStacks", + "tags": [ + "Drifts" + ], + "parameters": [ + { + "in": "path", + "name": "org_uuid", + "description": "UUID of the organization", + "schema": { + "type": "string", + "format": "uuid" + }, + "required": true + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "x-ogen-json-streaming": true, + "schema": { + "$ref": "#/components/schemas/PostDriftStatusRequestObject" + } + } + } + }, + "responses": { + "204": { + "description": "No Content" + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + }, + "security": [ + { + "apiKey": [] + }, + { + "jwtToken": [] + } + ] + } + }, + "/v1/drifts/{org_uuid}/{stack_id}/{drift_id}": { + "get": { + "summary": "Get Drift Details", + "description": "Get the details of a drift run for a stack.\nNote that in the response field `changeset_ascii` could be up\nto 4MiB in size, and `changeset_json` is not yet populated.\n\n**Access**\n - Members of the organization with a `member` role.\n - Trusted GitHub Owner.\n", + "operationId": "GetDriftDetails", + "tags": [ + "Drifts" + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + }, + { + "$ref": "#/components/parameters/stackID" + }, + { + "$ref": "#/components/parameters/driftID" + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Drift" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + }, + "security": [ + { + "apiKey": [] + }, + { + "jwtToken": [] + } + ] + } + }, + "/v1/drifts/{org_uuid}/{stack_id}/{drift_id}/summarize": { + "post": { + "summary": "Summarize Drift Plan", + "description": "Get a summary of a drift. Only drifts with a drifted state\nwill return any content.\n\n**Access**\n - Members of the organization with a `member` role.\n - API key.\n", + "operationId": "SummarizeDrift", + "tags": [ + "Drifts" + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + }, + { + "$ref": "#/components/parameters/stackID" + }, + { + "$ref": "#/components/parameters/driftID" + }, + { + "$ref": "#/components/parameters/qForce" + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SummaryResponse" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + }, + "security": [ + { + "apiKey": [] + }, + { + "jwtToken": [] + } + ] + } + }, + "/v1/organizations": { + "post": { + "summary": "Create an organization", + "description": "A new organization will be created and the current user will\nbe the first member of the organization and get the admin role.\nOn successful creation the new membership object is resturned.\n\nA SSO logged in user cannot create an organization.\n", + "operationId": "CreateOrganization", + "tags": [ + "Organizations" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Organization" + } + } + } + }, + "responses": { + "201": { + "description": "Created", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PostOrganizationsResponseObject" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "409": { + "$ref": "#/components/responses/Conflict" + } + }, + "security": [ + { + "jwtToken": [] + } + ] + } + }, + "/v1/organizations/name/{name}": { + "get": { + "summary": "Get organization SSO data from a organization.", + "description": "Get organization details.", + "operationId": "GetEnterpriseOrganization", + "tags": [ + "Organizations" + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgShortName" + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EnterpriseOrganization" + } + } + } + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + } + }, + "/v1/organizations/{org_uuid}": { + "patch": { + "summary": "Update an organization", + "description": "Only admin users can modify an organization.", + "operationId": "UpdateOrganization", + "tags": [ + "Organizations" + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PatchOrganizationRequestObject" + } + } + } + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PatchOrganizationResponseObject" + } + } + } + }, + "304": { + "description": "Not Modified" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + }, + "security": [ + { + "jwtToken": [] + } + ] + }, + "get": { + "summary": "Get organization details.", + "description": "Get organization details.", + "operationId": "GetOrganization", + "tags": [ + "Organizations" + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Organization" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + }, + "security": [ + { + "jwtToken": [] + } + ] + } + }, + "/v1/organizations/{org_uuid}/members": { + "get": { + "summary": "Get all memberships of an organization.", + "description": "Get all memberships of an organization.", + "operationId": "GetOrganizationsMembers", + "tags": [ + "Organization Members" + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + }, + { + "$ref": "#/components/parameters/qPage" + }, + { + "$ref": "#/components/parameters/qPerPage" + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetOrganizationsMembersResponse" + }, + "example": { + "paginated_result": { + "page": 1, + "per_page": 10, + "total": 30 + }, + "members": [ + { + "member_id": 23, + "user_display_name": "Marius Tolzmann", + "user_email": "marius@terramate.io", + "role": "admin", + "status": "active" + }, + { + "member_id": 42, + "invited_email": "marius@mineiros.io,", + "role": "member", + "status": "invited" + } + ] + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + }, + "security": [ + { + "jwtToken": [] + } + ] + }, + "post": { + "summary": "Create a member in an organization.", + "description": "There are two possible use case:\n - Active admin member of an organization invities a user\n to the organization.\n - A SSO logged in user auto-invite himself as member.\n", + "operationId": "CreateMembership", + "tags": [ + "Organization Members" + ], + "parameters": [ + { + "in": "path", + "name": "org_uuid", + "description": "UUID of the organization", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateMembershipRequest" + } + } + } + }, + "responses": { + "201": { + "description": "Created", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateMembershipResponse" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "409": { + "$ref": "#/components/responses/Conflict" + } + }, + "security": [ + { + "jwtToken": [] + } + ] + } + }, + "/v1/organizations/{org_uuid}/members/{member_id}": { + "patch": { + "summary": "Update users membership options of an organization", + "description": "Update users membership options of an organization.", + "operationId": "UpdateMembership", + "tags": [ + "Organization Members" + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + }, + { + "$ref": "#/components/parameters/memberID" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PatchOrganizationsMembersRequestObject" + } + } + } + }, + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PatchOrganizationsMembersResponseObject" + } + } + } + }, + "304": { + "description": "Not Modified" + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + }, + "security": [ + { + "jwtToken": [] + } + ] + }, + "delete": { + "summary": "Delete a membership of an invited user", + "description": "Only admin users can delete a membership.", + "operationId": "DeleteMembership", + "tags": [ + "Organization Members" + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + }, + { + "$ref": "#/components/parameters/memberID" + } + ], + "responses": { + "204": { + "description": "No Content" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + }, + "security": [ + { + "jwtToken": [] + } + ] + } + }, + "/v1/organizations/{org_uuid}/deployments": { + "get": { + "summary": "Get all deployments from an organization.", + "description": "Get all deployments from an organization.\n\nThat's different from `GET /v1/deployments/{org_uuid}` which is\nintended for dashboards to see active deployments.\n\nResults can be sorted using `sort` parameter with following fields:\n\n - updated_at (default with descending order)\n - finished_at (desc by default)\n - total_stack_count (desc by default)\n - type\n - duration (desc by default)\n", + "operationId": "GetOrganizationDeployments", + "tags": [ + "Deployments" + ], + "security": [ + { + "jwtToken": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + }, + { + "$ref": "#/components/parameters/qPage" + }, + { + "$ref": "#/components/parameters/qPerPage" + }, + { + "$ref": "#/components/parameters/qRepositories" + }, + { + "$ref": "#/components/parameters/qAuthTypes" + }, + { + "$ref": "#/components/parameters/qWorkflowDeploymentStatuses" + }, + { + "$ref": "#/components/parameters/qCollaboratorID" + }, + { + "$ref": "#/components/parameters/qUserUUID" + }, + { + "$ref": "#/components/parameters/qWorkflowDeploymentSearch" + }, + { + "$ref": "#/components/parameters/qCreatedAtFrom" + }, + { + "$ref": "#/components/parameters/qCreatedAtTo" + }, + { + "$ref": "#/components/parameters/qStartedAtFrom" + }, + { + "$ref": "#/components/parameters/qStartedAtTo" + }, + { + "$ref": "#/components/parameters/qFinishedAtFrom" + }, + { + "$ref": "#/components/parameters/qFinishedAtTo" + }, + { + "$ref": "#/components/parameters/qSort" + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetOrganizationDeploymentsResponseObject" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + } + } + } + }, + "/v1/organizations/{org_uuid}/deployments/activity": { + "get": { + "summary": "Get deployments activity from an organization.", + "description": "Get deployments activity from an organization for the last 371\ndays (53 weeks * 7 days).\n\nData is sorted from oldest to newest providing all the data\nwithout gaps, that is, a dense array.\n\n\"ok\" deployments are the sum of ok_count from workflow\ndeployment groups.\n\"failed\" deployments are the sum of failed_count,\ncanceled_count and the sum of running_count and pending_count\nolder than 24h.\n", + "operationId": "GetOrganizationDeploymentsActivity", + "tags": [ + "Deployments" + ], + "security": [ + { + "jwtToken": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetOrganizationDeploymentsActivityResponse" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + } + } + } + }, + "/v1/memberships": { + "get": { + "summary": "Get organization memberships of the current user", + "description": "This is used both in CLI and frontend to know the\norganisations a user belongs to.\n", + "operationId": "GetUserMemberships", + "tags": [ + "Organizations" + ], + "responses": { + "200": { + "$ref": "#/components/responses/GetUserOrgMembershipsResp" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + } + }, + "security": [ + { + "apiKey": [] + }, + { + "jwtToken": [] + } + ] + } + }, + "/v1/dashboards/{org_uuid}/history": { + "get": { + "summary": "Return historic deployment data for the last X days of deployments.", + "description": "Historic deployment data for the last X days. Returns an object with X\nkeys corresponding to date strings for the last X days. Days without\ndeployments will receive metrics objects with counts at 0.\n", + "operationId": "GetDeploymentsHistory", + "tags": [ + "Dashboard Data" + ], + "security": [ + { + "jwtToken": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + }, + { + "in": "query", + "name": "days", + "description": "Number of days to display historic deployment data.\n", + "schema": { + "type": "integer", + "format": "int32", + "default": 90, + "maximum": 365, + "minimum": 1, + "example": 14 + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetDeploymentsHistoryResponse" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + } + } + } + }, + "/v1/dashboards/{org_uuid}/stacks": { + "get": { + "summary": "Get dashboard data for an organization", + "description": "Get the counters for all active stacks belonging to an organization to show on the dashboard.\n\nThis will be extended with more counters in the future for e.g. resources and resource health.\n\nSoft deleted stacks are not counted.\n\n**Access**\n - Only members of the organization with any role are allowed to query.\n", + "operationId": "GetDashboardStacks", + "tags": [ + "Dashboard Data" + ], + "security": [ + { + "apiKey": [] + }, + { + "jwtToken": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetDashboardStacksResponseObject" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + } + }, + "/v1/dashboards/{org_uuid}/widgets/alerts": { + "get": { + "summary": "Get dashboard data for alerts widget", + "description": "Get the counters for alerts regarding their status and numbers of assignees.\n\n**Access**\n - Only members of the organization with any role are allowed to query.\n", + "operationId": "GetDashboardAlertsWidget", + "tags": [ + "Dashboard Data" + ], + "security": [ + { + "apiKey": [] + }, + { + "jwtToken": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + }, + { + "$ref": "#/components/parameters/qWidgetUserUUID" + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DashboardAlertsWidget" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + } + }, + "/v1/dashboards/{org_uuid}/widgets/alerts/period": { + "get": { + "summary": "Get dashboard data for alerts period widget", + "description": "Get the counters for alerts with a specific status in the given period.\n\n**Access**\n - Only members of the organization with any role are allowed to query.\n", + "operationId": "GetDashboardAlertsPeriodWidget", + "tags": [ + "Dashboard Data" + ], + "security": [ + { + "apiKey": [] + }, + { + "jwtToken": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + }, + { + "$ref": "#/components/parameters/qWidgetUserUUID" + }, + { + "$ref": "#/components/parameters/qDays" + }, + { + "$ref": "#/components/parameters/qOffsetDays" + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DashboardAlertsPeriodWidget" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + } + }, + "/v1/dashboards/{org_uuid}/widgets/review_requests": { + "get": { + "summary": "Get dashboard data for review requests widget", + "description": "Get the counters for review requests grouped by status.\n\n**Access**\n - Only members of the organization with any role are allowed to query.\n", + "operationId": "GetDashboardReviewRequestsWidget", + "tags": [ + "Dashboard Data" + ], + "security": [ + { + "apiKey": [] + }, + { + "jwtToken": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + }, + { + "$ref": "#/components/parameters/qWidgetUserUUID" + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DashboardReviewRequestsWidget" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + } + }, + "/v1/dashboards/{org_uuid}/widgets/review_requests/period": { + "get": { + "summary": "Get dashboard data for review requests period widget", + "description": "Get the counters for review requests with a specific status in the given period.\n\n**Access**\n - Only members of the organization with any role are allowed to query.\n", + "operationId": "GetDashboardReviewRequestsPeriodWidget", + "tags": [ + "Dashboard Data" + ], + "security": [ + { + "apiKey": [] + }, + { + "jwtToken": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + }, + { + "$ref": "#/components/parameters/qWidgetUserUUID" + }, + { + "$ref": "#/components/parameters/qDays" + }, + { + "$ref": "#/components/parameters/qOffsetDays" + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DashboardReviewRequestsPeriodWidget" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + } + }, + "/v1/dashboards/{org_uuid}/widgets/deployments/period": { + "get": { + "summary": "Get dashboard data for deployments period widget", + "description": "Get the counters for deployments with a specific status in the given period.\n\n**Access**\n - Only members of the organization with any role are allowed to query.\n", + "operationId": "GetDashboardDeploymentsPeriodWidget", + "tags": [ + "Dashboard Data" + ], + "security": [ + { + "apiKey": [] + }, + { + "jwtToken": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + }, + { + "$ref": "#/components/parameters/qWidgetUserUUID" + }, + { + "$ref": "#/components/parameters/qDays" + }, + { + "$ref": "#/components/parameters/qOffsetDays" + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DashboardDeploymentsPeriodWidget" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + } + }, + "/v1/stacks/{org_uuid}": { + "get": { + "summary": "Get stacks of an organization", + "description": "All stacks matching a given status are returned.\n\nFor the time being, if no page query parameter\nis provided, all stacks will be returned.\n\nStacks that are soft-deleted are *not* returned.\n\n**Access**\n - Only members of the organization with any role are allowed to query.\n", + "operationId": "GetStacks", + "tags": [ + "Stacks" + ], + "security": [ + { + "apiKey": [] + }, + { + "jwtToken": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + }, + { + "$ref": "#/components/parameters/qPage" + }, + { + "$ref": "#/components/parameters/qPerPage" + }, + { + "$ref": "#/components/parameters/qRepositories" + }, + { + "$ref": "#/components/parameters/qTargets" + }, + { + "$ref": "#/components/parameters/qStatuses" + }, + { + "$ref": "#/components/parameters/qDeploymentStatuses" + }, + { + "$ref": "#/components/parameters/qDriftStatuses" + }, + { + "$ref": "#/components/parameters/qDraft" + }, + { + "$ref": "#/components/parameters/qIsArchived" + }, + { + "description": "This performs a substring search on the following stack\nattributes:\n\n - meta_id\n - meta_name\n - meta_description\n - path\n", + "$ref": "#/components/parameters/qSearch" + }, + { + "$ref": "#/components/parameters/qMetaID" + }, + { + "$ref": "#/components/parameters/qDeploymentUUID" + }, + { + "$ref": "#/components/parameters/qMetaTag" + }, + { + "$ref": "#/components/parameters/qPolicySeverity" + }, + { + "description": "Stacks are sorted with updated_at by default.\n\nAvailable sorts are:\n - meta_name[,(asc|desc)]\n - path[,(asc|desc)]\n - policy_severity[,(desc|asc)]\n - repository[,(asc|desc)]\n - resource_count[,(desc|asc)]\n - status[,(asc|desc)]\n - target[,(asc|desc)]\n - updated_at[,(desc|asc)]\n", + "$ref": "#/components/parameters/qSort" + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetStacksResponseObject" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + } + }, + "/v1/stacks/{org_uuid}/{stack_id}": { + "get": { + "summary": "Get stack details from an organization", + "description": "All members of the organization with any role are allowed to\nquery.\n", + "operationId": "GetStack", + "tags": [ + "Stacks" + ], + "security": [ + { + "apiKey": [] + }, + { + "jwtToken": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + }, + { + "$ref": "#/components/parameters/stackID" + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Stack" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + }, + "patch": { + "summary": "Update specific attributes for the stack `stack_id`", + "description": "Update specific attributes for the stack `stack_id`", + "operationId": "PatchStack", + "tags": [ + "Stacks" + ], + "security": [ + { + "apiKey": [] + }, + { + "jwtToken": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + }, + { + "$ref": "#/components/parameters/stackID" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PatchStackRequest" + } + } + } + }, + "responses": { + "204": { + "description": "No Content" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + } + }, + "/v1/stacks/{org_uuid}/{stack_id}/reports/static_analysis": { + "get": { + "summary": "Get last SARIF report from a drift check run for a stack.", + "description": "All members of the organization with any role are allowed to\nquery.\n", + "operationId": "GetSecurityReport", + "tags": [ + "Stacks", + "Reports" + ], + "security": [ + { + "apiKey": [] + }, + { + "jwtToken": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + }, + { + "$ref": "#/components/parameters/stackID" + } + ], + "responses": { + "200": { + "description": "OK with a v2.1.0 SARIF report.\n\nSARIF spec can be found here: https://docs.oasis-open.org/sarif/sarif/v2.1.0/errata01/os/sarif-v2.1.0-errata01-os-complete.html#_Toc141790888\n", + "content": { + "application/json": { + "schema": {} + } + }, + "headers": { + "Last-Modified": { + "schema": { + "type": "string", + "format": "date-time" + }, + "required": true + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + }, + "head": { + "summary": "Check if there is a SARIF report available from a drift check run for a stack.", + "description": "This method should be used for clients if they don't want to\ndownload a potentially large security report.\n", + "operationId": "CheckSecurityReport", + "tags": [ + "Stacks", + "Reports" + ], + "security": [ + { + "apiKey": [] + }, + { + "jwtToken": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + }, + { + "$ref": "#/components/parameters/stackID" + } + ], + "responses": { + "200": { + "description": "OK, if present.\n" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + } + }, + "/v1/stacks/{org_uuid}/{stack_id}/deployments": { + "get": { + "summary": "Get all deployments of a stack.", + "description": "Get all deployments of a stack sorted by created at\nnewest first.\n", + "operationId": "GetStackDeployments", + "tags": [ + "Deployments" + ], + "security": [ + { + "apiKey": [] + }, + { + "jwtToken": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + }, + { + "$ref": "#/components/parameters/stackID" + }, + { + "$ref": "#/components/parameters/qPage" + }, + { + "$ref": "#/components/parameters/qPerPage" + }, + { + "$ref": "#/components/parameters/qDeploymentStatuses" + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetStacksDeploymentsResponseObject" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + } + } + } + }, + "/v1/stacks/{org_uuid}/{stack_id}/deployments/{deployment_uuid}/logs": { + "post": { + "summary": "Send a batch of logs for a deployment.", + "description": "Send a batch of logs for a deployment.\nBody cannot be larger than 4 MiB.\n", + "operationId": "SendDeploymentLogs", + "tags": [ + "Deployments" + ], + "security": [ + { + "apiKey": [] + }, + { + "jwtToken": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + }, + { + "$ref": "#/components/parameters/stackID" + }, + { + "$ref": "#/components/parameters/deploymentUUID" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CommandLogLine" + } + } + } + } + }, + "responses": { + "204": { + "description": "No Content" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + }, + "get": { + "summary": "Get a batch of logs for a deployment.", + "description": "Get a batch of logs for a deployment.", + "operationId": "GetDeploymentLogs", + "tags": [ + "Deployments" + ], + "security": [ + { + "apiKey": [] + }, + { + "jwtToken": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + }, + { + "$ref": "#/components/parameters/stackID" + }, + { + "$ref": "#/components/parameters/deploymentUUID" + }, + { + "$ref": "#/components/parameters/qPage" + }, + { + "$ref": "#/components/parameters/qPerPage" + }, + { + "$ref": "#/components/parameters/qChannel" + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetDeploymentLogsResponseObject" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + } + }, + "/v1/stacks/{org_uuid}/{stack_id}/deployments/{deployment_uuid}/logs/summarize": { + "post": { + "summary": "Summarize deployment logs", + "description": "Get a summary using layman words of the\ndeployments logs.\n", + "operationId": "SummarizeStackDeploymentLogs", + "tags": [ + "Deployments" + ], + "security": [ + { + "apiKey": [] + }, + { + "jwtToken": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + }, + { + "$ref": "#/components/parameters/stackID" + }, + { + "$ref": "#/components/parameters/deploymentUUID" + }, + { + "$ref": "#/components/parameters/qForce" + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SummaryResponse" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + } + }, + "/v1/stacks/{org_uuid}/{stack_id}/drifts": { + "get": { + "summary": "Get all drifts of a stack", + "description": "Get all drifts of a stack.", + "operationId": "GetStackDrifts", + "tags": [ + "Drifts" + ], + "security": [ + { + "apiKey": [] + }, + { + "jwtToken": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + }, + { + "$ref": "#/components/parameters/stackID" + }, + { + "$ref": "#/components/parameters/qPage" + }, + { + "$ref": "#/components/parameters/qPerPage" + }, + { + "$ref": "#/components/parameters/qDriftStatuses" + }, + { + "$ref": "#/components/parameters/qGroupingKey" + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetDriftsResponseObject" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + } + } + } + }, + "/v1/deployments/{org_uuid}/{deployment_uuid}/stacks": { + "post": { + "summary": "Batch start a new deployment for each stack in a list of stacks", + "description": "Create a new deployment for each stack in a list of stacks with the status of `pending`.\nStacks that are not yet known in the database identified by `(repository, meta_id)` will be created.\n\nA list of Stack IDs will be returned with the status `created`.\n\nIf new stacks are created, they will be assigned the status `unknown` if no status is available in the payload.\n\n**Access**\n - Members of the organization with `member` role.\n - Trusted GitHub Owner.\n", + "operationId": "PostDeployment", + "tags": [ + "Deployments" + ], + "security": [ + { + "apiKey": [] + }, + { + "jwtToken": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + }, + { + "$ref": "#/components/parameters/deploymentUUID" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PostDeploymentStacksRequest" + } + } + } + }, + "responses": { + "201": { + "description": "Created", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/PostDeploymentStacksResponseObject" + } + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "409": { + "$ref": "#/components/responses/Conflict" + } + } + }, + "patch": { + "summary": "Batch update stack status for a deployment.", + "description": "Update the status of a specific deployment (identified by `deployment_uuid`).\n\n**Status Lifecycle of a Deployment and Stacks**\n\nThe status of a stack, can be any of the following:\n\n - `ok` - when a stack is considered healthy and correctly configured (considered `healthy`)\n - `drifted` - when a stack definition is different from that of the current status (considered `unhealthy`)\n - `failed` - when the latest apply of the stack failed (considered `unhealthy`)\n - `unknown` - the initial status of a newly created stack or the status of a stale stack (considered `unhealthy`)\n - `canceled` - when a preceeding stack in a deployment failed, the subsequent stacks will be canceled (considered `unhealthy`)\n\nThe status of a deployment has in some cases a direct relationship with the status of a stack. The status of a deployment can be any of the following:\n\n - `pending` - temporary status as part of a deployment about to commence. Set by the `POST` endpoint when creating a deployment\n - `running` - temporary status as part of a running a deployment\n - `ok` - when a deployment is considered successfully deployed with no errors. Will also set the `ok` status of the stacks in the deployment\n - `failed` - when a deployment has failed to apply correctly. Will also set the `failed` status of the stacks in the deployment\n - `canceled` - after a specific stack has failed, and the execution of the succeeding stacks is canceled. Will also set the `canceled` status of the stacks in the deployment\n\n**Terramate Cli Deployment Status**\nTerramate CLI will use this endpoint to set the deployment status to one of the following:\n\n - `running`\n - `ok`\n - `failed`\n - `canceled`\n\n**Access**\n - Members of the organization with a `member` role.\n - Trusted GitHub Owner.\n", + "operationId": "PatchDeployment", + "tags": [ + "Deployments" + ], + "security": [ + { + "apiKey": [] + }, + { + "jwtToken": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + }, + { + "$ref": "#/components/parameters/deploymentUUID" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "x-ogen-json-streaming": true, + "schema": { + "type": "object", + "properties": { + "stacks": { + "type": "array", + "nullable": true, + "items": { + "$ref": "#/components/schemas/PatchDeploymentStacksRequestObject" + } + } + } + } + } + } + }, + "responses": { + "204": { + "description": "No Content" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "$ref": "#/components/responses/NotFound" + }, + "409": { + "$ref": "#/components/responses/Conflict" + } + } + } + }, + "/v1/workflow_deployment_groups/{org_uuid}/{workflow_deployment_group_id}": { + "get": { + "summary": "Get details from a workflow deployment group", + "description": "Get details from a workflow deployment group.", + "operationId": "GetWorkflowDeploymentGroup", + "tags": [ + "Deployments" + ], + "security": [ + { + "apiKey": [] + }, + { + "jwtToken": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + }, + { + "$ref": "#/components/parameters/workflowDeploymentGroupID" + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/WorkflowDeploymentGroup" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + } + }, + "/v1/workflow_deployment_groups/{org_uuid}/{workflow_deployment_group_id}/summarize": { + "post": { + "summary": "Summarize Workflow Deployment Group", + "description": "Get a summary of all stack deployments including the plan and\nthe logs to know what happened in the deployment.\n\n**Access**\n - Members of the organization with a `member` role.\n - API key.\n", + "operationId": "SummarizeWorkflowDeploymentGroup", + "tags": [ + "Deployments" + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + }, + { + "$ref": "#/components/parameters/workflowDeploymentGroupID" + }, + { + "$ref": "#/components/parameters/qForce" + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SummaryResponse" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "$ref": "#/components/responses/NotFound" + }, + "422": { + "$ref": "#/components/responses/UnprocessableContent" + } + }, + "security": [ + { + "apiKey": [] + }, + { + "jwtToken": [] + } + ] + } + }, + "/v1/workflow_deployment_groups/{org_uuid}/{workflow_deployment_group_id}/stacks": { + "get": { + "summary": "Get stack deployments from a workflow deployment group.", + "description": "Get stack deployments related to this workflow\ndeployment group details from a workflow deployment group\n", + "operationId": "GetWorkflowGroupStacksDeployments", + "tags": [ + "Deployments" + ], + "security": [ + { + "apiKey": [] + }, + { + "jwtToken": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + }, + { + "$ref": "#/components/parameters/workflowDeploymentGroupID" + }, + { + "$ref": "#/components/parameters/qPage" + }, + { + "$ref": "#/components/parameters/qPerPage" + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetWorkflowGroupStacksDeploymentsResponse" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + } + }, + "/v1/stack_deployments/{org_uuid}": { + "get": { + "summary": "Get stack deployments.", + "description": "Get stack deployments for an organization.", + "operationId": "GetOrganizationStackDeployments", + "tags": [ + "Deployments" + ], + "security": [ + { + "jwtToken": [] + }, + { + "apiKey": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + }, + { + "$ref": "#/components/parameters/qPage" + }, + { + "$ref": "#/components/parameters/qPerPage" + }, + { + "$ref": "#/components/parameters/qCreatedAtFrom" + }, + { + "$ref": "#/components/parameters/qCreatedAtTo" + }, + { + "$ref": "#/components/parameters/qDeploymentStatuses" + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StackDeploymentsCollection" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + } + } + } + }, + "/v1/stack_deployments/{org_uuid}/{stack_deployment_id}": { + "get": { + "summary": "Get stack deployment details.", + "description": "Get stack deployment details.", + "operationId": "GetStackDeployment", + "tags": [ + "Deployments" + ], + "security": [ + { + "apiKey": [] + }, + { + "jwtToken": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + }, + { + "$ref": "#/components/parameters/stackDeploymentID" + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StackDeployment" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + } + }, + "/v1/stack_deployments/{org_uuid}/{stack_deployment_id}/summarize": { + "post": { + "summary": "Summarize Stack Deployment Plan", + "description": "Get a summary of a stack deployment plan.\n\n**Access**\n - Members of the organization with a `member` role.\n - API key.\n", + "operationId": "SummarizeStackDeployment", + "tags": [ + "Deployments" + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + }, + { + "$ref": "#/components/parameters/stackDeploymentID" + }, + { + "$ref": "#/components/parameters/qForce" + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SummaryResponse" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + }, + "security": [ + { + "apiKey": [] + }, + { + "jwtToken": [] + } + ] + } + }, + "/v1/stack_deployments/{org_uuid}/reports/dora/total": { + "get": { + "summary": "Get DORA report with total values.", + "description": "Get DORA report with total values for stack deployments based on the filters.\n", + "operationId": "GetStackDeploymentsDORATotalReport", + "tags": [ + "Deployments", + "Reports" + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + }, + { + "$ref": "#/components/parameters/qTimezone" + }, + { + "$ref": "#/components/parameters/qFromDate" + }, + { + "$ref": "#/components/parameters/qToDate" + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StackDeploymentsDORATotalReport" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + } + }, + "security": [ + { + "apiKey": [] + }, + { + "jwtToken": [] + } + ] + } + }, + "/v1/stack_deployments/{org_uuid}/reports/dora/range": { + "get": { + "summary": "Get DORA report within a time range.", + "description": "Get DORA report within a range.\n\ngranularity and from-to has the following relationship:\n - days (available only if time range is below 32 days in total)\n - weeks (available only if time range is max 1 year)\n - months (available only if time range is max 2 years)\n - quarters (available only if time range is max 4 years)\n - years (always available)\n", + "operationId": "GetStackDeploymentsDORARangeReport", + "tags": [ + "Deployments", + "Reports" + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + }, + { + "$ref": "#/components/parameters/qTimezone" + }, + { + "$ref": "#/components/parameters/qFromDate" + }, + { + "$ref": "#/components/parameters/qToDate" + }, + { + "$ref": "#/components/parameters/qTimeGranularity" + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StackDeploymentsDORARangeReport" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + } + }, + "security": [ + { + "apiKey": [] + }, + { + "jwtToken": [] + } + ] + } + }, + "/v1/stack_deployments/{org_uuid}/reports/dora/rating": { + "get": { + "summary": "Get DORA report grouped by rating bucket.", + "description": "Get DORA report for rating buckets.\n\nRatings are: Elite, High, Medium and Low\n", + "operationId": "GetStackDeploymentsDORARatingReport", + "tags": [ + "Deployments", + "Reports" + ], + "security": [ + { + "apiKey": [] + }, + { + "jwtToken": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + }, + { + "$ref": "#/components/parameters/qTimezone" + }, + { + "$ref": "#/components/parameters/qFromDate" + }, + { + "$ref": "#/components/parameters/qToDate" + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DORARatingReport" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + } + } + } + }, + "/v1/review_requests/{org_uuid}": { + "get": { + "summary": "List the review requests from an organization", + "description": "List the review requests from an organization sorted by\nupdated_at in descendent order.\n\nResults can be sorted using `sort` parameter with following fields:\n\n - last_updated_at (default with descending order nulls last)\n - status (where order is open, merged, closed in asc order)\n - repository (asc by default)\n", + "operationId": "GetReviewRequests", + "tags": [ + "Review Requests" + ], + "security": [ + { + "apiKey": [] + }, + { + "jwtToken": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + }, + { + "$ref": "#/components/parameters/qPage" + }, + { + "$ref": "#/components/parameters/qPerPage" + }, + { + "$ref": "#/components/parameters/qReviewRequestsStatus" + }, + { + "$ref": "#/components/parameters/qRepositories" + }, + { + "$ref": "#/components/parameters/qCollaboratorID" + }, + { + "$ref": "#/components/parameters/qUserUUID" + }, + { + "$ref": "#/components/parameters/qAuthorUUID" + }, + { + "$ref": "#/components/parameters/qReviewRequestedUUID" + }, + { + "$ref": "#/components/parameters/qReviewRequestsDraft" + }, + { + "$ref": "#/components/parameters/qReviewRequestsSearch" + }, + { + "$ref": "#/components/parameters/qCreatedAtFrom" + }, + { + "$ref": "#/components/parameters/qCreatedAtTo" + }, + { + "$ref": "#/components/parameters/qSort" + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetReviewRequestsResponse" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + } + } + } + }, + "/v1/review_requests/{org_uuid}/{review_request_id}": { + "get": { + "summary": "Get the details of a review request.", + "description": "Get the details of a review request from an organization with\nthe latest available preview for the affected stacks.\n", + "operationId": "GetReviewRequest", + "tags": [ + "Review Requests" + ], + "security": [ + { + "apiKey": [] + }, + { + "jwtToken": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + }, + { + "$ref": "#/components/parameters/reviewRequestID" + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetReviewRequestResponse" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + } + }, + "/v1/review_requests/{org_uuid}/reports/dora/total": { + "get": { + "summary": "Get DORA report with total values.", + "description": "Get DORA report with total values based on the filters.\n", + "operationId": "GetReviewRequestsDORATotalReport", + "tags": [ + "Review Requests", + "Reports" + ], + "security": [ + { + "apiKey": [] + }, + { + "jwtToken": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + }, + { + "$ref": "#/components/parameters/qTimezone" + }, + { + "$ref": "#/components/parameters/qFromDate" + }, + { + "$ref": "#/components/parameters/qToDate" + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ReviewRequestsDORATotalReport" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + } + } + } + }, + "/v1/review_requests/{org_uuid}/reports/dora/range": { + "get": { + "summary": "Get DORA report within a time range.", + "description": "Get DORA report within a range.\n\ngranularity and from-to has the following relationship:\n - days (available only if time range is below 32 days in total)\n - weeks (available only if time range is max 1 year)\n - months (available only if time range is max 2 years)\n - quarters (available only if time range is max 4 years)\n - years (always available)\n", + "operationId": "GetReviewRequestsDORARangeReport", + "tags": [ + "Review Requests", + "Reports" + ], + "security": [ + { + "apiKey": [] + }, + { + "jwtToken": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + }, + { + "$ref": "#/components/parameters/qTimezone" + }, + { + "$ref": "#/components/parameters/qFromDate" + }, + { + "$ref": "#/components/parameters/qToDate" + }, + { + "$ref": "#/components/parameters/qTimeGranularity" + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ReviewRequestsDORARangeReport" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + } + } + } + }, + "/v1/review_requests/{org_uuid}/reports/dora/rating": { + "get": { + "summary": "Get DORA report grouped by rating bucket.", + "description": "Get DORA report for rating buckets.\n\nRatings are: Elite, High, Medium and Low\n", + "operationId": "GetReviewRequestsDORARatingReport", + "tags": [ + "Review Requests", + "Reports" + ], + "security": [ + { + "apiKey": [] + }, + { + "jwtToken": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + }, + { + "$ref": "#/components/parameters/qTimezone" + }, + { + "$ref": "#/components/parameters/qFromDate" + }, + { + "$ref": "#/components/parameters/qToDate" + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DORARatingReport" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + } + } + } + }, + "/v1/filters/{org_uuid}/{entity}": { + "get": { + "summary": "Get available filters for a provided entity.", + "description": "**Get Filters for Entity**\n\nRetrieve all available filters for a given entity, with distinct values for pre-filling.\n\nFields per entity:\n - alerts:\n - severity\n - assignee\n - stacks:\n - deployment_status\n - drift_status\n - meta_tag\n - policy_severity\n - repository\n - target\n - status\n - resources:\n - extracted_account\n - policy_severity\n - provider\n - repository\n - status\n - target\n - technology\n - type\n\n**Access**\n - Members of the organization with any role.\n", + "operationId": "GetFilters", + "tags": [ + "Filters" + ], + "security": [ + { + "jwtToken": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + }, + { + "in": "path", + "name": "entity", + "required": true, + "description": "only select stacks with specific status e.g. for dashboard view.", + "schema": { + "default": "stacks", + "type": "string", + "enum": [ + "alerts", + "resources", + "stacks" + ] + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetFiltersResponseObject" + } + } + }, + "headers": { + "Cache-Control": { + "description": "Caching directives", + "schema": { + "type": "string" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + } + } + } + }, + "/v1/filters/{org_uuid}/review_requests": { + "get": { + "summary": "Get available filters for review requests.", + "description": "Retrieve all available filters for a review request:\n\n - collaborators\n - repository\n - status\n\n**Access**\n - Members of the organization with any role.\n", + "operationId": "GetReviewRequestFilters", + "tags": [ + "Filters" + ], + "security": [ + { + "jwtToken": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetReviewRequestFiltersResponse" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + } + } + } + }, + "/v1/filters/{org_uuid}/workflow_deployment_groups": { + "get": { + "summary": "Get available filters for workflow deployment groups.", + "description": "Retrieve all available filters for workflow deployment groups:\n\n - collaborators\n - repository\n - status\n - type\n\n**Access**\n - Members of the organization with any role.\n", + "operationId": "GetWorkflowDeploymentGroupFilters", + "tags": [ + "Filters" + ], + "security": [ + { + "jwtToken": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetWorkflowDeploymentGroupFiltersResponse" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + } + } + } + }, + "/v1/apps/{org_uuid}/github/connection": { + "get": { + "summary": "Generate a connection URL to GitHub App.", + "description": "Visiting this endpoint will attempt to initiate a connection between the organization of the authenticated user and a github.\nThe user needs to be an admin of the org. If the Organization is already connected, it will error.\n", + "operationId": "ConnectGithubApp", + "tags": [ + "GitHub App" + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetGithubAppConnectionResponse" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "409": { + "$ref": "#/components/responses/Conflict" + } + }, + "security": [ + { + "jwtToken": [] + } + ] + } + }, + "/v1/apps/{org_uuid}/github": { + "get": { + "summary": "Returns the status of the github app installation for this org.\n", + "description": "Returns the status of the github app installation for this org.", + "operationId": "GithubAppStatus", + "tags": [ + "GitHub App" + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GithubAppInstallationStatus" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + } + }, + "security": [ + { + "jwtToken": [] + } + ] + } + }, + "/v1/apps/github/landing": { + "get": { + "summary": "Landing page after installing GitHub App.", + "description": "GitHub will redirect to this endpoint, once the user finishes installing our app.\nThe parameters sent along are used to verify the authenticity of this request as well as associate it with\na TMC org.\n", + "operationId": "ConnectGithubAppLanding", + "tags": [ + "GitHub App" + ], + "parameters": [ + { + "in": "query", + "required": true, + "name": "state", + "description": "Forwarded state associated with the installation attempt", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "required": true, + "name": "setup_action", + "description": "The action the user has taken on GitHub that led to the visit of this page", + "schema": { + "type": "string", + "enum": [ + "install" + ] + } + }, + { + "in": "query", + "name": "installation_id", + "required": true, + "description": "The github installation ID the action on GitHub affected.", + "schema": { + "type": "integer", + "format": "int64" + } + } + ], + "responses": { + "302": { + "description": "will redirect to Github settings", + "headers": { + "Location": { + "required": true, + "description": "github settings uri", + "schema": { + "type": "string" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + } + } + } + }, + "/v1/apps/{org_uuid}/gitlab/webhook/token": { + "post": { + "summary": "Generate a new token for Gitlab webhooks", + "description": "This generates a new token to see it once for an organization meant\nto be used with Gitlab webhooks.\n\nIf it is called multiple times, a new token is generated.\n\nReturned tokens are not stored in plain text so they cannot be\nrecovered.\n\nOnly admin members or API keys can perform this operation.\n\nSee https://docs.gitlab.com/user/project/integrations/webhooks for details.\n", + "operationId": "GenerateGitlabWebhookToken", + "tags": [ + "Gitlab" + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + } + ], + "responses": { + "200": { + "description": "Gitlab webhook token generated", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GitlabWebhookToken" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + } + }, + "security": [ + { + "apiKey": [] + }, + { + "jwtToken": [] + } + ] + }, + "get": { + "summary": "Get token status for Gitlab webhooks", + "description": "This gets the organization-scoped token.\n\nSee https://docs.gitlab.com/user/project/integrations/webhooks for details.\n", + "operationId": "GetGitlabWebhookTokenStatus", + "tags": [ + "Gitlab" + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + } + ], + "responses": { + "200": { + "description": "Gitlab webhook token status", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GitlabWebhookToken" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + }, + "security": [ + { + "apiKey": [] + }, + { + "jwtToken": [] + } + ] + }, + "delete": { + "summary": "Delete token for Gitlab webhooks", + "description": "This deletes the organization-scoped token.\n\nIt successes even if no token was set\n\nOnly admin members or API keys can perform this operation.\n", + "operationId": "DeleteGitlabWebhookToken", + "tags": [ + "Gitlab" + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + } + ], + "responses": { + "204": { + "description": "No Content" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + } + }, + "security": [ + { + "apiKey": [] + }, + { + "jwtToken": [] + } + ] + } + }, + "/v1/apps/{org_uuid}/slack/connection/authorize": { + "get": { + "summary": "Generate a connection URL to Slack App.", + "description": "Visiting this endpoint will attempt to initiate a connection\nbetween the organization and a slack App.\nThe user needs to be an admin of the org. If the Organization is already connected, it will error.\n", + "operationId": "ConnectSlackAppAuth", + "tags": [ + "Slack App" + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectSlackAppAuthResponse" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "409": { + "$ref": "#/components/responses/Conflict" + } + }, + "security": [ + { + "jwtToken": [] + } + ] + } + }, + "/v1/apps/slack/connection/access": { + "get": { + "summary": "Landing page to end Slack App installation.", + "description": "Slack will redirect to this endpoint, once the user authorises\nthe Slack App installation with provided scopes\nThis is going to perform the slack app final step to verify\nthe access.\nThe parameters sent along are used to verify the authenticity of this request as well as associate it with\na TMC org.\n", + "operationId": "ConnectSlackAppAccess", + "tags": [ + "Slack App" + ], + "parameters": [ + { + "in": "query", + "required": true, + "name": "code", + "description": "Temporary code to access", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "required": true, + "name": "state", + "description": "Forwarded state associated with the installation attempt", + "schema": { + "type": "string" + } + } + ], + "responses": { + "302": { + "description": "will redirect to Slack App settings", + "headers": { + "Location": { + "required": true, + "description": "slack app settings uri", + "schema": { + "type": "string" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + } + } + } + }, + "/v1/apps/{org_uuid}/slack": { + "get": { + "summary": "Returns the status of the slack app installation for this org.\n", + "description": "Returns the status of the slack app installation for this org.", + "operationId": "SlackAppStatus", + "tags": [ + "Slack App" + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SlackAppInstallationStatus" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + } + }, + "security": [ + { + "jwtToken": [] + } + ] + } + }, + "/v1/previews/{org_uuid}": { + "post": { + "summary": "Start a new preview for each stack part of a review request", + "description": "Create a new preview for each stack that is part of the preview run.\n\nStacks that are not yet known in the database identified by `(repository, meta_id)` will be created.\nIf new stacks are created, they will be assigned the status `ok` if no status is available in the payload.\n\nThe response contains a `preview_id` for the preview run.\n\nThe response contains `stack_preview_id` and `meta_id` for each stack that was submitted in the request payload.\n\n**Access**\n - Members of the organization with `member` role.\n - Trusted GitHub Owner.\n", + "operationId": "PostStackPreviews", + "tags": [ + "Previews" + ], + "security": [ + { + "apiKey": [] + }, + { + "jwtToken": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PostStackPreviewsRequestObject" + } + } + } + }, + "responses": { + "201": { + "description": "Created", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PostStackPreviewsResponseObject" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + } + } + } + }, + "/v1/previews/{org_uuid}/{preview_id}/summarize": { + "post": { + "summary": "Summarize a preview", + "description": "Get a summary of a full Preview/PR of resources.\nIt summaries what are the overall changes of a review request.\n\n**Access**\n - Members of the organization with a `member` role.\n - API key.\n", + "operationId": "SummarizePreview", + "tags": [ + "Previews" + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + }, + { + "in": "path", + "name": "preview_id", + "required": true, + "description": "Unique identifier for the preview", + "schema": { + "type": "integer", + "format": "int64", + "example": 42 + } + }, + { + "$ref": "#/components/parameters/qForce" + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SummaryResponse" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "$ref": "#/components/responses/NotFound" + }, + "422": { + "$ref": "#/components/responses/UnprocessableContent" + } + }, + "security": [ + { + "apiKey": [] + }, + { + "jwtToken": [] + } + ] + } + }, + "/v1/stack_previews/{org_uuid}/{stack_preview_id}": { + "patch": { + "summary": "Update specific attributes for the stack preview associated with `stack_preview_id`", + "description": "Update specific attributes for the stack preview associated with `stack_preview_id`", + "operationId": "PatchStackPreview", + "tags": [ + "Previews" + ], + "security": [ + { + "apiKey": [] + }, + { + "jwtToken": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + }, + { + "$ref": "#/components/parameters/stackPreviewID" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "x-ogen-json-streaming": true, + "schema": { + "$ref": "#/components/schemas/PatchStackPreviewRequestObject" + } + } + } + }, + "responses": { + "204": { + "description": "No Content" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + } + }, + "/v1/stack_previews/{org_uuid}/{stack_preview_id}/logs": { + "post": { + "summary": "Persist log lines for the provided `stack_preview_id`", + "description": "Persist log lines for the provided `stack_preview_id`.", + "operationId": "AppendStackPreviewLogs", + "tags": [ + "Previews" + ], + "security": [ + { + "apiKey": [] + }, + { + "jwtToken": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + }, + { + "$ref": "#/components/parameters/stackPreviewID" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CommandLogLine" + } + } + } + } + }, + "responses": { + "204": { + "description": "No Content" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + }, + "get": { + "summary": "Get a batch of logs for a stack preview", + "description": "Get a batch of logs for a stack preview.", + "operationId": "GetStackPreviewLogs", + "tags": [ + "Previews" + ], + "security": [ + { + "apiKey": [] + }, + { + "jwtToken": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + }, + { + "$ref": "#/components/parameters/stackPreviewID" + }, + { + "$ref": "#/components/parameters/qPage" + }, + { + "$ref": "#/components/parameters/qPerPage" + }, + { + "$ref": "#/components/parameters/qChannel" + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetStackPreviewLogsResponse" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + } + }, + "/v1/stack_previews/{org_uuid}/{stack_preview_id}/logs/summarize": { + "post": { + "summary": "Summarize stack preview logs", + "description": "Get a summary using layman words of the\nstack preview logs.\n", + "operationId": "SummarizeStackPreviewLogs", + "tags": [ + "Previews" + ], + "security": [ + { + "apiKey": [] + }, + { + "jwtToken": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + }, + { + "$ref": "#/components/parameters/stackPreviewID" + }, + { + "$ref": "#/components/parameters/qForce" + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SummaryResponse" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + } + }, + "/v1/stack_previews/{org_uuid}/{stack_preview_id}/summarize": { + "post": { + "summary": "Summarize stack preview plan for changes.", + "description": "Get a summary using layman words for the summary of the stack\npreview changes to apply.\n", + "operationId": "SummarizeStackPreview", + "tags": [ + "Previews" + ], + "security": [ + { + "apiKey": [] + }, + { + "jwtToken": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + }, + { + "$ref": "#/components/parameters/stackPreviewID" + }, + { + "$ref": "#/components/parameters/qForce" + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SummaryResponse" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + } + }, + "/v1/alerts/{org_uuid}": { + "get": { + "summary": "Select a set of alerts from an organization.", + "description": "Select a set of alerts from an organization.", + "operationId": "GetAlerts", + "tags": [ + "Alerts" + ], + "security": [ + { + "apiKey": [] + }, + { + "jwtToken": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + }, + { + "$ref": "#/components/parameters/qSeverity" + }, + { + "$ref": "#/components/parameters/qNegUserUUID" + }, + { + "$ref": "#/components/parameters/qUnassigned" + }, + { + "$ref": "#/components/parameters/qAlertStatuses" + }, + { + "$ref": "#/components/parameters/qFrom" + }, + { + "$ref": "#/components/parameters/qTo" + }, + { + "$ref": "#/components/parameters/qResolvedAtFrom" + }, + { + "$ref": "#/components/parameters/qResolvedAtTo" + }, + { + "$ref": "#/components/parameters/qAlertsSearch" + }, + { + "$ref": "#/components/parameters/qPage" + }, + { + "$ref": "#/components/parameters/qPerPage" + }, + { + "description": "Alerts are sorted with updated_at by default.\n\nAvailable sorts are:\n - created_at[,(asc|desc)\n - resolved_at[,(desc|asc)\n - updated_at[,(desc|asc)\n", + "$ref": "#/components/parameters/qSort" + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AlertsCollection" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + } + } + } + }, + "/v1/alerts/{org_uuid}/{alert_uuid}": { + "get": { + "summary": "Get an alert from an organization.", + "description": "Get an alert from an organization.", + "operationId": "GetAlert", + "tags": [ + "Alerts" + ], + "security": [ + { + "apiKey": [] + }, + { + "jwtToken": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + }, + { + "$ref": "#/components/parameters/alertUUID" + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetAlertResponse" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + }, + "patch": { + "summary": "Update an alert from an organization.", + "description": "Update an alert from an organization.\n\nA fixed alert cannot change so it will lead a BadRequest response.\n", + "operationId": "PatchAlert", + "tags": [ + "Alerts" + ], + "security": [ + { + "jwtToken": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + }, + { + "$ref": "#/components/parameters/alertUUID" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PatchAlertRequest" + } + } + } + }, + "responses": { + "200": { + "description": "OK with the updated alert entity.\n", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Alert" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "$ref": "#/components/responses/NotFound" + }, + "409": { + "description": "A fixed alert cannot be updated", + "$ref": "#/components/responses/Conflict" + } + } + } + }, + "/v1/alerts/{org_uuid}/{alert_uuid}/stacks": { + "get": { + "summary": "Get affected stacks for an alert.", + "description": "Get affected stacks for an alert.", + "operationId": "GetAlertAffectedStacks", + "tags": [ + "Alerts" + ], + "security": [ + { + "apiKey": [] + }, + { + "jwtToken": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + }, + { + "$ref": "#/components/parameters/alertUUID" + }, + { + "$ref": "#/components/parameters/qPage" + }, + { + "$ref": "#/components/parameters/qPerPage" + }, + { + "$ref": "#/components/parameters/qSort" + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AlertAffectedStacksCollection", + "description": "Status for the stack would be the status related to\nthe alert. So for instance, a stack current status\ncould be 'failed' but it may be 'ok' if the alert\nwas fixed for this stack in a point of time.\n" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + } + }, + "/v1/alerts/{org_uuid}/{alert_uuid}/timeline": { + "get": { + "summary": "Get an alert timeline from an alert.", + "description": "Get an alert timeline from an alert.", + "operationId": "GetAlertTimeline", + "tags": [ + "Alerts" + ], + "security": [ + { + "apiKey": [] + }, + { + "jwtToken": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + }, + { + "$ref": "#/components/parameters/alertUUID" + }, + { + "$ref": "#/components/parameters/qPage" + }, + { + "$ref": "#/components/parameters/qPerPage" + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AlertEventsCollection" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + } + }, + "/v1/resources/{org_uuid}": { + "get": { + "summary": "Select a set of resources from an organization.", + "description": "Select a set of resources from an organization.", + "operationId": "GetResources", + "tags": [ + "Resources" + ], + "security": [ + { + "apiKey": [] + }, + { + "jwtToken": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + }, + { + "$ref": "#/components/parameters/qPage" + }, + { + "$ref": "#/components/parameters/qPerPage" + }, + { + "description": "Resources are sorted with updated_at by default.\n\nAvailable sorts are:\n - created_at[,(asc|desc)\n - extracted_account[,(asc|desc)]\n - extracted_name[,(asc|desc)]\n - path[,(asc|desc)]\n - policy_severity\n - provider[,(asc|desc)]\n - repository[,(asc|desc)]\n - status[,(asc|desc)]\n - target[,(asc|desc)]\n - technology[,(asc|desc)]\n - type[,(asc|desc)]\n - updated_at[,(desc|asc)\n", + "$ref": "#/components/parameters/qSort" + }, + { + "$ref": "#/components/parameters/qResourceStatuses" + }, + { + "$ref": "#/components/parameters/qTechnologies" + }, + { + "$ref": "#/components/parameters/qProviders" + }, + { + "$ref": "#/components/parameters/qResourceTypes" + }, + { + "$ref": "#/components/parameters/qRepositories" + }, + { + "$ref": "#/components/parameters/qTargets" + }, + { + "$ref": "#/components/parameters/qResourceAccounts" + }, + { + "$ref": "#/components/parameters/qStackID" + }, + { + "$ref": "#/components/parameters/qIsArchived" + }, + { + "$ref": "#/components/parameters/qPolicySeverity" + }, + { + "$ref": "#/components/parameters/qResourceSearch" + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ResourcesCollection" + } + } + } + }, + "400": { + "$ref": "#/components/responses/BadRequest" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + } + } + } + }, + "/v1/resources/{org_uuid}/{resource_uuid}": { + "get": { + "summary": "Get a specific resource.", + "description": "Get a specific resource.", + "operationId": "GetResource", + "tags": [ + "Resources" + ], + "security": [ + { + "apiKey": [] + }, + { + "jwtToken": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + }, + { + "$ref": "#/components/parameters/resourceUUID" + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Resource" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + } + }, + "/v1/resources/{org_uuid}/{resource_uuid}/deployments": { + "get": { + "summary": "Get a list of deployment change sets for the resource.", + "description": "Get a list of deployment change sets for the resource, in descending order of created_at.", + "operationId": "GetResourceDeployments", + "tags": [ + "Resources" + ], + "security": [ + { + "apiKey": [] + }, + { + "jwtToken": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + }, + { + "$ref": "#/components/parameters/resourceUUID" + }, + { + "$ref": "#/components/parameters/qPage" + }, + { + "$ref": "#/components/parameters/qPerPage" + }, + { + "$ref": "#/components/parameters/qSkipTotalCount" + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ResourceDeploymentsCollection" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + } + }, + "/v1/resources/{org_uuid}/{resource_uuid}/drift": { + "get": { + "summary": "Get the latest drift change set for a resource", + "description": "Get the latest drift change set for a resource, or NotFound if the latest drift check was OK or there was no check yet.", + "operationId": "GetResourceDrift", + "tags": [ + "Resources" + ], + "security": [ + { + "apiKey": [] + }, + { + "jwtToken": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + }, + { + "$ref": "#/components/parameters/resourceUUID" + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ResourceDrift" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + } + }, + "/v1/resources/{org_uuid}/{resource_uuid}/previews": { + "get": { + "summary": "Get a list of preview change sets for open reviews\nrelated to the resource.\n", + "description": "Get a list of preview change sets for open reviews related to the resource, in descending order of last_pushed_at.", + "operationId": "GetResourcePreviews", + "tags": [ + "Resources" + ], + "security": [ + { + "apiKey": [] + }, + { + "jwtToken": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + }, + { + "$ref": "#/components/parameters/resourceUUID" + }, + { + "$ref": "#/components/parameters/qPage" + }, + { + "$ref": "#/components/parameters/qPerPage" + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ResourcePreviewsCollection" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + } + }, + "/v1/organizations/{org_uuid}/api_keys": { + "post": { + "summary": "Create an API key for an organization", + "description": "Only admin users can create API keys for an organization.", + "operationId": "CreateOrganizationAPIKey", + "tags": [ + "Org API Keys" + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateAPIKeyRequest" + } + } + } + }, + "responses": { + "201": { + "description": "Created", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/APIKey" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + }, + "security": [ + { + "jwtToken": [] + } + ] + }, + "get": { + "summary": "List API keys belonging to an organization", + "description": "Only admin users can list API keys for an organization.", + "operationId": "ListOrganizationAPIKeys", + "tags": [ + "Org API Keys" + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/APIKeysCollection" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + }, + "security": [ + { + "jwtToken": [] + } + ] + } + }, + "/v1/organizations/{org_uuid}/api_keys/{key_id}": { + "delete": { + "summary": "Delete an API key", + "description": "Only admin users can delete API keys.", + "operationId": "DeleteOrganizationAPIKey", + "tags": [ + "Org API Keys" + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + }, + { + "in": "path", + "name": "key_id", + "required": true, + "description": "UUID of the API key", + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "204": { + "description": "No Content" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "403": { + "$ref": "#/components/responses/Forbidden" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + }, + "security": [ + { + "jwtToken": [] + } + ] + } + }, + "/v1/license_keys/{org_uuid}": { + "post": { + "summary": "Create an license key for terramate-pro for an organization", + "description": "Create an license key for terramate-pro for an organization.", + "operationId": "CreateLicenseKey", + "tags": [ + "License Keys" + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + } + ], + "responses": { + "201": { + "description": "Created", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/License" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + } + }, + "security": [ + { + "apiKey": [] + }, + { + "jwtToken": [] + } + ] + }, + "get": { + "summary": "List licenses for terramate-pro belonging to an organization", + "description": "List licenses for terramate-pro belonging to an organization", + "operationId": "ListLicenseKeys", + "tags": [ + "License Keys" + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + }, + { + "$ref": "#/components/parameters/qPage" + }, + { + "$ref": "#/components/parameters/qPerPage" + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/LicensesCollection" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + } + }, + "security": [ + { + "apiKey": [] + }, + { + "jwtToken": [] + } + ] + } + }, + "/v1/license_keys/{org_uuid}/{license_id}": { + "get": { + "summary": "Get details from a license for terramate-pro.", + "description": "Get details from a license for terramate-pro.", + "operationId": "GetLicenseKey", + "tags": [ + "License Keys" + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + }, + { + "in": "path", + "name": "license_id", + "required": true, + "description": "UUID of the license key", + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/License" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + }, + "security": [ + { + "apiKey": [] + }, + { + "jwtToken": [] + } + ] + }, + "delete": { + "summary": "Revoke a license for terramate-pro.", + "description": "Revoke a license for terramate-pro.", + "operationId": "DeleteLicenseKey", + "tags": [ + "License Keys" + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + }, + { + "in": "path", + "name": "license_id", + "required": true, + "description": "UUID of the license key", + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "204": { + "description": "No Content" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + }, + "security": [ + { + "apiKey": [] + }, + { + "jwtToken": [] + } + ] + } + }, + "/v1/store/{org_uuid}/outputs": { + "post": { + "summary": "Store outputs for a Terraform stack.", + "description": "It's used for Cross-Repository Terraform Outputs sharing.", + "operationId": "CreateStoreOutput", + "tags": [ + "Store" + ], + "security": [ + { + "apiKey": [] + }, + { + "jwtToken": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PostStoreOutputRequest" + } + } + } + }, + "responses": { + "201": { + "description": "Created", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StoreOutput" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "409": { + "description": "There's already a key with the same name.", + "$ref": "#/components/responses/Conflict" + } + } + }, + "get": { + "summary": "lookup an output by its composite key.", + "description": "It's used by the Terraform Provider in the data source.", + "operationId": "GetStoreOutputByKey", + "tags": [ + "Store" + ], + "security": [ + { + "apiKey": [] + }, + { + "jwtToken": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + }, + { + "in": "query", + "name": "repository", + "required": true, + "description": "The repository where the output is stored.", + "schema": { + "type": "string" + }, + "example": "github.com/terramate-io/terramate" + }, + { + "in": "query", + "name": "stack_meta_id", + "required": true, + "description": "The meta id of the stack.", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "name", + "required": true, + "description": "The name of the output.", + "schema": { + "type": "string" + } + }, + { + "in": "query", + "name": "target", + "schema": { + "$ref": "#/components/schemas/DeploymentTarget" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StoreOutput" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + } + }, + "/v1/store/{org_uuid}/outputs/{output_uuid}": { + "get": { + "summary": "Get an output by ID.", + "description": "It's used by the Terraform Provider in the refresh phase in order to check output status and content.", + "operationId": "GetStoreOutputById", + "tags": [ + "Store" + ], + "security": [ + { + "apiKey": [] + }, + { + "jwtToken": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + }, + { + "$ref": "#/components/parameters/outputUUID" + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StoreOutput" + } + } + } + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + }, + "delete": { + "summary": "Delete an output by ID.", + "description": "It's used by the Terraform Provider when a resource is deleted.", + "operationId": "DeleteStoreOutput", + "tags": [ + "Store" + ], + "security": [ + { + "apiKey": [] + }, + { + "jwtToken": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + }, + { + "$ref": "#/components/parameters/outputUUID" + } + ], + "responses": { + "204": { + "description": "Deleted successfully" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + } + }, + "/v1/store/{org_uuid}/outputs/{output_uuid}/value": { + "put": { + "summary": "Update the output value", + "description": "It's used by the Terraform Provider in the Terraform apply phase to update the output content.", + "operationId": "PutStoreOutputValue", + "tags": [ + "Store" + ], + "security": [ + { + "apiKey": [] + }, + { + "jwtToken": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/orgUUID" + }, + { + "$ref": "#/components/parameters/outputUUID" + } + ], + "requestBody": { + "required": true, + "content": { + "text/plain": { + "schema": { + "type": "string" + } + } + } + }, + "responses": { + "204": { + "description": "Updated successfully" + }, + "401": { + "$ref": "#/components/responses/Unauthorized" + }, + "404": { + "$ref": "#/components/responses/NotFound" + } + } + } + } + }, + "components": { + "responses": { + "BadRequest": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GenericErrorResponseObject" + } + } + } + }, + "Unauthorized": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GenericErrorResponseObject" + } + } + } + }, + "Forbidden": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GenericErrorResponseObject" + } + } + } + }, + "NotFound": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GenericErrorResponseObject" + } + } + } + }, + "Conflict": { + "description": "Conflict", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GenericErrorResponseObject" + } + } + } + }, + "NotImplemented": { + "description": "Not Implemented", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GenericErrorResponseObject" + } + } + } + }, + "UnprocessableContent": { + "description": "Unprocessable Content", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GenericErrorResponseObject" + } + } + } + }, + "GetUserOrgMembershipsResp": { + "description": "Found", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/GetMembershipsResponseObject" + } + } + } + } + } + }, + "parameters": { + "orgUUID": { + "in": "path", + "name": "org_uuid", + "description": "UUID of the organization", + "schema": { + "type": "string", + "format": "uuid" + }, + "required": true + }, + "deploymentUUID": { + "in": "path", + "name": "deployment_uuid", + "description": "UUID of the deployment", + "schema": { + "type": "string", + "format": "uuid" + }, + "required": true + }, + "outputUUID": { + "in": "path", + "name": "output_uuid", + "description": "UUID of the output", + "schema": { + "type": "string", + "format": "uuid" + }, + "required": true + }, + "stackID": { + "in": "path", + "name": "stack_id", + "description": "ID of the Stack", + "schema": { + "type": "integer", + "format": "int64" + }, + "required": true + }, + "memberID": { + "in": "path", + "name": "member_id", + "description": "ID of the Member", + "schema": { + "type": "integer", + "format": "int64" + }, + "required": true + }, + "driftID": { + "in": "path", + "name": "drift_id", + "description": "ID of the Stack (Using representational integer ID)", + "schema": { + "type": "integer", + "format": "int64" + }, + "required": true + }, + "workflowDeploymentGroupID": { + "in": "path", + "name": "workflow_deployment_group_id", + "required": true, + "description": "Unique identifier for the workflow deployment group", + "schema": { + "type": "integer", + "format": "int64", + "example": 42 + } + }, + "stackDeploymentID": { + "in": "path", + "name": "stack_deployment_id", + "description": "Stack deployment identifier", + "schema": { + "type": "integer", + "format": "int64", + "example": 42 + }, + "required": true + }, + "stackPreviewID": { + "in": "path", + "name": "stack_preview_id", + "description": "The ID of the stack preview", + "schema": { + "type": "integer", + "format": "int64" + }, + "required": true + }, + "reviewRequestID": { + "in": "path", + "name": "review_request_id", + "description": "The ID of the review request", + "schema": { + "type": "integer", + "format": "int64" + }, + "required": true + }, + "alertUUID": { + "in": "path", + "name": "alert_uuid", + "description": "The ID of the alert", + "schema": { + "type": "string", + "format": "uuid", + "example": "01c9fb02-7648-45f5-9bdd-f2c27e59c448" + }, + "required": true + }, + "resourceUUID": { + "in": "path", + "name": "resource_uuid", + "description": "The ID of the resource", + "schema": { + "type": "string", + "format": "uuid", + "example": "01c9fb02-7648-45f5-9bdd-f2c27e59c448" + }, + "required": true + }, + "orgShortName": { + "in": "path", + "name": "name", + "description": "The organization name.", + "required": true, + "schema": { + "$ref": "#/components/schemas/OrgShortName" + } + }, + "qPage": { + "in": "query", + "name": "page", + "description": "Page number to return", + "schema": { + "type": "integer", + "format": "int64", + "minimum": 1, + "example": 1 + } + }, + "qPerPage": { + "in": "query", + "name": "per_page", + "description": "Number of elements per page", + "schema": { + "type": "integer", + "format": "int64", + "minimum": 1, + "default": 10 + } + }, + "qSkipTotalCount": { + "in": "query", + "name": "skip_total_count", + "description": "If set true, don't calculate the 'total' count in paginated results. Defaults to false.", + "schema": { + "type": "boolean", + "default": false + } + }, + "qRepositories": { + "in": "query", + "name": "repository", + "required": false, + "description": "Only select entities whose repository matches any\nof the strings in the provided array. Only full strings will\nbe matched.\n", + "explode": false, + "schema": { + "type": "array", + "items": { + "type": "string", + "example": "github.com/terramate-io/tmc-local-testing" + } + } + }, + "qTargets": { + "in": "query", + "name": "target", + "required": false, + "description": "Only select entities whose deployment target matches any\nof the strings in the provided array. Only full strings will\nbe matched.\n", + "explode": false, + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/DeploymentTarget" + } + } + }, + "qStackID": { + "in": "query", + "name": "stack_id", + "required": false, + "description": "Only select entities whose stack id matches the given value.\n", + "schema": { + "type": "integer", + "format": "int64" + } + }, + "qStatuses": { + "in": "query", + "name": "status", + "required": false, + "description": "only select stacks with specific status e.g. for dashboard view.", + "explode": false, + "schema": { + "type": "array", + "items": { + "type": "string" + }, + "examples": [ + { + "AllPossibleValues": { + "value": [ + "all", + "unhealthy", + "healthy", + "drifted", + "failed", + "ok" + ] + } + } + ] + } + }, + "qDeploymentStatuses": { + "in": "query", + "name": "deployment_status", + "required": false, + "description": "Only select stacks with these last known\ndeployment status.\n", + "explode": false, + "schema": { + "type": "array", + "items": { + "type": "string" + }, + "examples": [ + { + "AllPossibleValues": { + "value": [ + "canceled", + "failed", + "ok", + "pending", + "running" + ] + } + } + ] + } + }, + "qDriftStatuses": { + "in": "query", + "name": "drift_status", + "required": false, + "description": "Only select entities with these last known drift status.\n", + "explode": false, + "schema": { + "type": "array", + "items": { + "type": "string" + }, + "examples": [ + { + "AllPossibleValues": { + "value": [ + "ok", + "drifted", + "failed" + ] + } + } + ] + } + }, + "qDraft": { + "in": "query", + "name": "draft", + "required": false, + "description": "Only select stacks with the provided draft value.\n", + "schema": { + "type": "boolean", + "example": false + } + }, + "qIsArchived": { + "in": "query", + "name": "is_archived", + "required": false, + "description": "true - Only select entities that are archived.\nfalse - Only select entities that are not archived (default).\ntrue,false - Select all entities.\n", + "explode": false, + "schema": { + "type": "array", + "items": { + "type": "boolean" + }, + "examples": [ + { + "AllPossibleValues": { + "value": [ + true, + false + ] + } + } + ] + } + }, + "qGroupingKey": { + "in": "query", + "name": "grouping_key", + "required": false, + "description": "Only select entities with this grouping key\n", + "schema": { + "type": "string", + "example": "repo+id+1" + } + }, + "qSearch": { + "in": "query", + "name": "search", + "required": false, + "description": "Only select stacks where the title, description or path\nincludes the given search string.\nIf string contains ',' or spaces all terms will be searched and\nmatched.\nSearch terms should be a valid regular expression.\n", + "schema": { + "type": "string", + "example": "stackTitle" + } + }, + "qReviewRequestsSearch": { + "in": "query", + "name": "search", + "required": false, + "description": "Select review_requests where the following attributes match the provided\nsearch query. If string contains a comma or spaces all terms will be\nsearched and matched.\n- pull request number\n- pull request title\n- commit SHA\n- commit title\n- branch\n- base_branch\n", + "schema": { + "type": "string", + "example": "fix,main" + } + }, + "qReviewRequestsStatus": { + "in": "query", + "name": "status", + "required": false, + "description": "Review request status like open, closed or merged.\n", + "explode": false, + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ReviewRequestStatus" + } + } + }, + "qReviewRequestsDraft": { + "in": "query", + "name": "draft", + "required": false, + "description": "Only select review requests with the provided draft value.\n", + "schema": { + "type": "boolean", + "example": false + } + }, + "qMetaID": { + "in": "query", + "name": "meta_id", + "required": false, + "description": "Only select stacks where meta_id matches this value.\n", + "schema": { + "type": "string", + "example": "4106cc6-ec4b-4ef7-a0eb-d927f860e176" + } + }, + "qDeploymentUUID": { + "in": "query", + "name": "deployment_uuid", + "description": "Deployment UUID", + "schema": { + "$ref": "#/components/schemas/DeploymentUUID" + } + }, + "qMetaTag": { + "in": "query", + "name": "meta_tag", + "required": false, + "description": "Only select stacks where the meta_tags includes the given tag.\nIf they are provided multiple times *ALL* values should be\ncontained in the meta_tags. If the string contains ',' then\n*ANY* value should be in the meta_tags.\n", + "schema": { + "type": "array", + "items": { + "type": "string" + }, + "examples": [ + { + "TwoTagsExample": { + "Value": [ + "tag_a", + "tag_b" + ] + } + } + ] + } + }, + "qSort": { + "name": "sort", + "in": "query", + "description": "**Sorting**\n\nAllows for sorting of the returned entities based on specified fields and order.\nMultiple fields can be provided with their sorting direction, separated by commas.\nFor example, to sort by 'updated_at' in ascending order and then by 'path' in descending order,\nthe parameter can be specified as follows: `sort=updated_at,asc&sort=path,desc`.\nBy default, entities are sorted by 'updated_at' in descending order.\n", + "required": false, + "schema": { + "type": "array", + "items": { + "type": "string" + }, + "examples": [ + { + "UpdatedAtDescPathDescExample": { + "Value": [ + "updated_at,asc", + "path,desc" + ] + } + } + ] + } + }, + "qChannel": { + "name": "channel", + "in": "query", + "description": "OS Channel to query information from.\n", + "schema": { + "$ref": "#/components/schemas/StreamOSChannel" + } + }, + "qAuthTypes": { + "in": "query", + "name": "type", + "required": false, + "description": "Only select entities whose auth type was in provided array.\n", + "explode": false, + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AuthType" + } + } + }, + "qWorkflowDeploymentStatuses": { + "in": "query", + "name": "status", + "required": false, + "description": "Only entities whose status matches any of\nprovided input elements.\n", + "explode": false, + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/WorkflowDeploymentGroupStatus" + } + } + }, + "qWorkflowDeploymentSearch": { + "in": "query", + "name": "search", + "required": false, + "description": "Select deployments where the following attributes match the provided\nsearch query. If string contains a comma or spaces all terms will be\nsearched and matched.\n- pull request number\n- pull request title\n- commit SHA\n- commit title\n- branch\n- base_branch\n", + "schema": { + "type": "string", + "example": "fix,main" + } + }, + "qCollaboratorID": { + "in": "query", + "name": "collaborator_id", + "required": false, + "description": "Only collaborators whose identifier is set.\n", + "explode": false, + "schema": { + "type": "array", + "items": { + "type": "integer", + "format": "int64", + "example": 42 + } + } + }, + "qAuthorUUID": { + "in": "query", + "name": "author_uuid", + "required": false, + "description": "Only review requests whose author is the TMC User UUID.\n\nThis is an interim solution until a flexible filter is implemented.\n", + "explode": false, + "schema": { + "type": "array", + "items": { + "type": "string", + "format": "uuid", + "example": "183e0589-65a8-48b8-bd90-6ee89e0682aa" + } + } + }, + "qSeverity": { + "in": "query", + "name": "severity", + "required": false, + "description": "Only alerts with this grade of severity\n", + "explode": false, + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AlertSeverityRank" + } + } + }, + "qAlertStatuses": { + "in": "query", + "name": "status", + "required": false, + "description": "Only alerts with the provided status\n", + "explode": false, + "schema": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "open", + "resolved", + "fixed", + "closed" + ] + } + } + }, + "qUserUUID": { + "in": "query", + "name": "user_uuid", + "required": false, + "description": "Only entities that relates to those users.\n", + "explode": false, + "schema": { + "type": "array", + "items": { + "type": "string", + "format": "uuid", + "example": "683e0589-65a8-48b8-bd90-6ee89e0682ab" + } + } + }, + "qNegUserUUID": { + "in": "query", + "name": "user_uuid", + "required": false, + "description": "Only entities that relates to those users.\nMultiple fields can be provided separated by commas.\nNegation can be achieved by prefixing a value with `!`. For example:\n`!uuid1,uuid2` would include alerts where assignees include uuid2 but not uuid1.\n", + "schema": { + "type": "string", + "example": "!683e0589-65a8-48b8-bd90-6ee89e0682ab,11111111-1111-1111-1111-111111111111" + } + }, + "qUnassigned": { + "in": "query", + "name": "unassigned", + "required": false, + "description": "Only entities that are not assigned to a user.\nSetting this value to false has no effect and is the same as omitting it.\n", + "schema": { + "type": "boolean" + } + }, + "qFrom": { + "in": "query", + "name": "from", + "required": false, + "description": "Only entities that has a timestamp from this date including\nthe date.\n", + "schema": { + "type": "string", + "format": "date-time", + "example": "2024-04-11T20:31:00Z" + } + }, + "qTo": { + "in": "query", + "name": "to", + "required": false, + "description": "Only entities that has a timestamp up to this timestamp including\nthe timestamp.\n", + "schema": { + "type": "string", + "format": "date-time", + "example": "2024-04-11T21:31:00Z" + } + }, + "qFromDate": { + "in": "query", + "name": "from", + "required": false, + "description": "Only entities that has a timestamp from this date including\nthe date.\n", + "schema": { + "type": "string", + "format": "date", + "example": "2024-04-11" + } + }, + "qToDate": { + "in": "query", + "name": "to", + "required": false, + "description": "Only entities that has a date up to this date including\nthe date.\n", + "schema": { + "type": "string", + "format": "date", + "example": "2024-04-11" + } + }, + "qResolvedAtFrom": { + "in": "query", + "name": "resolved_at_from", + "required": false, + "description": "Only entities that has a resolved_at timestamp from this date including\nthe date.\n", + "schema": { + "type": "string", + "format": "date-time", + "example": "2024-04-11T20:31:00Z" + } + }, + "qResolvedAtTo": { + "in": "query", + "name": "resolved_at_to", + "required": false, + "description": "Only entities that has a resolved_at timestamp up to this date including\nthe date.\n", + "schema": { + "type": "string", + "format": "date-time", + "example": "2024-04-11T21:31:00Z" + } + }, + "qAlertsSearch": { + "in": "query", + "name": "search", + "required": false, + "description": "Select alerts where the following attributes match the provided\nsearch query. Match is done using case-insensitive regular\nexpression search. If string contains a comma or spaces all terms will be\nsearched and matched.\n- title\n", + "schema": { + "type": "string", + "example": "fix,ut" + } + }, + "qResourceStatuses": { + "in": "query", + "name": "status", + "required": false, + "description": "Only select resources with these statuses.\n", + "explode": false, + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceStatus" + }, + "examples": [ + { + "OKOrDriftedExample": { + "value": [ + "ok", + "drifted" + ] + } + } + ] + } + }, + "qResourceAccounts": { + "in": "query", + "name": "extracted_account", + "required": false, + "description": "Only select resources with these accounts.\n", + "explode": false, + "schema": { + "type": "array", + "items": { + "type": "string", + "example": "acme" + } + } + }, + "qTechnologies": { + "in": "query", + "name": "technology", + "required": false, + "description": "Only select resources with these technologies.\n", + "explode": false, + "schema": { + "type": "array", + "items": { + "type": "string" + }, + "examples": [ + { + "TerraformOrOpenTofuExample": { + "value": [ + "terraform", + "opentofu" + ] + } + } + ] + } + }, + "qProviders": { + "in": "query", + "name": "provider", + "required": false, + "description": "Only select resources with these providers.\n", + "explode": false, + "schema": { + "type": "array", + "items": { + "type": "string" + }, + "examples": [ + { + "AWSOrGcloudExample": { + "value": [ + "aws", + "gcloud" + ] + } + } + ] + } + }, + "qResourceTypes": { + "in": "query", + "name": "type", + "required": false, + "description": "Only select resources with these types.\n", + "explode": false, + "schema": { + "type": "array", + "items": { + "type": "string" + }, + "examples": [ + { + "VPCOrLoadBalancerExample": { + "value": [ + "vpc", + "loadbalancer" + ] + } + } + ] + } + }, + "qResourceSearch": { + "in": "query", + "name": "search", + "required": false, + "description": "Select resource where the following attributes match the provided\nsearch query. Match is done using case-insensitive regular\nexpression search. If string contains a comma or spaces all terms will be\nsearched and matched. The following attributes will be searched:\n- stack title, description, path\n- resource extracted name, extracted id, address\n", + "schema": { + "type": "string", + "example": "stackTitle" + } + }, + "qPolicySeverity": { + "in": "query", + "name": "policy_severity", + "required": false, + "description": "Only select entities that have specific policy check results.\nAvailable options:\n- missing: No analysis data available.\n- none: No checks defined for the entity.\n- passed: Entity has no violations.\n- low: Entity has violations with low severity.\n- medium: Entity has violations with medium severity.\n- high: Entity has violations with high severity.\n", + "explode": false, + "schema": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "missing", + "none", + "passed", + "low", + "medium", + "high" + ] + } + } + }, + "qWidgetUserUUID": { + "in": "query", + "name": "user_uuid", + "required": false, + "description": "Only return stats related to this user uuid.\n", + "schema": { + "type": "string", + "format": "uuid" + } + }, + "qDays": { + "in": "query", + "name": "days", + "required": false, + "description": "Only select entities in time range (T-days, T).\nT the current time by default, or it can be modified with `offset_days`.\nIf days is not set, all entities before T are selected.\n", + "schema": { + "type": "integer" + } + }, + "qOffsetDays": { + "in": "query", + "name": "offset_days", + "required": false, + "description": "Shift the selection range offset_days into the past.\nFor example: days=7, offset_days=7 is the range 14d ago to 7d ago.\n", + "schema": { + "type": "integer" + } + }, + "qReviewRequestedUUID": { + "in": "query", + "name": "review_requested_uuid", + "required": false, + "description": "Only return entities where the given user was a requested reviewer.\n", + "schema": { + "type": "string", + "format": "uuid" + } + }, + "qCreatedAtFrom": { + "in": "query", + "name": "created_at_from", + "required": false, + "description": "Only entities that has a created_at timestamp from this date including\nthe date.\n", + "schema": { + "type": "string", + "format": "date-time", + "example": "2024-04-11T20:31:00Z" + } + }, + "qCreatedAtTo": { + "in": "query", + "name": "created_at_to", + "required": false, + "description": "Only entities that has a created_at timestamp up to this date including\nthe date.\n", + "schema": { + "type": "string", + "format": "date-time", + "example": "2024-04-11T21:31:00Z" + } + }, + "qStartedAtFrom": { + "in": "query", + "name": "started_at_from", + "required": false, + "description": "Only entities that has a started_at timestamp from this date including\nthe date.\n", + "schema": { + "type": "string", + "format": "date-time", + "example": "2024-04-11T20:31:00Z" + } + }, + "qStartedAtTo": { + "in": "query", + "name": "started_at_to", + "required": false, + "description": "Only entities that has a started_at timestamp up to this date including\nthe date.\n", + "schema": { + "type": "string", + "format": "date-time", + "example": "2024-04-11T21:31:00Z" + } + }, + "qFinishedAtFrom": { + "in": "query", + "name": "finished_at_from", + "required": false, + "description": "Only entities that has a finished_at timestamp from this date including\nthe date.\n", + "schema": { + "type": "string", + "format": "date-time", + "example": "2024-04-11T20:31:00Z" + } + }, + "qFinishedAtTo": { + "in": "query", + "name": "finished_at_to", + "required": false, + "description": "Only entities that has a finished_at timestamp up to this date including\nthe date.\n", + "schema": { + "type": "string", + "format": "date-time", + "example": "2024-04-11T21:31:00Z" + } + }, + "qForce": { + "in": "query", + "name": "force", + "required": false, + "description": "Force the request to avoid any cached content.\n", + "schema": { + "type": "boolean", + "example": true + } + }, + "qTimezone": { + "in": "query", + "name": "timezone", + "required": false, + "description": "The time zone defined by IANA.\n", + "schema": { + "type": "string", + "example": "Europe/Berlin" + } + }, + "qTimeGranularity": { + "in": "query", + "name": "granularity", + "required": false, + "description": "The time granularity to use.\n", + "schema": { + "type": "string", + "enum": [ + "days", + "weeks", + "months", + "quarters", + "years" + ], + "default": "days", + "example": "days" + } + } + }, + "schemas": { + "WellKnownCLI": { + "type": "object", + "required": [ + "required_version" + ], + "properties": { + "required_version": { + "type": "string", + "description": "A version constraint indicating the required Terramate CLI version.\nFor more information see https://pkg.go.dev/github.com/hashicorp/go-version@v1.7.0\n", + "example": ">=0.8.0" + } + } + }, + "DeploymentTarget": { + "type": "string", + "description": "Name of a deployment target.", + "example": "staging", + "pattern": "^[a-z0-9][-_a-z0-9]*[a-z0-9]$" + }, + "UserProfile": { + "allOf": [ + { + "$ref": "#/components/schemas/User" + }, + { + "type": "object", + "required": [ + "email", + "job_title" + ], + "properties": { + "email": { + "type": "string", + "example": "marius@terramate.io" + }, + "job_title": { + "type": "string", + "example": "CTPO" + } + } + } + ] + }, + "GenericErrorResponseObject": { + "type": "object", + "required": [ + "error_code", + "error_message" + ], + "properties": { + "error_code": { + "description": "Numeric error code", + "type": "integer", + "example": 1 + }, + "error_message": { + "description": "Human readable error message", + "type": "string", + "example": "Unknown error occured." + } + } + }, + "PostUsersRequestObject": { + "oneOf": [ + { + "type": "null" + }, + { + "type": "object", + "properties": { + "display_name": { + "$ref": "#/components/schemas/UserDisplayName" + }, + "job_title": { + "$ref": "#/components/schemas/UserPosition" + } + }, + "additionalProperties": false + } + ] + }, + "GetMembershipsResponseObject": { + "type": "object", + "required": [ + "member_id", + "org_display_name", + "org_name", + "org_uuid" + ], + "properties": { + "member_id": { + "description": "ID of the Member", + "type": "integer", + "format": "int64" + }, + "org_display_name": { + "type": "string", + "example": "Terramate GmbH" + }, + "org_domain": { + "type": "string", + "example": "terramate.io" + }, + "org_name": { + "type": "string", + "example": "terramate" + }, + "org_uuid": { + "type": "string", + "format": "uuid", + "example": "7af57dbe-4f8a-4046-b5f7-135a79f478b3" + }, + "role": { + "$ref": "#/components/schemas/MemberRole" + }, + "status": { + "$ref": "#/components/schemas/MembershipStatus" + } + } + }, + "DriftStatus": { + "type": "string", + "enum": [ + "ok", + "drifted", + "failed" + ] + }, + "Provisioner": { + "type": "string", + "enum": [ + "terraform", + "opentofu" + ] + }, + "GetDriftsResponseObject": { + "type": "object", + "required": [ + "paginated_result" + ], + "properties": { + "drifts": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Drift" + } + }, + "paginated_result": { + "$ref": "#/components/schemas/PaginatedResultObject" + } + } + }, + "Drift": { + "description": "Representation of a drift.\nNote:\n - `drift_details` and `stack` are not populated in responses that list drifts.\n - either `auth_user` or `auth_trust` may be filled, based on `auth_type` value.\n", + "type": "object", + "required": [ + "id", + "org_uuid", + "stack_id", + "status", + "metadata" + ], + "properties": { + "started_at": { + "type": "string", + "format": "date-time", + "description": "The time the drift run started." + }, + "finished_at": { + "type": "string", + "format": "date-time", + "description": "The time the drift run finished. This field is optional, but if the started_at field is set,\nthis field must be set as well.\n" + }, + "id": { + "type": "integer", + "format": "int64", + "description": "ID of the Drift." + }, + "auth_type": { + "$ref": "#/components/schemas/AuthType" + }, + "auth_user": { + "$ref": "#/components/schemas/UserInfo" + }, + "auth_trust": { + "$ref": "#/components/schemas/TrustInfo" + }, + "org_uuid": { + "type": "string", + "format": "uuid", + "description": "UUID of org the Drift belongs to." + }, + "stack_id": { + "type": "integer", + "format": "int64", + "description": "ID of stack the Drift belongs to." + }, + "stack": { + "$ref": "#/components/schemas/Stack" + }, + "status": { + "$ref": "#/components/schemas/DriftStatus" + }, + "metadata": { + "$ref": "#/components/schemas/DeploymentMetadata" + }, + "drift_details": { + "$ref": "#/components/schemas/ChangesetDetails" + }, + "grouping_key": { + "type": "string", + "description": "Key to group drifts and related to workflow deployment\ngroups with the same grouping key.\n\nThis key is only set if the drift is run within CI/CD.\n", + "example": "repo+id+1" + }, + "cmd": { + "description": "Command executed to run the drift check.\n", + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "terraform", + "plan" + ] + } + } + }, + "UserInfo": { + "type": "object", + "properties": { + "display_name": { + "$ref": "#/components/schemas/UserDisplayName" + }, + "position": { + "$ref": "#/components/schemas/UserPosition" + }, + "user_picture_url": { + "$ref": "#/components/schemas/UserPictureURL" + } + } + }, + "TrustInfo": { + "type": "object", + "required": [ + "auth_id" + ], + "properties": { + "auth_id": { + "type": "string", + "description": "the id of the entity that was authorized", + "example": "terramate-io/somerepo/.github/workflows/check-all.yml@refs/heads/main" + } + } + }, + "ChangesetDetails": { + "type": "object", + "properties": { + "provisioner": { + "$ref": "#/components/schemas/Provisioner" + }, + "serial": { + "type": "integer", + "description": "The serial for this changeset.\nThis value is extracted from the .tfstate and incremented by Terraform as plans are applied.\nWe use the serial to detect stale changesets.\n", + "format": "int64" + }, + "changeset_ascii": { + "type": "string", + "description": "The changeset in ASCII format.", + "maxLength": 4194304 + }, + "changeset_json": { + "type": "string", + "description": "The changeset as a stringified JSON.\nValue is always stored, but only returned for previews and\ndrift details.\nOnly \"resource_changes\" and \"output_changes\" keys are returned if present.\n", + "maxLength": 16777216 + } + } + }, + "PostDriftStatusRequestObject": { + "type": "object", + "required": [ + "stack", + "drift_status" + ], + "properties": { + "stack": { + "description": "Stack for which we want to create a drift status.", + "type": "object", + "required": [ + "path", + "meta_id", + "repository" + ], + "properties": { + "path": { + "description": "The path of the stack within the repository", + "type": "string", + "example": "/path/to/stack" + }, + "meta_id": { + "description": "The Terramate Metadata `stack.id`. Unique within the repository. This ID can be chosen by the user.", + "type": "string", + "example": "4106cc6-ec4b-4ef7-a0eb-d927f860e176" + }, + "repository": { + "description": "The repository of the stack", + "type": "string", + "example": "github.com/terramate-io/iac-github" + }, + "target": { + "description": "Deployment target of the stack. `default` if not set.", + "$ref": "#/components/schemas/DeploymentTarget" + }, + "from_target": { + "description": "Migrate from stack with previous deployment target. Has no effect if `from_target` doesn't exist or `target` already exists.", + "$ref": "#/components/schemas/DeploymentTarget" + }, + "default_branch": { + "description": "The default branch for the repository of the stack", + "type": "string", + "default": "main", + "example": "main" + }, + "meta_name": { + "description": "The Terramate Metadata `stack.name`. This name is used to identify the stack in the UI.", + "type": "string", + "example": "My Stack" + }, + "meta_description": { + "description": "The Terramate Metadata `stack.description`. This description is used to identify the stack in the UI.", + "type": "string", + "example": "My Stack" + }, + "meta_tags": { + "description": "The Terramate Metadata `stack.tags`. This tags are used to identify the stack in the UI.", + "type": "array", + "example": [ + "prod", + "tag" + ], + "items": { + "type": "string" + } + } + } + }, + "metadata": { + "$ref": "#/components/schemas/DeploymentMetadata" + }, + "drift_status": { + "$ref": "#/components/schemas/DriftStatus" + }, + "drift_details": { + "$ref": "#/components/schemas/ChangesetDetails" + }, + "started_at": { + "type": "string", + "format": "date-time", + "description": "The time the drift run started." + }, + "finished_at": { + "type": "string", + "format": "date-time", + "description": "The time the drift run finished. This field is optional, but if the started_at field is set,\nthis field must be set as well.\n" + }, + "command": { + "description": "Command executed to run the drift check.\n", + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "terraform", + "plan" + ] + } + } + }, + "Organization": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "name": { + "$ref": "#/components/schemas/OrgShortName" + }, + "display_name": { + "$ref": "#/components/schemas/OrgDisplayName" + }, + "domain": { + "$ref": "#/components/schemas/OrgDomainName" + }, + "github_owner": { + "$ref": "#/components/schemas/OrgGithubOwner" + }, + "gitlab_owner": { + "$ref": "#/components/schemas/OrgGitlabOwner" + }, + "slack_webhook": { + "description": "The Slack Webhook set for this organization used to send notifications.\nMust be an empty string or a valid Slack webhook URL.\n", + "type": "string", + "example": "https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX", + "pattern": "^$|^https://hooks\\.slack\\.com/services/T(.+?)/B(.+?)/(.+)$" + } + } + }, + "PostOrganizationsResponseObject": { + "$ref": "#/components/schemas/GetMembershipsResponseObject" + }, + "PatchOrganizationRequestObject": { + "type": "object", + "properties": { + "display_name": { + "$ref": "#/components/schemas/OrgDisplayName" + }, + "domain": { + "$ref": "#/components/schemas/OrgDomainName" + }, + "github_owner": { + "$ref": "#/components/schemas/OrgGithubOwner" + }, + "gitlab_owner": { + "$ref": "#/components/schemas/OrgGitlabOwner" + }, + "slack_webhook": { + "description": "The Slack Webhook set for this organization used to send notifications.\nMust be an empty string or a valid Slack webhook URL.\n", + "type": "string", + "example": "https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX", + "pattern": "^$|^https://hooks\\.slack\\.com/services/T(.+?)/B(.+?)/(.+)$" + } + } + }, + "PatchOrganizationResponseObject": { + "$ref": "#/components/schemas/Organization" + }, + "EnterpriseOrganization": { + "type": "object", + "properties": { + "enterprise_org_id": { + "type": "string", + "example": "org_0123232dada" + } + } + }, + "CreateMembershipRequest": { + "oneOf": [ + { + "type": "null" + }, + { + "$ref": "#/components/schemas/CreateMembershipRequestBody" + } + ] + }, + "CreateMembershipRequestBody": { + "type": "object", + "required": [ + "invite_email" + ], + "properties": { + "invite_email": { + "type": "string", + "format": "email", + "example": "soeren@terramate.io" + }, + "role": { + "$ref": "#/components/schemas/MemberRole" + } + } + }, + "CreateMembershipResponse": { + "type": "object", + "required": [ + "member_id", + "role", + "status" + ], + "properties": { + "member_id": { + "type": "integer", + "format": "int64", + "description": "The Member ID", + "example": 42 + }, + "invited_email": { + "type": "string", + "example": "soeren@terrmate.io" + }, + "role": { + "$ref": "#/components/schemas/MemberRole" + }, + "status": { + "$ref": "#/components/schemas/MemberStatus" + } + } + }, + "PatchOrganizationsMembersRequestObject": { + "type": "object", + "properties": { + "role": { + "$ref": "#/components/schemas/MemberRole" + }, + "status": { + "$ref": "#/components/schemas/MemberStatus" + } + } + }, + "PatchOrganizationsMembersResponseObject": { + "$ref": "#/components/schemas/Member" + }, + "GetOrganizationsMembersResponse": { + "type": "object", + "required": [ + "members", + "paginated_result" + ], + "properties": { + "members": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Member" + } + }, + "paginated_result": { + "$ref": "#/components/schemas/PaginatedResultObject" + } + } + }, + "GetDashboardStacksResponseObject": { + "type": "object", + "required": [ + "stacks_status" + ], + "properties": { + "stacks_status": { + "type": "object", + "required": [ + "ok_count", + "drifted_count", + "failed_count" + ], + "properties": { + "ok_count": { + "type": "integer", + "description": "The total number of stacks with status ok (healthy)", + "example": 1337 + }, + "drifted_count": { + "type": "integer", + "description": "The total number of stacks with status drifted (unhealthy)", + "example": 42 + }, + "failed_count": { + "type": "integer", + "description": "The total number of stacks with status failed (unhealthy)", + "example": 5 + } + } + } + } + }, + "GetStacksResponseObject": { + "type": "object", + "required": [ + "paginated_result" + ], + "properties": { + "stacks": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Stack" + } + }, + "paginated_result": { + "$ref": "#/components/schemas/PaginatedResultObject" + } + } + }, + "StackStatus": { + "description": "The last known status of the stack at `updated_at` time.", + "type": "string", + "enum": [ + "canceled", + "drifted", + "failed", + "ok", + "unknown" + ] + }, + "Stack": { + "type": "object", + "required": [ + "stack_id", + "repository", + "path", + "default_branch", + "meta_id", + "status", + "created_at", + "updated_at", + "seen_at", + "deployment_status", + "drift_status", + "draft", + "is_archived" + ], + "properties": { + "stack_id": { + "type": "integer", + "format": "int64", + "description": "Globally unique Terramate Cloud Stack ID.", + "example": 1337 + }, + "repository": { + "type": "string", + "description": "Git repository", + "example": "github.com/terramate-io/iac-gcloud" + }, + "target": { + "$ref": "#/components/schemas/DeploymentTarget" + }, + "path": { + "type": "string", + "description": "The path of the stack within the repository", + "example": "/path/to/stack" + }, + "default_branch": { + "description": "The default branch for the repository of the stack", + "type": "string", + "example": "main" + }, + "meta_id": { + "type": "string", + "description": "The Terramate Metadata `stack.id`. Unique within the repository. This ID can be chosen by the user.", + "example": "a754255a-c92a-4aeb-9668-bd3ce21dc8a2" + }, + "meta_name": { + "type": "string", + "description": "The Terramate Metadata `stack.name`.", + "example": "My Stack Name" + }, + "meta_description": { + "type": "string", + "description": "The Terramate Metadata `stack.description`.", + "example": "My Stack Description" + }, + "meta_tags": { + "type": "array", + "items": { + "type": "string", + "description": "The Terramate Metadata `stack.tags`." + }, + "example": [ + "tagA", + "tagB" + ] + }, + "status": { + "$ref": "#/components/schemas/StackStatus" + }, + "created_at": { + "type": "string", + "format": "date-time", + "description": "The time the stack was first registered with Terramate Cloud" + }, + "updated_at": { + "type": "string", + "format": "date-time", + "description": "The time the stacks status was last updated." + }, + "seen_at": { + "type": "string", + "format": "date-time", + "description": "The time the stack was last seen." + }, + "is_archived": { + "description": "True if this is an archived stack.", + "type": "boolean" + }, + "archived_at": { + "type": "string", + "format": "date-time", + "description": "If present, then time when the stack was archived." + }, + "archived_by_user_uuid": { + "type": "string", + "format": "uuid", + "description": "If archived_at is set, then UUID of the user who archived the stack, if available." + }, + "unarchived_at": { + "type": "string", + "format": "date-time", + "description": "If present, then time when the stack was unarchived." + }, + "unarchived_by_user_uuid": { + "type": "string", + "format": "uuid", + "description": "If unarchived_at is set, then UUID of the user who unarchived the stack, if available." + }, + "deployment_status": { + "$ref": "#/components/schemas/DeploymentStatus" + }, + "drift_status": { + "type": "string", + "description": "Drift status are defined in DriftStatus schema.\nBut here it's possible to have an `unknown`\ndrift status, which cannot be written by clients,\nwhen the stack has been created in a\ndeployment and no drift run has happened yet.\n", + "enum": [ + "ok", + "drifted", + "failed", + "unknown" + ] + }, + "draft": { + "type": "boolean", + "description": "This is set only if stack was created via\npreview and not under deployment or drift.\n" + }, + "related_stacks": { + "type": "array", + "nullable": true, + "description": "Stacks from other targets with the same `repository` and `meta_id`. Only set when getting a single stack.", + "items": { + "type": "object", + "required": [ + "stack_id", + "target" + ], + "properties": { + "stack_id": { + "type": "integer", + "format": "int64" + }, + "target": { + "type": "string" + } + } + } + }, + "resources": { + "description": "Only set when getting the stack list and stack details.", + "$ref": "#/components/schemas/StackResources" + } + } + }, + "StackResources": { + "type": "object", + "description": "Resources related data for this stack.\nOnly set when getting the stack list.\n", + "required": [ + "count" + ], + "properties": { + "count": { + "type": "integer", + "format": "int64", + "minimum": 0, + "description": "Last known number of resources that are defined for\nthis stack in the cloud state.\n", + "example": 42 + }, + "policy_check": { + "description": "Lask known policy check done to this stack.", + "$ref": "#/components/schemas/StackPolicyCheck" + } + } + }, + "StackPolicyCheck": { + "type": "object", + "description": "Policy check from a stack", + "required": [ + "created_at", + "passed", + "counters" + ], + "properties": { + "created_at": { + "type": "string", + "format": "date-time", + "description": "Define when the policy analysis was performed.", + "example": "2024-09-12T07:06:00Z" + }, + "passed": { + "type": "boolean", + "description": "Define if the stack passed the policy check.", + "example": false + }, + "counters": { + "$ref": "#/components/schemas/PolicyCheckCounters" + } + } + }, + "PatchStackRequest": { + "description": "All elements in the request set will be updated in the related Stack entity.\n", + "type": "object", + "properties": { + "is_archived": { + "description": "If true, archive the stack; does nothing if it was already archived.\nIf false, unarchive the stack; does nothing if it was not archived.\n", + "type": "boolean" + } + } + }, + "DeploymentStatus": { + "description": "The last known status of the stack deployment at `updated_at` time.", + "type": "string", + "enum": [ + "canceled", + "failed", + "ok", + "pending", + "running" + ] + }, + "WorkflowDeploymentGroupStatus": { + "description": "The last status of the deployment group.", + "type": "string", + "enum": [ + "failed", + "processing", + "ok" + ] + }, + "DeploymentMetadata": { + "type": "object", + "additionalProperties": {}, + "description": "Arbitrary metadata for deployment." + }, + "ReviewRequest": { + "type": "object", + "description": "The associated Review Request, if any", + "required": [ + "review_request_id" + ], + "properties": { + "review_request_id": { + "type": "integer", + "format": "int64", + "description": "The ID of the review request", + "example": 42 + }, + "platform": { + "description": "The VCS platform also known as vendor.", + "type": "string", + "example": "github" + }, + "repository": { + "description": "Git repository at time of deployment", + "type": "string", + "example": "github.com/terramate-io/iac-gcloud" + }, + "commit_sha": { + "description": "Commit SHA (if not stale, uncommitted, etc)", + "type": "string", + "example": "deadc0decafebabecafed00ddeadbeeff00dface" + }, + "number": { + "description": "The number/id of the pull/merge request within the repository", + "type": "integer", + "example": 23 + }, + "title": { + "type": "string", + "description": "The title of the pull/merge request", + "example": "feat: Add feature X" + }, + "description": { + "type": "string", + "description": "The description of the pull/merge request", + "example": "My Change Description\n\nwith a lot of details.\n" + }, + "url": { + "description": "Link to the pull request (if in CI/CD)", + "type": "string", + "format": "uri", + "example": "https://github.com/terramate-io/iac-gcloud/pull/666" + }, + "author": { + "description": "This field is deprecated use collaborators\ninstead.\n", + "deprecated": true, + "$ref": "#/components/schemas/VCSUser" + }, + "status": { + "$ref": "#/components/schemas/ReviewRequestStatus" + }, + "platform_updated_at": { + "type": "string", + "format": "date-time", + "description": "The last timestamp the review request was\nupdated in the VCS.\n" + }, + "platform_created_at": { + "type": "string", + "format": "date-time", + "description": "The timestamp when the review request was created in the VCS." + }, + "platform_pushed_at": { + "type": "string", + "format": "date-time", + "description": "The timestamp when the last commit was pushed to the review request." + }, + "platform_merged_at": { + "type": "string", + "format": "date-time", + "description": "The timestamp when the review request was merged." + }, + "reviewers": { + "type": "array", + "deprecated": true, + "description": "List of reviewers login names.\nDeprecated, use collaborators property instead.\n", + "items": { + "$ref": "#/components/schemas/VCSUser" + }, + "example": [ + { + "login": "reviewer1" + }, + { + "login": "reviewer2" + } + ] + }, + "branch": { + "type": "string", + "description": "Name for the branch of this review request", + "example": "my_awesome_feature" + }, + "base_branch": { + "type": "string", + "description": "Name for the branch the review request is\nattempted to be merged.\n", + "example": "main" + }, + "draft": { + "type": "boolean", + "description": "Is this review request in the draft state?\n" + }, + "review_decision": { + "$ref": "#/components/schemas/ReviewRequestReviewDecision" + }, + "changes_requested_count": { + "description": "The number of reviews with requested changes", + "type": "integer", + "example": 1 + }, + "approved_count": { + "description": "The number of approvals", + "type": "integer", + "example": 1 + }, + "checks_total_count": { + "description": "The number of total checks (including skipped ones)", + "type": "integer", + "example": 1 + }, + "checks_failure_count": { + "description": "The number of failed checks", + "type": "integer", + "example": 1 + }, + "checks_success_count": { + "description": "The number of successful checks", + "type": "integer", + "example": 1 + }, + "labels": { + "description": "List of labels for the review request", + "type": "array", + "nullable": true, + "items": { + "$ref": "#/components/schemas/VCSLabel" + } + }, + "preview": { + "$ref": "#/components/schemas/Preview" + }, + "metrics": { + "$ref": "#/components/schemas/DORAMetrics" + }, + "collaborators": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ReviewRequestCollaborator" + } + } + } + }, + "DORAMetrics": { + "type": "object", + "description": "DevOps Research and Assessment metrics", + "properties": { + "last_drafted_at": { + "type": "string", + "format": "date-time", + "description": "Timestamp when the review request was last put\nas draft.\n" + }, + "last_ready_for_review_at": { + "type": "string", + "format": "date-time", + "description": "Timestamp when the review request was last put\nas ready for review.\n" + }, + "ready_for_review_count": { + "type": "integer", + "min": 0, + "example": 1, + "description": "Number of times the review request was ready for review.\n" + }, + "review_total_duration_seconds": { + "type": "integer", + "format": "int64", + "example": 1, + "description": "Total time of review until ready for merge.\nIf time is below 1s, it is set to 1.\n" + }, + "last_mergeable_at": { + "type": "string", + "format": "date-time", + "description": "Timestamp when the review request was last put\nas ready for merge.\n" + }, + "mergeable_count": { + "type": "integer", + "min": 0, + "example": 1, + "description": "Number of times the review request was ready for merge.\n" + }, + "mergeable_total_duration_seconds": { + "type": "integer", + "format": "int64", + "example": 2323, + "description": "Total time of being ready for merge until merged.\nIf time is below 1s, it is set to 1.\n" + }, + "last_closed_at": { + "type": "string", + "format": "date-time", + "description": "Timestamp when the review request was last closed.\nIt does not matter if it was merged or not.\n" + }, + "deployment": { + "$ref": "#/components/schemas/DeploymentMetrics" + } + } + }, + "DeploymentMetrics": { + "type": "object", + "description": "Metrics related to deployment.", + "required": [ + "started_at" + ], + "properties": { + "started_at": { + "type": "string", + "format": "date-time", + "description": "Timestamp when the deployment was started.\n" + }, + "finished_at": { + "type": "string", + "format": "date-time", + "description": "Timestamp when the deployment finished.\n" + }, + "failed_at": { + "type": "string", + "format": "date-time", + "description": "Timestamp when the first stack deployment failed for any\nrelated workflow deployment group for this review request.\n" + }, + "fixed_at": { + "type": "string", + "format": "date-time", + "description": "Timestamp when all related alerts for this review request\nare fixed, the last fixed timestamp.\n" + }, + "wait_time_total_duration_seconds": { + "type": "integer", + "format": "int64", + "example": 2323, + "description": "Total waiting time to deploy changes in the review request.\nIf time is below 1s, it is set to 1.\n" + }, + "status": { + "$ref": "#/components/schemas/WorkflowDeploymentGroupStatus" + }, + "time_to_restore_seconds": { + "type": "integer", + "format": "int64", + "example": 2323, + "descrption": "Total time to restore since the first stack deployment\nfailed till the last alert was fixed.\nIf time is below 1s, it is set to 1.\n" + }, + "lead_time_for_change_seconds": { + "type": "integer", + "format": "int64", + "example": 2342, + "descrption": "Total time to change since the review request was created.\nIn case of failure, it will be the time that last alert\nwas fixed. And in case of success, the last stack\ndeployment finished at.\nIf time is below 1s, it is set to 1.\n" + }, + "stack_deployment_ok_count": { + "type": "integer", + "description": "The number of successful stack deployments.", + "example": 34 + }, + "stack_deployment_failed_count": { + "type": "integer", + "description": "The number of failed stack deployments.", + "example": 23 + } + } + }, + "Preview": { + "type": "object", + "required": [ + "id", + "status", + "affected_count", + "pending_count", + "running_count", + "changed_count", + "unchanged_count", + "failed_count", + "canceled_count" + ], + "properties": { + "id": { + "type": "integer", + "format": "int64", + "example": 232, + "description": "Identifier for the preview" + }, + "status": { + "type": "string", + "description": "The status of the last known preview", + "enum": [ + "outdated", + "current" + ], + "example": "outdated" + }, + "affected_count": { + "type": "integer", + "description": "The number of affected stack previews", + "example": 1 + }, + "pending_count": { + "type": "integer", + "description": "The number of pending stack previews", + "example": 1 + }, + "running_count": { + "type": "integer", + "description": "The number of running stack previews", + "example": 1 + }, + "changed_count": { + "type": "integer", + "description": "The number of changed stack previews", + "example": 1 + }, + "unchanged_count": { + "type": "integer", + "description": "The number of unchanged stack previews", + "example": 1 + }, + "failed_count": { + "type": "integer", + "description": "The number of canceled stack previews", + "example": 1 + }, + "canceled_count": { + "type": "integer", + "description": "The number of canceled stack previews", + "example": 0 + }, + "resource_changes": { + "description": "Summary of the resource changes planned in this preview.\n", + "$ref": "#/components/schemas/ResourceChangesActionsSummary" + } + } + }, + "ResourceChangesActionsSummary": { + "type": "object", + "required": [ + "create_count", + "delete_count", + "noop_count", + "read_count", + "replace_count", + "update_count" + ], + "properties": { + "create_count": { + "type": "integer", + "description": "Number of resources created in this preview.", + "example": 3 + }, + "delete_count": { + "type": "integer", + "description": "Number of resources deleted in this preview.", + "example": 2 + }, + "noop_count": { + "type": "integer", + "description": "Number of resources that are no operations\nin this preview. That is, the unchanged resources.\n", + "example": 5 + }, + "read_count": { + "type": "integer", + "description": "Number of data sources that are read in this\npreview.\n", + "example": 4 + }, + "replace_count": { + "type": "integer", + "description": "Number of resources that are replaced in this\npreview.\n", + "example": 7 + }, + "update_count": { + "type": "integer", + "description": "Number of resources that are updated in this\npreview.\n", + "example": 0 + } + } + }, + "ReviewRequestReviewDecision": { + "type": "string", + "enum": [ + "approved", + "changes_requested", + "review_required", + "none" + ], + "description": "State which represents at which point review of the request is affected.", + "example": "approved" + }, + "ReviewRequestStatus": { + "type": "string", + "enum": [ + "approved", + "changes_requested", + "closed", + "merged", + "open", + "review_required" + ] + }, + "VCSLabel": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "name": { + "type": "string", + "example": "label1" + }, + "color": { + "type": "string", + "example": "#000000" + }, + "description": { + "type": "string", + "example": "label description" + } + } + }, + "VCSUser": { + "type": "object", + "description": "The Version Control System Platform user.", + "nullable": true, + "required": [ + "login" + ], + "properties": { + "login": { + "type": "string", + "example": "hacker", + "minLength": 1 + }, + "avatar_url": { + "type": "string", + "format": "uri", + "nullable": true, + "example": "https://avatar.url/hacker" + }, + "id": { + "type": "string", + "description": "Federated unique identifier from VCS", + "example": "id" + } + } + }, + "ReviewRequestCollaborator": { + "allOf": [ + { + "$ref": "#/components/schemas/Collaborator" + }, + { + "type": "object", + "required": [ + "roles" + ], + "properties": { + "roles": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "author", + "reviewer", + "requested_reviewer" + ] + }, + "minItems": 1 + } + } + } + ] + }, + "Collaborator": { + "type": "object", + "description": "An entity that has collaborated in a business\nobject.\n", + "required": [ + "id", + "platform", + "display_name" + ], + "properties": { + "id": { + "type": "integer", + "format": "int64", + "description": "Collaborator identifier", + "example": 232 + }, + "platform": { + "$ref": "#/components/schemas/PlatformSlugName" + }, + "display_name": { + "type": "string", + "description": "Name for the collaborator to display.", + "example": "hacker" + }, + "avatar_url": { + "type": "string", + "format": "uri", + "nullable": true, + "example": "https://avatar.url/hacker" + }, + "linked_user": { + "description": "The TMC user linked to that collaborator if\nany.\n", + "$ref": "#/components/schemas/User" + } + } + }, + "PlatformSlugName": { + "type": "string", + "description": "Third-party platform slug name.", + "enum": [ + "bitbucket", + "github", + "gitlab", + "google", + "microsoft", + "tmc", + "workos" + ], + "example": "github" + }, + "AuthType": { + "type": "string", + "enum": [ + "gha", + "gitlabcicd", + "idp", + "tmco" + ] + }, + "GetOrganizationDeploymentsResponseObject": { + "type": "object", + "required": [ + "deployments", + "paginated_result" + ], + "properties": { + "deployments": { + "type": "array", + "items": { + "$ref": "#/components/schemas/WorkflowDeploymentGroup" + } + }, + "paginated_result": { + "$ref": "#/components/schemas/PaginatedResultObject" + } + } + }, + "GetOrganizationDeploymentsActivityResponse": { + "type": "object", + "required": [ + "start", + "end", + "offset", + "workflow_deployment_groups" + ], + "properties": { + "start": { + "type": "string", + "format": "date-time", + "description": "When activity started" + }, + "end": { + "type": "string", + "format": "date-time", + "description": "When activity ended" + }, + "offset": { + "type": "string", + "format": "duration", + "description": "Separation between elements in the array in seconds" + }, + "workflow_deployment_groups": { + "type": "array", + "items": { + "type": "array", + "items": { + "type": "integer", + "minimum": 0 + }, + "minItems": 2, + "maxItems": 2, + "description": "The first element is ok_count and the second one is the\nfailed_count.\n\nSo [1, 4] would be ok = 1 and failed = 4.\n", + "examples": [ + { + "OneOKAndFourFailedExample": { + "value": [ + 1, + 4 + ] + } + } + ] + }, + "examples": [ + { + "TwoItemsExample": { + "value": [ + [ + 1, + 4 + ], + [ + 2, + 3 + ] + ] + } + } + ] + } + } + }, + "GetStacksDeploymentsResponseObject": { + "type": "object", + "required": [ + "deployments", + "paginated_result" + ], + "properties": { + "deployments": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Deployment" + } + }, + "paginated_result": { + "$ref": "#/components/schemas/PaginatedResultObject" + } + } + }, + "GetDeploymentsHistoryResponse": { + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/GetDeploymentsHistoryResponseElement" + } + }, + "GetDeploymentsHistoryResponseElement": { + "type": "object", + "required": [ + "successful_sum", + "unsuccessful_sum" + ], + "properties": { + "successful_sum": { + "type": "integer" + }, + "unsuccessful_sum": { + "type": "integer" + } + } + }, + "PostDeploymentStacksRequestReviewRequestObject": { + "type": "object", + "required": [ + "repository" + ], + "properties": { + "platform": { + "description": "The VCS platform", + "type": "string", + "example": "github" + }, + "repository": { + "description": "Git repository at time of deployment", + "type": "string", + "example": "github.com/terramate-io/iac-gcloud" + }, + "commit_sha": { + "description": "Commit SHA (if not stale, uncommitted, etc)", + "type": "string", + "example": "deadc0decafebabecafed00ddeadbeeff00dface" + }, + "branch": { + "description": "the branch name (aka head_ref_name) of the review request", + "type": "string", + "example": "some-branch-name" + }, + "base_branch": { + "description": "the base branch (aka base_ref_name) of the review request", + "type": "string", + "example": "main" + }, + "number": { + "description": "The number/id of the pull/merge request within the repository", + "type": "integer", + "example": 23 + }, + "title": { + "type": "string", + "description": "The title of the pull/merge request", + "example": "feat: Add feature X" + }, + "description": { + "type": "string", + "description": "The description of the pull/merge request", + "example": "My Change Description\n\nwith a lot of details.\n" + }, + "url": { + "description": "Link to the pull request (if in CI/CD)", + "type": "string", + "format": "uri", + "example": "https://github.com/terramate-io/iac-gcloud/pull/666" + }, + "created_at": { + "type": "string", + "format": "date-time", + "description": "The timestamp when review request was created.\nThis field is not yet populated but it's using metadata.\n" + }, + "updated_at": { + "type": "string", + "format": "date-time", + "description": "The last timestamp the review request was updated in the VCS.\n" + }, + "pushed_at": { + "oneOf": [ + { + "type": "string", + "format": "date-time", + "description": "The pushed_at of the last commit in the review\nrequest. This is only available when the cli is running in a\npull request context.\n" + }, + { + "type": "integer", + "format": "int64", + "mininum": 0, + "maximum": 253402300799, + "description": "The number that defines the last code push change for\na review request.\n" + } + ] + }, + "author": { + "$ref": "#/components/schemas/VCSUser" + }, + "reviewers": { + "description": "List of reviewers for the review request.\n", + "type": "array", + "nullable": true, + "items": { + "$ref": "#/components/schemas/VCSUser" + }, + "example": [ + { + "login": "reviewer1" + }, + { + "login": "reviewer2" + } + ] + }, + "labels": { + "description": "List of labels for the review request", + "type": "array", + "nullable": true, + "items": { + "$ref": "#/components/schemas/VCSLabel" + } + }, + "status": { + "type": "string", + "description": "The status of this review. Can be open, closed, merged.\n", + "example": "open" + }, + "draft": { + "type": "boolean", + "description": "Is this review request in the draft state?\n" + }, + "review_decision": { + "$ref": "#/components/schemas/ReviewRequestReviewDecision" + }, + "changes_requested_count": { + "description": "The number of reviews with requested changes", + "type": "integer", + "example": 1 + }, + "approved_count": { + "description": "The number of approvals", + "type": "integer", + "example": 1 + }, + "checks_total_count": { + "description": "The number of total checks (including skipped ones)", + "type": "integer", + "example": 1 + }, + "checks_failure_count": { + "description": "The number of failed checks", + "type": "integer", + "example": 1 + }, + "checks_success_count": { + "description": "The number of succeesful checks", + "type": "integer", + "example": 1 + } + } + }, + "PostDeploymentStacksRequestStackObject": { + "type": "object", + "required": [ + "repository", + "path", + "meta_id", + "deployment_cmd" + ], + "properties": { + "commit_sha": { + "description": "Commit SHA (if not stale, uncommitted, etc)", + "type": "string", + "example": "deadc0decafebabecafed00ddeadbeeff00dface" + }, + "repository": { + "description": "The repository the deployment was run in", + "type": "string", + "example": "github.com/terramate-io/iac-gcloud" + }, + "target": { + "description": "Deployment target of the stack. `default` if not set.", + "$ref": "#/components/schemas/DeploymentTarget" + }, + "from_target": { + "description": "Migrate from stack with previous deployment target. Has no effect if `from_target` doesn't exist or `target` already exists.", + "$ref": "#/components/schemas/DeploymentTarget" + }, + "path": { + "description": "Path within the repository at time of deployment", + "type": "string", + "example": "/stacks/organizations/terramate.io/landing-zone/iam" + }, + "default_branch": { + "description": "The default branch for the repository of the stack", + "type": "string", + "default": "main", + "example": "main" + }, + "meta_id": { + "description": "stack.id of the stack deployed", + "type": "string", + "example": "deadbeef-babe-d00d-face-badc0de11111" + }, + "meta_name": { + "type": "string", + "description": "The Terramate Metadata `stack.name` of the stack deployed", + "example": "My Stack Name" + }, + "meta_description": { + "type": "string", + "description": "The Terramate Metadata `stack.name` of the stack deployed", + "example": "My Stack Description" + }, + "meta_tags": { + "type": "array", + "items": { + "type": "string", + "description": "The Terramate Metadata `stack.tags` of the stack deployed" + }, + "example": [ + "tagA", + "tagB" + ] + }, + "deployment_url": { + "description": "Link to the deployment logs (if in CI/CD)", + "type": "string", + "format": "uri", + "example": "https://github.com/terramate-io/iac-gcloud/actions/runs/5146438941" + }, + "deployment_cmd": { + "description": "Command executed to deploy", + "type": "string", + "example": "terraform apply" + } + } + }, + "PostDeploymentStacksRequest": { + "type": "object", + "properties": { + "review_request": { + "$ref": "#/components/schemas/PostDeploymentStacksRequestReviewRequestObject" + }, + "stacks": { + "type": "array", + "nullable": true, + "description": "Stacks involved in the deployment", + "items": { + "$ref": "#/components/schemas/PostDeploymentStacksRequestStackObject" + } + }, + "workdir": { + "type": "string", + "description": "Working directory of where the deployment was run.", + "example": "/users/terraform/checkouts/terramate" + }, + "metadata": { + "$ref": "#/components/schemas/DeploymentMetadata" + } + } + }, + "PostDeploymentStacksResponseObject": { + "type": "object", + "required": [ + "meta_id", + "stack_id", + "status" + ], + "properties": { + "meta_id": { + "description": "terramate stack.id of the stack", + "type": "string", + "example": "deadbeef-babe-d00d-face-badc0de11111" + }, + "stack_id": { + "description": "Globally unique Terramate Cloud Stack ID", + "type": "integer", + "format": "int64", + "example": 42 + }, + "target": { + "description": "Name of the deployment target the stack was added to.\nOnly present if also set in the request, otherwise implicitly default.\n", + "$ref": "#/components/schemas/DeploymentTarget" + }, + "status": { + "$ref": "#/components/schemas/StackStatus" + } + } + }, + "PatchDeploymentStacksRequestObject": { + "type": "object", + "required": [ + "stack_id", + "status" + ], + "properties": { + "stack_id": { + "description": "Globally unique Terramate Cloud Stack ID", + "type": "integer", + "format": "int64", + "example": 42 + }, + "status": { + "$ref": "#/components/schemas/DeploymentStatus" + }, + "changeset_details": { + "$ref": "#/components/schemas/ChangesetDetails" + } + } + }, + "PatchStackPreviewRequestObject": { + "type": "object", + "required": [ + "status" + ], + "properties": { + "status": { + "$ref": "#/components/schemas/PatchStackPreviewStatus" + }, + "changeset_details": { + "$ref": "#/components/schemas/ChangesetDetails" + } + } + }, + "PostStackPreviewsRequestObject": { + "type": "object", + "required": [ + "technology", + "technology_layer", + "review_request", + "stacks" + ], + "properties": { + "updated_at": { + "deprecated": true, + "type": "integer", + "format": "int64", + "description": "Timestamp from epoch in seconds when the\npreview was last updated. This value will be used to group previews.\nThis field is deprecated in favor of `pushed_at`.\n", + "example": 1707385396 + }, + "pushed_at": { + "type": "integer", + "format": "int64", + "description": "Timestamp from epoch in seconds when the last commit was pushed to PR.\nThis value will be used to group previews.\n", + "example": 1707385396 + }, + "commit_sha": { + "type": "string", + "description": "The Commit SHA associated with this preview.\n", + "example": "9730ff4ccab39c022404b41a435a179558f641c6" + }, + "technology": { + "type": "string", + "example": "terraform" + }, + "technology_layer": { + "type": "string", + "example": "default" + }, + "review_request": { + "$ref": "#/components/schemas/PostDeploymentStacksRequestReviewRequestObject" + }, + "metadata": { + "$ref": "#/components/schemas/DeploymentMetadata" + }, + "stacks": { + "type": "array", + "nullable": true, + "description": "Stacks involved in the review request (but not part of the preview)", + "items": { + "type": "object", + "required": [ + "preview_status", + "repository", + "path", + "default_branch", + "meta_id" + ], + "properties": { + "preview_status": { + "type": "string", + "enum": [ + "affected", + "pending" + ] + }, + "repository": { + "type": "string", + "description": "The repository the stack belongs to", + "example": "github.com/owner/repository" + }, + "target": { + "description": "Deployment target of the stack. `default` if not set.", + "$ref": "#/components/schemas/DeploymentTarget" + }, + "from_target": { + "description": "Migrate from stack with previous deployment target. Has no effect if `from_target` doesn't exist or `target` already exists.", + "$ref": "#/components/schemas/DeploymentTarget" + }, + "path": { + "description": "Path within the repository at time of deployment", + "type": "string", + "example": "/stacks/organizations/terramate.io/landing-zone/iam" + }, + "default_branch": { + "description": "The default branch for the repository of the stack", + "type": "string", + "example": "main" + }, + "meta_id": { + "description": "stack.id of the stack deployed", + "type": "string", + "example": "deadbeef-babe-d00d-face-badc0de11111" + }, + "meta_name": { + "type": "string", + "description": "The Terramate Metadata `stack.name` of the stack deployed", + "example": "My Stack Name" + }, + "meta_description": { + "type": "string", + "description": "The Terramate Metadata `stack.name` of the stack deployed", + "example": "My Stack Description" + }, + "meta_tags": { + "type": "array", + "items": { + "type": "string", + "description": "The Terramate Metadata `stack.tags` of the stack deployed" + }, + "example": [ + "tagA", + "tagB" + ] + }, + "cmd": { + "description": "Command executed to generate the preview.\nWhen preview_status is affected, field should be omitted.\n", + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "terraform", + "plan" + ] + } + } + } + } + } + }, + "PostStackPreviewsResponseObject": { + "type": "object", + "required": [ + "preview_id", + "stacks" + ], + "properties": { + "preview_id": { + "type": "string", + "example": "42" + }, + "stacks": { + "type": "array", + "items": { + "type": "object", + "required": [ + "meta_id", + "stack_preview_id" + ], + "properties": { + "meta_id": { + "description": "terramate stack.id of the stack", + "type": "string", + "example": "deadbeef-babe-d00d-face-badc0de11111 (not always uuid)" + }, + "stack_preview_id": { + "type": "string", + "example": "42" + } + } + } + } + } + }, + "StackPreviewStatus": { + "type": "string", + "enum": [ + "affected", + "pending", + "running", + "changed", + "unchanged", + "failed", + "canceled" + ] + }, + "PatchStackPreviewStatus": { + "type": "string", + "enum": [ + "running", + "changed", + "unchanged", + "failed", + "canceled" + ] + }, + "StackPreviewTechnology": { + "type": "string", + "enum": [ + "terraform", + "opentofu", + "other" + ] + }, + "CommandLogLine": { + "type": "object", + "required": [ + "log_line", + "timestamp", + "channel", + "message" + ], + "properties": { + "log_line": { + "description": "Log line number of the log", + "type": "integer", + "format": "int64", + "minimum": 0 + }, + "timestamp": { + "type": "string", + "format": "date-time", + "description": "The RFC3339Nano time the log was printed" + }, + "channel": { + "$ref": "#/components/schemas/StreamOSChannel" + }, + "message": { + "type": "string" + } + } + }, + "PaginatedResultObject": { + "type": "object", + "required": [ + "total", + "page", + "per_page" + ], + "properties": { + "total": { + "description": "Number of elements in total", + "type": "integer", + "format": "int64", + "minimum": 0 + }, + "page": { + "description": "Current page we are in", + "type": "integer", + "format": "int64", + "minimum": 1 + }, + "per_page": { + "description": "Number of elements per page", + "type": "integer", + "format": "int64", + "minimum": 1 + } + } + }, + "OrgShortName": { + "type": "string", + "description": "A globally unique shortname of the organization that can be used in routes.", + "example": "terramate", + "maxLength": 32 + }, + "OrgDisplayName": { + "type": "string", + "description": "The display name of the organiation", + "example": "Terramate GmbH", + "maxLength": 32 + }, + "OrgDomainName": { + "type": "string", + "description": "The domain that is associated with this organization", + "example": "terramate.io", + "maxLength": 255 + }, + "OrgGithubOwner": { + "type": "string", + "description": "A GitHub organization to trust.\nMultiple orgs can be set separated by commas.\n", + "example": "terramate-io", + "maxLength": 1024 + }, + "OrgGitlabOwner": { + "type": "string", + "description": "A GitLab organization to trust.\nMultiple orgs can be set separated by commas.\n", + "example": "terramate-io", + "maxLength": 1024 + }, + "UserDisplayName": { + "type": "string", + "example": "Marius Tolzmann", + "maxLength": 32 + }, + "UserPosition": { + "type": "string", + "example": "CTPO", + "maxLength": 128 + }, + "UserPictureURL": { + "type": "string", + "example": "https://lh3.googleusercontent.com/a/AAcHTtcBqudpP0hVoQyjDv-v5b4lP6e0vN_92zi_aPp90hE=s96-c", + "description": "URL to the profile picture of the user. This is the same URL as the one\nreturned by the Google People API.\n" + }, + "Member": { + "type": "object", + "required": [ + "member_id", + "role", + "status" + ], + "properties": { + "member_id": { + "type": "integer", + "description": "The Member ID", + "example": 23 + }, + "user_display_name": { + "$ref": "#/components/schemas/UserDisplayName" + }, + "user_email": { + "type": "string", + "example": "marius@terramate.io" + }, + "user_uuid": { + "type": "string", + "format": "uuid", + "example": "683e0589-65a8-48b8-bd90-6ee89e0682ab" + }, + "invited_email": { + "type": "string" + }, + "role": { + "$ref": "#/components/schemas/MemberRole" + }, + "status": { + "$ref": "#/components/schemas/MemberStatus" + }, + "position": { + "$ref": "#/components/schemas/UserPosition" + }, + "user_picture_url": { + "$ref": "#/components/schemas/UserPictureURL" + }, + "linked_accounts": { + "type": "array", + "description": "It is only populated in GetOrganizationsMembers operation\n", + "items": { + "$ref": "#/components/schemas/AuthProvider" + } + } + } + }, + "AuthProvider": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "name": { + "type": "string", + "description": "Provider name in the auth system", + "enum": [ + "bitbucket", + "github", + "gitlab", + "google", + "microsoft" + ] + } + } + }, + "MembershipStatus": { + "description": "The \"active\", \"inactive\", \"sso_invited\" and \"invited\" are meant to be used with\nusers authenticated with personal JWT tokens (eg.: Google IDP).\nThe \"trusted\" MUST be used only with CI/CD based authentication\nwhen the \"repository\" and/or \"owner\" relationship is established\nwith the organization.\n", + "type": "string", + "enum": [ + "active", + "inactive", + "invited", + "sso_invited", + "trusted" + ], + "example": "active" + }, + "MemberStatus": { + "type": "string", + "enum": [ + "active", + "inactive", + "invited" + ], + "example": "active" + }, + "MemberRole": { + "type": "string", + "enum": [ + "admin", + "member" + ], + "example": "admin" + }, + "GetFiltersResponseObject": { + "type": "object", + "description": "An example of the probable response object:\n\n```json\n{\n \"repository\": [\n \"github.com/terramate-io/tmc-stack/pulls\",\n \"github.com/terramate-io\"\n ],\n \"status\": [\n \"ok\",\n \"failed\"\n ]\n}\n```\n", + "additionalProperties": { + "type": "array", + "items": { + "oneOf": [ + { + "$ref": "#/components/schemas/User" + }, + { + "type": "string" + } + ] + } + } + }, + "GetReviewRequestFiltersResponse": { + "type": "object", + "description": "Response for review request filters.", + "required": [ + "collaborators", + "repository", + "status" + ], + "properties": { + "collaborators": { + "type": "array", + "description": "List of collaborators that collaborated on a review request.\n", + "items": { + "$ref": "#/components/schemas/Collaborator" + } + }, + "repository": { + "type": "array", + "description": "List of repositories from the review requests.\n", + "items": { + "type": "string" + } + }, + "status": { + "type": "array", + "description": "List of possible status for a review request.\n", + "items": { + "$ref": "#/components/schemas/ReviewRequestStatus" + } + } + }, + "examples": { + "testExample": { + "summary": "This is a likely response", + "value": { + "collaborators": [ + { + "id": 123, + "platform": "github", + "display_name": "hacker", + "avatar_url": "avatar.url", + "linked_user": { + "user_uuid": "2f212db6-8439-4a7a-b91f-75e5d0f0490c", + "display_name": "John Doe", + "user_picture_url": "picture.url" + } + } + ], + "repository": [ + "github.com/corp/iac" + ], + "status": [ + "approved", + "merged" + ] + } + } + } + }, + "GetWorkflowDeploymentGroupFiltersResponse": { + "type": "object", + "description": "Response for Workflow Deployment Group filters", + "required": [ + "collaborators", + "repository", + "status", + "type" + ], + "properties": { + "collaborators": { + "type": "array", + "description": "List of collaborators that collaborated on a deployment\nby triggering or collaborated on the related review request.\n", + "items": { + "$ref": "#/components/schemas/Collaborator" + } + }, + "repository": { + "type": "array", + "description": "List of repositories from the deployments.\n", + "items": { + "type": "string" + } + }, + "status": { + "type": "array", + "description": "List of possible status for a deployment.\n", + "items": { + "$ref": "#/components/schemas/WorkflowDeploymentGroupStatus" + } + }, + "type": { + "type": "array", + "description": "List of possible authenticated types for a deployment.\n", + "items": { + "$ref": "#/components/schemas/AuthType" + } + } + }, + "examples": { + "testExample": { + "summary": "This is a likely response", + "value": { + "collaborators": [ + { + "id": 123, + "platform": "github", + "display_name": "hacker", + "avatar_url": "avatar.url", + "linked_user": { + "user_uuid": "2f212db6-8439-4a7a-b91f-75e5d0f0490c", + "display_name": "John Doe", + "user_picture_url": "picture.url" + } + } + ], + "repository": [ + "github.com/corp/iac" + ], + "status": [ + "failed", + "processing", + "pk" + ], + "type": [ + "idp", + "gha" + ] + } + } + } + }, + "GetDeploymentLogsResponseObject": { + "type": "object", + "description": "Returns the paginated deployment logs\n", + "required": [ + "paginated_result", + "deployment_log_lines" + ], + "properties": { + "deployment_log_lines": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CommandLogLine" + } + }, + "paginated_result": { + "$ref": "#/components/schemas/PaginatedResultObject" + } + } + }, + "SummaryResponse": { + "type": "object", + "description": "Defines the summary (lines of text).\n", + "required": [ + "summary" + ], + "properties": { + "summary": { + "type": "object", + "required": [ + "contents", + "created_at" + ], + "properties": { + "contents": { + "type": "array", + "items": { + "type": "string" + } + }, + "created_at": { + "type": "string", + "format": "date-time", + "description": "Summary's creation time." + }, + "requester": { + "description": "Requester's user.", + "$ref": "#/components/schemas/User" + } + } + } + } + }, + "GetStackPreviewLogsResponse": { + "type": "object", + "description": "Returns the paginated stack preview logs\n", + "required": [ + "paginated_result", + "stack_preview_log_lines" + ], + "properties": { + "stack_preview_log_lines": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CommandLogLine" + } + }, + "paginated_result": { + "$ref": "#/components/schemas/PaginatedResultObject" + } + } + }, + "StreamOSChannel": { + "type": "string", + "enum": [ + "stderr", + "stdout" + ] + }, + "Deployment": { + "type": "object", + "required": [ + "workflow_deployment_group_id", + "deployment_uuid", + "stack_id", + "path", + "cmd", + "status", + "auth_type", + "auth_id", + "created_at", + "metadata" + ], + "properties": { + "workflow_deployment_group_id": { + "type": "integer", + "format": "int64", + "description": "The workflow deployment identifier that groups\nthis stack deployment.\n" + }, + "deployment_uuid": { + "$ref": "#/components/schemas/DeploymentUUID" + }, + "stack_id": { + "type": "integer", + "format": "int64", + "description": "ID of the Stack", + "example": 42 + }, + "repository": { + "type": "string", + "description": "The reposiory the deployment was run in", + "example": "github.com/terramate-io/iac-gcloud" + }, + "path": { + "type": "string", + "description": "Path within the repository at time of deployment", + "example": "/stacks/organizations/terramate.io/landing-zone/iam" + }, + "commit_sha": { + "type": "string", + "description": "Commit SHA (if not stale, uncommitted, etc)", + "example": "deadc0decafebabecafed00ddeadbeeff00dface" + }, + "deployment_url": { + "type": "string", + "format": "uri", + "description": "Link to the deployment logs (if in CI/CD)", + "example": "https://github.com/terramate-io/iac-gcloud/actions/runs/5146438941" + }, + "cmd": { + "type": "array", + "items": { + "type": "string", + "example": "ls" + }, + "example": [ + "terraform", + "apply" + ], + "description": "Command executed to deploy." + }, + "status": { + "$ref": "#/components/schemas/DeploymentStatus" + }, + "auth_type": { + "$ref": "#/components/schemas/AuthType" + }, + "auth_id": { + "type": "string", + "description": "The authenticated identity" + }, + "created_at": { + "type": "string", + "format": "date-time", + "description": "Time of the deployment start" + }, + "started_at": { + "type": "string", + "format": "date-time", + "description": "Time of deployment update" + }, + "finished_at": { + "type": "string", + "format": "date-time", + "description": "Time of deployment finish" + }, + "metadata": { + "$ref": "#/components/schemas/DeploymentMetadata" + }, + "review_request": { + "$ref": "#/components/schemas/ReviewRequest" + } + } + }, + "DeploymentUUID": { + "type": "string", + "format": "uuid", + "description": "The Deployment UUID", + "example": "096c55b6-1599-4a17-a48f-fa846a84aa8a" + }, + "GetGithubAppConnectionResponse": { + "type": "object", + "required": [ + "install_url" + ], + "properties": { + "install_url": { + "type": "string", + "format": "uri", + "description": "Github URL to connect the Github App to a given\norganization.\n", + "example": "https://github.com/apps/terramate-cloud/installations/new?state=secret" + } + } + }, + "GithubAppInstallationStatus": { + "type": "object", + "required": [ + "status" + ], + "properties": { + "status": { + "type": "string", + "enum": [ + "installed", + "not_installed" + ] + }, + "installed_to": { + "type": "string", + "description": "Name of the GitHub org the app is installed for.\nOnly set if app is installed.\n" + }, + "management_location": { + "type": "string", + "format": "uri", + "description": "Location to redirect to manage the GitHub App installed, namely,\nuninstall it.\nOnly set if the app is installed and user is an admin.\n", + "example": "https://github.com/organizations/terramate-io/settings/installations/42" + }, + "installation_location": { + "type": "string", + "description": "Location to redirect to in order to initiate app installation\nOnly set if app is not_installed and user is admin.\n", + "example": "/v1/apps/{org_uuid}/github/connection" + } + } + }, + "GitlabWebhookToken": { + "type": "object", + "required": [ + "created_at", + "receiver_url" + ], + "properties": { + "created_at": { + "type": "string", + "format": "date-time", + "description": "Time when the token was created.\n" + }, + "token": { + "type": "string", + "description": "base62 encoded token to be placed in Gitlab webhooks\nconfiguration page.\n\nOnly available in GenerateGitlabWebhookToken operation.\n" + }, + "receiver_url": { + "type": "string", + "format": "uri", + "description": "URL for the webhook receiver to set in the Gitlab\nconfiguration page.\n", + "example": "https://api.stg.terramate.io/v1/apps/gitlab/webhook" + } + } + }, + "ConnectSlackAppAuthResponse": { + "type": "object", + "required": [ + "install_url" + ], + "properties": { + "install_url": { + "type": "string", + "format": "uri", + "description": "Slack URL to connect the Slack App to a given\norganization.\n", + "example": "https://slack.com/oauth/v2/authorize?client_id=client_id&scope=chat:write&state=secret" + } + } + }, + "SlackAppInstallationStatus": { + "type": "object", + "required": [ + "status" + ], + "properties": { + "status": { + "type": "string", + "enum": [ + "installed", + "not_installed" + ] + }, + "workspace": { + "type": "object", + "description": "Slack workspace where slack app is installed.", + "required": [ + "name", + "url" + ], + "properties": { + "name": { + "type": "string", + "description": "Workspace name of the Slack.\nOnly set if app is installed.\n" + }, + "url": { + "type": "string", + "format": "uri", + "description": "Slack Workspace URL.\nOnly set if app is installed.\n" + } + } + }, + "installation_location": { + "type": "string", + "description": "Location to redirect to in order to initiate app installation\nOnly set if app is not_installed and user is admin.\n", + "example": "/v1/apps/{org_uuid}/slack/connection" + }, + "management_location": { + "type": "string", + "format": "uri", + "description": "Location to redirect to manage the Slack App installed, namely,\nuninstall it.\nOnly set if the app is installed and user is an admin.\n", + "example": "https://workspace.slack.com/apps/B172P3RS1L2" + } + } + }, + "ConnectBitbucketCurrentUserAuthorizeResponse": { + "type": "object", + "required": [ + "link_url" + ], + "properties": { + "link_url": { + "type": "string", + "format": "uri", + "description": "Bitbucket Cloud URL to start OAuth2 authorization code flow.\n", + "example": "https://bitbucket.org/site/oauth/v2/authorize?client_id=client_id&scope=account,email&state=secret" + } + } + }, + "GetReviewRequestsResponse": { + "type": "object", + "required": [ + "paginated_result", + "review_requests" + ], + "properties": { + "review_requests": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ReviewRequest" + } + }, + "paginated_result": { + "$ref": "#/components/schemas/PaginatedResultObject" + } + } + }, + "GetReviewRequestResponse": { + "type": "object", + "required": [ + "review_request", + "stack_previews" + ], + "properties": { + "review_request": { + "$ref": "#/components/schemas/ReviewRequest" + }, + "stack_previews": { + "type": "array", + "nullable": true, + "items": { + "$ref": "#/components/schemas/StackPreview" + } + } + } + }, + "StackPreview": { + "type": "object", + "required": [ + "stack_preview_id", + "stack", + "status", + "technology", + "updated_at" + ], + "properties": { + "stack_preview_id": { + "type": "integer", + "format": "int64", + "example": 4242 + }, + "stack": { + "$ref": "#/components/schemas/Stack" + }, + "path": { + "type": "string", + "description": "Stack path used for the preview, can be different from current stack path." + }, + "status": { + "$ref": "#/components/schemas/StackPreviewStatus" + }, + "changeset_details": { + "$ref": "#/components/schemas/ChangesetDetails" + }, + "technology": { + "$ref": "#/components/schemas/StackPreviewTechnology" + }, + "technology_layer": { + "type": "string", + "description": "Namespace or layer for the technology to differentiate\namong stacks previews from same stack and technology.\n", + "example": "default" + }, + "updated_at": { + "type": "string", + "format": "date-time", + "description": "Timestamp the preview was last updated" + }, + "resource_changes": { + "description": "Define the changes in the resources from this\nstack planned for the preview.\n", + "$ref": "#/components/schemas/ResourceChanges" + } + } + }, + "ResourceChanges": { + "type": "object", + "required": [ + "actions_summary" + ], + "properties": { + "actions_summary": { + "$ref": "#/components/schemas/ResourceChangesActionsSummary" + } + } + }, + "WorkflowDeploymentGroup": { + "type": "object", + "required": [ + "id", + "status", + "commit_title", + "repository", + "canceled_count", + "failed_count", + "ok_count", + "pending_count", + "running_count", + "stack_deployment_total_count", + "created_at" + ], + "properties": { + "id": { + "type": "integer", + "format": "int64", + "example": 42 + }, + "status": { + "$ref": "#/components/schemas/WorkflowDeploymentGroupStatus" + }, + "commit_title": { + "type": "string", + "example": "Fix this" + }, + "commit_sha": { + "type": "string", + "description": "Commit SHA (if not stale, uncommitted, etc)", + "example": "deadc0decafebabecafed00ddeadbeeff00dface" + }, + "repository": { + "type": "string", + "description": "The reposiory the workflow deployment group was run in", + "example": "github.com/terramate-io/iac-gcloud" + }, + "auth_type": { + "$ref": "#/components/schemas/AuthType" + }, + "auth_id": { + "type": "string", + "description": "The authenticated identity. auth_user will be only\npopulated if auth_type == 'idp'.\n" + }, + "auth_user": { + "$ref": "#/components/schemas/UserInfo" + }, + "canceled_count": { + "type": "integer", + "description": "The number of canceled stack deployments", + "example": 8 + }, + "failed_count": { + "type": "integer", + "description": "The number of failed stack deployments", + "example": 1 + }, + "ok_count": { + "type": "integer", + "description": "The number of successful stack deployments", + "example": 7 + }, + "pending_count": { + "type": "integer", + "description": "The number of pending stack deployments", + "example": 23 + }, + "running_count": { + "type": "integer", + "description": "The number of running stack deployments", + "example": 1 + }, + "stack_deployment_total_count": { + "type": "integer", + "description": "The sum of previous counters to ease\ncalculations in frontend side.\n", + "example": 40 + }, + "created_at": { + "type": "string", + "format": "date-time", + "description": "Time of the deployment start" + }, + "started_at": { + "type": "string", + "format": "date-time", + "description": "Time of deployment update" + }, + "finished_at": { + "type": "string", + "format": "date-time", + "description": "Time of deployment finish" + }, + "metadata": { + "$ref": "#/components/schemas/DeploymentMetadata" + }, + "review_request": { + "$ref": "#/components/schemas/ReviewRequest" + }, + "branch": { + "type": "string", + "description": "Branch name where deployment was done", + "example": "main" + }, + "workflow_triggered_by": { + "type": "string", + "description": "VCS login for the user who triggered the workflow.\n\nThis is only set when auth_type == \"gha\"\n\nThis is deprecated and it should use triggered_by instead.\n", + "example": "hacker", + "deprecated": true + }, + "workflow_name": { + "type": "string", + "description": "Name for the workflow deployment when auth_type = \"gha\"\n", + "example": "deploy to prod" + }, + "grouping_key": { + "type": "string", + "description": "Key to group deployments within the same workflow.\n\nIt can be related with drifts with the same grouping key.\n" + }, + "triggered_by": { + "description": "The collaborator who triggered the deployment", + "$ref": "#/components/schemas/Collaborator" + } + } + }, + "GetWorkflowGroupStacksDeploymentsResponse": { + "type": "object", + "required": [ + "stack_deployments", + "paginated_result" + ], + "properties": { + "stack_deployments": { + "type": "array", + "items": { + "$ref": "#/components/schemas/StackDeployment" + } + }, + "paginated_result": { + "$ref": "#/components/schemas/PaginatedResultObject" + } + } + }, + "StackDeploymentsCollection": { + "type": "object", + "required": [ + "stack_deployments", + "paginated_result" + ], + "properties": { + "stack_deployments": { + "type": "array", + "items": { + "$ref": "#/components/schemas/StackDeployment" + } + }, + "paginated_result": { + "$ref": "#/components/schemas/PaginatedResultObject" + } + } + }, + "StackDeployment": { + "type": "object", + "required": [ + "id", + "deployment_uuid", + "path", + "cmd", + "status", + "created_at" + ], + "properties": { + "id": { + "type": "integer", + "format": "int64", + "description": "Identifier for the stack deployment", + "example": 42 + }, + "deployment_uuid": { + "$ref": "#/components/schemas/DeploymentUUID" + }, + "path": { + "type": "string", + "description": "Path within the repository at time of deployment", + "example": "/stacks/organizations/terramate.io/landing-zone/iam" + }, + "cmd": { + "description": "Command executed in the deployment", + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "terraform", + "apply" + ] + }, + "status": { + "$ref": "#/components/schemas/DeploymentStatus" + }, + "created_at": { + "type": "string", + "format": "date-time", + "description": "Time of the stack deployment was created" + }, + "started_at": { + "type": "string", + "format": "date-time", + "description": "Time of the stack deployment was started to run" + }, + "finished_at": { + "type": "string", + "format": "date-time", + "description": "Time of the stack deployment was finished" + }, + "fixed_at": { + "type": "string", + "format": "date-time", + "description": "Time of the stack deployment was fixed. That is, when the\nrelated stack returns back to a healthy state.\n" + }, + "stack": { + "$ref": "#/components/schemas/Stack" + }, + "changeset_details": { + "$ref": "#/components/schemas/ChangesetDetails" + }, + "metrics": { + "$ref": "#/components/schemas/StackDeploymentDORAMetrics" + }, + "review_request": { + "description": "Only populated in GetOrganizationStackDeployments\noperation.\n", + "type": "object", + "required": [ + "created_at" + ], + "properties": { + "created_at": { + "type": "string", + "format": "date-time", + "description": "The timestamp when the review request was created in the VCS." + } + } + } + } + }, + "StackDeploymentDORAMetrics": { + "type": "object", + "properties": { + "lead_time_for_change_seconds": { + "type": "integer", + "format": "int64", + "example": 1, + "description": "Lead time for the deployment to change.\n\nFor failed deployments, it goes from related review\nrequest created_at to fixed_at.\nFor successful deployments, it goes from related review\nrequest created_at to finished_at.\n\nIf time is below 1s, it is set to 1.\n" + }, + "time_to_restore_seconds": { + "type": "integer", + "format": "int64", + "example": 121, + "description": "Time to restore when a deployment failed.\n\nIt goes from finished_at to fixed_at.\n\nIf time is below 1s, it is set to 1.\n" + } + } + }, + "AlertSeverity": { + "type": "object", + "required": [ + "rank", + "name" + ], + "properties": { + "name": { + "description": "Descriptive unique name for alert severity\n", + "type": "string", + "enum": [ + "critical", + "high", + "medium", + "low", + "none" + ] + }, + "rank": { + "$ref": "#/components/schemas/AlertSeverityRank" + } + }, + "example": { + "name": "high", + "rank": 3 + } + }, + "AlertSeverityRank": { + "type": "integer", + "format": "int32", + "enum": [ + 0, + 1, + 2, + 3, + 4 + ], + "description": "Lowest rank is the lowest severity.\n\n0 - none\n1 - low\n2 - medium\n3 - high\n4 - critical\n" + }, + "AlertsCollection": { + "type": "object", + "required": [ + "alerts", + "paginated_result" + ], + "properties": { + "alerts": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Alert" + } + }, + "paginated_result": { + "$ref": "#/components/schemas/PaginatedResultObject" + } + } + }, + "Alert": { + "type": "object", + "required": [ + "id", + "severity", + "created_at", + "updated_at", + "triggered_event" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "f1c9ecfe-1a45-499b-ab6d-1aa0a8ea2f95" + }, + "severity": { + "$ref": "#/components/schemas/AlertSeverity" + }, + "created_at": { + "description": "Timestamp when alert was created.", + "type": "string", + "format": "date-time", + "example": "2024-04-12T07:06:00Z" + }, + "updated_at": { + "description": "Timestamp when alert was last updated.", + "type": "string", + "format": "date-time", + "example": "2024-04-15T11:05:00Z" + }, + "trigger": { + "description": "The trigger object that launches the event to trigger the\nalert.\n", + "oneOf": [ + { + "$ref": "#/components/schemas/Drift" + }, + { + "$ref": "#/components/schemas/WorkflowDeploymentGroup" + } + ], + "discriminator": { + "propertyName": "trigger_type", + "mapping": { + "drift": "#/components/schemas/Drift", + "deployment": "#/components/schemas/WorkflowDeploymentGroup" + } + } + }, + "triggered_event": { + "description": "Which event triggered the alert.\n", + "$ref": "#/components/schemas/AlertEvent" + }, + "resolved_event": { + "description": "Which resolved the alert, if any.\nOnly present if resolved_at is present.\n", + "$ref": "#/components/schemas/AlertEvent" + }, + "assignees": { + "description": "List of assignees for this alert.\n", + "nullable": true, + "type": "array", + "items": { + "$ref": "#/components/schemas/User" + } + }, + "resolved_at": { + "description": "Timestamp when alert was resolved.", + "type": "string", + "format": "date-time", + "example": "2024-04-12T07:53:00Z" + }, + "fixed_at": { + "description": "Timestamp when alert was fixed.\nThat's when the alert was automatically resolved.\n", + "type": "string", + "format": "date-time", + "example": "2024-04-12T07:53:00Z" + } + } + }, + "User": { + "type": "object", + "required": [ + "user_uuid", + "display_name" + ], + "properties": { + "user_uuid": { + "type": "string", + "format": "uuid", + "example": "683e0589-65a8-48b8-bd90-6ee89e0682ab" + }, + "display_name": { + "$ref": "#/components/schemas/UserDisplayName" + }, + "user_picture_url": { + "$ref": "#/components/schemas/UserPictureURL" + } + } + }, + "GetAlertResponse": { + "type": "object", + "required": [ + "alert" + ], + "properties": { + "alert": { + "$ref": "#/components/schemas/Alert" + } + } + }, + "AlertEventsCollection": { + "type": "object", + "required": [ + "alert_events", + "paginated_result" + ], + "properties": { + "alert_events": { + "description": "Events related to an alert\n", + "type": "array", + "items": { + "$ref": "#/components/schemas/AlertEvent" + } + }, + "paginated_result": { + "$ref": "#/components/schemas/PaginatedResultObject" + } + } + }, + "AlertEvent": { + "type": "object", + "required": [ + "created_at", + "type", + "actions" + ], + "properties": { + "author_id": { + "type": "string", + "format": "uuid", + "description": "User UUID from the person who performed the event.\n\nIf it's not present, then the event was run by a fully\nautomatic process.\n" + }, + "created_at": { + "type": "string", + "format": "date-time", + "description": "The time the alert event happened\n" + }, + "type": { + "type": "string", + "enum": [ + "anomaly", + "resolution", + "metadata_update" + ], + "description": "Automatically composed descriptor, built from alert event\ndata.\n" + }, + "actions": { + "type": "array", + "items": { + "type": "object", + "required": [ + "action", + "field", + "value" + ], + "properties": { + "action": { + "type": "string", + "description": "Action performed by the user.\n\n- add adds a value to a collection field in the\n alert.\n- decrease decreases a numeric value for previous\n alert field.\n- increase increases a numeric value for previous\n alert field.\n- remove removes a value to a collection field in\n the alert.\n- update updates a value for an alert field.\n\nCollection fields are: stack_deployments,\nstack_drift_checks and assignees.\n", + "enum": [ + "add", + "decrease", + "increase", + "remove", + "update" + ], + "example": "add" + }, + "field": { + "type": "string", + "description": "Alert field related to that action.\n", + "enum": [ + "stack_deployments", + "stack_drift_checks", + "severity", + "assignees", + "resolved_at" + ], + "example": "resolved_at" + }, + "value": { + "description": "Any value could be set here.\n\nExamples could be:\n - A stack deployment id\n - A user UUID\n - A timestamp\n", + "example": "42" + }, + "grouping_id": { + "description": "A value to group separated events in a set of common\ntrigger.\n\nRight now, there is a single possible value which is\nworkflow_deployment_group_id value set for\nstack_deployments.\n", + "type": "integer", + "format": "int64", + "example": 323 + } + }, + "examples": [ + { + "AddStackDeploymentExample": { + "action": "add", + "field": "stack_deployments", + "value": 42, + "grouping_id": 323 + } + }, + { + "AddDriftCheckExample": { + "action": "add", + "field": "stack_drift_checks", + "value": 34 + } + }, + { + "DecreaseSeverityExample": { + "action": "decrease", + "field": "severity", + "value": 1 + } + }, + { + "IncreaseSeverityExample": { + "action": "increase", + "field": "severity", + "value": 2 + } + }, + { + "RemoveAssigneeExample": { + "action": "remove", + "field": "assignee", + "value": "5ed0987b-b314-45f9-b2fd-2c1b6e386603" + } + }, + { + "UpdateResolvedAt": { + "action": "update", + "field": "resolved_at", + "value": "2024-04-12T14:56:00Z" + } + }, + { + "RemoveResolvedAt": { + "action": "update", + "field": "resolved_at", + "value": null + } + } + ] + } + } + } + }, + "PatchAlertRequest": { + "description": "All elements in the request set will be updated in the related\nAlert entity.\n", + "type": "object", + "properties": { + "severity": { + "$ref": "#/components/schemas/AlertSeverityRank" + }, + "assignees": { + "description": "Set of assignees to handle this alert. If it's set to\nnull, then all assignees are cleared.\n", + "nullable": true, + "type": "array", + "items": { + "type": "string", + "format": "uuid", + "description": "User UUIDs" + }, + "example": [ + "fd842d03-45e8-40db-8c48-f398e1535640", + "7820a663-50d7-4a72-a0d4-abca14e962b3" + ] + }, + "resolved_at": { + "description": "Set it to a value different from null, it resolves the\nalert. If it sets to null, then it reopens the alert.\n", + "nullable": true, + "type": "string", + "format": "date-time", + "example": "2024-04-15T09:17:00Z" + } + } + }, + "AlertAffectedStacksCollection": { + "description": "Stacks affected by an alert.\n", + "type": "object", + "required": [ + "affected_stacks", + "paginated_result" + ], + "properties": { + "affected_stacks": { + "type": "array", + "items": { + "type": "object", + "required": [ + "stack_status_in_alert", + "stack" + ], + "properties": { + "stack_status_in_alert": { + "description": "If alert is resolved, then last status of a stack at\nthe time the alert was resolved.\n", + "example": "ok", + "$ref": "#/components/schemas/StackStatus" + }, + "stack": { + "$ref": "#/components/schemas/Stack" + } + } + } + }, + "paginated_result": { + "$ref": "#/components/schemas/PaginatedResultObject" + } + } + }, + "ResourcesCollection": { + "type": "object", + "required": [ + "resources", + "paginated_result" + ], + "properties": { + "resources": { + "description": "A list of resources", + "type": "array", + "items": { + "$ref": "#/components/schemas/Resource" + } + }, + "paginated_result": { + "$ref": "#/components/schemas/PaginatedResultObject" + } + } + }, + "ResourceDeploymentsCollection": { + "type": "object", + "required": [ + "resource_deployments", + "paginated_result" + ], + "properties": { + "resource_deployments": { + "description": "A list of resource deployments", + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourceDeployment" + } + }, + "paginated_result": { + "$ref": "#/components/schemas/PaginatedResultObject" + } + } + }, + "ResourcePreviewsCollection": { + "type": "object", + "required": [ + "resource_previews", + "paginated_result" + ], + "properties": { + "resource_previews": { + "description": "A list of resource previews", + "type": "array", + "items": { + "$ref": "#/components/schemas/ResourcePreview" + } + }, + "paginated_result": { + "$ref": "#/components/schemas/PaginatedResultObject" + } + } + }, + "Resource": { + "type": "object", + "description": "A unique resource within an organization.\nThe 'details' property is only set when selecting a specific resource.\n", + "required": [ + "resource_uuid", + "stack", + "descriptor", + "status", + "drifted", + "pending", + "created_at", + "updated_at" + ], + "properties": { + "resource_uuid": { + "description": "The unique identifier for this resource.\nThis attribute is TMC-generated and not part of the plan data.\nIt's based on matching the same addresses over time in sequential plans.\n", + "type": "string", + "format": "uuid", + "example": "f1c9ecfe-1a45-499b-ab6d-1aa0a8ea2f95" + }, + "stack": { + "$ref": "#/components/schemas/Stack" + }, + "provisioner": { + "$ref": "#/components/schemas/Provisioner" + }, + "descriptor": { + "$ref": "#/components/schemas/ResourceDescriptor" + }, + "details": { + "$ref": "#/components/schemas/ResourceDetails" + }, + "status": { + "$ref": "#/components/schemas/ResourceStatus" + }, + "drifted": { + "description": "Indicates if a resource has drifted.", + "type": "boolean" + }, + "pending": { + "description": "Indicates if a resource is pending to be created.", + "type": "boolean" + }, + "created_at": { + "description": "Timestamp when resource was created.", + "type": "string", + "format": "date-time", + "example": "2024-04-12T07:06:00Z" + }, + "updated_at": { + "description": "Timestamp when resource was last updated.", + "type": "string", + "format": "date-time", + "example": "2024-04-15T11:05:00Z" + }, + "policy_check": { + "description": "Optional policy check done to this resource", + "$ref": "#/components/schemas/ResourcePolicyCheck" + } + } + }, + "ResourceDescriptor": { + "type": "object", + "description": "Attributes describing the resource.\nThe values extracted from the plan data.\nFor reference, see https://developer.hashicorp.com/terraform/internals/json-format#values-representation.\n\nThose that are not part of the values representation are\ndefined with the prefix `extracted_` where each description\ndescribes how data is retrieved.\n", + "required": [ + "address", + "schema_version" + ], + "properties": { + "address": { + "type": "string" + }, + "mode": { + "type": "string" + }, + "type": { + "type": "string" + }, + "name": { + "type": "string" + }, + "index": { + "type": "string" + }, + "provider_name": { + "type": "string" + }, + "extracted_id": { + "description": "This value is not part of the original data structure, but extracted from 'values.id', if it exists.\n", + "type": "string" + }, + "extracted_name": { + "description": "This value is not part of the original data structure, but extracted from 'values' in a type/provider-specific way.\n", + "type": "string" + }, + "extracted_account": { + "description": "This value is not part of the original data structure, but extracted from 'values' in a type/provider-specific way.\n", + "type": "string" + }, + "schema_version": { + "type": "integer", + "format": "int64" + }, + "depends_on": { + "type": "array", + "items": { + "type": "string" + } + }, + "tainted": { + "type": "boolean" + }, + "deposed_key": { + "type": "string" + } + } + }, + "ResourceDetails": { + "type": "object", + "description": "Detailed information about a resource, i.e. it's value state.\n", + "properties": { + "values": { + "description": "The content of the 'values' field within a resource, encoded as a JSON string.\nFor reference, see https://developer.hashicorp.com/terraform/internals/json-format#values-representation.\n", + "type": "string" + }, + "sensitive_values": { + "description": "The content of the 'sensitive_values' field within a resource, provided as a JSON string.\n", + "type": "string" + } + } + }, + "ResourceDeployment": { + "type": "object", + "description": "Information about a resource deployment.\n", + "required": [ + "change", + "changed_at", + "stack_deployment", + "workflow_deployment_group" + ], + "properties": { + "change": { + "description": "The change data object, encoded as a JSON string.\nFor reference, see https://developer.hashicorp.com/terraform/internals/json-format#values-representation.\n", + "type": "string" + }, + "changed_at": { + "description": "Timestamp when the change happened.", + "type": "string", + "format": "date-time", + "example": "2024-04-12T07:06:00Z" + }, + "stack_deployment": { + "description": "This deployment won't include changeset details", + "$ref": "#/components/schemas/StackDeployment" + }, + "workflow_deployment_group": { + "$ref": "#/components/schemas/WorkflowDeploymentGroup" + } + } + }, + "ResourcePreview": { + "type": "object", + "description": "Detailed information about a resource preview.\n", + "required": [ + "change", + "changed_at", + "stack_preview", + "review_request" + ], + "properties": { + "change": { + "description": "The change data object, encoded as a JSON string.\nFor reference, see https://developer.hashicorp.com/terraform/internals/json-format#values-representation.\n", + "type": "string" + }, + "changed_at": { + "description": "Timestamp when the change happened.", + "type": "string", + "format": "date-time", + "example": "2024-04-12T07:06:00Z" + }, + "stack_preview": { + "description": "This preview does not include changeset details", + "$ref": "#/components/schemas/StackPreview" + }, + "review_request": { + "$ref": "#/components/schemas/ReviewRequest" + } + } + }, + "ResourceDrift": { + "type": "object", + "description": "Information about a resource drift.\n", + "required": [ + "change", + "changed_at", + "drift" + ], + "properties": { + "change": { + "description": "The change data object, encoded as a JSON string.\nFor reference, see https://developer.hashicorp.com/terraform/internals/json-format#values-representation.\n", + "type": "string" + }, + "changed_at": { + "description": "Timestamp when the change happened.", + "type": "string", + "format": "date-time", + "example": "2024-04-12T07:06:00Z" + }, + "drift": { + "description": "This drift doesn't include changeset details", + "$ref": "#/components/schemas/Drift" + } + } + }, + "ResourceStatus": { + "description": "The last known status of the resource at `updated_at` time.\nThis field is **deprecated** and will be removed in favor of flags `drifted` and `pending`.\n", + "type": "string", + "enum": [ + "drifted", + "ok", + "pending" + ] + }, + "ResourcePolicyCheck": { + "type": "object", + "description": "Summary for an analysis done to a resource.\n", + "required": [ + "created_at", + "passed", + "counters" + ], + "properties": { + "created_at": { + "type": "string", + "format": "date-time", + "description": "Define when the policy analysis was performed.", + "example": "2024-09-12T07:06:00Z" + }, + "passed": { + "type": "boolean", + "description": "Define if the resource passed the policy check.", + "example": false + }, + "start_violated_at": { + "type": "string", + "format": "date-time", + "description": "Define when the resource stopped passing any of the rules set\nby the policy analysis.\nIt is only set when passed == false. Otherwise, it's null.\n", + "example": "2024-09-12T05:06:00Z" + }, + "counters": { + "$ref": "#/components/schemas/PolicyCheckCounters" + } + } + }, + "PolicyCheckCounters": { + "type": "object", + "required": [ + "passed_count", + "severity_low_count", + "severity_medium_count", + "severity_high_count" + ], + "properties": { + "passed_count": { + "type": "integer", + "minimum": 0, + "format": "int64", + "description": "Number of policy checks that passed.", + "example": 42 + }, + "severity_low_count": { + "type": "integer", + "minimum": 0, + "format": "int64", + "description": "Number of policy checks with low severity that was violated.", + "example": 3 + }, + "severity_medium_count": { + "type": "integer", + "minimum": 0, + "format": "int64", + "description": "Number of policy checks with medium severity that was violated.", + "example": 2 + }, + "severity_high_count": { + "type": "integer", + "minimum": 0, + "format": "int64", + "description": "Number of policy checks with high severity that was violated.", + "example": 1 + } + } + }, + "CreateAPIKeyRequest": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "name": { + "type": "string", + "description": "Name of the API key", + "minLength": 2 + }, + "expires_at": { + "type": "string", + "format": "date-time", + "description": "Optional expiration date for the key" + } + } + }, + "APIKey": { + "type": "object", + "required": [ + "id", + "name", + "created_at" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid" + }, + "name": { + "type": "string" + }, + "key": { + "type": "string", + "description": "The actual API key (only returned on creation)", + "nullable": true + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "created_by": { + "$ref": "#/components/schemas/User" + }, + "expires_at": { + "type": "string", + "format": "date-time", + "nullable": true + }, + "last_used_at": { + "type": "string", + "format": "date-time", + "nullable": true + } + } + }, + "APIKeysCollection": { + "type": "object", + "required": [ + "paginated_result", + "api_keys" + ], + "properties": { + "api_keys": { + "type": "array", + "items": { + "$ref": "#/components/schemas/APIKey" + } + } + } + }, + "License": { + "type": "object", + "required": [ + "id", + "key", + "created_at", + "expires_at" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid" + }, + "key": { + "type": "string", + "description": "The actual License key" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "expires_at": { + "type": "string", + "format": "date-time" + }, + "deleted_at": { + "type": "string", + "format": "date-time" + } + } + }, + "LicensesCollection": { + "type": "object", + "required": [ + "paginated_result", + "licenses" + ], + "properties": { + "licenses": { + "type": "array", + "items": { + "$ref": "#/components/schemas/License" + } + }, + "paginated_result": { + "$ref": "#/components/schemas/PaginatedResultObject" + } + } + }, + "PostStoreOutputRequest": { + "type": "object", + "required": [ + "key", + "value" + ], + "properties": { + "key": { + "type": "object", + "required": [ + "repository", + "stack_meta_id", + "name" + ], + "properties": { + "repository": { + "type": "string", + "description": "Repository URL", + "example": "github.com/terramate-io/iac-gcloud" + }, + "stack_meta_id": { + "type": "string", + "description": "Stack Meta ID", + "example": "b3df4bbf-154a-4331-ab71-52075ca418ad" + }, + "target": { + "description": "Deployment target of the output. `default` if not set.", + "$ref": "#/components/schemas/DeploymentTarget" + }, + "name": { + "$ref": "#/components/schemas/StoreOutputName" + } + } + }, + "value": { + "type": "string", + "description": "Value of the output", + "example": "output_value", + "maxLength": 16384 + } + } + }, + "StoreOutput": { + "type": "object", + "required": [ + "id", + "key", + "value", + "created_at", + "updated_at" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "ID of the stored output", + "example": "4aebf6d3-c72f-4137-9dc5-afb2e38d7ebd" + }, + "key": { + "type": "object", + "required": [ + "id", + "org_uuid", + "repository", + "stack_meta_id", + "name", + "target" + ], + "properties": { + "org_uuid": { + "type": "string", + "format": "uuid", + "description": "UUID of the organization", + "example": "4aebf6d3-c72f-4137-9dc5-afb2e38d7ebd" + }, + "repository": { + "type": "string", + "description": "Repository URL", + "example": "github.com/terramate-io/iac-gcloud" + }, + "stack_meta_id": { + "type": "string", + "description": "Stack Meta ID", + "example": "b3df4bbf-154a-4331-ab71-52075ca418ad" + }, + "target": { + "description": "Deployment target of the output. `default` if not set.", + "$ref": "#/components/schemas/DeploymentTarget" + }, + "name": { + "$ref": "#/components/schemas/StoreOutputName" + } + } + }, + "value": { + "type": "string", + "description": "Value of the output", + "example": "output_value" + }, + "created_at": { + "type": "string", + "format": "date-time", + "description": "Time of the output creation" + }, + "updated_at": { + "type": "string", + "format": "date-time", + "description": "Time of the output update" + } + } + }, + "StoreOutputName": { + "type": "string", + "description": "Name of the output", + "example": "database_id", + "pattern": "^[a-z]([-_a-z0-9]*[a-z0-9])?$" + }, + "DashboardAlertsWidget": { + "type": "object", + "description": "The stats calculated for the dashboard alerts widget.\n", + "required": [ + "open_total", + "open_unassigned_total", + "open_assigned_total", + "open_owned_total", + "closed_total", + "closed_unassigned_total", + "closed_assigned_total", + "closed_owned_total", + "resolved_total", + "resolved_unassigned_total", + "resolved_assigned_total", + "resolved_owned_total", + "fixed_total", + "fixed_unassigned_total", + "fixed_assigned_total", + "fixed_owned_total" + ], + "properties": { + "open_total": { + "type": "integer" + }, + "open_unassigned_total": { + "type": "integer" + }, + "open_assigned_total": { + "type": "integer" + }, + "open_owned_total": { + "type": "integer" + }, + "closed_total": { + "type": "integer" + }, + "closed_unassigned_total": { + "type": "integer" + }, + "closed_assigned_total": { + "type": "integer" + }, + "closed_owned_total": { + "type": "integer" + }, + "resolved_total": { + "type": "integer" + }, + "resolved_unassigned_total": { + "type": "integer" + }, + "resolved_assigned_total": { + "type": "integer" + }, + "resolved_owned_total": { + "type": "integer" + }, + "fixed_total": { + "type": "integer" + }, + "fixed_unassigned_total": { + "type": "integer" + }, + "fixed_assigned_total": { + "type": "integer" + }, + "fixed_owned_total": { + "type": "integer" + } + } + }, + "DashboardAlertsPeriodWidget": { + "type": "object", + "description": "The stats calculated for the dashboard alerts period widget.\n", + "required": [ + "created_total", + "closed_total", + "resolved_total", + "fixed_total" + ], + "properties": { + "created_total": { + "type": "integer" + }, + "closed_total": { + "type": "integer" + }, + "resolved_total": { + "type": "integer" + }, + "fixed_total": { + "type": "integer" + } + } + }, + "DashboardReviewRequestsWidget": { + "type": "object", + "description": "The stats calculated for the dashboard review requests widget.\n", + "required": [ + "total", + "draft_total", + "open_total", + "review_required_total", + "changes_requested_total", + "approved_total", + "merged_total", + "closed_total" + ], + "properties": { + "total": { + "type": "integer" + }, + "draft_total": { + "type": "integer" + }, + "open_total": { + "type": "integer" + }, + "review_required_total": { + "type": "integer" + }, + "changes_requested_total": { + "type": "integer" + }, + "approved_total": { + "type": "integer" + }, + "merged_total": { + "type": "integer" + }, + "closed_total": { + "type": "integer" + } + } + }, + "DashboardReviewRequestsPeriodWidget": { + "type": "object", + "description": "The stats calculated for the dashboard review requests period widget.\n", + "required": [ + "created_total", + "closed_total", + "merged_total", + "reviewed_total" + ], + "properties": { + "created_total": { + "type": "integer" + }, + "closed_total": { + "type": "integer" + }, + "merged_total": { + "type": "integer" + }, + "reviewed_total": { + "type": "integer" + } + } + }, + "DashboardDeploymentsPeriodWidget": { + "type": "object", + "description": "The stats calculated for the dashboard deployments period widget.\n", + "required": [ + "ok", + "failed", + "canceled" + ], + "properties": { + "ok": { + "type": "integer" + }, + "failed": { + "type": "integer" + }, + "canceled": { + "type": "integer" + } + } + }, + "ReviewRequestsDORATotalReport": { + "allOf": [ + { + "$ref": "#/components/schemas/DORATotalReport" + }, + { + "type": "object", + "required": [ + "status_success_total", + "status_failed_total", + "status_unstable_total" + ], + "properties": { + "status_success_total": { + "type": "integer", + "format": "int64", + "description": "Number of review requests whose last related workflow\ndeployment group was a success.\n", + "example": 42, + "minimum": 0 + }, + "status_failed_total": { + "type": "integer", + "format": "int64", + "description": "Number of review requests whose last related workflow\ndeployment group was a failure.\n", + "example": 32, + "minimum": 0 + }, + "status_unstable_total": { + "type": "integer", + "format": "int64", + "description": "Number of review requests whose last related workflow\ndeployment group was unstable.\n\nThis is not yet implemented.\n", + "example": 0, + "minimum": 0 + } + } + } + ] + }, + "DORATotalReport": { + "type": "object", + "description": "DORA report on total numbers.\n", + "required": [ + "lead_time_for_change_seconds_max", + "lead_time_for_change_seconds_min", + "lead_time_for_change_seconds_total", + "lead_time_for_change_seconds_avg", + "lead_time_for_change_count", + "time_to_restore_seconds_max", + "time_to_restore_seconds_min", + "time_to_restore_seconds_total", + "time_to_restore_seconds_avg", + "time_to_restore_count", + "days_with_data_total" + ], + "properties": { + "lead_time_for_change_seconds_max": { + "type": "integer", + "format": "int64", + "description": "Maximum number of seconds with that lead time for change.\n", + "example": 23232, + "minimum": 1 + }, + "lead_time_for_change_seconds_min": { + "type": "integer", + "format": "int64", + "description": "Minimum number of seconds with that lead time for change.\n", + "example": 2, + "minimum": 1 + }, + "lead_time_for_change_seconds_total": { + "type": "integer", + "format": "int64", + "description": "Total accumulated number of seconds for lead time for change.\n", + "example": 223232, + "minimum": 1 + }, + "lead_time_for_change_seconds_avg": { + "type": "integer", + "format": "int64", + "description": "Average number of seconds for lead time for change.\n", + "example": 2232, + "minimum": 0 + }, + "lead_time_for_change_count": { + "type": "integer", + "format": "int64", + "description": "Number of entities with lead time for change value set.\n", + "example": 22, + "minimum": 0 + }, + "time_to_restore_seconds_max": { + "type": "integer", + "format": "int64", + "description": "Maximum number of seconds with that time to restore.\n", + "example": 2323, + "minimum": 1 + }, + "time_to_restore_seconds_min": { + "type": "integer", + "format": "int64", + "description": "Minimum number of seconds with that time to restore.\n", + "example": 2, + "minimum": 1 + }, + "time_to_restore_seconds_total": { + "type": "integer", + "format": "int64", + "description": "Total accumulated number of seconds for time to restore.\n", + "example": 2, + "minimum": 1 + }, + "time_to_restore_seconds_avg": { + "type": "integer", + "format": "int64", + "description": "Average number of seconds for time to restore.\n", + "example": 21122, + "minimum": 0 + }, + "time_to_restore_count": { + "type": "integer", + "format": "int64", + "description": "Number of entities with time to restore set.\n", + "example": 2, + "minimum": 0 + }, + "days_with_data_total": { + "type": "integer", + "format": "int64", + "description": "Number of days within the range with data.\n", + "example": 2, + "minimum": 0 + } + } + }, + "ReviewRequestsDORARangeReport": { + "type": "object", + "description": "The report for DORA metrics related to review requests for\ndata within a range.\n", + "required": [ + "review_requests" + ], + "properties": { + "review_requests": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ReviewRequestsDORARangeReportElement" + } + } + } + }, + "ReviewRequestsDORARangeReportElement": { + "allOf": [ + { + "$ref": "#/components/schemas/DORARangeReportElement" + }, + { + "type": "object", + "description": "The element for DORA metrics within a range.\n", + "required": [ + "status_success_total", + "status_failed_total", + "status_unstable_total" + ], + "properties": { + "status_success_total": { + "type": "integer", + "format": "int64", + "description": "Number of review requests whose last related workflow\ndeployment group was a success.\n", + "example": 42, + "minimum": 0 + }, + "status_failed_total": { + "type": "integer", + "format": "int64", + "description": "Number of review requests whose last related workflow\ndeployment group was a failure.\n", + "example": 32, + "minimum": 0 + }, + "status_unstable_total": { + "type": "integer", + "format": "int64", + "description": "Number of review requests whose last related workflow\ndeployment group was unstable.\n\nThis is not yet implemented.\n", + "example": 0, + "minimum": 0 + } + } + } + ] + }, + "DORARangeReportElement": { + "type": "object", + "description": "The element for DORA metrics within a range.\n", + "required": [ + "date", + "lead_time_for_change_seconds_avg", + "lead_time_for_change_seconds_max", + "lead_time_for_change_seconds_min", + "time_to_restore_seconds_avg", + "time_to_restore_seconds_max", + "time_to_restore_seconds_min" + ], + "properties": { + "date": { + "type": "string", + "format": "date", + "description": "Date for the range element in YYYY-MM-DD format.\n", + "example": "2025-06-25T00:00:00.000Z" + }, + "lead_time_for_change_seconds_max": { + "type": "integer", + "format": "int64", + "description": "Maximum number of seconds with that lead time for change.\n", + "example": 23232, + "minimum": 1 + }, + "lead_time_for_change_seconds_min": { + "type": "integer", + "format": "int64", + "description": "Minimum number of seconds with that lead time for change.\n", + "example": 2, + "minimum": 1 + }, + "lead_time_for_change_seconds_avg": { + "type": "integer", + "format": "int64", + "description": "Average number of seconds for lead time for change.\n", + "example": 223.23 + }, + "time_to_restore_seconds_max": { + "type": "integer", + "format": "int64", + "description": "Maximum number of seconds with that time to restore.\n", + "example": 2323, + "minimum": 1 + }, + "time_to_restore_seconds_min": { + "type": "integer", + "format": "int64", + "description": "Minimum number of seconds with that time to restore.\n", + "example": 2, + "minimum": 1 + }, + "time_to_restore_seconds_avg": { + "type": "integer", + "format": "int64", + "description": "Average number of seconds for time to restore.\n", + "example": 2 + } + } + }, + "DORARatingReport": { + "type": "object", + "description": "The report for DORA metrics related to the entities divided\nby rating buckets.\n", + "required": [ + "lead_time_for_change_elite_total", + "lead_time_for_change_high_total", + "lead_time_for_change_medium_total", + "lead_time_for_change_low_total", + "time_to_restore_elite_total", + "time_to_restore_high_total", + "time_to_restore_medium_total", + "time_to_restore_low_total" + ], + "properties": { + "lead_time_for_change_elite_total": { + "type": "integer", + "format": "int64", + "description": "Number of lead time for change within Elite rating.\n", + "example": 23232, + "minimum": 0 + }, + "lead_time_for_change_high_total": { + "type": "integer", + "format": "int64", + "description": "Number of lead time for change within High rating.\n", + "example": 2, + "minimum": 0 + }, + "lead_time_for_change_medium_total": { + "type": "integer", + "format": "int64", + "description": "Number of lead time for change within Medium rating.\n", + "example": 22, + "minimum": 0 + }, + "lead_time_for_change_low_total": { + "type": "integer", + "format": "int64", + "description": "Number of lead time for change within Low rating.\n", + "example": 23, + "minimum": 0 + }, + "time_to_restore_elite_total": { + "type": "integer", + "format": "int64", + "description": "Number of times to restore within Elite rating.\n", + "example": 2323, + "minimum": 0 + }, + "time_to_restore_high_total": { + "type": "integer", + "format": "int64", + "description": "Number of time to restore within High rating.\n", + "example": 2, + "minimum": 0 + }, + "time_to_restore_medium_total": { + "type": "integer", + "format": "int64", + "description": "Number of time to restore within Medium rating.\n", + "example": 2, + "minimum": 0 + }, + "time_to_restore_low_total": { + "type": "integer", + "format": "int64", + "description": "Number of time to restore within Low rating.\n", + "example": 2, + "minimum": 0 + } + } + }, + "StackDeploymentsDORATotalReport": { + "allOf": [ + { + "$ref": "#/components/schemas/DORATotalReport" + }, + { + "type": "object", + "description": "The report for DORA metrics related to stack deployments for\ntotal numbers.\n", + "required": [ + "status_success_total", + "status_failed_total", + "status_unstable_total", + "status_canceled_total" + ], + "properties": { + "status_success_total": { + "type": "integer", + "format": "int64", + "description": "Number of review requests whose status was a success.\n", + "example": 42, + "minimum": 0 + }, + "status_failed_total": { + "type": "integer", + "format": "int64", + "description": "Number of review requests whose status was a failure.\n", + "example": 32, + "minimum": 0 + }, + "status_unstable_total": { + "type": "integer", + "format": "int64", + "description": "Number of review requests whose status was unstable.\n\nThis is not yet implemented.\n", + "example": 0, + "minimum": 0 + }, + "status_canceled_total": { + "type": "integer", + "format": "int64", + "description": "Number of stack deployments whose status was canceled.\n", + "example": 32, + "minimum": 0 + } + } + } + ] + }, + "StackDeploymentsDORARangeReport": { + "type": "object", + "description": "The report for DORA metrics related to stack deployments for\ndata within a range.\n", + "required": [ + "stack_deployments" + ], + "properties": { + "stack_deployments": { + "type": "array", + "items": { + "$ref": "#/components/schemas/StackDeploymentsDORARangeReportElement" + } + } + } + }, + "StackDeploymentsDORARangeReportElement": { + "allOf": [ + { + "$ref": "#/components/schemas/DORARangeReportElement" + }, + { + "type": "object", + "description": "The element for DORA metrics within a range.\n", + "required": [ + "status_success_total", + "status_failed_total", + "status_unstable_total", + "status_canceled_total" + ], + "properties": { + "status_success_total": { + "type": "integer", + "format": "int64", + "description": "Number of stack deployemnts whose status was a success.\n", + "example": 42, + "minimum": 0 + }, + "status_failed_total": { + "type": "integer", + "format": "int64", + "description": "Number of stack deployments whose status was a failure.\n", + "example": 32, + "minimum": 0 + }, + "status_unstable_total": { + "type": "integer", + "format": "int64", + "description": "Number of stack deployments whose status was unstable.\n\nThis is not yet implemented.\n", + "example": 0, + "minimum": 0 + }, + "status_canceled_total": { + "type": "integer", + "format": "int64", + "description": "Number of stack deployments whose status was canceled.\n", + "example": 32, + "minimum": 0 + } + } + } + ] + } + }, + "securitySchemes": { + "jwtToken": { + "type": "http", + "scheme": "bearer", + "bearerFormat": "JWT" + }, + "apiKey": { + "type": "apiKey", + "description": "API key as username in Basic Authorization with\nempty password.\n", + "name": "Authorization", + "in": "header" + } + } + } +} diff --git a/.vitepress/theme/openapi.yml b/.vitepress/theme/openapi.yml new file mode 100644 index 0000000..281f034 --- /dev/null +++ b/.vitepress/theme/openapi.yml @@ -0,0 +1,7938 @@ +openapi: 3.1.0 +info: + contact: + email: hello@terramate.io + name: Terramate + url: https://terramate.io + description: Terramate Cloud API + title: TMC API + version: 0.0.1 +servers: + - url: http://localhost:8000 + description: Development server +tags: + - name: System + description: functionality-independent system endpoints + - name: Users + description: Manage users + - name: Organizations + description: Manage organizations + - name: Organization Members + description: Manage organization members + - name: Stacks + description: Manage stacks + - name: Drifts + description: Manage drifts in stacks + - name: Deployments + description: Manage deployments in organizations and stacks + - name: Review Requests + description: Display review requests related to stacks + - name: Previews + description: Manage previews from stacks done in review requests + - name: Alerts + description: Manage alerts + - name: Resources + description: Display resources coming from stacks + - name: Dashboard Data + description: Provide data for display on dashboard + - name: Filters + description: Provide filter values for various paginated views + - name: GitHub App + description: Manage Connections to GitHub + - name: Slack App + description: Manage Connections to Slack + - name: Gitlab + description: Manage Gitlab integration + - name: Reports + description: Provide data for security and compliance purposes + - name: Org API Keys + description: Manage API keys for organizations + +paths: + /ping: + get: + tags: + - System + summary: check if the service is alive. + description: This does not check dependencies like the database. No other response than 200 is possible, everything else will just time out. + operationId: Ping + responses: + '200': + description: Service is alive and functional. + + /healthcheck: + get: + tags: + - System + summary: Check if the service is well. + description: Check if the service is well. + operationId: HealthCheck + responses: + '200': + description: Service is healthy. + + /.well-known/cli.json: + get: + tags: + - System + summary: | + Returns information for the Terramate CLI regarding + supported versions. + description: | + Returns information for the Terramate CLI regarding + supported versions. + operationId: WellKnownCLI + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/WellKnownCLI' + + /v1/users: + get: + summary: Returns a User from their user_id in the JWT. + description: Returns a User from their user_id in the JWT. + operationId: getCurrentUser + tags: + - Users + responses: + '200': + description: Found + content: + application/json: + schema: + $ref: '#/components/schemas/UserProfile' + '401': + $ref: '#/components/responses/Unauthorized' + '404': + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/GenericErrorResponseObject' + security: + - jwtToken: [] + post: + summary: Create the current User. + description: Create the current User. + operationId: CreateCurrentUser + tags: + - Users + requestBody: + description: Provide user display name and position (job title). + required: false + content: + application/json: + schema: + $ref: '#/components/schemas/PostUsersRequestObject' + responses: + '201': + description: Created + content: + application/json: + schema: + $ref: '#/components/schemas/UserProfile' + '401': + $ref: '#/components/responses/Unauthorized' + '409': + description: Conflict + content: + application/json: + schema: + $ref: '#/components/schemas/GenericErrorResponseObject' + security: + - jwtToken: [] + + /v1/user: + patch: + summary: Update current logged in user + description: | + Update current logged in user. + + Only JWT tokens are supported by now. + operationId: UpdateCurrentUser + tags: + - Users + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/PostUsersRequestObject' + responses: + '200': + description: Found + content: + application/json: + schema: + $ref: '#/components/schemas/UserProfile' + '401': + $ref: '#/components/responses/Unauthorized' + '404': + $ref: '#/components/responses/NotFound' + security: + - jwtToken: [] + + /v1/user/links: + post: + summary: Link any platform account to this user. + description: This operation may create/delete one or more links with a user. + operationId: CreateCurrentUserLinks + tags: + - Users + parameters: + - in: header + required: false + name: Cluster-Location-Origin + description: Define if the call is done from a TMC cluster. + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + type: object + description: Expected list of platforms to get created. + required: + - platforms + properties: + platforms: + type: array + items: + $ref: '#/components/schemas/PlatformSlugName' + minItems: 1 + responses: + '204': + description: No Content + '401': + $ref: '#/components/responses/Unauthorized' + security: + - jwtToken: [] + delete: + summary: Unlink some platform accounts to this user. + description: This operation may create/delete one or more links with a user. + operationId: SyncCurrentUserLinks + tags: + - Users + requestBody: + required: true + content: + application/json: + schema: + type: object + description: Expected list of platforms to get deleted. + required: + - platforms + properties: + platforms: + type: array + items: + $ref: '#/components/schemas/PlatformSlugName' + minItems: 1 + responses: + '204': + description: No Content + '401': + $ref: '#/components/responses/Unauthorized' + security: + - jwtToken: [] + + /v1/user/links/gitlab: + post: + summary: Link a user with their Gitlab account using their JWT ID token. + description: Link a user with their Gitlab account using their JWT ID token. + operationId: CurrentUserLinkGitlab + tags: + - Users + requestBody: + required: true + content: + application/json: + schema: + type: object + required: + - id_token + properties: + id_token: + description: | + Base64 encoded JWT token coming from Gitlab with profile information. + The exact information provided by Gitlab is available at https://docs.gitlab.com/ee/integration/openid_connect_provider.html + type: string + responses: + '204': + description: No Content + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + security: + - jwtToken: [] + + /v1/user/links/bitbucket/authorize: + get: + summary: Generate a connection URL to BitBucket OAuth2 Code flow. + description: | + Visiting this endpoint will attempt to ask for grant access to + the current user against Bitbucket Cloud to retrieve the requested + scopes. + operationId: ConnectBitbucketCurrentUserAuthorize + tags: + - Users + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectBitbucketCurrentUserAuthorizeResponse' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '409': + $ref: '#/components/responses/Conflict' + '501': + $ref: '#/components/responses/NotImplemented' + security: + - jwtToken: [] + + /v1/user/links/bitbucket/access: + get: + summary: Landing page to end BitBucket User linking + description: | + Bitbucket cloud will redirect to this endpoint, once the current user authorises + the OAuth2 customer to access the provided scopes. + This is going to perform the latest steps to link the + logged-in TMC user to that Bitbucket account. + The parameters sent along are used to verify the authenticity of this request. + a TMC org. + operationId: ConnectBitbucketCurrentUserAccess + tags: + - Users + parameters: + - in: query + required: true + name: code + description: Temporary code to access + schema: + type: string + - in: query + required: true + name: state + description: Forwarded state associated with the link attempt. + schema: + type: string + responses: + '302': + description: will redirect to Profile settings + headers: + Location: + required: true + description: The profile frontend settings. + schema: + type: string + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + '501': + $ref: '#/components/responses/NotImplemented' + + /v1/drifts/{org_uuid}: + post: + summary: Create drift run for a stack. + description: Create drift run for a stack. + operationId: CreateDriftsForStacks + tags: + - Drifts + parameters: + - in: path + name: org_uuid + description: UUID of the organization + schema: + type: string + format: uuid + required: true + requestBody: + required: true + content: + application/json: + x-ogen-json-streaming: true + schema: + $ref: '#/components/schemas/PostDriftStatusRequestObject' + responses: + '204': + description: No Content + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + '404': + $ref: '#/components/responses/NotFound' + security: + - apiKey: [] + - jwtToken: [] + + /v1/drifts/{org_uuid}/{stack_id}/{drift_id}: + get: + summary: Get Drift Details + description: | + Get the details of a drift run for a stack. + Note that in the response field `changeset_ascii` could be up + to 4MiB in size, and `changeset_json` is not yet populated. + + **Access** + - Members of the organization with a `member` role. + - Trusted GitHub Owner. + operationId: GetDriftDetails + tags: + - Drifts + parameters: + - $ref: '#/components/parameters/orgUUID' + - $ref: '#/components/parameters/stackID' + - $ref: '#/components/parameters/driftID' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/Drift' + '401': + $ref: '#/components/responses/Unauthorized' + '404': + $ref: '#/components/responses/NotFound' + security: + - apiKey: [] + - jwtToken: [] + + /v1/drifts/{org_uuid}/{stack_id}/{drift_id}/summarize: + post: + summary: Summarize Drift Plan + description: | + Get a summary of a drift. Only drifts with a drifted state + will return any content. + + **Access** + - Members of the organization with a `member` role. + - API key. + operationId: SummarizeDrift + tags: + - Drifts + parameters: + - $ref: '#/components/parameters/orgUUID' + - $ref: '#/components/parameters/stackID' + - $ref: '#/components/parameters/driftID' + - $ref: '#/components/parameters/qForce' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/SummaryResponse' + '401': + $ref: '#/components/responses/Unauthorized' + '404': + $ref: '#/components/responses/NotFound' + security: + - apiKey: [] + - jwtToken: [] + + /v1/organizations: + post: + summary: Create an organization + description: | + A new organization will be created and the current user will + be the first member of the organization and get the admin role. + On successful creation the new membership object is resturned. + + A SSO logged in user cannot create an organization. + operationId: CreateOrganization + tags: + - Organizations + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/Organization' + responses: + '201': + description: Created + content: + application/json: + schema: + $ref: '#/components/schemas/PostOrganizationsResponseObject' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '409': + $ref: '#/components/responses/Conflict' + security: + - jwtToken: [] + + /v1/organizations/name/{name}: + get: + summary: Get organization SSO data from a organization. + description: Get organization details. + operationId: GetEnterpriseOrganization + tags: + - Organizations + parameters: + - $ref: '#/components/parameters/orgShortName' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/EnterpriseOrganization' + '404': + $ref: '#/components/responses/NotFound' + + /v1/organizations/{org_uuid}: + patch: + summary: Update an organization + description: Only admin users can modify an organization. + operationId: UpdateOrganization + tags: + - Organizations + parameters: + - $ref: '#/components/parameters/orgUUID' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/PatchOrganizationRequestObject' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/PatchOrganizationResponseObject' + '304': + description: Not Modified + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + security: + - jwtToken: [] + get: + summary: Get organization details. + description: Get organization details. + operationId: GetOrganization + tags: + - Organizations + parameters: + - $ref: '#/components/parameters/orgUUID' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/Organization' + '401': + $ref: '#/components/responses/Unauthorized' + '404': + $ref: '#/components/responses/NotFound' + security: + - jwtToken: [] + + /v1/organizations/{org_uuid}/members: + get: + summary: Get all memberships of an organization. + description: Get all memberships of an organization. + operationId: GetOrganizationsMembers + tags: + - Organization Members + parameters: + - $ref: '#/components/parameters/orgUUID' + - $ref: '#/components/parameters/qPage' + - $ref: '#/components/parameters/qPerPage' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/GetOrganizationsMembersResponse' + example: + paginated_result: + page: 1 + per_page: 10 + total: 30 + members: + - member_id: 23 + user_display_name: Marius Tolzmann + user_email: marius@terramate.io + role: admin + status: active + - member_id: 42 + invited_email: marius@mineiros.io, + role: member + status: invited + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + security: + - jwtToken: [] + + post: + summary: Create a member in an organization. + description: | + There are two possible use case: + - Active admin member of an organization invities a user + to the organization. + - A SSO logged in user auto-invite himself as member. + operationId: CreateMembership + tags: + - Organization Members + parameters: + - in: path + name: org_uuid + description: UUID of the organization + required: true + schema: + type: string + format: uuid + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/CreateMembershipRequest' + responses: + '201': + description: Created + content: + application/json: + schema: + $ref: '#/components/schemas/CreateMembershipResponse' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '409': + $ref: '#/components/responses/Conflict' + security: + - jwtToken: [] + + /v1/organizations/{org_uuid}/members/{member_id}: + patch: + summary: Update users membership options of an organization + description: Update users membership options of an organization. + operationId: UpdateMembership + tags: + - Organization Members + parameters: + - $ref: '#/components/parameters/orgUUID' + - $ref: '#/components/parameters/memberID' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/PatchOrganizationsMembersRequestObject' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/PatchOrganizationsMembersResponseObject' + '304': + description: Not Modified + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + security: + - jwtToken: [] + delete: + summary: Delete a membership of an invited user + description: Only admin users can delete a membership. + operationId: DeleteMembership + tags: + - Organization Members + parameters: + - $ref: '#/components/parameters/orgUUID' + - $ref: '#/components/parameters/memberID' + responses: + '204': + description: No Content + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + security: + - jwtToken: [] + + /v1/organizations/{org_uuid}/deployments: + get: + summary: Get all deployments from an organization. + description: | + Get all deployments from an organization. + + That's different from `GET /v1/deployments/{org_uuid}` which is + intended for dashboards to see active deployments. + + Results can be sorted using `sort` parameter with following fields: + + - updated_at (default with descending order) + - finished_at (desc by default) + - total_stack_count (desc by default) + - type + - duration (desc by default) + + operationId: GetOrganizationDeployments + tags: + - Deployments + security: + - jwtToken: [] + parameters: + - $ref: '#/components/parameters/orgUUID' + - $ref: '#/components/parameters/qPage' + - $ref: '#/components/parameters/qPerPage' + - $ref: '#/components/parameters/qRepositories' + - $ref: '#/components/parameters/qAuthTypes' + - $ref: '#/components/parameters/qWorkflowDeploymentStatuses' + - $ref: '#/components/parameters/qCollaboratorID' + - $ref: '#/components/parameters/qUserUUID' + - $ref: '#/components/parameters/qWorkflowDeploymentSearch' + - $ref: '#/components/parameters/qCreatedAtFrom' + - $ref: '#/components/parameters/qCreatedAtTo' + - $ref: '#/components/parameters/qStartedAtFrom' + - $ref: '#/components/parameters/qStartedAtTo' + - $ref: '#/components/parameters/qFinishedAtFrom' + - $ref: '#/components/parameters/qFinishedAtTo' + - $ref: '#/components/parameters/qSort' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/GetOrganizationDeploymentsResponseObject' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + + /v1/organizations/{org_uuid}/deployments/activity: + get: + summary: Get deployments activity from an organization. + description: | + Get deployments activity from an organization for the last 371 + days (53 weeks * 7 days). + + Data is sorted from oldest to newest providing all the data + without gaps, that is, a dense array. + + "ok" deployments are the sum of ok_count from workflow + deployment groups. + "failed" deployments are the sum of failed_count, + canceled_count and the sum of running_count and pending_count + older than 24h. + + operationId: GetOrganizationDeploymentsActivity + tags: + - Deployments + security: + - jwtToken: [] + parameters: + - $ref: '#/components/parameters/orgUUID' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/GetOrganizationDeploymentsActivityResponse' + '401': + $ref: '#/components/responses/Unauthorized' + + /v1/memberships: + get: + summary: Get organization memberships of the current user + description: | + This is used both in CLI and frontend to know the + organisations a user belongs to. + operationId: GetUserMemberships + tags: + - Organizations + responses: + '200': + $ref: '#/components/responses/GetUserOrgMembershipsResp' + '401': + $ref: '#/components/responses/Unauthorized' + security: + - apiKey: [] + - jwtToken: [] + + /v1/dashboards/{org_uuid}/history: + get: + summary: Return historic deployment data for the last X days of deployments. + description: | + Historic deployment data for the last X days. Returns an object with X + keys corresponding to date strings for the last X days. Days without + deployments will receive metrics objects with counts at 0. + operationId: GetDeploymentsHistory + tags: + - Dashboard Data + security: + - jwtToken: [] + parameters: + - $ref: '#/components/parameters/orgUUID' + - in: query + name: days + description: | + Number of days to display historic deployment data. + schema: + type: integer + format: int32 + default: 90 + maximum: 365 + minimum: 1 + example: 14 + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/GetDeploymentsHistoryResponse' + '401': + $ref: '#/components/responses/Unauthorized' + + /v1/dashboards/{org_uuid}/stacks: + get: + summary: Get dashboard data for an organization + description: | + Get the counters for all active stacks belonging to an organization to show on the dashboard. + + This will be extended with more counters in the future for e.g. resources and resource health. + + Soft deleted stacks are not counted. + + **Access** + - Only members of the organization with any role are allowed to query. + operationId: GetDashboardStacks + tags: + - Dashboard Data + security: + - apiKey: [] + - jwtToken: [] + parameters: + - $ref: '#/components/parameters/orgUUID' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/GetDashboardStacksResponseObject' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + + /v1/dashboards/{org_uuid}/widgets/alerts: + get: + summary: Get dashboard data for alerts widget + description: | + Get the counters for alerts regarding their status and numbers of assignees. + + **Access** + - Only members of the organization with any role are allowed to query. + operationId: GetDashboardAlertsWidget + tags: + - Dashboard Data + security: + - apiKey: [] + - jwtToken: [] + parameters: + - $ref: '#/components/parameters/orgUUID' + - $ref: '#/components/parameters/qWidgetUserUUID' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/DashboardAlertsWidget' + '401': + $ref: '#/components/responses/Unauthorized' + '404': + $ref: '#/components/responses/NotFound' + + /v1/dashboards/{org_uuid}/widgets/alerts/period: + get: + summary: Get dashboard data for alerts period widget + description: | + Get the counters for alerts with a specific status in the given period. + + **Access** + - Only members of the organization with any role are allowed to query. + operationId: GetDashboardAlertsPeriodWidget + tags: + - Dashboard Data + security: + - apiKey: [] + - jwtToken: [] + parameters: + - $ref: '#/components/parameters/orgUUID' + - $ref: '#/components/parameters/qWidgetUserUUID' + - $ref: '#/components/parameters/qDays' + - $ref: '#/components/parameters/qOffsetDays' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/DashboardAlertsPeriodWidget' + '401': + $ref: '#/components/responses/Unauthorized' + '404': + $ref: '#/components/responses/NotFound' + + /v1/dashboards/{org_uuid}/widgets/review_requests: + get: + summary: Get dashboard data for review requests widget + description: | + Get the counters for review requests grouped by status. + + **Access** + - Only members of the organization with any role are allowed to query. + operationId: GetDashboardReviewRequestsWidget + tags: + - Dashboard Data + security: + - apiKey: [] + - jwtToken: [] + parameters: + - $ref: '#/components/parameters/orgUUID' + - $ref: '#/components/parameters/qWidgetUserUUID' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/DashboardReviewRequestsWidget' + '401': + $ref: '#/components/responses/Unauthorized' + '404': + $ref: '#/components/responses/NotFound' + + /v1/dashboards/{org_uuid}/widgets/review_requests/period: + get: + summary: Get dashboard data for review requests period widget + description: | + Get the counters for review requests with a specific status in the given period. + + **Access** + - Only members of the organization with any role are allowed to query. + operationId: GetDashboardReviewRequestsPeriodWidget + tags: + - Dashboard Data + security: + - apiKey: [] + - jwtToken: [] + parameters: + - $ref: '#/components/parameters/orgUUID' + - $ref: '#/components/parameters/qWidgetUserUUID' + - $ref: '#/components/parameters/qDays' + - $ref: '#/components/parameters/qOffsetDays' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/DashboardReviewRequestsPeriodWidget' + '401': + $ref: '#/components/responses/Unauthorized' + '404': + $ref: '#/components/responses/NotFound' + + /v1/dashboards/{org_uuid}/widgets/deployments/period: + get: + summary: Get dashboard data for deployments period widget + description: | + Get the counters for deployments with a specific status in the given period. + + **Access** + - Only members of the organization with any role are allowed to query. + operationId: GetDashboardDeploymentsPeriodWidget + tags: + - Dashboard Data + security: + - apiKey: [] + - jwtToken: [] + parameters: + - $ref: '#/components/parameters/orgUUID' + - $ref: '#/components/parameters/qWidgetUserUUID' + - $ref: '#/components/parameters/qDays' + - $ref: '#/components/parameters/qOffsetDays' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/DashboardDeploymentsPeriodWidget' + '401': + $ref: '#/components/responses/Unauthorized' + '404': + $ref: '#/components/responses/NotFound' + + /v1/stacks/{org_uuid}: + get: + summary: Get stacks of an organization + description: | + All stacks matching a given status are returned. + + For the time being, if no page query parameter + is provided, all stacks will be returned. + + Stacks that are soft-deleted are *not* returned. + + **Access** + - Only members of the organization with any role are allowed to query. + operationId: GetStacks + tags: + - Stacks + security: + - apiKey: [] + - jwtToken: [] + parameters: + - $ref: '#/components/parameters/orgUUID' + - $ref: '#/components/parameters/qPage' + - $ref: '#/components/parameters/qPerPage' + - $ref: '#/components/parameters/qRepositories' + - $ref: '#/components/parameters/qTargets' + - $ref: '#/components/parameters/qStatuses' + - $ref: '#/components/parameters/qDeploymentStatuses' + - $ref: '#/components/parameters/qDriftStatuses' + - $ref: '#/components/parameters/qDraft' + - $ref: '#/components/parameters/qIsArchived' + - description: | + This performs a substring search on the following stack + attributes: + + - meta_id + - meta_name + - meta_description + - path + + $ref: '#/components/parameters/qSearch' + - $ref: '#/components/parameters/qMetaID' + - $ref: '#/components/parameters/qDeploymentUUID' + - $ref: '#/components/parameters/qMetaTag' + - $ref: '#/components/parameters/qPolicySeverity' + - description: | + Stacks are sorted with updated_at by default. + + Available sorts are: + - meta_name[,(asc|desc)] + - path[,(asc|desc)] + - policy_severity[,(desc|asc)] + - repository[,(asc|desc)] + - resource_count[,(desc|asc)] + - status[,(asc|desc)] + - target[,(asc|desc)] + - updated_at[,(desc|asc)] + $ref: '#/components/parameters/qSort' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/GetStacksResponseObject' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + + /v1/stacks/{org_uuid}/{stack_id}: + get: + summary: Get stack details from an organization + description: | + All members of the organization with any role are allowed to + query. + operationId: GetStack + tags: + - Stacks + security: + - apiKey: [] + - jwtToken: [] + parameters: + - $ref: '#/components/parameters/orgUUID' + - $ref: '#/components/parameters/stackID' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/Stack' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + patch: + summary: Update specific attributes for the stack `stack_id` + description: Update specific attributes for the stack `stack_id` + operationId: PatchStack + tags: + - Stacks + security: + - apiKey: [] + - jwtToken: [] + parameters: + - $ref: '#/components/parameters/orgUUID' + - $ref: '#/components/parameters/stackID' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/PatchStackRequest' + responses: + '204': + description: No Content + '401': + $ref: '#/components/responses/Unauthorized' + '404': + $ref: '#/components/responses/NotFound' + + /v1/stacks/{org_uuid}/{stack_id}/reports/static_analysis: + get: + summary: Get last SARIF report from a drift check run for a stack. + description: | + All members of the organization with any role are allowed to + query. + operationId: GetSecurityReport + tags: + - Stacks + - Reports + security: + - apiKey: [] + - jwtToken: [] + parameters: + - $ref: '#/components/parameters/orgUUID' + - $ref: '#/components/parameters/stackID' + responses: + '200': + description: | + OK with a v2.1.0 SARIF report. + + SARIF spec can be found here: https://docs.oasis-open.org/sarif/sarif/v2.1.0/errata01/os/sarif-v2.1.0-errata01-os-complete.html#_Toc141790888 + content: + application/json: + schema: + {} + headers: + Last-Modified: + schema: + type: string + format: date-time + required: true + '401': + $ref: '#/components/responses/Unauthorized' + '404': + $ref: '#/components/responses/NotFound' + head: + summary: Check if there is a SARIF report available from a drift check run for a stack. + description: | + This method should be used for clients if they don't want to + download a potentially large security report. + operationId: CheckSecurityReport + tags: + - Stacks + - Reports + security: + - apiKey: [] + - jwtToken: [] + parameters: + - $ref: '#/components/parameters/orgUUID' + - $ref: '#/components/parameters/stackID' + responses: + '200': + description: | + OK, if present. + '401': + $ref: '#/components/responses/Unauthorized' + '404': + $ref: '#/components/responses/NotFound' + + /v1/stacks/{org_uuid}/{stack_id}/deployments: + get: + summary: Get all deployments of a stack. + description: | + Get all deployments of a stack sorted by created at + newest first. + operationId: GetStackDeployments + tags: + - Deployments + security: + - apiKey: [] + - jwtToken: [] + parameters: + - $ref: '#/components/parameters/orgUUID' + - $ref: '#/components/parameters/stackID' + - $ref: '#/components/parameters/qPage' + - $ref: '#/components/parameters/qPerPage' + - $ref: '#/components/parameters/qDeploymentStatuses' + responses: + '401': + $ref: '#/components/responses/Unauthorized' + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/GetStacksDeploymentsResponseObject' + + /v1/stacks/{org_uuid}/{stack_id}/deployments/{deployment_uuid}/logs: + post: + summary: Send a batch of logs for a deployment. + description: | + Send a batch of logs for a deployment. + Body cannot be larger than 4 MiB. + operationId: SendDeploymentLogs + tags: + - Deployments + security: + - apiKey: [] + - jwtToken: [] + parameters: + - $ref: '#/components/parameters/orgUUID' + - $ref: '#/components/parameters/stackID' + - $ref: '#/components/parameters/deploymentUUID' + requestBody: + required: true + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/CommandLogLine' + responses: + '204': + description: No Content + '401': + $ref: '#/components/responses/Unauthorized' + '404': + $ref: '#/components/responses/NotFound' + get: + summary: Get a batch of logs for a deployment. + description: Get a batch of logs for a deployment. + operationId: GetDeploymentLogs + tags: + - Deployments + security: + - apiKey: [] + - jwtToken: [] + parameters: + - $ref: '#/components/parameters/orgUUID' + - $ref: '#/components/parameters/stackID' + - $ref: '#/components/parameters/deploymentUUID' + - $ref: '#/components/parameters/qPage' + - $ref: '#/components/parameters/qPerPage' + - $ref: '#/components/parameters/qChannel' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/GetDeploymentLogsResponseObject' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + + /v1/stacks/{org_uuid}/{stack_id}/deployments/{deployment_uuid}/logs/summarize: + post: + summary: Summarize deployment logs + description: | + Get a summary using layman words of the + deployments logs. + operationId: SummarizeStackDeploymentLogs + tags: + - Deployments + security: + - apiKey: [] + - jwtToken: [] + parameters: + - $ref: '#/components/parameters/orgUUID' + - $ref: '#/components/parameters/stackID' + - $ref: '#/components/parameters/deploymentUUID' + - $ref: '#/components/parameters/qForce' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/SummaryResponse' + '401': + $ref: '#/components/responses/Unauthorized' + '404': + $ref: '#/components/responses/NotFound' + + /v1/stacks/{org_uuid}/{stack_id}/drifts: + get: + summary: Get all drifts of a stack + description: Get all drifts of a stack. + operationId: GetStackDrifts + tags: + - Drifts + security: + - apiKey: [] + - jwtToken: [] + parameters: + - $ref: '#/components/parameters/orgUUID' + - $ref: '#/components/parameters/stackID' + - $ref: '#/components/parameters/qPage' + - $ref: '#/components/parameters/qPerPage' + - $ref: '#/components/parameters/qDriftStatuses' + - $ref: '#/components/parameters/qGroupingKey' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/GetDriftsResponseObject' + '401': + $ref: '#/components/responses/Unauthorized' + + /v1/deployments/{org_uuid}/{deployment_uuid}/stacks: + post: + summary: Batch start a new deployment for each stack in a list of stacks + description: | + Create a new deployment for each stack in a list of stacks with the status of `pending`. + Stacks that are not yet known in the database identified by `(repository, meta_id)` will be created. + + A list of Stack IDs will be returned with the status `created`. + + If new stacks are created, they will be assigned the status `unknown` if no status is available in the payload. + + **Access** + - Members of the organization with `member` role. + - Trusted GitHub Owner. + operationId: PostDeployment + tags: + - Deployments + security: + - apiKey: [] + - jwtToken: [] + parameters: + - $ref: '#/components/parameters/orgUUID' + - $ref: '#/components/parameters/deploymentUUID' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/PostDeploymentStacksRequest' + responses: + '201': + description: Created + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/PostDeploymentStacksResponseObject' + '401': + $ref: '#/components/responses/Unauthorized' + '409': + $ref: '#/components/responses/Conflict' + + patch: + summary: Batch update stack status for a deployment. + description: | + Update the status of a specific deployment (identified by `deployment_uuid`). + + **Status Lifecycle of a Deployment and Stacks** + + The status of a stack, can be any of the following: + + - `ok` - when a stack is considered healthy and correctly configured (considered `healthy`) + - `drifted` - when a stack definition is different from that of the current status (considered `unhealthy`) + - `failed` - when the latest apply of the stack failed (considered `unhealthy`) + - `unknown` - the initial status of a newly created stack or the status of a stale stack (considered `unhealthy`) + - `canceled` - when a preceeding stack in a deployment failed, the subsequent stacks will be canceled (considered `unhealthy`) + + The status of a deployment has in some cases a direct relationship with the status of a stack. The status of a deployment can be any of the following: + + - `pending` - temporary status as part of a deployment about to commence. Set by the `POST` endpoint when creating a deployment + - `running` - temporary status as part of a running a deployment + - `ok` - when a deployment is considered successfully deployed with no errors. Will also set the `ok` status of the stacks in the deployment + - `failed` - when a deployment has failed to apply correctly. Will also set the `failed` status of the stacks in the deployment + - `canceled` - after a specific stack has failed, and the execution of the succeeding stacks is canceled. Will also set the `canceled` status of the stacks in the deployment + + **Terramate Cli Deployment Status** + Terramate CLI will use this endpoint to set the deployment status to one of the following: + + - `running` + - `ok` + - `failed` + - `canceled` + + **Access** + - Members of the organization with a `member` role. + - Trusted GitHub Owner. + operationId: PatchDeployment + tags: + - Deployments + security: + - apiKey: [] + - jwtToken: [] + parameters: + - $ref: '#/components/parameters/orgUUID' + - $ref: '#/components/parameters/deploymentUUID' + + requestBody: + required: true + content: + application/json: + x-ogen-json-streaming: true + schema: + type: object + properties: + stacks: + type: array + nullable: true + items: + $ref: '#/components/schemas/PatchDeploymentStacksRequestObject' + responses: + '204': + description: No Content + '401': + $ref: '#/components/responses/Unauthorized' + '404': + $ref: '#/components/responses/NotFound' + '409': + $ref: '#/components/responses/Conflict' + + /v1/workflow_deployment_groups/{org_uuid}/{workflow_deployment_group_id}: + get: + summary: Get details from a workflow deployment group + description: Get details from a workflow deployment group. + operationId: GetWorkflowDeploymentGroup + tags: + - Deployments + security: + - apiKey: [] + - jwtToken: [] + parameters: + - $ref: '#/components/parameters/orgUUID' + - $ref: '#/components/parameters/workflowDeploymentGroupID' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/WorkflowDeploymentGroup' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + + /v1/workflow_deployment_groups/{org_uuid}/{workflow_deployment_group_id}/summarize: + post: + summary: Summarize Workflow Deployment Group + description: | + Get a summary of all stack deployments including the plan and + the logs to know what happened in the deployment. + + **Access** + - Members of the organization with a `member` role. + - API key. + operationId: SummarizeWorkflowDeploymentGroup + tags: + - Deployments + parameters: + - $ref: '#/components/parameters/orgUUID' + - $ref: '#/components/parameters/workflowDeploymentGroupID' + - $ref: '#/components/parameters/qForce' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/SummaryResponse' + '401': + $ref: '#/components/responses/Unauthorized' + '404': + $ref: '#/components/responses/NotFound' + '422': + $ref: '#/components/responses/UnprocessableContent' + security: + - apiKey: [] + - jwtToken: [] + + /v1/workflow_deployment_groups/{org_uuid}/{workflow_deployment_group_id}/stacks: + get: + summary: Get stack deployments from a workflow deployment group. + description: | + Get stack deployments related to this workflow + deployment group details from a workflow deployment group + operationId: GetWorkflowGroupStacksDeployments + tags: + - Deployments + security: + - apiKey: [] + - jwtToken: [] + parameters: + - $ref: '#/components/parameters/orgUUID' + - $ref: '#/components/parameters/workflowDeploymentGroupID' + - $ref: '#/components/parameters/qPage' + - $ref: '#/components/parameters/qPerPage' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/GetWorkflowGroupStacksDeploymentsResponse' + '401': + $ref: '#/components/responses/Unauthorized' + '404': + $ref: '#/components/responses/NotFound' + + /v1/stack_deployments/{org_uuid}: + get: + summary: Get stack deployments. + description: Get stack deployments for an organization. + operationId: GetOrganizationStackDeployments + tags: + - Deployments + security: + - jwtToken: [] + - apiKey: [] + parameters: + - $ref: '#/components/parameters/orgUUID' + - $ref: '#/components/parameters/qPage' + - $ref: '#/components/parameters/qPerPage' + - $ref: '#/components/parameters/qCreatedAtFrom' + - $ref: '#/components/parameters/qCreatedAtTo' + - $ref: '#/components/parameters/qDeploymentStatuses' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/StackDeploymentsCollection' + '401': + $ref: '#/components/responses/Unauthorized' + + /v1/stack_deployments/{org_uuid}/{stack_deployment_id}: + get: + summary: Get stack deployment details. + description: Get stack deployment details. + operationId: GetStackDeployment + tags: + - Deployments + security: + - apiKey: [] + - jwtToken: [] + parameters: + - $ref: '#/components/parameters/orgUUID' + - $ref: '#/components/parameters/stackDeploymentID' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/StackDeployment' + '401': + $ref: '#/components/responses/Unauthorized' + '404': + $ref: '#/components/responses/NotFound' + + /v1/stack_deployments/{org_uuid}/{stack_deployment_id}/summarize: + post: + summary: Summarize Stack Deployment Plan + description: | + Get a summary of a stack deployment plan. + + **Access** + - Members of the organization with a `member` role. + - API key. + operationId: SummarizeStackDeployment + tags: + - Deployments + parameters: + - $ref: '#/components/parameters/orgUUID' + - $ref: '#/components/parameters/stackDeploymentID' + - $ref: '#/components/parameters/qForce' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/SummaryResponse' + '401': + $ref: '#/components/responses/Unauthorized' + '404': + $ref: '#/components/responses/NotFound' + security: + - apiKey: [] + - jwtToken: [] + + /v1/stack_deployments/{org_uuid}/reports/dora/total: + get: + summary: Get DORA report with total values. + description: | + Get DORA report with total values for stack deployments based on the filters. + operationId: GetStackDeploymentsDORATotalReport + tags: + - Deployments + - Reports + parameters: + - $ref: '#/components/parameters/orgUUID' + - $ref: '#/components/parameters/qTimezone' + - $ref: '#/components/parameters/qFromDate' + - $ref: '#/components/parameters/qToDate' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/StackDeploymentsDORATotalReport' + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + security: + - apiKey: [] + - jwtToken: [] + + /v1/stack_deployments/{org_uuid}/reports/dora/range: + get: + summary: Get DORA report within a time range. + description: | + Get DORA report within a range. + + granularity and from-to has the following relationship: + - days (available only if time range is below 32 days in total) + - weeks (available only if time range is max 1 year) + - months (available only if time range is max 2 years) + - quarters (available only if time range is max 4 years) + - years (always available) + operationId: GetStackDeploymentsDORARangeReport + tags: + - Deployments + - Reports + parameters: + - $ref: '#/components/parameters/orgUUID' + - $ref: '#/components/parameters/qTimezone' + - $ref: '#/components/parameters/qFromDate' + - $ref: '#/components/parameters/qToDate' + - $ref: '#/components/parameters/qTimeGranularity' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/StackDeploymentsDORARangeReport' + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + security: + - apiKey: [] + - jwtToken: [] + + /v1/stack_deployments/{org_uuid}/reports/dora/rating: + get: + summary: Get DORA report grouped by rating bucket. + description: | + Get DORA report for rating buckets. + + Ratings are: Elite, High, Medium and Low + operationId: GetStackDeploymentsDORARatingReport + tags: + - Deployments + - Reports + security: + - apiKey: [] + - jwtToken: [] + parameters: + - $ref: '#/components/parameters/orgUUID' + - $ref: '#/components/parameters/qTimezone' + - $ref: '#/components/parameters/qFromDate' + - $ref: '#/components/parameters/qToDate' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/DORARatingReport' + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + + /v1/review_requests/{org_uuid}: + get: + summary: List the review requests from an organization + description: | + List the review requests from an organization sorted by + updated_at in descendent order. + + Results can be sorted using `sort` parameter with following fields: + + - last_updated_at (default with descending order nulls last) + - status (where order is open, merged, closed in asc order) + - repository (asc by default) + + operationId: GetReviewRequests + tags: + - Review Requests + security: + - apiKey: [] + - jwtToken: [] + parameters: + - $ref: '#/components/parameters/orgUUID' + - $ref: '#/components/parameters/qPage' + - $ref: '#/components/parameters/qPerPage' + - $ref: '#/components/parameters/qReviewRequestsStatus' + - $ref: '#/components/parameters/qRepositories' + - $ref: '#/components/parameters/qCollaboratorID' + - $ref: '#/components/parameters/qUserUUID' + - $ref: '#/components/parameters/qAuthorUUID' + - $ref: '#/components/parameters/qReviewRequestedUUID' + - $ref: '#/components/parameters/qReviewRequestsDraft' + - $ref: '#/components/parameters/qReviewRequestsSearch' + - $ref: '#/components/parameters/qCreatedAtFrom' + - $ref: '#/components/parameters/qCreatedAtTo' + - $ref: '#/components/parameters/qSort' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/GetReviewRequestsResponse' + '401': + $ref: '#/components/responses/Unauthorized' + + /v1/review_requests/{org_uuid}/{review_request_id}: + get: + summary: Get the details of a review request. + description: | + Get the details of a review request from an organization with + the latest available preview for the affected stacks. + operationId: GetReviewRequest + tags: + - Review Requests + security: + - apiKey: [] + - jwtToken: [] + parameters: + - $ref: '#/components/parameters/orgUUID' + - $ref: '#/components/parameters/reviewRequestID' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/GetReviewRequestResponse' + '401': + $ref: '#/components/responses/Unauthorized' + '404': + $ref: '#/components/responses/NotFound' + + /v1/review_requests/{org_uuid}/reports/dora/total: + get: + summary: Get DORA report with total values. + description: | + Get DORA report with total values based on the filters. + operationId: GetReviewRequestsDORATotalReport + tags: + - Review Requests + - Reports + security: + - apiKey: [] + - jwtToken: [] + parameters: + - $ref: '#/components/parameters/orgUUID' + - $ref: '#/components/parameters/qTimezone' + - $ref: '#/components/parameters/qFromDate' + - $ref: '#/components/parameters/qToDate' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/ReviewRequestsDORATotalReport' + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + + /v1/review_requests/{org_uuid}/reports/dora/range: + get: + summary: Get DORA report within a time range. + description: | + Get DORA report within a range. + + granularity and from-to has the following relationship: + - days (available only if time range is below 32 days in total) + - weeks (available only if time range is max 1 year) + - months (available only if time range is max 2 years) + - quarters (available only if time range is max 4 years) + - years (always available) + operationId: GetReviewRequestsDORARangeReport + tags: + - Review Requests + - Reports + security: + - apiKey: [] + - jwtToken: [] + parameters: + - $ref: '#/components/parameters/orgUUID' + - $ref: '#/components/parameters/qTimezone' + - $ref: '#/components/parameters/qFromDate' + - $ref: '#/components/parameters/qToDate' + - $ref: '#/components/parameters/qTimeGranularity' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/ReviewRequestsDORARangeReport' + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + + /v1/review_requests/{org_uuid}/reports/dora/rating: + get: + summary: Get DORA report grouped by rating bucket. + description: | + Get DORA report for rating buckets. + + Ratings are: Elite, High, Medium and Low + operationId: GetReviewRequestsDORARatingReport + tags: + - Review Requests + - Reports + security: + - apiKey: [] + - jwtToken: [] + parameters: + - $ref: '#/components/parameters/orgUUID' + - $ref: '#/components/parameters/qTimezone' + - $ref: '#/components/parameters/qFromDate' + - $ref: '#/components/parameters/qToDate' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/DORARatingReport' + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + + /v1/filters/{org_uuid}/{entity}: + get: + summary: Get available filters for a provided entity. + description: | + **Get Filters for Entity** + + Retrieve all available filters for a given entity, with distinct values for pre-filling. + + Fields per entity: + - alerts: + - severity + - assignee + - stacks: + - deployment_status + - drift_status + - meta_tag + - policy_severity + - repository + - target + - status + - resources: + - extracted_account + - policy_severity + - provider + - repository + - status + - target + - technology + - type + + **Access** + - Members of the organization with any role. + operationId: GetFilters + tags: + - Filters + security: + - jwtToken: [] + parameters: + - $ref: '#/components/parameters/orgUUID' + - in: path + name: entity + required: true + description: only select stacks with specific status e.g. for dashboard view. + schema: + default: stacks + type: string + enum: + - alerts + - resources + - stacks + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/GetFiltersResponseObject' + headers: + Cache-Control: + description: Caching directives + schema: + type: string + '401': + $ref: '#/components/responses/Unauthorized' + + /v1/filters/{org_uuid}/review_requests: + get: + summary: Get available filters for review requests. + description: | + Retrieve all available filters for a review request: + + - collaborators + - repository + - status + + **Access** + - Members of the organization with any role. + operationId: GetReviewRequestFilters + tags: + - Filters + security: + - jwtToken: [] + parameters: + - $ref: '#/components/parameters/orgUUID' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/GetReviewRequestFiltersResponse' + '401': + $ref: '#/components/responses/Unauthorized' + + /v1/filters/{org_uuid}/workflow_deployment_groups: + get: + summary: Get available filters for workflow deployment groups. + description: | + Retrieve all available filters for workflow deployment groups: + + - collaborators + - repository + - status + - type + + **Access** + - Members of the organization with any role. + operationId: GetWorkflowDeploymentGroupFilters + tags: + - Filters + security: + - jwtToken: [] + parameters: + - $ref: '#/components/parameters/orgUUID' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/GetWorkflowDeploymentGroupFiltersResponse' + '401': + $ref: '#/components/responses/Unauthorized' + + /v1/apps/{org_uuid}/github/connection: + get: + summary: Generate a connection URL to GitHub App. + description: | + Visiting this endpoint will attempt to initiate a connection between the organization of the authenticated user and a github. + The user needs to be an admin of the org. If the Organization is already connected, it will error. + operationId: ConnectGithubApp + tags: + - GitHub App + parameters: + - $ref: '#/components/parameters/orgUUID' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/GetGithubAppConnectionResponse' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '409': + $ref: '#/components/responses/Conflict' + security: + - jwtToken: [] + + /v1/apps/{org_uuid}/github: + get: + summary: | + Returns the status of the github app installation for this org. + description: Returns the status of the github app installation for this org. + operationId: GithubAppStatus + tags: + - GitHub App + parameters: + - $ref: '#/components/parameters/orgUUID' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/GithubAppInstallationStatus' + '401': + $ref: '#/components/responses/Unauthorized' + security: + - jwtToken: [] + + /v1/apps/github/landing: + get: + summary: Landing page after installing GitHub App. + description: | + GitHub will redirect to this endpoint, once the user finishes installing our app. + The parameters sent along are used to verify the authenticity of this request as well as associate it with + a TMC org. + operationId: ConnectGithubAppLanding + tags: + - GitHub App + parameters: + - in: query + required: true + name: state + description: Forwarded state associated with the installation attempt + schema: + type: string + - in: query + required: true + name: setup_action + description: The action the user has taken on GitHub that led to the visit of this page + schema: + type: string + enum: + - install + # Adding more when required. + - in: query + name: installation_id + required: true + description: The github installation ID the action on GitHub affected. + schema: + type: integer + format: int64 + responses: + '302': + description: will redirect to Github settings + headers: + Location: + required: true + description: github settings uri + schema: + type: string + '400': + $ref: '#/components/responses/BadRequest' + '401': + $ref: '#/components/responses/Unauthorized' + + /v1/apps/{org_uuid}/gitlab/webhook/token: + post: + summary: Generate a new token for Gitlab webhooks + description: | + This generates a new token to see it once for an organization meant + to be used with Gitlab webhooks. + + If it is called multiple times, a new token is generated. + + Returned tokens are not stored in plain text so they cannot be + recovered. + + Only admin members or API keys can perform this operation. + + See https://docs.gitlab.com/user/project/integrations/webhooks for details. + + operationId: GenerateGitlabWebhookToken + tags: + - Gitlab + parameters: + - $ref: '#/components/parameters/orgUUID' + responses: + '200': + description: Gitlab webhook token generated + content: + application/json: + schema: + $ref: '#/components/schemas/GitlabWebhookToken' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + security: + - apiKey: [] + - jwtToken: [] + get: + summary: Get token status for Gitlab webhooks + description: | + This gets the organization-scoped token. + + See https://docs.gitlab.com/user/project/integrations/webhooks for details. + + operationId: GetGitlabWebhookTokenStatus + tags: + - Gitlab + parameters: + - $ref: '#/components/parameters/orgUUID' + responses: + '200': + description: Gitlab webhook token status + content: + application/json: + schema: + $ref: '#/components/schemas/GitlabWebhookToken' + '401': + $ref: '#/components/responses/Unauthorized' + '404': + $ref: '#/components/responses/NotFound' + security: + - apiKey: [] + - jwtToken: [] + delete: + summary: Delete token for Gitlab webhooks + description: | + This deletes the organization-scoped token. + + It successes even if no token was set + + Only admin members or API keys can perform this operation. + + operationId: DeleteGitlabWebhookToken + tags: + - Gitlab + parameters: + - $ref: '#/components/parameters/orgUUID' + responses: + '204': + description: No Content + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + security: + - apiKey: [] + - jwtToken: [] + + /v1/apps/{org_uuid}/slack/connection/authorize: + get: + summary: Generate a connection URL to Slack App. + description: | + Visiting this endpoint will attempt to initiate a connection + between the organization and a slack App. + The user needs to be an admin of the org. If the Organization is already connected, it will error. + operationId: ConnectSlackAppAuth + tags: + - Slack App + parameters: + - $ref: '#/components/parameters/orgUUID' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectSlackAppAuthResponse' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '409': + $ref: '#/components/responses/Conflict' + security: + - jwtToken: [] + + /v1/apps/slack/connection/access: + get: + summary: Landing page to end Slack App installation. + description: | + Slack will redirect to this endpoint, once the user authorises + the Slack App installation with provided scopes + This is going to perform the slack app final step to verify + the access. + The parameters sent along are used to verify the authenticity of this request as well as associate it with + a TMC org. + operationId: ConnectSlackAppAccess + tags: + - Slack App + parameters: + - in: query + required: true + name: code + description: Temporary code to access + schema: + type: string + - in: query + required: true + name: state + description: Forwarded state associated with the installation attempt + schema: + type: string + responses: + '302': + description: will redirect to Slack App settings + headers: + Location: + required: true + description: slack app settings uri + schema: + type: string + '400': + $ref: '#/components/responses/BadRequest' + + /v1/apps/{org_uuid}/slack: + get: + summary: | + Returns the status of the slack app installation for this org. + description: Returns the status of the slack app installation for this org. + operationId: SlackAppStatus + tags: + - Slack App + parameters: + - $ref: '#/components/parameters/orgUUID' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/SlackAppInstallationStatus' + '401': + $ref: '#/components/responses/Unauthorized' + security: + - jwtToken: [] + + /v1/previews/{org_uuid}: + post: + summary: Start a new preview for each stack part of a review request + description: | + Create a new preview for each stack that is part of the preview run. + + Stacks that are not yet known in the database identified by `(repository, meta_id)` will be created. + If new stacks are created, they will be assigned the status `ok` if no status is available in the payload. + + The response contains a `preview_id` for the preview run. + + The response contains `stack_preview_id` and `meta_id` for each stack that was submitted in the request payload. + + **Access** + - Members of the organization with `member` role. + - Trusted GitHub Owner. + operationId: PostStackPreviews + tags: + - Previews + security: + - apiKey: [] + - jwtToken: [] + parameters: + - $ref: '#/components/parameters/orgUUID' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/PostStackPreviewsRequestObject' + responses: + '201': + description: Created + content: + application/json: + schema: + $ref: '#/components/schemas/PostStackPreviewsResponseObject' + '401': + $ref: '#/components/responses/Unauthorized' + + /v1/previews/{org_uuid}/{preview_id}/summarize: + post: + summary: Summarize a preview + description: | + Get a summary of a full Preview/PR of resources. + It summaries what are the overall changes of a review request. + + **Access** + - Members of the organization with a `member` role. + - API key. + operationId: SummarizePreview + tags: + - Previews + parameters: + - $ref: '#/components/parameters/orgUUID' + - in: path + name: preview_id + required: true + description: Unique identifier for the preview + schema: + type: integer + format: int64 + example: 42 + - $ref: '#/components/parameters/qForce' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/SummaryResponse' + '401': + $ref: '#/components/responses/Unauthorized' + '404': + $ref: '#/components/responses/NotFound' + '422': + $ref: '#/components/responses/UnprocessableContent' + security: + - apiKey: [] + - jwtToken: [] + + /v1/stack_previews/{org_uuid}/{stack_preview_id}: + patch: + summary: Update specific attributes for the stack preview associated with `stack_preview_id` + description: Update specific attributes for the stack preview associated with `stack_preview_id` + operationId: PatchStackPreview + tags: + - Previews + security: + - apiKey: [] + - jwtToken: [] + parameters: + - $ref: '#/components/parameters/orgUUID' + - $ref: '#/components/parameters/stackPreviewID' + requestBody: + required: true + content: + application/json: + x-ogen-json-streaming: true + schema: + $ref: '#/components/schemas/PatchStackPreviewRequestObject' + responses: + '204': + description: No Content + '401': + $ref: '#/components/responses/Unauthorized' + '404': + $ref: '#/components/responses/NotFound' + + /v1/stack_previews/{org_uuid}/{stack_preview_id}/logs: + post: + summary: Persist log lines for the provided `stack_preview_id` + description: Persist log lines for the provided `stack_preview_id`. + operationId: AppendStackPreviewLogs + tags: + - Previews + security: + - apiKey: [] + - jwtToken: [] + parameters: + - $ref: '#/components/parameters/orgUUID' + - $ref: '#/components/parameters/stackPreviewID' + requestBody: + required: true + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/CommandLogLine' + responses: + '204': + description: No Content + '401': + $ref: '#/components/responses/Unauthorized' + '404': + $ref: '#/components/responses/NotFound' + get: + summary: Get a batch of logs for a stack preview + description: Get a batch of logs for a stack preview. + operationId: GetStackPreviewLogs + tags: + - Previews + security: + - apiKey: [] + - jwtToken: [] + parameters: + - $ref: '#/components/parameters/orgUUID' + - $ref: '#/components/parameters/stackPreviewID' + - $ref: '#/components/parameters/qPage' + - $ref: '#/components/parameters/qPerPage' + - $ref: '#/components/parameters/qChannel' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/GetStackPreviewLogsResponse' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + + /v1/stack_previews/{org_uuid}/{stack_preview_id}/logs/summarize: + post: + summary: Summarize stack preview logs + description: | + Get a summary using layman words of the + stack preview logs. + operationId: SummarizeStackPreviewLogs + tags: + - Previews + security: + - apiKey: [] + - jwtToken: [] + parameters: + - $ref: '#/components/parameters/orgUUID' + - $ref: '#/components/parameters/stackPreviewID' + - $ref: '#/components/parameters/qForce' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/SummaryResponse' + '401': + $ref: '#/components/responses/Unauthorized' + '404': + $ref: '#/components/responses/NotFound' + + /v1/stack_previews/{org_uuid}/{stack_preview_id}/summarize: + post: + summary: Summarize stack preview plan for changes. + description: | + Get a summary using layman words for the summary of the stack + preview changes to apply. + operationId: SummarizeStackPreview + tags: + - Previews + security: + - apiKey: [] + - jwtToken: [] + parameters: + - $ref: '#/components/parameters/orgUUID' + - $ref: '#/components/parameters/stackPreviewID' + - $ref: '#/components/parameters/qForce' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/SummaryResponse' + '401': + $ref: '#/components/responses/Unauthorized' + '404': + $ref: '#/components/responses/NotFound' + + /v1/alerts/{org_uuid}: + get: + summary: Select a set of alerts from an organization. + description: Select a set of alerts from an organization. + operationId: GetAlerts + tags: + - Alerts + security: + - apiKey: [] + - jwtToken: [] + parameters: + - $ref: '#/components/parameters/orgUUID' + - $ref: '#/components/parameters/qSeverity' + - $ref: '#/components/parameters/qNegUserUUID' + - $ref: '#/components/parameters/qUnassigned' + - $ref: '#/components/parameters/qAlertStatuses' + - $ref: '#/components/parameters/qFrom' + - $ref: '#/components/parameters/qTo' + - $ref: '#/components/parameters/qResolvedAtFrom' + - $ref: '#/components/parameters/qResolvedAtTo' + - $ref: '#/components/parameters/qAlertsSearch' + - $ref: '#/components/parameters/qPage' + - $ref: '#/components/parameters/qPerPage' + - description: | + Alerts are sorted with updated_at by default. + + Available sorts are: + - created_at[,(asc|desc) + - resolved_at[,(desc|asc) + - updated_at[,(desc|asc) + $ref: '#/components/parameters/qSort' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/AlertsCollection' + '401': + $ref: '#/components/responses/Unauthorized' + '400': + $ref: '#/components/responses/BadRequest' + + /v1/alerts/{org_uuid}/{alert_uuid}: + get: + summary: Get an alert from an organization. + description: Get an alert from an organization. + operationId: GetAlert + tags: + - Alerts + security: + - apiKey: [] + - jwtToken: [] + parameters: + - $ref: '#/components/parameters/orgUUID' + - $ref: '#/components/parameters/alertUUID' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/GetAlertResponse' + '401': + $ref: '#/components/responses/Unauthorized' + '404': + $ref: '#/components/responses/NotFound' + patch: + summary: Update an alert from an organization. + description: | + Update an alert from an organization. + + A fixed alert cannot change so it will lead a BadRequest response. + operationId: PatchAlert + tags: + - Alerts + security: + - jwtToken: [] + parameters: + - $ref: '#/components/parameters/orgUUID' + - $ref: '#/components/parameters/alertUUID' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/PatchAlertRequest' + responses: + '200': + description: | + OK with the updated alert entity. + content: + application/json: + schema: + $ref: '#/components/schemas/Alert' + '401': + $ref: '#/components/responses/Unauthorized' + '404': + $ref: '#/components/responses/NotFound' + '409': + description: A fixed alert cannot be updated + $ref: '#/components/responses/Conflict' + + /v1/alerts/{org_uuid}/{alert_uuid}/stacks: + get: + summary: Get affected stacks for an alert. + description: Get affected stacks for an alert. + operationId: GetAlertAffectedStacks + tags: + - Alerts + security: + - apiKey: [] + - jwtToken: [] + parameters: + - $ref: '#/components/parameters/orgUUID' + - $ref: '#/components/parameters/alertUUID' + - $ref: '#/components/parameters/qPage' + - $ref: '#/components/parameters/qPerPage' + - $ref: '#/components/parameters/qSort' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/AlertAffectedStacksCollection' + description: | + Status for the stack would be the status related to + the alert. So for instance, a stack current status + could be 'failed' but it may be 'ok' if the alert + was fixed for this stack in a point of time. + '401': + $ref: '#/components/responses/Unauthorized' + '404': + $ref: '#/components/responses/NotFound' + + /v1/alerts/{org_uuid}/{alert_uuid}/timeline: + get: + summary: Get an alert timeline from an alert. + description: Get an alert timeline from an alert. + operationId: GetAlertTimeline + tags: + - Alerts + security: + - apiKey: [] + - jwtToken: [] + parameters: + - $ref: '#/components/parameters/orgUUID' + - $ref: '#/components/parameters/alertUUID' + - $ref: '#/components/parameters/qPage' + - $ref: '#/components/parameters/qPerPage' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/AlertEventsCollection' + '401': + $ref: '#/components/responses/Unauthorized' + '404': + $ref: '#/components/responses/NotFound' + + /v1/resources/{org_uuid}: + get: + summary: Select a set of resources from an organization. + description: Select a set of resources from an organization. + operationId: GetResources + tags: + - Resources + security: + - apiKey: [] + - jwtToken: [] + parameters: + - $ref: '#/components/parameters/orgUUID' + - $ref: '#/components/parameters/qPage' + - $ref: '#/components/parameters/qPerPage' + - description: | + Resources are sorted with updated_at by default. + + Available sorts are: + - created_at[,(asc|desc) + - extracted_account[,(asc|desc)] + - extracted_name[,(asc|desc)] + - path[,(asc|desc)] + - policy_severity + - provider[,(asc|desc)] + - repository[,(asc|desc)] + - status[,(asc|desc)] + - target[,(asc|desc)] + - technology[,(asc|desc)] + - type[,(asc|desc)] + - updated_at[,(desc|asc) + $ref: '#/components/parameters/qSort' + - $ref: '#/components/parameters/qResourceStatuses' + - $ref: '#/components/parameters/qTechnologies' + - $ref: '#/components/parameters/qProviders' + - $ref: '#/components/parameters/qResourceTypes' + - $ref: '#/components/parameters/qRepositories' + - $ref: '#/components/parameters/qTargets' + - $ref: '#/components/parameters/qResourceAccounts' + - $ref: '#/components/parameters/qStackID' + - $ref: '#/components/parameters/qIsArchived' + - $ref: '#/components/parameters/qPolicySeverity' + - $ref: '#/components/parameters/qResourceSearch' + + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/ResourcesCollection' + '401': + $ref: '#/components/responses/Unauthorized' + '400': + $ref: '#/components/responses/BadRequest' + + /v1/resources/{org_uuid}/{resource_uuid}: + get: + summary: Get a specific resource. + description: Get a specific resource. + operationId: GetResource + tags: + - Resources + security: + - apiKey: [] + - jwtToken: [] + parameters: + - $ref: '#/components/parameters/orgUUID' + - $ref: '#/components/parameters/resourceUUID' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/Resource' + '401': + $ref: '#/components/responses/Unauthorized' + '404': + $ref: '#/components/responses/NotFound' + + /v1/resources/{org_uuid}/{resource_uuid}/deployments: + get: + summary: Get a list of deployment change sets for the resource. + description: Get a list of deployment change sets for the resource, in descending order of created_at. + operationId: GetResourceDeployments + tags: + - Resources + security: + - apiKey: [] + - jwtToken: [] + parameters: + - $ref: '#/components/parameters/orgUUID' + - $ref: '#/components/parameters/resourceUUID' + - $ref: '#/components/parameters/qPage' + - $ref: '#/components/parameters/qPerPage' + - $ref: '#/components/parameters/qSkipTotalCount' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/ResourceDeploymentsCollection' + '401': + $ref: '#/components/responses/Unauthorized' + '404': + $ref: '#/components/responses/NotFound' + + /v1/resources/{org_uuid}/{resource_uuid}/drift: + get: + summary: Get the latest drift change set for a resource + description: Get the latest drift change set for a resource, or NotFound if the latest drift check was OK or there was no check yet. + operationId: GetResourceDrift + tags: + - Resources + security: + - apiKey: [] + - jwtToken: [] + parameters: + - $ref: '#/components/parameters/orgUUID' + - $ref: '#/components/parameters/resourceUUID' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/ResourceDrift' + '401': + $ref: '#/components/responses/Unauthorized' + '404': + $ref: '#/components/responses/NotFound' + + /v1/resources/{org_uuid}/{resource_uuid}/previews: + get: + summary: | + Get a list of preview change sets for open reviews + related to the resource. + description: Get a list of preview change sets for open reviews related to the resource, in descending order of last_pushed_at. + operationId: GetResourcePreviews + tags: + - Resources + security: + - apiKey: [] + - jwtToken: [] + parameters: + - $ref: '#/components/parameters/orgUUID' + - $ref: '#/components/parameters/resourceUUID' + - $ref: '#/components/parameters/qPage' + - $ref: '#/components/parameters/qPerPage' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/ResourcePreviewsCollection' + '401': + $ref: '#/components/responses/Unauthorized' + '404': + $ref: '#/components/responses/NotFound' + + /v1/organizations/{org_uuid}/api_keys: + post: + summary: Create an API key for an organization + description: Only admin users can create API keys for an organization. + operationId: CreateOrganizationAPIKey + tags: + - Org API Keys + parameters: + - $ref: '#/components/parameters/orgUUID' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/CreateAPIKeyRequest' + responses: + '201': + description: Created + content: + application/json: + schema: + $ref: '#/components/schemas/APIKey' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + security: + - jwtToken: [] + + get: + summary: List API keys belonging to an organization + description: Only admin users can list API keys for an organization. + operationId: ListOrganizationAPIKeys + tags: + - Org API Keys + parameters: + - $ref: '#/components/parameters/orgUUID' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/APIKeysCollection' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + security: + - jwtToken: [] + + /v1/organizations/{org_uuid}/api_keys/{key_id}: + delete: + summary: Delete an API key + description: Only admin users can delete API keys. + operationId: DeleteOrganizationAPIKey + tags: + - Org API Keys + parameters: + - $ref: '#/components/parameters/orgUUID' + - in: path + name: key_id + required: true + description: UUID of the API key + schema: + type: string + format: uuid + responses: + '204': + description: No Content + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + security: + - jwtToken: [] + + /v1/license_keys/{org_uuid}: + post: + summary: Create an license key for terramate-pro for an organization + description: Create an license key for terramate-pro for an organization. + operationId: CreateLicenseKey + tags: + - License Keys + parameters: + - $ref: '#/components/parameters/orgUUID' + responses: + '201': + description: Created + content: + application/json: + schema: + $ref: '#/components/schemas/License' + '401': + $ref: '#/components/responses/Unauthorized' + security: + - apiKey: [] + - jwtToken: [] + + get: + summary: List licenses for terramate-pro belonging to an organization + description: List licenses for terramate-pro belonging to an organization + operationId: ListLicenseKeys + tags: + - License Keys + parameters: + - $ref: '#/components/parameters/orgUUID' + - $ref: '#/components/parameters/qPage' + - $ref: '#/components/parameters/qPerPage' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/LicensesCollection' + '401': + $ref: '#/components/responses/Unauthorized' + security: + - apiKey: [] + - jwtToken: [] + + /v1/license_keys/{org_uuid}/{license_id}: + get: + summary: Get details from a license for terramate-pro. + description: Get details from a license for terramate-pro. + operationId: GetLicenseKey + tags: + - License Keys + parameters: + - $ref: '#/components/parameters/orgUUID' + - in: path + name: license_id + required: true + description: UUID of the license key + schema: + type: string + format: uuid + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/License' + '401': + $ref: '#/components/responses/Unauthorized' + '404': + $ref: '#/components/responses/NotFound' + security: + - apiKey: [] + - jwtToken: [] + delete: + summary: Revoke a license for terramate-pro. + description: Revoke a license for terramate-pro. + operationId: DeleteLicenseKey + tags: + - License Keys + parameters: + - $ref: '#/components/parameters/orgUUID' + - in: path + name: license_id + required: true + description: UUID of the license key + schema: + type: string + format: uuid + responses: + '204': + description: No Content + '401': + $ref: '#/components/responses/Unauthorized' + '404': + $ref: '#/components/responses/NotFound' + security: + - apiKey: [] + - jwtToken: [] + + /v1/store/{org_uuid}/outputs: + post: + summary: Store outputs for a Terraform stack. + description: It's used for Cross-Repository Terraform Outputs sharing. + operationId: CreateStoreOutput + tags: + - Store + security: + - apiKey: [] + - jwtToken: [] + parameters: + - $ref: '#/components/parameters/orgUUID' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/PostStoreOutputRequest' + responses: + '201': + description: Created + content: + application/json: + schema: + $ref: '#/components/schemas/StoreOutput' + '401': + $ref: '#/components/responses/Unauthorized' + '409': + description: There's already a key with the same name. + $ref: '#/components/responses/Conflict' + + get: + summary: lookup an output by its composite key. + description: It's used by the Terraform Provider in the data source. + operationId: GetStoreOutputByKey + tags: + - Store + security: + - apiKey: [] + - jwtToken: [] + parameters: + - $ref: '#/components/parameters/orgUUID' + - in: query + name: repository + required: true + description: The repository where the output is stored. + schema: + type: string + example: github.com/terramate-io/terramate + - in: query + name: stack_meta_id + required: true + description: The meta id of the stack. + schema: + type: string + - in: query + name: name + required: true + description: The name of the output. + schema: + type: string + - in: query + name: target + schema: + $ref: '#/components/schemas/DeploymentTarget' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/StoreOutput' + '401': + $ref: '#/components/responses/Unauthorized' + '404': + $ref: '#/components/responses/NotFound' + + /v1/store/{org_uuid}/outputs/{output_uuid}: + get: + summary: Get an output by ID. + description: It's used by the Terraform Provider in the refresh phase in order to check output status and content. + operationId: GetStoreOutputById + tags: + - Store + security: + - apiKey: [] + - jwtToken: [] + parameters: + - $ref: '#/components/parameters/orgUUID' + - $ref: '#/components/parameters/outputUUID' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/StoreOutput' + '401': + $ref: '#/components/responses/Unauthorized' + '404': + $ref: '#/components/responses/NotFound' + delete: + summary: Delete an output by ID. + description: It's used by the Terraform Provider when a resource is deleted. + operationId: DeleteStoreOutput + tags: + - Store + security: + - apiKey: [] + - jwtToken: [] + parameters: + - $ref: '#/components/parameters/orgUUID' + - $ref: '#/components/parameters/outputUUID' + responses: + '204': + description: Deleted successfully + '401': + $ref: '#/components/responses/Unauthorized' + '404': + $ref: '#/components/responses/NotFound' + + /v1/store/{org_uuid}/outputs/{output_uuid}/value: + put: + summary: Update the output value + description: It's used by the Terraform Provider in the Terraform apply phase to update the output content. + operationId: PutStoreOutputValue + tags: + - Store + security: + - apiKey: [] + - jwtToken: [] + parameters: + - $ref: '#/components/parameters/orgUUID' + - $ref: '#/components/parameters/outputUUID' + requestBody: + required: true + content: + text/plain: + schema: + type: string + + responses: + '204': + description: Updated successfully + '401': + $ref: '#/components/responses/Unauthorized' + '404': + $ref: '#/components/responses/NotFound' + +components: + responses: + BadRequest: + description: Bad Request + content: + application/json: + schema: + $ref: '#/components/schemas/GenericErrorResponseObject' + Unauthorized: + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/GenericErrorResponseObject' + Forbidden: + description: Forbidden + content: + application/json: + schema: + $ref: '#/components/schemas/GenericErrorResponseObject' + NotFound: + description: Not Found + content: + application/json: + schema: + $ref: '#/components/schemas/GenericErrorResponseObject' + Conflict: + description: Conflict + content: + application/json: + schema: + $ref: '#/components/schemas/GenericErrorResponseObject' + NotImplemented: + description: Not Implemented + content: + application/json: + schema: + $ref: '#/components/schemas/GenericErrorResponseObject' + UnprocessableContent: + description: Unprocessable Content + content: + application/json: + schema: + $ref: '#/components/schemas/GenericErrorResponseObject' + GetUserOrgMembershipsResp: + description: Found + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/GetMembershipsResponseObject' + + parameters: + orgUUID: + in: path + name: org_uuid + description: UUID of the organization + schema: + type: string + format: uuid + required: true + deploymentUUID: + in: path + name: deployment_uuid + description: UUID of the deployment + schema: + type: string + format: uuid + required: true + outputUUID: + in: path + name: output_uuid + description: UUID of the output + schema: + type: string + format: uuid + required: true + stackID: + in: path + name: stack_id + description: ID of the Stack + schema: + type: integer + format: int64 + required: true + memberID: + in: path + name: member_id + description: ID of the Member + schema: + type: integer + format: int64 + required: true + driftID: + in: path + name: drift_id + description: ID of the Stack (Using representational integer ID) + schema: + type: integer + format: int64 + required: true + workflowDeploymentGroupID: + in: path + name: workflow_deployment_group_id + required: true + description: Unique identifier for the workflow deployment group + schema: + type: integer + format: int64 + example: 42 + stackDeploymentID: + in: path + name: stack_deployment_id + description: Stack deployment identifier + schema: + type: integer + format: int64 + example: 42 + required: true + stackPreviewID: + in: path + name: stack_preview_id + description: The ID of the stack preview + schema: + type: integer + format: int64 + required: true + reviewRequestID: + in: path + name: review_request_id + description: The ID of the review request + schema: + type: integer + format: int64 + required: true + alertUUID: + in: path + name: alert_uuid + description: The ID of the alert + schema: + type: string + format: uuid + example: 01c9fb02-7648-45f5-9bdd-f2c27e59c448 + required: true + resourceUUID: + in: path + name: resource_uuid + description: The ID of the resource + schema: + type: string + format: uuid + example: 01c9fb02-7648-45f5-9bdd-f2c27e59c448 + required: true + orgShortName: + in: path + name: name + description: The organization name. + required: true + schema: + $ref: '#/components/schemas/OrgShortName' + qPage: + in: query + name: page + description: Page number to return + schema: + type: integer + format: int64 + minimum: 1 + example: 1 + qPerPage: + in: query + name: per_page + description: Number of elements per page + schema: + type: integer + format: int64 + minimum: 1 + default: 10 + qSkipTotalCount: + in: query + name: skip_total_count + description: If set true, don't calculate the 'total' count in paginated results. Defaults to false. + schema: + type: boolean + default: false + qRepositories: + in: query + name: repository + required: false + description: | + Only select entities whose repository matches any + of the strings in the provided array. Only full strings will + be matched. + explode: false + schema: + type: array + items: + type: string + example: github.com/terramate-io/tmc-local-testing + qTargets: + in: query + name: target + required: false + description: | + Only select entities whose deployment target matches any + of the strings in the provided array. Only full strings will + be matched. + explode: false + schema: + type: array + items: + $ref: '#/components/schemas/DeploymentTarget' + qStackID: + in: query + name: stack_id + required: false + description: | + Only select entities whose stack id matches the given value. + schema: + type: integer + format: int64 + + qStatuses: + in: query + name: status + required: false + description: only select stacks with specific status e.g. for dashboard view. + explode: false + schema: + type: array + items: + type: string + examples: + - AllPossibleValues: + value: [all, unhealthy, healthy, drifted, failed, ok] + qDeploymentStatuses: + in: query + name: deployment_status + required: false + description: | + Only select stacks with these last known + deployment status. + explode: false + schema: + type: array + items: + type: string + examples: + - AllPossibleValues: + value: [canceled, failed, ok, pending, running] + qDriftStatuses: + in: query + name: drift_status + required: false + description: | + Only select entities with these last known drift status. + explode: false + schema: + type: array + items: + type: string + examples: + - AllPossibleValues: + value: [ok, drifted, failed] + qDraft: + in: query + name: draft + required: false + description: | + Only select stacks with the provided draft value. + schema: + type: boolean + example: false + qIsArchived: + in: query + name: is_archived + required: false + description: | + true - Only select entities that are archived. + false - Only select entities that are not archived (default). + true,false - Select all entities. + explode: false + schema: + type: array + items: + type: boolean + examples: + - AllPossibleValues: + value: [true, false] + qGroupingKey: + in: query + name: grouping_key + required: false + description: | + Only select entities with this grouping key + schema: + type: string + example: 'repo+id+1' + qSearch: + in: query + name: search + required: false + description: | + Only select stacks where the title, description or path + includes the given search string. + If string contains ',' or spaces all terms will be searched and + matched. + Search terms should be a valid regular expression. + schema: + type: string + example: stackTitle + qReviewRequestsSearch: + in: query + name: search + required: false + description: | + Select review_requests where the following attributes match the provided + search query. If string contains a comma or spaces all terms will be + searched and matched. + - pull request number + - pull request title + - commit SHA + - commit title + - branch + - base_branch + schema: + type: string + example: 'fix,main' + qReviewRequestsStatus: + in: query + name: status + required: false + description: | + Review request status like open, closed or merged. + explode: false + schema: + type: array + items: + $ref: '#/components/schemas/ReviewRequestStatus' + qReviewRequestsDraft: + in: query + name: draft + required: false + description: | + Only select review requests with the provided draft value. + schema: + type: boolean + example: false + qMetaID: + in: query + name: meta_id + required: false + description: | + Only select stacks where meta_id matches this value. + schema: + type: string + example: 4106cc6-ec4b-4ef7-a0eb-d927f860e176 + qDeploymentUUID: + in: query + name: deployment_uuid + description: Deployment UUID + schema: + $ref: '#/components/schemas/DeploymentUUID' + qMetaTag: + in: query + name: meta_tag + required: false + description: | + Only select stacks where the meta_tags includes the given tag. + If they are provided multiple times *ALL* values should be + contained in the meta_tags. If the string contains ',' then + *ANY* value should be in the meta_tags. + schema: + type: array + items: + type: string + examples: + - TwoTagsExample: + Value: [tag_a, tag_b] + qSort: + name: sort + in: query + description: | + **Sorting** + + Allows for sorting of the returned entities based on specified fields and order. + Multiple fields can be provided with their sorting direction, separated by commas. + For example, to sort by 'updated_at' in ascending order and then by 'path' in descending order, + the parameter can be specified as follows: `sort=updated_at,asc&sort=path,desc`. + By default, entities are sorted by 'updated_at' in descending order. + required: false + schema: + type: array + items: + type: string + examples: + - UpdatedAtDescPathDescExample: + Value: ['updated_at,asc', 'path,desc'] + qChannel: + name: channel + in: query + description: | + OS Channel to query information from. + schema: + $ref: '#/components/schemas/StreamOSChannel' + qAuthTypes: + in: query + name: type + required: false + description: | + Only select entities whose auth type was in provided array. + explode: false + schema: + type: array + items: + $ref: '#/components/schemas/AuthType' + qWorkflowDeploymentStatuses: + in: query + name: status + required: false + description: | + Only entities whose status matches any of + provided input elements. + explode: false + schema: + type: array + items: + $ref: '#/components/schemas/WorkflowDeploymentGroupStatus' + qWorkflowDeploymentSearch: + in: query + name: search + required: false + description: | + Select deployments where the following attributes match the provided + search query. If string contains a comma or spaces all terms will be + searched and matched. + - pull request number + - pull request title + - commit SHA + - commit title + - branch + - base_branch + schema: + type: string + example: 'fix,main' + qCollaboratorID: + in: query + name: collaborator_id + required: false + description: | + Only collaborators whose identifier is set. + explode: false + schema: + type: array + items: + type: integer + format: int64 + example: 42 + qAuthorUUID: + in: query + name: author_uuid + required: false + description: | + Only review requests whose author is the TMC User UUID. + + This is an interim solution until a flexible filter is implemented. + explode: false + schema: + type: array + items: + type: string + format: uuid + example: 183e0589-65a8-48b8-bd90-6ee89e0682aa + qSeverity: + in: query + name: severity + required: false + description: | + Only alerts with this grade of severity + explode: false + schema: + type: array + items: + $ref: '#/components/schemas/AlertSeverityRank' + qAlertStatuses: + in: query + name: status + required: false + description: | + Only alerts with the provided status + explode: false + schema: + type: array + items: + type: string + enum: + - open + - resolved + - fixed + - closed + qUserUUID: + in: query + name: user_uuid + required: false + description: | + Only entities that relates to those users. + explode: false + schema: + type: array + items: + type: string + format: uuid + example: 683e0589-65a8-48b8-bd90-6ee89e0682ab + qNegUserUUID: + in: query + name: user_uuid + required: false + description: | + Only entities that relates to those users. + Multiple fields can be provided separated by commas. + Negation can be achieved by prefixing a value with `!`. For example: + `!uuid1,uuid2` would include alerts where assignees include uuid2 but not uuid1. + schema: + type: string + example: '!683e0589-65a8-48b8-bd90-6ee89e0682ab,11111111-1111-1111-1111-111111111111' + qUnassigned: + in: query + name: unassigned + required: false + description: | + Only entities that are not assigned to a user. + Setting this value to false has no effect and is the same as omitting it. + schema: + type: boolean + qFrom: + in: query + name: from + required: false + description: | + Only entities that has a timestamp from this date including + the date. + schema: + type: string + format: date-time + example: '2024-04-11T20:31:00Z' + qTo: + in: query + name: to + required: false + description: | + Only entities that has a timestamp up to this timestamp including + the timestamp. + schema: + type: string + format: date-time + example: '2024-04-11T21:31:00Z' + qFromDate: + in: query + name: from + required: false + description: | + Only entities that has a timestamp from this date including + the date. + schema: + type: string + format: date + example: 2024-04-11 + qToDate: + in: query + name: to + required: false + description: | + Only entities that has a date up to this date including + the date. + schema: + type: string + format: date + example: 2024-04-11 + qResolvedAtFrom: + in: query + name: resolved_at_from + required: false + description: | + Only entities that has a resolved_at timestamp from this date including + the date. + schema: + type: string + format: date-time + example: '2024-04-11T20:31:00Z' + qResolvedAtTo: + in: query + name: resolved_at_to + required: false + description: | + Only entities that has a resolved_at timestamp up to this date including + the date. + schema: + type: string + format: date-time + example: '2024-04-11T21:31:00Z' + qAlertsSearch: + in: query + name: search + required: false + description: | + Select alerts where the following attributes match the provided + search query. Match is done using case-insensitive regular + expression search. If string contains a comma or spaces all terms will be + searched and matched. + - title + schema: + type: string + example: 'fix,ut' + qResourceStatuses: + in: query + name: status + required: false + description: | + Only select resources with these statuses. + explode: false + schema: + type: array + items: + $ref: '#/components/schemas/ResourceStatus' + examples: + - OKOrDriftedExample: + value: [ok, drifted] + qResourceAccounts: + in: query + name: extracted_account + required: false + description: | + Only select resources with these accounts. + explode: false + schema: + type: array + items: + type: string + example: acme + qTechnologies: + in: query + name: technology + required: false + description: | + Only select resources with these technologies. + explode: false + schema: + type: array + items: + type: string + examples: + - TerraformOrOpenTofuExample: + value: [terraform, opentofu] + qProviders: + in: query + name: provider + required: false + description: | + Only select resources with these providers. + explode: false + schema: + type: array + items: + type: string + examples: + - AWSOrGcloudExample: + value: [aws, gcloud] + qResourceTypes: + in: query + name: type + required: false + description: | + Only select resources with these types. + explode: false + schema: + type: array + items: + type: string + examples: + - VPCOrLoadBalancerExample: + value: [vpc, loadbalancer] + qResourceSearch: + in: query + name: search + required: false + description: | + Select resource where the following attributes match the provided + search query. Match is done using case-insensitive regular + expression search. If string contains a comma or spaces all terms will be + searched and matched. The following attributes will be searched: + - stack title, description, path + - resource extracted name, extracted id, address + schema: + type: string + example: stackTitle + qPolicySeverity: + in: query + name: policy_severity + required: false + description: | + Only select entities that have specific policy check results. + Available options: + - missing: No analysis data available. + - none: No checks defined for the entity. + - passed: Entity has no violations. + - low: Entity has violations with low severity. + - medium: Entity has violations with medium severity. + - high: Entity has violations with high severity. + explode: false + schema: + type: array + items: + type: string + enum: + - missing + - none + - passed + - low + - medium + - high + qWidgetUserUUID: + in: query + name: user_uuid + required: false + description: | + Only return stats related to this user uuid. + schema: + type: string + format: uuid + qDays: + in: query + name: days + required: false + description: | + Only select entities in time range (T-days, T). + T the current time by default, or it can be modified with `offset_days`. + If days is not set, all entities before T are selected. + schema: + type: integer + qOffsetDays: + in: query + name: offset_days + required: false + description: | + Shift the selection range offset_days into the past. + For example: days=7, offset_days=7 is the range 14d ago to 7d ago. + schema: + type: integer + qReviewRequestedUUID: + in: query + name: review_requested_uuid + required: false + description: | + Only return entities where the given user was a requested reviewer. + schema: + type: string + format: uuid + qCreatedAtFrom: + in: query + name: created_at_from + required: false + description: | + Only entities that has a created_at timestamp from this date including + the date. + schema: + type: string + format: date-time + example: '2024-04-11T20:31:00Z' + qCreatedAtTo: + in: query + name: created_at_to + required: false + description: | + Only entities that has a created_at timestamp up to this date including + the date. + schema: + type: string + format: date-time + example: '2024-04-11T21:31:00Z' + qStartedAtFrom: + in: query + name: started_at_from + required: false + description: | + Only entities that has a started_at timestamp from this date including + the date. + schema: + type: string + format: date-time + example: '2024-04-11T20:31:00Z' + qStartedAtTo: + in: query + name: started_at_to + required: false + description: | + Only entities that has a started_at timestamp up to this date including + the date. + schema: + type: string + format: date-time + example: '2024-04-11T21:31:00Z' + qFinishedAtFrom: + in: query + name: finished_at_from + required: false + description: | + Only entities that has a finished_at timestamp from this date including + the date. + schema: + type: string + format: date-time + example: '2024-04-11T20:31:00Z' + qFinishedAtTo: + in: query + name: finished_at_to + required: false + description: | + Only entities that has a finished_at timestamp up to this date including + the date. + schema: + type: string + format: date-time + example: '2024-04-11T21:31:00Z' + qForce: + in: query + name: force + required: false + description: | + Force the request to avoid any cached content. + schema: + type: boolean + example: true + qTimezone: + in: query + name: timezone + required: false + description: | + The time zone defined by IANA. + schema: + type: string + example: Europe/Berlin + qTimeGranularity: + in: query + name: granularity + required: false + description: | + The time granularity to use. + schema: + type: string + enum: + - days + - weeks + - months + - quarters + - years + default: days + example: days + + schemas: + WellKnownCLI: + type: object + required: + - required_version + properties: + required_version: + type: string + description: | + A version constraint indicating the required Terramate CLI version. + For more information see https://pkg.go.dev/github.com/hashicorp/go-version@v1.7.0 + example: '>=0.8.0' + + DeploymentTarget: + type: string + description: Name of a deployment target. + example: staging + pattern: ^[a-z0-9][-_a-z0-9]*[a-z0-9]$ + + UserProfile: + allOf: + - $ref: '#/components/schemas/User' + - type: object + required: + - email + - job_title + properties: + email: + type: string + example: marius@terramate.io + job_title: + type: string + example: CTPO + + GenericErrorResponseObject: + type: object + required: + - error_code + - error_message + properties: + error_code: + description: Numeric error code + type: integer + example: 1 + error_message: + description: Human readable error message + type: string + example: Unknown error occured. + + PostUsersRequestObject: + oneOf: + - type: 'null' + - type: object + properties: + display_name: + $ref: '#/components/schemas/UserDisplayName' + job_title: + $ref: '#/components/schemas/UserPosition' + additionalProperties: false + + GetMembershipsResponseObject: + type: object + required: + - member_id + - org_display_name + - org_name + - org_uuid + properties: + member_id: + description: ID of the Member + type: integer + format: int64 + org_display_name: + type: string + example: Terramate GmbH + org_domain: + type: string + example: terramate.io + org_name: + type: string + example: terramate + org_uuid: + type: string + format: uuid + example: 7af57dbe-4f8a-4046-b5f7-135a79f478b3 + role: + $ref: '#/components/schemas/MemberRole' + status: + $ref: '#/components/schemas/MembershipStatus' + + DriftStatus: + type: string + enum: + - ok + - drifted + - failed + + Provisioner: + type: string + enum: + - terraform + - opentofu + + GetDriftsResponseObject: + type: object + required: + - paginated_result + properties: + drifts: + type: array + items: + $ref: '#/components/schemas/Drift' + paginated_result: + $ref: '#/components/schemas/PaginatedResultObject' + + Drift: + description: | + Representation of a drift. + Note: + - `drift_details` and `stack` are not populated in responses that list drifts. + - either `auth_user` or `auth_trust` may be filled, based on `auth_type` value. + type: object + required: + - id + - org_uuid + - stack_id + - status + - metadata + properties: + started_at: + type: string + format: date-time + description: The time the drift run started. + finished_at: + type: string + format: date-time + description: | + The time the drift run finished. This field is optional, but if the started_at field is set, + this field must be set as well. + id: + type: integer + format: int64 + description: ID of the Drift. + auth_type: + $ref: '#/components/schemas/AuthType' + auth_user: + $ref: '#/components/schemas/UserInfo' + auth_trust: + $ref: '#/components/schemas/TrustInfo' + org_uuid: + type: string + format: uuid + description: UUID of org the Drift belongs to. + stack_id: + type: integer + format: int64 + description: ID of stack the Drift belongs to. + stack: + $ref: '#/components/schemas/Stack' + status: + $ref: '#/components/schemas/DriftStatus' + metadata: + $ref: '#/components/schemas/DeploymentMetadata' + drift_details: + $ref: '#/components/schemas/ChangesetDetails' + grouping_key: + type: string + description: | + Key to group drifts and related to workflow deployment + groups with the same grouping key. + + This key is only set if the drift is run within CI/CD. + example: 'repo+id+1' + cmd: + description: | + Command executed to run the drift check. + type: array + items: + type: string + example: [terraform, plan] + + UserInfo: + type: object + properties: + display_name: + $ref: '#/components/schemas/UserDisplayName' + position: + $ref: '#/components/schemas/UserPosition' + user_picture_url: + $ref: '#/components/schemas/UserPictureURL' + + TrustInfo: + type: object + required: + - auth_id + properties: + auth_id: + type: string + description: the id of the entity that was authorized + example: terramate-io/somerepo/.github/workflows/check-all.yml@refs/heads/main + + ChangesetDetails: + type: object + properties: + provisioner: + $ref: '#/components/schemas/Provisioner' + serial: + type: integer + description: | + The serial for this changeset. + This value is extracted from the .tfstate and incremented by Terraform as plans are applied. + We use the serial to detect stale changesets. + format: int64 + changeset_ascii: + type: string + description: The changeset in ASCII format. + maxLength: 4194304 + changeset_json: + type: string + description: | + The changeset as a stringified JSON. + Value is always stored, but only returned for previews and + drift details. + Only "resource_changes" and "output_changes" keys are returned if present. + maxLength: 16777216 + + PostDriftStatusRequestObject: + type: object + required: + - stack + - drift_status + properties: + stack: + description: Stack for which we want to create a drift status. + type: object + required: + - path + - meta_id + - repository + properties: + path: + description: The path of the stack within the repository + type: string + example: /path/to/stack + meta_id: + description: The Terramate Metadata `stack.id`. Unique within the repository. This ID can be chosen by the user. + type: string + example: 4106cc6-ec4b-4ef7-a0eb-d927f860e176 + repository: + description: The repository of the stack + type: string + example: github.com/terramate-io/iac-github + target: + description: Deployment target of the stack. `default` if not set. + $ref: '#/components/schemas/DeploymentTarget' + from_target: + description: Migrate from stack with previous deployment target. Has no effect if `from_target` doesn't exist or `target` already exists. + $ref: '#/components/schemas/DeploymentTarget' + default_branch: + description: The default branch for the repository of the stack + type: string + default: main + example: main + meta_name: + description: The Terramate Metadata `stack.name`. This name is used to identify the stack in the UI. + type: string + example: My Stack + meta_description: + description: The Terramate Metadata `stack.description`. This description is used to identify the stack in the UI. + type: string + example: My Stack + meta_tags: + description: The Terramate Metadata `stack.tags`. This tags are used to identify the stack in the UI. + type: array + example: + - prod + - tag + items: + type: string + metadata: + $ref: '#/components/schemas/DeploymentMetadata' + drift_status: + $ref: '#/components/schemas/DriftStatus' + drift_details: + $ref: '#/components/schemas/ChangesetDetails' + started_at: + type: string + format: date-time + description: The time the drift run started. + finished_at: + type: string + format: date-time + description: | + The time the drift run finished. This field is optional, but if the started_at field is set, + this field must be set as well. + command: + description: | + Command executed to run the drift check. + type: array + items: + type: string + example: [terraform, plan] + + Organization: + type: object + required: + - name + properties: + name: + $ref: '#/components/schemas/OrgShortName' + display_name: + $ref: '#/components/schemas/OrgDisplayName' + domain: + $ref: '#/components/schemas/OrgDomainName' + github_owner: + $ref: '#/components/schemas/OrgGithubOwner' + gitlab_owner: + $ref: '#/components/schemas/OrgGitlabOwner' + slack_webhook: + description: | + The Slack Webhook set for this organization used to send notifications. + Must be an empty string or a valid Slack webhook URL. + type: string + example: 'https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX' + pattern: ^$|^https://hooks\.slack\.com/services/T(.+?)/B(.+?)/(.+)$ + + PostOrganizationsResponseObject: + $ref: '#/components/schemas/GetMembershipsResponseObject' + + PatchOrganizationRequestObject: + type: object + properties: + display_name: + $ref: '#/components/schemas/OrgDisplayName' + domain: + $ref: '#/components/schemas/OrgDomainName' + github_owner: + $ref: '#/components/schemas/OrgGithubOwner' + gitlab_owner: + $ref: '#/components/schemas/OrgGitlabOwner' + slack_webhook: + description: | + The Slack Webhook set for this organization used to send notifications. + Must be an empty string or a valid Slack webhook URL. + type: string + example: 'https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX' + pattern: ^$|^https://hooks\.slack\.com/services/T(.+?)/B(.+?)/(.+)$ + + # refactor, we return the full object after a patch even if partial data was sent + PatchOrganizationResponseObject: + $ref: '#/components/schemas/Organization' + + EnterpriseOrganization: + type: object + properties: + enterprise_org_id: + type: string + example: org_0123232dada + + CreateMembershipRequest: + oneOf: + - type: 'null' + - $ref: '#/components/schemas/CreateMembershipRequestBody' + + CreateMembershipRequestBody: + type: object + required: + - invite_email + properties: + invite_email: + type: string + format: email + example: soeren@terramate.io + role: + $ref: '#/components/schemas/MemberRole' + + CreateMembershipResponse: + type: object + required: + - member_id + - role + - status + properties: + member_id: + type: integer + format: int64 + description: The Member ID + example: 42 + invited_email: + type: string + example: soeren@terrmate.io + role: + $ref: '#/components/schemas/MemberRole' + status: + $ref: '#/components/schemas/MemberStatus' + + PatchOrganizationsMembersRequestObject: + type: object + properties: + role: + $ref: '#/components/schemas/MemberRole' + status: + $ref: '#/components/schemas/MemberStatus' + + PatchOrganizationsMembersResponseObject: + $ref: '#/components/schemas/Member' + + GetOrganizationsMembersResponse: + type: object + required: + - members + - paginated_result + properties: + members: + type: array + items: + $ref: '#/components/schemas/Member' + paginated_result: + $ref: '#/components/schemas/PaginatedResultObject' + + GetDashboardStacksResponseObject: + type: object + required: + - stacks_status + properties: + stacks_status: + type: object + required: + - ok_count + - drifted_count + - failed_count + properties: + ok_count: + type: integer + description: The total number of stacks with status ok (healthy) + example: 1337 + drifted_count: + type: integer + description: The total number of stacks with status drifted (unhealthy) + example: 42 + failed_count: + type: integer + description: The total number of stacks with status failed (unhealthy) + example: 5 + + GetStacksResponseObject: + type: object + required: + - paginated_result + properties: + stacks: + type: array + items: + $ref: '#/components/schemas/Stack' + paginated_result: + $ref: '#/components/schemas/PaginatedResultObject' + + StackStatus: + description: The last known status of the stack at `updated_at` time. + type: string + enum: + - canceled + - drifted + - failed + - ok + - unknown + + Stack: + type: object + required: + - stack_id + - repository + - path + - default_branch + - meta_id + - status + - created_at + - updated_at + - seen_at + - deployment_status + - drift_status + - draft + - is_archived + properties: + stack_id: + type: integer + format: int64 + description: Globally unique Terramate Cloud Stack ID. + example: 1337 + repository: + type: string + description: Git repository + example: github.com/terramate-io/iac-gcloud + target: + $ref: '#/components/schemas/DeploymentTarget' + path: + type: string + description: The path of the stack within the repository + example: /path/to/stack + default_branch: + description: The default branch for the repository of the stack + type: string + example: main + meta_id: + type: string + description: The Terramate Metadata `stack.id`. Unique within the repository. This ID can be chosen by the user. + example: a754255a-c92a-4aeb-9668-bd3ce21dc8a2 + meta_name: + type: string + description: The Terramate Metadata `stack.name`. + example: My Stack Name + meta_description: + type: string + description: The Terramate Metadata `stack.description`. + example: My Stack Description + meta_tags: + type: array + items: + type: string + description: The Terramate Metadata `stack.tags`. + example: + - tagA + - tagB + status: + $ref: '#/components/schemas/StackStatus' + created_at: + type: string + format: date-time + description: The time the stack was first registered with Terramate Cloud + updated_at: + type: string + format: date-time + description: The time the stacks status was last updated. + seen_at: + type: string + format: date-time + description: The time the stack was last seen. + is_archived: + description: True if this is an archived stack. + type: boolean + archived_at: + type: string + format: date-time + description: If present, then time when the stack was archived. + archived_by_user_uuid: + type: string + format: uuid + description: If archived_at is set, then UUID of the user who archived the stack, if available. + unarchived_at: + type: string + format: date-time + description: If present, then time when the stack was unarchived. + unarchived_by_user_uuid: + type: string + format: uuid + description: If unarchived_at is set, then UUID of the user who unarchived the stack, if available. + deployment_status: + $ref: '#/components/schemas/DeploymentStatus' + drift_status: + type: string + description: | + Drift status are defined in DriftStatus schema. + But here it's possible to have an `unknown` + drift status, which cannot be written by clients, + when the stack has been created in a + deployment and no drift run has happened yet. + + enum: + - ok + - drifted + - failed + - unknown + draft: + type: boolean + description: | + This is set only if stack was created via + preview and not under deployment or drift. + related_stacks: + type: array + nullable: true + description: Stacks from other targets with the same `repository` and `meta_id`. Only set when getting a single stack. + items: + type: object + required: + - stack_id + - target + properties: + stack_id: + type: integer + format: int64 + target: + type: string + resources: + description: Only set when getting the stack list and stack details. + $ref: '#/components/schemas/StackResources' + + StackResources: + type: object + description: | + Resources related data for this stack. + Only set when getting the stack list. + required: + - count + properties: + count: + type: integer + format: int64 + minimum: 0 + description: | + Last known number of resources that are defined for + this stack in the cloud state. + example: 42 + policy_check: + description: Lask known policy check done to this stack. + $ref: '#/components/schemas/StackPolicyCheck' + + StackPolicyCheck: + type: object + description: Policy check from a stack + required: + - created_at + - passed + - counters + properties: + created_at: + type: string + format: date-time + description: Define when the policy analysis was performed. + example: '2024-09-12T07:06:00Z' + passed: + type: boolean + description: Define if the stack passed the policy check. + example: false + counters: + $ref: '#/components/schemas/PolicyCheckCounters' + + PatchStackRequest: + description: | + All elements in the request set will be updated in the related Stack entity. + type: object + properties: + is_archived: + description: | + If true, archive the stack; does nothing if it was already archived. + If false, unarchive the stack; does nothing if it was not archived. + type: boolean + + DeploymentStatus: + description: The last known status of the stack deployment at `updated_at` time. + type: string + enum: + - canceled + - failed + - ok + - pending + - running + + WorkflowDeploymentGroupStatus: + description: The last status of the deployment group. + type: string + enum: + - failed + - processing + - ok + + DeploymentMetadata: + type: object + additionalProperties: {} + description: Arbitrary metadata for deployment. + + ReviewRequest: + type: object + description: The associated Review Request, if any + required: + - review_request_id + + properties: + review_request_id: + type: integer + format: int64 + description: The ID of the review request + example: 42 + platform: + description: The VCS platform also known as vendor. + type: string + example: github + repository: + description: Git repository at time of deployment + type: string + example: github.com/terramate-io/iac-gcloud + commit_sha: + description: Commit SHA (if not stale, uncommitted, etc) + type: string + example: deadc0decafebabecafed00ddeadbeeff00dface + number: + description: The number/id of the pull/merge request within the repository + type: integer + example: 23 + title: + type: string + description: The title of the pull/merge request + example: 'feat: Add feature X' + description: + type: string + description: The description of the pull/merge request + example: | + My Change Description + + with a lot of details. + url: + description: Link to the pull request (if in CI/CD) + type: string + format: uri + example: https://github.com/terramate-io/iac-gcloud/pull/666 + author: + description: | + This field is deprecated use collaborators + instead. + deprecated: true + $ref: '#/components/schemas/VCSUser' + status: + $ref: '#/components/schemas/ReviewRequestStatus' + platform_updated_at: + type: string + format: date-time + description: | + The last timestamp the review request was + updated in the VCS. + platform_created_at: + type: string + format: date-time + description: The timestamp when the review request was created in the VCS. + platform_pushed_at: + type: string + format: date-time + description: The timestamp when the last commit was pushed to the review request. + platform_merged_at: + type: string + format: date-time + description: The timestamp when the review request was merged. + reviewers: + type: array + deprecated: true + description: | + List of reviewers login names. + Deprecated, use collaborators property instead. + items: + $ref: '#/components/schemas/VCSUser' + example: [{login: reviewer1}, {login: reviewer2}] + branch: + type: string + description: Name for the branch of this review request + example: my_awesome_feature + base_branch: + type: string + description: | + Name for the branch the review request is + attempted to be merged. + example: main + draft: + type: boolean + description: | + Is this review request in the draft state? + review_decision: + $ref: '#/components/schemas/ReviewRequestReviewDecision' + changes_requested_count: + description: The number of reviews with requested changes + type: integer + example: 1 + approved_count: + description: The number of approvals + type: integer + example: 1 + checks_total_count: + description: The number of total checks (including skipped ones) + type: integer + example: 1 + checks_failure_count: + description: The number of failed checks + type: integer + example: 1 + checks_success_count: + description: The number of successful checks + type: integer + example: 1 + labels: + description: List of labels for the review request + type: array + nullable: true + items: + $ref: '#/components/schemas/VCSLabel' + preview: + $ref: '#/components/schemas/Preview' + metrics: + $ref: '#/components/schemas/DORAMetrics' + collaborators: + type: array + items: + $ref: '#/components/schemas/ReviewRequestCollaborator' + + DORAMetrics: + type: object + description: DevOps Research and Assessment metrics + properties: + last_drafted_at: + type: string + format: date-time + description: | + Timestamp when the review request was last put + as draft. + last_ready_for_review_at: + type: string + format: date-time + description: | + Timestamp when the review request was last put + as ready for review. + ready_for_review_count: + type: integer + min: 0 + example: 1 + description: | + Number of times the review request was ready for review. + review_total_duration_seconds: + type: integer + format: int64 + example: 1 + description: | + Total time of review until ready for merge. + If time is below 1s, it is set to 1. + last_mergeable_at: + type: string + format: date-time + description: | + Timestamp when the review request was last put + as ready for merge. + mergeable_count: + type: integer + min: 0 + example: 1 + description: | + Number of times the review request was ready for merge. + mergeable_total_duration_seconds: + type: integer + format: int64 + example: 2323 + description: | + Total time of being ready for merge until merged. + If time is below 1s, it is set to 1. + last_closed_at: + type: string + format: date-time + description: | + Timestamp when the review request was last closed. + It does not matter if it was merged or not. + deployment: + $ref: '#/components/schemas/DeploymentMetrics' + + DeploymentMetrics: + type: object + description: Metrics related to deployment. + required: + - started_at + properties: + started_at: + type: string + format: date-time + description: | + Timestamp when the deployment was started. + finished_at: + type: string + format: date-time + description: | + Timestamp when the deployment finished. + failed_at: + type: string + format: date-time + description: | + Timestamp when the first stack deployment failed for any + related workflow deployment group for this review request. + fixed_at: + type: string + format: date-time + description: | + Timestamp when all related alerts for this review request + are fixed, the last fixed timestamp. + wait_time_total_duration_seconds: + type: integer + format: int64 + example: 2323 + description: | + Total waiting time to deploy changes in the review request. + If time is below 1s, it is set to 1. + status: + $ref: '#/components/schemas/WorkflowDeploymentGroupStatus' + time_to_restore_seconds: + type: integer + format: int64 + example: 2323 + descrption: | + Total time to restore since the first stack deployment + failed till the last alert was fixed. + If time is below 1s, it is set to 1. + lead_time_for_change_seconds: + type: integer + format: int64 + example: 2342 + descrption: | + Total time to change since the review request was created. + In case of failure, it will be the time that last alert + was fixed. And in case of success, the last stack + deployment finished at. + If time is below 1s, it is set to 1. + stack_deployment_ok_count: + type: integer + description: The number of successful stack deployments. + example: 34 + stack_deployment_failed_count: + type: integer + description: The number of failed stack deployments. + example: 23 + + Preview: + type: object + required: + - id + - status + - affected_count + - pending_count + - running_count + - changed_count + - unchanged_count + - failed_count + - canceled_count + properties: + id: + type: integer + format: int64 + example: 232 + description: Identifier for the preview + status: + type: string + description: The status of the last known preview + enum: + - outdated + - current + example: outdated + affected_count: + type: integer + description: The number of affected stack previews + example: 1 + pending_count: + type: integer + description: The number of pending stack previews + example: 1 + running_count: + type: integer + description: The number of running stack previews + example: 1 + changed_count: + type: integer + description: The number of changed stack previews + example: 1 + unchanged_count: + type: integer + description: The number of unchanged stack previews + example: 1 + failed_count: + type: integer + description: The number of canceled stack previews + example: 1 + canceled_count: + type: integer + description: The number of canceled stack previews + example: 0 + resource_changes: + description: | + Summary of the resource changes planned in this preview. + $ref: '#/components/schemas/ResourceChangesActionsSummary' + + ResourceChangesActionsSummary: + type: object + required: + - create_count + - delete_count + - noop_count + - read_count + - replace_count + - update_count + properties: + create_count: + type: integer + description: Number of resources created in this preview. + example: 3 + delete_count: + type: integer + description: Number of resources deleted in this preview. + example: 2 + noop_count: + type: integer + description: | + Number of resources that are no operations + in this preview. That is, the unchanged resources. + example: 5 + read_count: + type: integer + description: | + Number of data sources that are read in this + preview. + example: 4 + replace_count: + type: integer + description: | + Number of resources that are replaced in this + preview. + example: 7 + update_count: + type: integer + description: | + Number of resources that are updated in this + preview. + example: 0 + + ReviewRequestReviewDecision: + type: string + enum: + - approved + - changes_requested + - review_required + - none + description: State which represents at which point review of the request is affected. + example: approved + + ReviewRequestStatus: + type: string + enum: + - approved + - changes_requested + - closed + - merged + - open + - review_required + + VCSLabel: + type: object + required: + - name + properties: + name: + type: string + example: label1 + color: + type: string + example: '#000000' + description: + type: string + example: label description + + VCSUser: + type: object + description: The Version Control System Platform user. + nullable: true + required: + - login + properties: + login: + type: string + example: hacker + minLength: 1 + avatar_url: + type: string + format: uri + nullable: true + example: https://avatar.url/hacker + id: + type: string + description: Federated unique identifier from VCS + example: id + + ReviewRequestCollaborator: + allOf: + - $ref: '#/components/schemas/Collaborator' + - type: object + required: + - roles + properties: + roles: + type: array + items: + type: string + enum: + - author + - reviewer + - requested_reviewer + minItems: 1 + + Collaborator: + type: object + description: | + An entity that has collaborated in a business + object. + required: + - id + - platform + - display_name + properties: + id: + type: integer + format: int64 + description: Collaborator identifier + example: 232 + platform: + $ref: '#/components/schemas/PlatformSlugName' + display_name: + type: string + description: Name for the collaborator to display. + example: hacker + avatar_url: + type: string + format: uri + nullable: true + example: https://avatar.url/hacker + linked_user: + description: | + The TMC user linked to that collaborator if + any. + $ref: '#/components/schemas/User' + + PlatformSlugName: + type: string + description: Third-party platform slug name. + enum: + - bitbucket + - github + - gitlab + - google + - microsoft + - tmc + - workos + example: github + + AuthType: + type: string + enum: + - gha + - gitlabcicd + - idp + - tmco + + GetOrganizationDeploymentsResponseObject: + type: object + required: + - deployments + - paginated_result + properties: + deployments: + type: array + items: + $ref: '#/components/schemas/WorkflowDeploymentGroup' + paginated_result: + $ref: '#/components/schemas/PaginatedResultObject' + + GetOrganizationDeploymentsActivityResponse: + type: object + required: + - start + - end + - offset + - workflow_deployment_groups + properties: + start: + type: string + format: date-time + description: When activity started + end: + type: string + format: date-time + description: When activity ended + offset: + type: string + format: duration + description: Separation between elements in the array in seconds + workflow_deployment_groups: + type: array + items: + type: array # Use prefixItems in OpenAPI 3.1.X + items: + type: integer + minimum: 0 + minItems: 2 + maxItems: 2 + description: | + The first element is ok_count and the second one is the + failed_count. + + So [1, 4] would be ok = 1 and failed = 4. + examples: + - OneOKAndFourFailedExample: + value: [1, 4] + examples: + - TwoItemsExample: + value: [[1, 4], [2, 3]] + + GetStacksDeploymentsResponseObject: + type: object + required: + - deployments + - paginated_result + properties: + deployments: + type: array + items: + $ref: '#/components/schemas/Deployment' + paginated_result: + $ref: '#/components/schemas/PaginatedResultObject' + + GetDeploymentsHistoryResponse: + type: object + additionalProperties: + $ref: '#/components/schemas/GetDeploymentsHistoryResponseElement' + + GetDeploymentsHistoryResponseElement: + type: object + required: + - successful_sum + - unsuccessful_sum + properties: + successful_sum: + type: integer + unsuccessful_sum: + type: integer + + PostDeploymentStacksRequestReviewRequestObject: + type: object + required: + - repository + properties: + platform: + description: The VCS platform + type: string + example: github + repository: + description: Git repository at time of deployment + type: string + example: github.com/terramate-io/iac-gcloud + commit_sha: + description: Commit SHA (if not stale, uncommitted, etc) + type: string + example: deadc0decafebabecafed00ddeadbeeff00dface + branch: + description: the branch name (aka head_ref_name) of the review request + type: string + example: some-branch-name + base_branch: + description: the base branch (aka base_ref_name) of the review request + type: string + example: main + number: + description: The number/id of the pull/merge request within the repository + type: integer + example: 23 + title: + type: string + description: The title of the pull/merge request + example: 'feat: Add feature X' + description: + type: string + description: The description of the pull/merge request + example: | + My Change Description + + with a lot of details. + url: + description: Link to the pull request (if in CI/CD) + type: string + format: uri + example: https://github.com/terramate-io/iac-gcloud/pull/666 + created_at: + type: string + format: date-time + description: | + The timestamp when review request was created. + This field is not yet populated but it's using metadata. + updated_at: + type: string + format: date-time + description: | + The last timestamp the review request was updated in the VCS. + pushed_at: + oneOf: + - type: string + format: date-time + description: | + The pushed_at of the last commit in the review + request. This is only available when the cli is running in a + pull request context. + - type: integer + format: int64 + mininum: 0 + # Year>9999 + maximum: 253402300799 + description: | + The number that defines the last code push change for + a review request. + author: + $ref: '#/components/schemas/VCSUser' + reviewers: + description: | + List of reviewers for the review request. + type: array + nullable: true + items: + $ref: '#/components/schemas/VCSUser' + example: [{login: reviewer1}, {login: reviewer2}] + labels: + description: List of labels for the review request + type: array + nullable: true + items: + $ref: '#/components/schemas/VCSLabel' + status: + type: string + description: | + The status of this review. Can be open, closed, merged. + example: open + draft: + type: boolean + description: | + Is this review request in the draft state? + review_decision: + $ref: '#/components/schemas/ReviewRequestReviewDecision' + changes_requested_count: + description: The number of reviews with requested changes + type: integer + example: 1 + approved_count: + description: The number of approvals + type: integer + example: 1 + checks_total_count: + description: The number of total checks (including skipped ones) + type: integer + example: 1 + checks_failure_count: + description: The number of failed checks + type: integer + example: 1 + checks_success_count: + description: The number of succeesful checks + type: integer + example: 1 + + PostDeploymentStacksRequestStackObject: + type: object + required: + - repository + - path + - meta_id + - deployment_cmd + properties: + commit_sha: + description: Commit SHA (if not stale, uncommitted, etc) + type: string + example: deadc0decafebabecafed00ddeadbeeff00dface + repository: + description: The repository the deployment was run in + type: string + example: github.com/terramate-io/iac-gcloud + target: + description: Deployment target of the stack. `default` if not set. + $ref: '#/components/schemas/DeploymentTarget' + from_target: + description: Migrate from stack with previous deployment target. Has no effect if `from_target` doesn't exist or `target` already exists. + $ref: '#/components/schemas/DeploymentTarget' + path: + description: Path within the repository at time of deployment + type: string + example: /stacks/organizations/terramate.io/landing-zone/iam + default_branch: + description: The default branch for the repository of the stack + type: string + default: main + example: main + meta_id: + description: stack.id of the stack deployed + type: string + example: deadbeef-babe-d00d-face-badc0de11111 + meta_name: + type: string + description: The Terramate Metadata `stack.name` of the stack deployed + example: My Stack Name + meta_description: + type: string + description: The Terramate Metadata `stack.name` of the stack deployed + example: My Stack Description + meta_tags: + type: array + items: + type: string + description: The Terramate Metadata `stack.tags` of the stack deployed + example: + - tagA + - tagB + deployment_url: + description: Link to the deployment logs (if in CI/CD) + type: string + format: uri + example: https://github.com/terramate-io/iac-gcloud/actions/runs/5146438941 + deployment_cmd: + description: Command executed to deploy + type: string + example: terraform apply + + PostDeploymentStacksRequest: + type: object + properties: + review_request: + $ref: '#/components/schemas/PostDeploymentStacksRequestReviewRequestObject' + stacks: + type: array + nullable: true + description: Stacks involved in the deployment + items: + $ref: '#/components/schemas/PostDeploymentStacksRequestStackObject' + workdir: + type: string + description: Working directory of where the deployment was run. + example: /users/terraform/checkouts/terramate + metadata: + $ref: '#/components/schemas/DeploymentMetadata' + + PostDeploymentStacksResponseObject: + type: object + required: + - meta_id + - stack_id + - status + properties: + meta_id: + description: terramate stack.id of the stack + type: string + example: deadbeef-babe-d00d-face-badc0de11111 + stack_id: + description: Globally unique Terramate Cloud Stack ID + type: integer + format: int64 + example: 42 + target: + description: | + Name of the deployment target the stack was added to. + Only present if also set in the request, otherwise implicitly default. + $ref: '#/components/schemas/DeploymentTarget' + status: + $ref: '#/components/schemas/StackStatus' + + PatchDeploymentStacksRequestObject: + type: object + required: + - stack_id + - status + properties: + stack_id: + description: Globally unique Terramate Cloud Stack ID + type: integer + format: int64 + example: 42 + status: + $ref: '#/components/schemas/DeploymentStatus' + changeset_details: + $ref: '#/components/schemas/ChangesetDetails' + + PatchStackPreviewRequestObject: + type: object + required: + - status + properties: + status: + $ref: '#/components/schemas/PatchStackPreviewStatus' + changeset_details: + $ref: '#/components/schemas/ChangesetDetails' + + PostStackPreviewsRequestObject: + type: object + required: + - technology + - technology_layer + - review_request + - stacks + properties: + updated_at: + deprecated: true + type: integer + format: int64 + description: | + Timestamp from epoch in seconds when the + preview was last updated. This value will be used to group previews. + This field is deprecated in favor of `pushed_at`. + example: 1707385396 + pushed_at: + type: integer + format: int64 + description: | + Timestamp from epoch in seconds when the last commit was pushed to PR. + This value will be used to group previews. + example: 1707385396 + commit_sha: + type: string + description: | + The Commit SHA associated with this preview. + example: 9730ff4ccab39c022404b41a435a179558f641c6 + technology: + type: string + example: terraform + technology_layer: + type: string + example: default + review_request: + $ref: '#/components/schemas/PostDeploymentStacksRequestReviewRequestObject' + metadata: + $ref: '#/components/schemas/DeploymentMetadata' + stacks: + type: array + nullable: true + description: Stacks involved in the review request (but not part of the preview) + items: + type: object + required: + - preview_status + - repository + - path + - default_branch + - meta_id + properties: + preview_status: + type: string + enum: + - affected + - pending + repository: + type: string + description: The repository the stack belongs to + example: github.com/owner/repository + target: + description: Deployment target of the stack. `default` if not set. + $ref: '#/components/schemas/DeploymentTarget' + from_target: + description: Migrate from stack with previous deployment target. Has no effect if `from_target` doesn't exist or `target` already exists. + $ref: '#/components/schemas/DeploymentTarget' + path: + description: Path within the repository at time of deployment + type: string + example: /stacks/organizations/terramate.io/landing-zone/iam + default_branch: + description: The default branch for the repository of the stack + type: string + example: main + meta_id: + description: stack.id of the stack deployed + type: string + example: deadbeef-babe-d00d-face-badc0de11111 + meta_name: + type: string + description: The Terramate Metadata `stack.name` of the stack deployed + example: My Stack Name + meta_description: + type: string + description: The Terramate Metadata `stack.name` of the stack deployed + example: My Stack Description + meta_tags: + type: array + items: + type: string + description: The Terramate Metadata `stack.tags` of the stack deployed + example: + - tagA + - tagB + cmd: + description: | + Command executed to generate the preview. + When preview_status is affected, field should be omitted. + type: array + items: + type: string + example: [terraform, plan] + + PostStackPreviewsResponseObject: + type: object + required: + - preview_id + - stacks + properties: + preview_id: + type: string + example: '42' + stacks: + type: array + items: + type: object + required: + - meta_id + - stack_preview_id + properties: + meta_id: + description: terramate stack.id of the stack + type: string + example: deadbeef-babe-d00d-face-badc0de11111 (not always uuid) + stack_preview_id: + type: string + example: '42' + StackPreviewStatus: + type: string + enum: + - affected + - pending + - running + - changed + - unchanged + - failed + - canceled + + PatchStackPreviewStatus: + type: string + enum: + - running + - changed + - unchanged + - failed + - canceled + + StackPreviewTechnology: + type: string + enum: + - terraform + - opentofu + - other + + CommandLogLine: + type: object + required: + - log_line + - timestamp + - channel + - message + properties: + log_line: + description: Log line number of the log + type: integer + format: int64 + minimum: 0 + timestamp: + type: string + format: date-time + description: The RFC3339Nano time the log was printed + channel: + $ref: '#/components/schemas/StreamOSChannel' + message: + type: string + PaginatedResultObject: + type: object + required: + - total + - page + - per_page + properties: + total: + description: Number of elements in total + type: integer + format: int64 + minimum: 0 + page: + description: Current page we are in + type: integer + format: int64 + minimum: 1 + per_page: + description: Number of elements per page + type: integer + format: int64 + minimum: 1 + OrgShortName: + type: string + description: A globally unique shortname of the organization that can be used in routes. + example: terramate + maxLength: 32 + OrgDisplayName: + type: string + description: The display name of the organiation + example: Terramate GmbH + maxLength: 32 + OrgDomainName: + type: string + description: The domain that is associated with this organization + example: terramate.io + maxLength: 255 + OrgGithubOwner: + type: string + description: | + A GitHub organization to trust. + Multiple orgs can be set separated by commas. + example: terramate-io + maxLength: 1024 + OrgGitlabOwner: + type: string + description: | + A GitLab organization to trust. + Multiple orgs can be set separated by commas. + example: terramate-io + maxLength: 1024 + UserDisplayName: + type: string + example: Marius Tolzmann + maxLength: 32 + UserPosition: + type: string + example: CTPO + maxLength: 128 + UserPictureURL: + type: string + example: https://lh3.googleusercontent.com/a/AAcHTtcBqudpP0hVoQyjDv-v5b4lP6e0vN_92zi_aPp90hE=s96-c + description: | + URL to the profile picture of the user. This is the same URL as the one + returned by the Google People API. + + Member: + type: object + required: + - member_id + - role + - status + properties: + member_id: + type: integer + description: The Member ID + example: 23 + user_display_name: + $ref: '#/components/schemas/UserDisplayName' + user_email: + type: string + example: marius@terramate.io + user_uuid: + type: string + format: uuid + example: 683e0589-65a8-48b8-bd90-6ee89e0682ab + invited_email: + type: string + role: + $ref: '#/components/schemas/MemberRole' + status: + $ref: '#/components/schemas/MemberStatus' + position: + $ref: '#/components/schemas/UserPosition' + user_picture_url: + $ref: '#/components/schemas/UserPictureURL' + linked_accounts: + type: array + description: | + It is only populated in GetOrganizationsMembers operation + items: + $ref: '#/components/schemas/AuthProvider' + + AuthProvider: + type: object + required: + - name + properties: + name: + type: string + description: Provider name in the auth system + enum: + - bitbucket + - github + - gitlab + - google + - microsoft + + MembershipStatus: + description: | + The "active", "inactive", "sso_invited" and "invited" are meant to be used with + users authenticated with personal JWT tokens (eg.: Google IDP). + The "trusted" MUST be used only with CI/CD based authentication + when the "repository" and/or "owner" relationship is established + with the organization. + type: string + enum: + - active + - inactive + - invited + - sso_invited + - trusted + example: active + + MemberStatus: + type: string + enum: + - active + - inactive + - invited + example: active + + MemberRole: + type: string + enum: + - admin + - member + example: admin + + GetFiltersResponseObject: + type: object + description: | + An example of the probable response object: + + ```json + { + "repository": [ + "github.com/terramate-io/tmc-stack/pulls", + "github.com/terramate-io" + ], + "status": [ + "ok", + "failed" + ] + } + ``` + additionalProperties: + type: array + items: + oneOf: + - $ref: '#/components/schemas/User' + - type: string + + GetReviewRequestFiltersResponse: + type: object + description: Response for review request filters. + required: + - collaborators + - repository + - status + properties: + collaborators: + type: array + description: | + List of collaborators that collaborated on a review request. + items: + $ref: '#/components/schemas/Collaborator' + repository: + type: array + description: | + List of repositories from the review requests. + items: + type: string + status: + type: array + description: | + List of possible status for a review request. + items: + $ref: '#/components/schemas/ReviewRequestStatus' + examples: + testExample: + summary: This is a likely response + value: + collaborators: + - id: 123 + platform: github + display_name: hacker + avatar_url: avatar.url + linked_user: + user_uuid: 2f212db6-8439-4a7a-b91f-75e5d0f0490c + display_name: John Doe + user_picture_url: picture.url + repository: + - github.com/corp/iac + status: + - approved + - merged + + GetWorkflowDeploymentGroupFiltersResponse: + type: object + description: Response for Workflow Deployment Group filters + required: + - collaborators + - repository + - status + - type + properties: + collaborators: + type: array + description: | + List of collaborators that collaborated on a deployment + by triggering or collaborated on the related review request. + items: + $ref: '#/components/schemas/Collaborator' + repository: + type: array + description: | + List of repositories from the deployments. + items: + type: string + status: + type: array + description: | + List of possible status for a deployment. + items: + $ref: '#/components/schemas/WorkflowDeploymentGroupStatus' + type: + type: array + description: | + List of possible authenticated types for a deployment. + items: + $ref: '#/components/schemas/AuthType' + examples: + testExample: + summary: This is a likely response + value: + collaborators: + - id: 123 + platform: github + display_name: hacker + avatar_url: avatar.url + linked_user: + user_uuid: 2f212db6-8439-4a7a-b91f-75e5d0f0490c + display_name: John Doe + user_picture_url: picture.url + repository: + - github.com/corp/iac + status: + - failed + - processing + - pk + type: + - idp + - gha + + GetDeploymentLogsResponseObject: + type: object + description: | + Returns the paginated deployment logs + required: + - paginated_result + - deployment_log_lines + properties: + deployment_log_lines: + type: array + items: + $ref: '#/components/schemas/CommandLogLine' + paginated_result: + $ref: '#/components/schemas/PaginatedResultObject' + + SummaryResponse: + type: object + description: | + Defines the summary (lines of text). + required: + - summary + properties: + summary: + type: object + required: + - contents + - created_at + properties: + contents: + type: array + items: + type: string + created_at: + type: string + format: date-time + description: Summary's creation time. + requester: + description: Requester's user. + $ref: '#/components/schemas/User' + + GetStackPreviewLogsResponse: + type: object + description: | + Returns the paginated stack preview logs + required: + - paginated_result + - stack_preview_log_lines + properties: + stack_preview_log_lines: + type: array + items: + $ref: '#/components/schemas/CommandLogLine' + paginated_result: + $ref: '#/components/schemas/PaginatedResultObject' + StreamOSChannel: + type: string + enum: + - stderr + - stdout + + Deployment: + type: object + required: + - workflow_deployment_group_id + - deployment_uuid + - stack_id + - path + - cmd + - status + - auth_type + - auth_id + - created_at + - metadata + properties: + workflow_deployment_group_id: + type: integer + format: int64 + description: | + The workflow deployment identifier that groups + this stack deployment. + deployment_uuid: + $ref: '#/components/schemas/DeploymentUUID' + stack_id: + type: integer + format: int64 + description: ID of the Stack + example: 42 + repository: + type: string + description: The reposiory the deployment was run in + example: github.com/terramate-io/iac-gcloud + path: + type: string + description: Path within the repository at time of deployment + example: /stacks/organizations/terramate.io/landing-zone/iam + commit_sha: + type: string + description: Commit SHA (if not stale, uncommitted, etc) + example: deadc0decafebabecafed00ddeadbeeff00dface + deployment_url: + type: string + format: uri + description: Link to the deployment logs (if in CI/CD) + example: https://github.com/terramate-io/iac-gcloud/actions/runs/5146438941 + cmd: + type: array + items: + type: string + example: ls + example: [terraform, apply] + description: Command executed to deploy. + status: + $ref: '#/components/schemas/DeploymentStatus' + auth_type: + $ref: '#/components/schemas/AuthType' + auth_id: + type: string + description: The authenticated identity + created_at: + type: string + format: date-time + description: Time of the deployment start + started_at: + type: string + format: date-time + description: Time of deployment update + finished_at: + type: string + format: date-time + description: Time of deployment finish + metadata: + $ref: '#/components/schemas/DeploymentMetadata' + review_request: + $ref: '#/components/schemas/ReviewRequest' + + DeploymentUUID: + type: string + format: uuid + description: The Deployment UUID + example: 096c55b6-1599-4a17-a48f-fa846a84aa8a + + GetGithubAppConnectionResponse: + type: object + required: + - install_url + properties: + install_url: + type: string + format: uri + description: | + Github URL to connect the Github App to a given + organization. + example: https://github.com/apps/terramate-cloud/installations/new?state=secret + + GithubAppInstallationStatus: + type: object + required: + - status + properties: + status: + type: string + enum: + - installed + - not_installed + installed_to: + type: string + description: | + Name of the GitHub org the app is installed for. + Only set if app is installed. + management_location: + type: string + format: uri + description: | + Location to redirect to manage the GitHub App installed, namely, + uninstall it. + Only set if the app is installed and user is an admin. + example: https://github.com/organizations/terramate-io/settings/installations/42 + installation_location: + type: string + description: | + Location to redirect to in order to initiate app installation + Only set if app is not_installed and user is admin. + example: '/v1/apps/{org_uuid}/github/connection' + + GitlabWebhookToken: + type: object + required: + - created_at + - receiver_url + properties: + created_at: + type: string + format: date-time + description: | + Time when the token was created. + token: + type: string + description: | + base62 encoded token to be placed in Gitlab webhooks + configuration page. + + Only available in GenerateGitlabWebhookToken operation. + receiver_url: + type: string + format: uri + description: | + URL for the webhook receiver to set in the Gitlab + configuration page. + example: https://api.stg.terramate.io/v1/apps/gitlab/webhook + + ConnectSlackAppAuthResponse: + type: object + required: + - install_url + properties: + install_url: + type: string + format: uri + description: | + Slack URL to connect the Slack App to a given + organization. + example: https://slack.com/oauth/v2/authorize?client_id=client_id&scope=chat:write&state=secret + + SlackAppInstallationStatus: + type: object + required: + - status + properties: + status: + type: string + enum: + - installed + - not_installed + workspace: + type: object + description: Slack workspace where slack app is installed. + required: + - name + - url + properties: + name: + type: string + description: | + Workspace name of the Slack. + Only set if app is installed. + url: + type: string + format: uri + description: | + Slack Workspace URL. + Only set if app is installed. + installation_location: + type: string + description: | + Location to redirect to in order to initiate app installation + Only set if app is not_installed and user is admin. + example: '/v1/apps/{org_uuid}/slack/connection' + management_location: + type: string + format: uri + description: | + Location to redirect to manage the Slack App installed, namely, + uninstall it. + Only set if the app is installed and user is an admin. + example: https://workspace.slack.com/apps/B172P3RS1L2 + + ConnectBitbucketCurrentUserAuthorizeResponse: + type: object + required: + - link_url + properties: + link_url: + type: string + format: uri + description: | + Bitbucket Cloud URL to start OAuth2 authorization code flow. + example: https://bitbucket.org/site/oauth/v2/authorize?client_id=client_id&scope=account,email&state=secret + + GetReviewRequestsResponse: + type: object + required: + - paginated_result + - review_requests + properties: + review_requests: + type: array + items: + $ref: '#/components/schemas/ReviewRequest' + paginated_result: + $ref: '#/components/schemas/PaginatedResultObject' + + GetReviewRequestResponse: + type: object + required: + - review_request + - stack_previews + properties: + review_request: + $ref: '#/components/schemas/ReviewRequest' + stack_previews: + type: array + nullable: true + items: + $ref: '#/components/schemas/StackPreview' + + StackPreview: + type: object + required: + - stack_preview_id + - stack + - status + - technology + - updated_at + properties: + stack_preview_id: + type: integer + format: int64 + example: 4242 + stack: + $ref: '#/components/schemas/Stack' + path: + type: string + description: Stack path used for the preview, can be different from current stack path. + status: + $ref: '#/components/schemas/StackPreviewStatus' + changeset_details: + $ref: '#/components/schemas/ChangesetDetails' + technology: + $ref: '#/components/schemas/StackPreviewTechnology' + + technology_layer: + type: string + description: | + Namespace or layer for the technology to differentiate + among stacks previews from same stack and technology. + example: default + updated_at: + type: string + format: date-time + description: Timestamp the preview was last updated + resource_changes: + description: | + Define the changes in the resources from this + stack planned for the preview. + $ref: '#/components/schemas/ResourceChanges' + + ResourceChanges: + type: object + required: + - actions_summary + properties: + actions_summary: + $ref: '#/components/schemas/ResourceChangesActionsSummary' + + WorkflowDeploymentGroup: + type: object + required: + - id + - status + - commit_title + - repository + - canceled_count + - failed_count + - ok_count + - pending_count + - running_count + - stack_deployment_total_count + - created_at + properties: + id: + type: integer + format: int64 + example: 42 + status: + $ref: '#/components/schemas/WorkflowDeploymentGroupStatus' + commit_title: + type: string + example: Fix this + commit_sha: + type: string + description: Commit SHA (if not stale, uncommitted, etc) + example: deadc0decafebabecafed00ddeadbeeff00dface + repository: + type: string + description: The reposiory the workflow deployment group was run in + example: github.com/terramate-io/iac-gcloud + auth_type: + $ref: '#/components/schemas/AuthType' + auth_id: + type: string + description: | + The authenticated identity. auth_user will be only + populated if auth_type == 'idp'. + auth_user: + $ref: '#/components/schemas/UserInfo' + canceled_count: + type: integer + description: The number of canceled stack deployments + example: 8 + failed_count: + type: integer + description: The number of failed stack deployments + example: 1 + ok_count: + type: integer + description: The number of successful stack deployments + example: 7 + pending_count: + type: integer + description: The number of pending stack deployments + example: 23 + running_count: + type: integer + description: The number of running stack deployments + example: 1 + stack_deployment_total_count: + type: integer + description: | + The sum of previous counters to ease + calculations in frontend side. + example: 40 + created_at: + type: string + format: date-time + description: Time of the deployment start + started_at: + type: string + format: date-time + description: Time of deployment update + finished_at: + type: string + format: date-time + description: Time of deployment finish + metadata: + $ref: '#/components/schemas/DeploymentMetadata' + review_request: + $ref: '#/components/schemas/ReviewRequest' + branch: + type: string + description: Branch name where deployment was done + example: main + workflow_triggered_by: + type: string + description: | + VCS login for the user who triggered the workflow. + + This is only set when auth_type == "gha" + + This is deprecated and it should use triggered_by instead. + example: hacker + deprecated: true + workflow_name: + type: string + description: | + Name for the workflow deployment when auth_type = "gha" + example: deploy to prod + grouping_key: + type: string + description: | + Key to group deployments within the same workflow. + + It can be related with drifts with the same grouping key. + triggered_by: + description: The collaborator who triggered the deployment + $ref: '#/components/schemas/Collaborator' + + GetWorkflowGroupStacksDeploymentsResponse: + type: object + required: + - stack_deployments + - paginated_result + properties: + stack_deployments: + type: array + items: + $ref: '#/components/schemas/StackDeployment' + paginated_result: + $ref: '#/components/schemas/PaginatedResultObject' + + StackDeploymentsCollection: + type: object + required: + - stack_deployments + - paginated_result + properties: + stack_deployments: + type: array + items: + $ref: '#/components/schemas/StackDeployment' + paginated_result: + $ref: '#/components/schemas/PaginatedResultObject' + + StackDeployment: + type: object + required: + - id + - deployment_uuid + - path + - cmd + - status + - created_at + properties: + id: + type: integer + format: int64 + description: Identifier for the stack deployment + example: 42 + deployment_uuid: + $ref: '#/components/schemas/DeploymentUUID' + path: + type: string + description: Path within the repository at time of deployment + example: /stacks/organizations/terramate.io/landing-zone/iam + cmd: + description: Command executed in the deployment + type: array + items: + type: string + example: [terraform, apply] + status: + $ref: '#/components/schemas/DeploymentStatus' + created_at: + type: string + format: date-time + description: Time of the stack deployment was created + started_at: + type: string + format: date-time + description: Time of the stack deployment was started to run + finished_at: + type: string + format: date-time + description: Time of the stack deployment was finished + fixed_at: + type: string + format: date-time + description: | + Time of the stack deployment was fixed. That is, when the + related stack returns back to a healthy state. + stack: + $ref: '#/components/schemas/Stack' + changeset_details: + $ref: '#/components/schemas/ChangesetDetails' + metrics: + $ref: '#/components/schemas/StackDeploymentDORAMetrics' + review_request: + description: | + Only populated in GetOrganizationStackDeployments + operation. + type: object + required: + - created_at + properties: + created_at: + type: string + format: date-time + description: The timestamp when the review request was created in the VCS. + + StackDeploymentDORAMetrics: + type: object + properties: + lead_time_for_change_seconds: + type: integer + format: int64 + example: 1 + description: | + Lead time for the deployment to change. + + For failed deployments, it goes from related review + request created_at to fixed_at. + For successful deployments, it goes from related review + request created_at to finished_at. + + If time is below 1s, it is set to 1. + + time_to_restore_seconds: + type: integer + format: int64 + example: 121 + description: | + Time to restore when a deployment failed. + + It goes from finished_at to fixed_at. + + If time is below 1s, it is set to 1. + + AlertSeverity: + type: object + required: + - rank + - name + properties: + name: + description: | + Descriptive unique name for alert severity + type: string + enum: + - critical + - high + - medium + - low + - none + rank: + $ref: '#/components/schemas/AlertSeverityRank' + example: + name: high + rank: 3 + + AlertSeverityRank: + type: integer + format: int32 + enum: + - 0 + - 1 + - 2 + - 3 + - 4 + description: | + Lowest rank is the lowest severity. + + 0 - none + 1 - low + 2 - medium + 3 - high + 4 - critical + + AlertsCollection: + type: object + required: + - alerts + - paginated_result + properties: + alerts: + type: array + items: + $ref: '#/components/schemas/Alert' + paginated_result: + $ref: '#/components/schemas/PaginatedResultObject' + + Alert: + type: object + required: + - id + - severity + - created_at + - updated_at + - triggered_event + properties: + id: + type: string + format: uuid + example: f1c9ecfe-1a45-499b-ab6d-1aa0a8ea2f95 + severity: + $ref: '#/components/schemas/AlertSeverity' + created_at: + description: Timestamp when alert was created. + type: string + format: date-time + example: '2024-04-12T07:06:00Z' + updated_at: + description: Timestamp when alert was last updated. + type: string + format: date-time + example: '2024-04-15T11:05:00Z' + trigger: + description: | + The trigger object that launches the event to trigger the + alert. + oneOf: + - $ref: '#/components/schemas/Drift' + - $ref: '#/components/schemas/WorkflowDeploymentGroup' + discriminator: + propertyName: trigger_type + mapping: + drift: '#/components/schemas/Drift' + deployment: '#/components/schemas/WorkflowDeploymentGroup' + triggered_event: + description: | + Which event triggered the alert. + $ref: '#/components/schemas/AlertEvent' + resolved_event: + description: | + Which resolved the alert, if any. + Only present if resolved_at is present. + $ref: '#/components/schemas/AlertEvent' + assignees: + description: | + List of assignees for this alert. + nullable: true + type: array + items: + $ref: '#/components/schemas/User' + resolved_at: + description: Timestamp when alert was resolved. + type: string + format: date-time + example: '2024-04-12T07:53:00Z' + fixed_at: + description: | + Timestamp when alert was fixed. + That's when the alert was automatically resolved. + type: string + format: date-time + example: '2024-04-12T07:53:00Z' + + User: + type: object + required: + - user_uuid + - display_name + properties: + user_uuid: + type: string + format: uuid + example: 683e0589-65a8-48b8-bd90-6ee89e0682ab + display_name: + $ref: '#/components/schemas/UserDisplayName' + user_picture_url: + $ref: '#/components/schemas/UserPictureURL' + + GetAlertResponse: + type: object + required: + - alert + properties: + alert: + $ref: '#/components/schemas/Alert' + + AlertEventsCollection: + type: object + required: + - alert_events + - paginated_result + properties: + alert_events: + description: | + Events related to an alert + type: array + items: + $ref: '#/components/schemas/AlertEvent' + paginated_result: + $ref: '#/components/schemas/PaginatedResultObject' + + AlertEvent: + type: object + required: + - created_at + - type + - actions + properties: + author_id: + type: string + format: uuid + description: | + User UUID from the person who performed the event. + + If it's not present, then the event was run by a fully + automatic process. + created_at: + type: string + format: date-time + description: | + The time the alert event happened + type: + type: string + enum: + - anomaly + - resolution + - metadata_update + description: | + Automatically composed descriptor, built from alert event + data. + actions: + type: array + items: + type: object + required: + - action + - field + - value + properties: + action: + type: string + description: | + Action performed by the user. + + - add adds a value to a collection field in the + alert. + - decrease decreases a numeric value for previous + alert field. + - increase increases a numeric value for previous + alert field. + - remove removes a value to a collection field in + the alert. + - update updates a value for an alert field. + + Collection fields are: stack_deployments, + stack_drift_checks and assignees. + enum: + - add + - decrease + - increase + - remove + - update + example: add + field: + type: string + description: | + Alert field related to that action. + enum: + - stack_deployments + - stack_drift_checks + - severity + - assignees + - resolved_at + example: resolved_at + value: + description: | + Any value could be set here. + + Examples could be: + - A stack deployment id + - A user UUID + - A timestamp + example: '42' + grouping_id: + description: | + A value to group separated events in a set of common + trigger. + + Right now, there is a single possible value which is + workflow_deployment_group_id value set for + stack_deployments. + type: integer + format: int64 + example: 323 + examples: + - AddStackDeploymentExample: + action: add + field: stack_deployments + value: 42 + grouping_id: 323 + - AddDriftCheckExample: + action: add + field: stack_drift_checks + value: 34 + - DecreaseSeverityExample: + action: decrease + field: severity + value: 1 + - IncreaseSeverityExample: + action: increase + field: severity + value: 2 + - RemoveAssigneeExample: + action: remove + field: assignee + value: 5ed0987b-b314-45f9-b2fd-2c1b6e386603 + - UpdateResolvedAt: + action: update + field: resolved_at + value: '2024-04-12T14:56:00Z' + - RemoveResolvedAt: + action: update + field: resolved_at + value: null + + PatchAlertRequest: + description: | + All elements in the request set will be updated in the related + Alert entity. + type: object + properties: + severity: + $ref: '#/components/schemas/AlertSeverityRank' + assignees: + description: | + Set of assignees to handle this alert. If it's set to + null, then all assignees are cleared. + nullable: true + type: array + items: + type: string + format: uuid + description: User UUIDs + example: + - fd842d03-45e8-40db-8c48-f398e1535640 + - 7820a663-50d7-4a72-a0d4-abca14e962b3 + resolved_at: + description: | + Set it to a value different from null, it resolves the + alert. If it sets to null, then it reopens the alert. + nullable: true + type: string + format: date-time + example: '2024-04-15T09:17:00Z' + + AlertAffectedStacksCollection: + description: | + Stacks affected by an alert. + type: object + required: + - affected_stacks + - paginated_result + properties: + affected_stacks: + type: array + items: + type: object + required: + - stack_status_in_alert + - stack + properties: + stack_status_in_alert: + description: | + If alert is resolved, then last status of a stack at + the time the alert was resolved. + example: ok + $ref: '#/components/schemas/StackStatus' + stack: + $ref: '#/components/schemas/Stack' + paginated_result: + $ref: '#/components/schemas/PaginatedResultObject' + + ResourcesCollection: + type: object + required: + - resources + - paginated_result + properties: + resources: + description: A list of resources + type: array + items: + $ref: '#/components/schemas/Resource' + paginated_result: + $ref: '#/components/schemas/PaginatedResultObject' + + ResourceDeploymentsCollection: + type: object + required: + - resource_deployments + - paginated_result + properties: + resource_deployments: + description: A list of resource deployments + type: array + items: + $ref: '#/components/schemas/ResourceDeployment' + paginated_result: + $ref: '#/components/schemas/PaginatedResultObject' + + ResourcePreviewsCollection: + type: object + required: + - resource_previews + - paginated_result + properties: + resource_previews: + description: A list of resource previews + type: array + items: + $ref: '#/components/schemas/ResourcePreview' + paginated_result: + $ref: '#/components/schemas/PaginatedResultObject' + + Resource: + type: object + description: | + A unique resource within an organization. + The 'details' property is only set when selecting a specific resource. + required: + - resource_uuid + - stack + - descriptor + - status + - drifted + - pending + - created_at + - updated_at + properties: + resource_uuid: + description: | + The unique identifier for this resource. + This attribute is TMC-generated and not part of the plan data. + It's based on matching the same addresses over time in sequential plans. + type: string + format: uuid + example: f1c9ecfe-1a45-499b-ab6d-1aa0a8ea2f95 + stack: + $ref: '#/components/schemas/Stack' + provisioner: + $ref: '#/components/schemas/Provisioner' + descriptor: + $ref: '#/components/schemas/ResourceDescriptor' + details: + $ref: '#/components/schemas/ResourceDetails' + status: + $ref: '#/components/schemas/ResourceStatus' + drifted: + description: Indicates if a resource has drifted. + type: boolean + pending: + description: Indicates if a resource is pending to be created. + type: boolean + created_at: + description: Timestamp when resource was created. + type: string + format: date-time + example: '2024-04-12T07:06:00Z' + updated_at: + description: Timestamp when resource was last updated. + type: string + format: date-time + example: '2024-04-15T11:05:00Z' + policy_check: + description: Optional policy check done to this resource + $ref: '#/components/schemas/ResourcePolicyCheck' + + ResourceDescriptor: + type: object + description: | + Attributes describing the resource. + The values extracted from the plan data. + For reference, see https://developer.hashicorp.com/terraform/internals/json-format#values-representation. + + Those that are not part of the values representation are + defined with the prefix `extracted_` where each description + describes how data is retrieved. + required: + - address + - schema_version + properties: + address: + type: string + mode: + type: string + type: + type: string + name: + type: string + index: + type: string + provider_name: + type: string + extracted_id: + description: | + This value is not part of the original data structure, but extracted from 'values.id', if it exists. + type: string + extracted_name: + description: | + This value is not part of the original data structure, but extracted from 'values' in a type/provider-specific way. + type: string + extracted_account: + description: | + This value is not part of the original data structure, but extracted from 'values' in a type/provider-specific way. + type: string + schema_version: + type: integer + format: int64 + depends_on: + type: array + items: + type: string + tainted: + type: boolean + deposed_key: + type: string + + ResourceDetails: + type: object + description: | + Detailed information about a resource, i.e. it's value state. + properties: + values: + description: | + The content of the 'values' field within a resource, encoded as a JSON string. + For reference, see https://developer.hashicorp.com/terraform/internals/json-format#values-representation. + type: string + sensitive_values: + description: | + The content of the 'sensitive_values' field within a resource, provided as a JSON string. + type: string + + ResourceDeployment: + type: object + description: | + Information about a resource deployment. + required: + - change + - changed_at + - stack_deployment + - workflow_deployment_group + properties: + change: + description: | + The change data object, encoded as a JSON string. + For reference, see https://developer.hashicorp.com/terraform/internals/json-format#values-representation. + type: string + changed_at: + description: Timestamp when the change happened. + type: string + format: date-time + example: '2024-04-12T07:06:00Z' + stack_deployment: + description: "This deployment won't include changeset details" + $ref: '#/components/schemas/StackDeployment' + workflow_deployment_group: + $ref: '#/components/schemas/WorkflowDeploymentGroup' + + ResourcePreview: + type: object + description: | + Detailed information about a resource preview. + required: + - change + - changed_at + - stack_preview + - review_request + properties: + change: + description: | + The change data object, encoded as a JSON string. + For reference, see https://developer.hashicorp.com/terraform/internals/json-format#values-representation. + type: string + changed_at: + description: Timestamp when the change happened. + type: string + format: date-time + example: '2024-04-12T07:06:00Z' + stack_preview: + description: This preview does not include changeset details + $ref: '#/components/schemas/StackPreview' + review_request: + $ref: '#/components/schemas/ReviewRequest' + + ResourceDrift: + type: object + description: | + Information about a resource drift. + required: + - change + - changed_at + - drift + properties: + change: + description: | + The change data object, encoded as a JSON string. + For reference, see https://developer.hashicorp.com/terraform/internals/json-format#values-representation. + type: string + changed_at: + description: Timestamp when the change happened. + type: string + format: date-time + example: '2024-04-12T07:06:00Z' + drift: + description: "This drift doesn't include changeset details" + $ref: '#/components/schemas/Drift' + + ResourceStatus: + description: | + The last known status of the resource at `updated_at` time. + This field is **deprecated** and will be removed in favor of flags `drifted` and `pending`. + type: string + enum: + - drifted + - ok + - pending + + ResourcePolicyCheck: + type: object + description: | + Summary for an analysis done to a resource. + required: + - created_at + - passed + - counters + properties: + created_at: + type: string + format: date-time + description: Define when the policy analysis was performed. + example: '2024-09-12T07:06:00Z' + passed: + type: boolean + description: Define if the resource passed the policy check. + example: false + start_violated_at: + type: string + format: date-time + description: | + Define when the resource stopped passing any of the rules set + by the policy analysis. + It is only set when passed == false. Otherwise, it's null. + example: '2024-09-12T05:06:00Z' + counters: + $ref: '#/components/schemas/PolicyCheckCounters' + + PolicyCheckCounters: + type: object + required: + - passed_count + - severity_low_count + - severity_medium_count + - severity_high_count + properties: + passed_count: + type: integer + minimum: 0 + format: int64 + description: Number of policy checks that passed. + example: 42 + severity_low_count: + type: integer + minimum: 0 + format: int64 + description: Number of policy checks with low severity that was violated. + example: 3 + severity_medium_count: + type: integer + minimum: 0 + format: int64 + description: Number of policy checks with medium severity that was violated. + example: 2 + severity_high_count: + type: integer + minimum: 0 + format: int64 + description: Number of policy checks with high severity that was violated. + example: 1 + + CreateAPIKeyRequest: + type: object + required: + - name + properties: + name: + type: string + description: Name of the API key + minLength: 2 + expires_at: + type: string + format: date-time + description: Optional expiration date for the key + + APIKey: + type: object + required: + - id + - name + - created_at + properties: + id: + type: string + format: uuid + name: + type: string + key: + type: string + description: The actual API key (only returned on creation) + nullable: true + created_at: + type: string + format: date-time + created_by: + $ref: '#/components/schemas/User' + expires_at: + type: string + format: date-time + nullable: true + last_used_at: + type: string + format: date-time + nullable: true + + APIKeysCollection: + type: object + required: + - paginated_result + - api_keys + properties: + api_keys: + type: array + items: + $ref: '#/components/schemas/APIKey' + + License: + type: object + required: + - id + - key + - created_at + - expires_at + properties: + id: + type: string + format: uuid + key: + type: string + description: The actual License key + created_at: + type: string + format: date-time + expires_at: + type: string + format: date-time + deleted_at: + type: string + format: date-time + + LicensesCollection: + type: object + required: + - paginated_result + - licenses + properties: + licenses: + type: array + items: + $ref: '#/components/schemas/License' + paginated_result: + $ref: '#/components/schemas/PaginatedResultObject' + + PostStoreOutputRequest: + type: object + required: + - key + - value + + properties: + key: + type: object + required: + - repository + - stack_meta_id + - name + + properties: + repository: + type: string + description: Repository URL + example: github.com/terramate-io/iac-gcloud + stack_meta_id: + type: string + description: Stack Meta ID + example: b3df4bbf-154a-4331-ab71-52075ca418ad + target: + description: Deployment target of the output. `default` if not set. + $ref: '#/components/schemas/DeploymentTarget' + name: + $ref: '#/components/schemas/StoreOutputName' + value: + type: string + description: Value of the output + example: output_value + maxLength: 16384 + + StoreOutput: + type: object + required: + - id + - key + - value + - created_at + - updated_at + + properties: + id: + type: string + format: uuid + description: ID of the stored output + example: 4aebf6d3-c72f-4137-9dc5-afb2e38d7ebd + key: + type: object + required: + - id + - org_uuid + - repository + - stack_meta_id + - name + - target + + properties: + org_uuid: + type: string + format: uuid + description: UUID of the organization + example: 4aebf6d3-c72f-4137-9dc5-afb2e38d7ebd + repository: + type: string + description: Repository URL + example: github.com/terramate-io/iac-gcloud + stack_meta_id: + type: string + description: Stack Meta ID + example: b3df4bbf-154a-4331-ab71-52075ca418ad + target: + description: Deployment target of the output. `default` if not set. + $ref: '#/components/schemas/DeploymentTarget' + name: + $ref: '#/components/schemas/StoreOutputName' + value: + type: string + description: Value of the output + example: output_value + created_at: + type: string + format: date-time + description: Time of the output creation + updated_at: + type: string + format: date-time + description: Time of the output update + + StoreOutputName: + type: string + description: Name of the output + example: database_id + pattern: '^[a-z]([-_a-z0-9]*[a-z0-9])?$' + + DashboardAlertsWidget: + type: object + description: | + The stats calculated for the dashboard alerts widget. + required: + - open_total + - open_unassigned_total + - open_assigned_total + - open_owned_total + - closed_total + - closed_unassigned_total + - closed_assigned_total + - closed_owned_total + - resolved_total + - resolved_unassigned_total + - resolved_assigned_total + - resolved_owned_total + - fixed_total + - fixed_unassigned_total + - fixed_assigned_total + - fixed_owned_total + properties: + open_total: + type: integer + open_unassigned_total: + type: integer + open_assigned_total: + type: integer + open_owned_total: + type: integer + closed_total: + type: integer + closed_unassigned_total: + type: integer + closed_assigned_total: + type: integer + closed_owned_total: + type: integer + resolved_total: + type: integer + resolved_unassigned_total: + type: integer + resolved_assigned_total: + type: integer + resolved_owned_total: + type: integer + fixed_total: + type: integer + fixed_unassigned_total: + type: integer + fixed_assigned_total: + type: integer + fixed_owned_total: + type: integer + + DashboardAlertsPeriodWidget: + type: object + description: | + The stats calculated for the dashboard alerts period widget. + required: + - created_total + - closed_total + - resolved_total + - fixed_total + properties: + created_total: + type: integer + closed_total: + type: integer + resolved_total: + type: integer + fixed_total: + type: integer + + DashboardReviewRequestsWidget: + type: object + description: | + The stats calculated for the dashboard review requests widget. + required: + - total + - draft_total + - open_total + - review_required_total + - changes_requested_total + - approved_total + - merged_total + - closed_total + properties: + total: + type: integer + draft_total: + type: integer + open_total: + type: integer + review_required_total: + type: integer + changes_requested_total: + type: integer + approved_total: + type: integer + merged_total: + type: integer + closed_total: + type: integer + + DashboardReviewRequestsPeriodWidget: + type: object + description: | + The stats calculated for the dashboard review requests period widget. + required: + - created_total + - closed_total + - merged_total + - reviewed_total + properties: + created_total: + type: integer + closed_total: + type: integer + merged_total: + type: integer + reviewed_total: + type: integer + + DashboardDeploymentsPeriodWidget: + type: object + description: | + The stats calculated for the dashboard deployments period widget. + required: + - ok + - failed + - canceled + properties: + ok: + type: integer + failed: + type: integer + canceled: + type: integer + + ReviewRequestsDORATotalReport: + allOf: + - $ref: '#/components/schemas/DORATotalReport' + - type: object + required: + - status_success_total + - status_failed_total + - status_unstable_total + properties: + status_success_total: + type: integer + format: int64 + description: | + Number of review requests whose last related workflow + deployment group was a success. + example: 42 + minimum: 0 + status_failed_total: + type: integer + format: int64 + description: | + Number of review requests whose last related workflow + deployment group was a failure. + example: 32 + minimum: 0 + status_unstable_total: + type: integer + format: int64 + description: | + Number of review requests whose last related workflow + deployment group was unstable. + + This is not yet implemented. + example: 0 + minimum: 0 + + DORATotalReport: + type: object + description: | + DORA report on total numbers. + required: + - lead_time_for_change_seconds_max + - lead_time_for_change_seconds_min + - lead_time_for_change_seconds_total + - lead_time_for_change_seconds_avg + - lead_time_for_change_count + - time_to_restore_seconds_max + - time_to_restore_seconds_min + - time_to_restore_seconds_total + - time_to_restore_seconds_avg + - time_to_restore_count + - days_with_data_total + properties: + lead_time_for_change_seconds_max: + type: integer + format: int64 + description: | + Maximum number of seconds with that lead time for change. + example: 23232 + minimum: 1 + lead_time_for_change_seconds_min: + type: integer + format: int64 + description: | + Minimum number of seconds with that lead time for change. + example: 2 + minimum: 1 + lead_time_for_change_seconds_total: + type: integer + format: int64 + description: | + Total accumulated number of seconds for lead time for change. + example: 223232 + minimum: 1 + lead_time_for_change_seconds_avg: + type: integer + format: int64 + description: | + Average number of seconds for lead time for change. + example: 2232 + minimum: 0 + lead_time_for_change_count: + type: integer + format: int64 + description: | + Number of entities with lead time for change value set. + example: 22 + minimum: 0 + time_to_restore_seconds_max: + type: integer + format: int64 + description: | + Maximum number of seconds with that time to restore. + example: 2323 + minimum: 1 + time_to_restore_seconds_min: + type: integer + format: int64 + description: | + Minimum number of seconds with that time to restore. + example: 2 + minimum: 1 + time_to_restore_seconds_total: + type: integer + format: int64 + description: | + Total accumulated number of seconds for time to restore. + example: 2 + minimum: 1 + time_to_restore_seconds_avg: + type: integer + format: int64 + description: | + Average number of seconds for time to restore. + example: 21122 + minimum: 0 + time_to_restore_count: + type: integer + format: int64 + description: | + Number of entities with time to restore set. + example: 2 + minimum: 0 + days_with_data_total: + type: integer + format: int64 + description: | + Number of days within the range with data. + example: 2 + minimum: 0 + + ReviewRequestsDORARangeReport: + type: object + description: | + The report for DORA metrics related to review requests for + data within a range. + required: + - review_requests + properties: + review_requests: + type: array + items: + $ref: '#/components/schemas/ReviewRequestsDORARangeReportElement' + + ReviewRequestsDORARangeReportElement: + allOf: + - $ref: '#/components/schemas/DORARangeReportElement' + - type: object + description: | + The element for DORA metrics within a range. + required: + - status_success_total + - status_failed_total + - status_unstable_total + properties: + status_success_total: + type: integer + format: int64 + description: | + Number of review requests whose last related workflow + deployment group was a success. + example: 42 + minimum: 0 + status_failed_total: + type: integer + format: int64 + description: | + Number of review requests whose last related workflow + deployment group was a failure. + example: 32 + minimum: 0 + status_unstable_total: + type: integer + format: int64 + description: | + Number of review requests whose last related workflow + deployment group was unstable. + + This is not yet implemented. + example: 0 + minimum: 0 + + DORARangeReportElement: + type: object + description: | + The element for DORA metrics within a range. + required: + - date + - lead_time_for_change_seconds_avg + - lead_time_for_change_seconds_max + - lead_time_for_change_seconds_min + - time_to_restore_seconds_avg + - time_to_restore_seconds_max + - time_to_restore_seconds_min + properties: + date: + type: string + format: date + description: | + Date for the range element in YYYY-MM-DD format. + example: 2025-06-25 + lead_time_for_change_seconds_max: + type: integer + format: int64 + description: | + Maximum number of seconds with that lead time for change. + example: 23232 + minimum: 1 + lead_time_for_change_seconds_min: + type: integer + format: int64 + description: | + Minimum number of seconds with that lead time for change. + example: 2 + minimum: 1 + lead_time_for_change_seconds_avg: + type: integer + format: int64 + description: | + Average number of seconds for lead time for change. + example: 223.23 + time_to_restore_seconds_max: + type: integer + format: int64 + description: | + Maximum number of seconds with that time to restore. + example: 2323 + minimum: 1 + time_to_restore_seconds_min: + type: integer + format: int64 + description: | + Minimum number of seconds with that time to restore. + example: 2 + minimum: 1 + time_to_restore_seconds_avg: + type: integer + format: int64 + description: | + Average number of seconds for time to restore. + example: 2 + + DORARatingReport: + type: object + description: | + The report for DORA metrics related to the entities divided + by rating buckets. + required: + - lead_time_for_change_elite_total + - lead_time_for_change_high_total + - lead_time_for_change_medium_total + - lead_time_for_change_low_total + - time_to_restore_elite_total + - time_to_restore_high_total + - time_to_restore_medium_total + - time_to_restore_low_total + properties: + lead_time_for_change_elite_total: + type: integer + format: int64 + description: | + Number of lead time for change within Elite rating. + example: 23232 + minimum: 0 + lead_time_for_change_high_total: + type: integer + format: int64 + description: | + Number of lead time for change within High rating. + example: 2 + minimum: 0 + lead_time_for_change_medium_total: + type: integer + format: int64 + description: | + Number of lead time for change within Medium rating. + example: 22 + minimum: 0 + lead_time_for_change_low_total: + type: integer + format: int64 + description: | + Number of lead time for change within Low rating. + example: 23 + minimum: 0 + time_to_restore_elite_total: + type: integer + format: int64 + description: | + Number of times to restore within Elite rating. + example: 2323 + minimum: 0 + time_to_restore_high_total: + type: integer + format: int64 + description: | + Number of time to restore within High rating. + example: 2 + minimum: 0 + time_to_restore_medium_total: + type: integer + format: int64 + description: | + Number of time to restore within Medium rating. + example: 2 + minimum: 0 + time_to_restore_low_total: + type: integer + format: int64 + description: | + Number of time to restore within Low rating. + example: 2 + minimum: 0 + + StackDeploymentsDORATotalReport: + allOf: + - $ref: '#/components/schemas/DORATotalReport' + - type: object + description: | + The report for DORA metrics related to stack deployments for + total numbers. + required: + - status_success_total + - status_failed_total + - status_unstable_total + - status_canceled_total + properties: + status_success_total: + type: integer + format: int64 + description: | + Number of review requests whose status was a success. + example: 42 + minimum: 0 + status_failed_total: + type: integer + format: int64 + description: | + Number of review requests whose status was a failure. + example: 32 + minimum: 0 + status_unstable_total: + type: integer + format: int64 + description: | + Number of review requests whose status was unstable. + + This is not yet implemented. + example: 0 + minimum: 0 + status_canceled_total: + type: integer + format: int64 + description: | + Number of stack deployments whose status was canceled. + example: 32 + minimum: 0 + + StackDeploymentsDORARangeReport: + type: object + description: | + The report for DORA metrics related to stack deployments for + data within a range. + required: + - stack_deployments + properties: + stack_deployments: + type: array + items: + $ref: '#/components/schemas/StackDeploymentsDORARangeReportElement' + + StackDeploymentsDORARangeReportElement: + allOf: + - $ref: '#/components/schemas/DORARangeReportElement' + - type: object + description: | + The element for DORA metrics within a range. + required: + - status_success_total + - status_failed_total + - status_unstable_total + - status_canceled_total + properties: + status_success_total: + type: integer + format: int64 + description: | + Number of stack deployemnts whose status was a success. + example: 42 + minimum: 0 + status_failed_total: + type: integer + format: int64 + description: | + Number of stack deployments whose status was a failure. + example: 32 + minimum: 0 + status_unstable_total: + type: integer + format: int64 + description: | + Number of stack deployments whose status was unstable. + + This is not yet implemented. + example: 0 + minimum: 0 + status_canceled_total: + type: integer + format: int64 + description: | + Number of stack deployments whose status was canceled. + example: 32 + minimum: 0 + + securitySchemes: + jwtToken: + type: http + scheme: bearer + bearerFormat: JWT + apiKey: + type: apiKey + description: | + API key as username in Basic Authorization with + empty password. + name: Authorization + in: header diff --git a/api/[operationId].md b/api/[operationId].md new file mode 100644 index 0000000..7bcdd42 --- /dev/null +++ b/api/[operationId].md @@ -0,0 +1,15 @@ +--- +aside: false +outline: false +title: vitepress-openapi +--- + + + + diff --git a/api/[operationId].paths.ts b/api/[operationId].paths.ts new file mode 100644 index 0000000..0f3860a --- /dev/null +++ b/api/[operationId].paths.ts @@ -0,0 +1,20 @@ +import { usePaths } from 'vitepress-openapi' +import spec from '../.vitepress/theme/openapi.json' with { type: 'json' } + +export default { + paths() { + return usePaths({ spec }) + .getPathsByVerbs() + .map((path) => { + if (!path) + return null + const { operationId, summary } = path + return { + params: { + operationId, + pageTitle: `${summary} - vitepress-openapi`, + }, + } + }) + }, +} diff --git a/package.json b/package.json index 9e8b159..e410930 100644 --- a/package.json +++ b/package.json @@ -10,10 +10,11 @@ "lint:fix": "eslint . --fix" }, "dependencies": { - "medium-zoom": "^1.1.0" + "medium-zoom": "^1.1.0", + "vitepress-openapi": "^0.1.4" }, "devDependencies": { - "@antfu/eslint-config": "^4.17.0", + "@antfu/eslint-config": "^4.18.0", "eslint": "^9.31.0", "glob": "^11.0.3", "pnpm": "10.13.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9692600..f07bcab 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,10 +11,13 @@ importers: medium-zoom: specifier: ^1.1.0 version: 1.1.0 + vitepress-openapi: + specifier: ^0.1.4 + version: 0.1.4(typescript@5.4.5)(vitepress@1.6.3(@algolia/client-search@5.34.1)(change-case@5.4.4)(postcss@8.5.6)(search-insights@2.13.0)(typescript@5.4.5))(vue@3.5.18(typescript@5.4.5)) devDependencies: '@antfu/eslint-config': - specifier: ^4.17.0 - version: 4.17.0(@vue/compiler-sfc@3.5.17)(eslint@9.31.0)(typescript@5.4.5) + specifier: ^4.18.0 + version: 4.18.0(@vue/compiler-sfc@3.5.18)(eslint@9.31.0)(typescript@5.4.5) eslint: specifier: ^9.31.0 version: 9.31.0 @@ -26,7 +29,7 @@ importers: version: 10.13.1 vitepress: specifier: 1.6.3 - version: 1.6.3(@algolia/client-search@5.34.0)(postcss@8.5.6)(search-insights@2.13.0)(typescript@5.4.5) + version: 1.6.3(@algolia/client-search@5.34.1)(change-case@5.4.4)(postcss@8.5.6)(search-insights@2.13.0)(typescript@5.4.5) packages: @@ -50,60 +53,60 @@ packages: '@algolia/client-search': '>= 4.9.1 < 6' algoliasearch: '>= 4.9.1 < 6' - '@algolia/client-abtesting@5.34.0': - resolution: {integrity: sha512-d6ardhDtQsnMpyr/rPrS3YuIE9NYpY4rftkC7Ap9tyuhZ/+V3E/LH+9uEewPguKzVqduApdwJzYq2k+vAXVEbQ==} + '@algolia/client-abtesting@5.34.1': + resolution: {integrity: sha512-M4zb6J7q+pg9V9Xk0k1WDgvupfCtXcxjKGTrNVYemiredLVGOmvVIPAUjg2rx4QmK7DWNApWLsieYwk7PAaOXw==} engines: {node: '>= 14.0.0'} - '@algolia/client-analytics@5.34.0': - resolution: {integrity: sha512-WXIByjHNA106JO1Dj6b4viSX/yMN3oIB4qXr2MmyEmNq0MgfuPfPw8ayLRIZPa9Dp27hvM3G8MWJ4RG978HYFw==} + '@algolia/client-analytics@5.34.1': + resolution: {integrity: sha512-h18zlL+bVUlbNE92olo1d/r6HQPkxhmP7yCpA1osERwpgC6F058kWm0O0aYdrHJIHtWBcs9aRqq7IkQSkpjPJg==} engines: {node: '>= 14.0.0'} - '@algolia/client-common@5.34.0': - resolution: {integrity: sha512-JeN1XJLZIkkv6yK0KT93CIXXk+cDPUGNg5xeH4fN9ZykYFDWYRyqgaDo+qvg4RXC3WWkdQ+hogQuuCk4Y3Eotw==} + '@algolia/client-common@5.34.1': + resolution: {integrity: sha512-otPWALs72KvmVuP0CN0DI6sqVx1jQWKi+/DgAiP8DysVMgiNlva3GDKTtAK6XVGlT08f4h32FNuL0yQODuCfKA==} engines: {node: '>= 14.0.0'} - '@algolia/client-insights@5.34.0': - resolution: {integrity: sha512-gdFlcQa+TWXJUsihHDlreFWniKPFIQ15i5oynCY4m9K3DCex5g5cVj9VG4Hsquxf2t6Y0yv8w6MvVTGDO8oRLw==} + '@algolia/client-insights@5.34.1': + resolution: {integrity: sha512-SNDb5wuEpQFM6S5Shk2iytLMusvGycm9uTuYh7cGa1h3U7O65OjjjIgQ0lLY5HPybHNtmXr4Zh/EZ23pZvAJHg==} engines: {node: '>= 14.0.0'} - '@algolia/client-personalization@5.34.0': - resolution: {integrity: sha512-g91NHhIZDkh1IUeNtsUd8V/ZxuBc2ByOfDqhCkoQY3Z/mZszhpn3Czn6AR5pE81fx793vMaiOZvQVB5QttArkQ==} + '@algolia/client-personalization@5.34.1': + resolution: {integrity: sha512-T8z9KqYJOup83Hw0mgICYWfJoLh//FNWbf4roFd95ZJzZ4v1cN/hvr7Eqml1qWMoCkJb4y/XQjrXsJ6Y9XnMLw==} engines: {node: '>= 14.0.0'} - '@algolia/client-query-suggestions@5.34.0': - resolution: {integrity: sha512-cvRApDfFrlJ3Vcn37U4Nd/7S6T8cx7FW3mVLJPqkkzixv8DQ/yV+x4VLirxOtGDdq3KohcIbIGWbg1QuyOZRvQ==} + '@algolia/client-query-suggestions@5.34.1': + resolution: {integrity: sha512-YA0kC4CwO1mc1dliNgbFgToweRa7Uihjz3izEaV4cXninF1v4SaOrPkQUsiFPprAffjMzOUoT7vahQZ/HZyiKQ==} engines: {node: '>= 14.0.0'} - '@algolia/client-search@5.34.0': - resolution: {integrity: sha512-m9tK4IqJmn+flEPRtuxuHgiHmrKV0su5fuVwVpq8/es4DMjWMgX1a7Lg1PktvO8AbKaTp9kTtBAPnwXpuCwmEg==} + '@algolia/client-search@5.34.1': + resolution: {integrity: sha512-bt5hC9vvjaKvdvsgzfXJ42Sl3qjQqoi/FD8V7HOQgtNFhwSauZOlgLwFoUiw67sM+r7ehF7QDk5WRDgY7fAkIg==} engines: {node: '>= 14.0.0'} - '@algolia/ingestion@1.34.0': - resolution: {integrity: sha512-2rxy4XoeRtIpzxEh5u5UgDC5HY4XbNdjzNgFx1eDrfFkSHpEVjirtLhISMy2N5uSFqYu1uUby5/NC1Soq8J7iw==} + '@algolia/ingestion@1.34.1': + resolution: {integrity: sha512-QLxiBskQxFGzPqKZvBNEvNN95kgDCbBd2X29ZGfh6Sr2QOSU34US6Z9x2duiF4o9FwsB0i6eQ2c9vHfuH0lAQg==} engines: {node: '>= 14.0.0'} - '@algolia/monitoring@1.34.0': - resolution: {integrity: sha512-OJiDhlJX8ZdWAndc50Z6aUEW/YmnhFK2ul3rahMw5/c9Damh7+oY9SufoK2LimJejy+65Qka06YPG29v2G/vww==} + '@algolia/monitoring@1.34.1': + resolution: {integrity: sha512-NteCvWcWXXdnPGyZH8rXHslcf2pM1WGDNMGNZFXLFtOt1Gf1Tjy2t0NZLp+Mxap3JMV4mbYmactbXrvpQf/lLA==} engines: {node: '>= 14.0.0'} - '@algolia/recommend@5.34.0': - resolution: {integrity: sha512-fzNQZAdVxu/Gnbavy8KW5gurApwdYcPW6+pjO7Pw8V5drCR3eSqnOxSvp79rhscDX8ezwqMqqK4F3Hsq+KpRzg==} + '@algolia/recommend@5.34.1': + resolution: {integrity: sha512-UdgDSrunLIBAAAxQlYLXYLnYFN4wkzkrAYx+wMLEk/pzASWyza3BkecbUFVqoYOBIgwo7Mt4iymzVtFkzL2uCQ==} engines: {node: '>= 14.0.0'} - '@algolia/requester-browser-xhr@5.34.0': - resolution: {integrity: sha512-gEI0xjzA/xvMpEdYmgQnf6AQKllhgKRtnEWmwDrnct+YPIruEHlx1dd7nRJTy/33MiYcCxkB4khXpNrHuqgp3Q==} + '@algolia/requester-browser-xhr@5.34.1': + resolution: {integrity: sha512-567LfFTc9VOiPtuySQohoqaWMeohYWbXK71aMSin+SLMgeKX7hz5LrVmkmMQj9udwWK6/mtHEYZGPYHSuXpLQg==} engines: {node: '>= 14.0.0'} - '@algolia/requester-fetch@5.34.0': - resolution: {integrity: sha512-5SwGOttpbACT4jXzfSJ3mnTcF46SVNSnZ1JjxC3qBa3qKi4U0CJGzuVVy3L798u8dG5H0SZ2MAB5v7180Gnqew==} + '@algolia/requester-fetch@5.34.1': + resolution: {integrity: sha512-YRbygPgGBEik5U593JvyjgxFjcsyZMR25eIQxNHvSQumdAzt5A4E4Idw3yXnwhrmMdjML54ZXT7EAjnTjWy8Xw==} engines: {node: '>= 14.0.0'} - '@algolia/requester-node-http@5.34.0': - resolution: {integrity: sha512-409XlyIyEXrxyGjWxd0q5RASizHSRVUU0AXPCEdqnbcGEzbCgL1n7oYI8YxzE/RqZLha+PNwWCcTVn7EE5tyyQ==} + '@algolia/requester-node-http@5.34.1': + resolution: {integrity: sha512-o0mqRYbS82Rt4DE02Od7RL6pNtV7oSxScPuIw8LW4aqO2V5eCF05Pry/SnUgcI/Vb2QCYC66hytBCqzyC/toZA==} engines: {node: '>= 14.0.0'} - '@antfu/eslint-config@4.17.0': - resolution: {integrity: sha512-S1y0A1+0DcpV6GmjwB9gQCQc7ni9zlKa3MQRqRCEZ0E1WW+nRL1BUwnbk3DpMJAMsb3UIAt1lsAiIBnvIw2NDw==} + '@antfu/eslint-config@4.18.0': + resolution: {integrity: sha512-NjzC2VS0UU45xMPN7FJcIF/hhfYHb/ILVp8T6JdfPKel5QToC4bjC8P0v1tp+cy0/F+5jRJdaGrnH31s7Ku4jw==} hasBin: true peerDependencies: '@eslint-react/eslint-plugin': ^1.38.4 @@ -379,14 +382,6 @@ packages: resolution: {integrity: sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.13.0': - resolution: {integrity: sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/core@0.14.0': - resolution: {integrity: sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.15.1': resolution: {integrity: sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -399,22 +394,30 @@ packages: resolution: {integrity: sha512-LOm5OVt7D4qiKCqoiPbA7LWmI+tbw1VbTUowBcUMgQSuM6poJufkFkYDcQpo5KfgD39TnNySV26QjOh7VFpSyw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/markdown@7.0.0': - resolution: {integrity: sha512-0WNH6pSFHNlWSlNaIFQP0sLHpMUJw1FaJtyqapvGqOt0ISRgTUkTLVT0hT/zekDA1QlP2TT8pwjPkqYTu2s8yg==} + '@eslint/markdown@7.1.0': + resolution: {integrity: sha512-Y+X1B1j+/zupKDVJfkKc8uYMjQkGzfnd8lt7vK3y8x9Br6H5dBuhAfFrQ6ff7HAMm/1BwgecyEiRFkYCWPRxmA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.6': resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.2.8': - resolution: {integrity: sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.3.4': resolution: {integrity: sha512-Ul5l+lHEcw3L5+k8POx6r74mxEYKG5kOb6Xpy2gCRW6zweT6TEhAf8vhxGgjhqrd/VO/Dirhsb+1hNpD1ue9hw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@floating-ui/core@1.7.2': + resolution: {integrity: sha512-wNB5ooIKHQc+Kui96jE/n69rHFWAVoxn5CAzL1Xdd8FG03cgY3MLO+GF9U3W737fYDSgPWA6MReKhBQBop6Pcw==} + + '@floating-ui/dom@1.7.2': + resolution: {integrity: sha512-7cfaOQuCS27HD7DX+6ib2OrnW+b4ZBwDNnCcT0uTyidcmyWb03FnQqJybDBoCnpdxwBSfA94UAYlRCt7mV+TbA==} + + '@floating-ui/utils@0.2.10': + resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} + + '@floating-ui/vue@1.1.7': + resolution: {integrity: sha512-idmAtbAIigGXN2SI5gItiXYBYtNfDTP9yIiObxgu13dgtG7ARCHlNfnR29GxP4LI4o13oiwsJ8wVgghj1lNqcw==} + '@humanfs/core@0.19.1': resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} engines: {node: '>=18.18.0'} @@ -441,6 +444,12 @@ packages: '@iconify/types@2.0.0': resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + '@internationalized/date@3.8.2': + resolution: {integrity: sha512-/wENk7CbvLbkUvX1tu0mwq49CVkkWpkXubGel6birjRPyo6uQ4nQpnq5xZu823zRCwwn82zgHrvgF1vZyvmVgA==} + + '@internationalized/number@3.6.4': + resolution: {integrity: sha512-P+/h+RDaiX8EGt3shB9AYM1+QgkvHmJ5rKi4/59k4sg9g58k9rqsRW0WxRO7jCoHyvVbFRRFKmVTdFYdehrxHg==} + '@isaacs/balanced-match@4.0.1': resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} engines: {node: 20 || >=22} @@ -596,12 +605,23 @@ packages: '@shikijs/vscode-textmate@10.0.2': resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} - '@stylistic/eslint-plugin@5.2.1': - resolution: {integrity: sha512-siNoKzQ0EJOfCrMFyA1wMtv1+t2OVH00PTXR9kZXji7AUVhL1TiumIF0Iufa2aqR3oOKsxjc/a8PiB9ANNW3+g==} + '@stylistic/eslint-plugin@5.2.2': + resolution: {integrity: sha512-bE2DUjruqXlHYP3Q2Gpqiuj2bHq7/88FnuaS0FjeGGLCy+X6a07bGVuwtiOYnPSLHR6jmx5Bwdv+j7l8H+G97A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: '>=9.0.0' + '@swc/helpers@0.5.17': + resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} + + '@tanstack/virtual-core@3.13.12': + resolution: {integrity: sha512-1YBOJfRHV4sXUmWsFSf5rQor4Ss82G8dQWLRbnk3GA4jeP8hQt1hxXh0tmflpC0dz3VgEv/1+qwPyLeWkQuPFA==} + + '@tanstack/vue-virtual@3.13.12': + resolution: {integrity: sha512-vhF7kEU9EXWXh+HdAwKJ2m3xaOnTTmgcdXcF2pim8g4GvI7eRrk2YRuV5nUlZnd/NbCIX4/Ja2OZu5EjJL06Ww==} + peerDependencies: + vue: ^2.7.0 || ^3.0.0 + '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} @@ -716,17 +736,17 @@ packages: vitest: optional: true - '@vue/compiler-core@3.5.17': - resolution: {integrity: sha512-Xe+AittLbAyV0pabcN7cP7/BenRBNcteM4aSDCtRvGw0d9OL+HG1u/XHLY/kt1q4fyMeZYXyIYrsHuPSiDPosA==} + '@vue/compiler-core@3.5.18': + resolution: {integrity: sha512-3slwjQrrV1TO8MoXgy3aynDQ7lslj5UqDxuHnrzHtpON5CBinhWjJETciPngpin/T3OuW3tXUf86tEurusnztw==} - '@vue/compiler-dom@3.5.17': - resolution: {integrity: sha512-+2UgfLKoaNLhgfhV5Ihnk6wB4ljyW1/7wUIog2puUqajiC29Lp5R/IKDdkebh9jTbTogTbsgB+OY9cEWzG95JQ==} + '@vue/compiler-dom@3.5.18': + resolution: {integrity: sha512-RMbU6NTU70++B1JyVJbNbeFkK+A+Q7y9XKE2EM4NLGm2WFR8x9MbAtWxPPLdm0wUkuZv9trpwfSlL6tjdIa1+A==} - '@vue/compiler-sfc@3.5.17': - resolution: {integrity: sha512-rQQxbRJMgTqwRugtjw0cnyQv9cP4/4BxWfTdRBkqsTfLOHWykLzbOc3C4GGzAmdMDxhzU/1Ija5bTjMVrddqww==} + '@vue/compiler-sfc@3.5.18': + resolution: {integrity: sha512-5aBjvGqsWs+MoxswZPoTB9nSDb3dhd1x30xrrltKujlCxo48j8HGDNj3QPhF4VIS0VQDUrA1xUfp2hEa+FNyXA==} - '@vue/compiler-ssr@3.5.17': - resolution: {integrity: sha512-hkDbA0Q20ZzGgpj5uZjb9rBzQtIHLS78mMilwrlpWk2Ep37DYntUz0PonQ6kr113vfOEdM+zTBuJDaceNIW0tQ==} + '@vue/compiler-ssr@3.5.18': + resolution: {integrity: sha512-xM16Ak7rSWHkM3m22NlmcdIM+K4BMyFARAfV9hYFl+SFuRzrZ3uGMNW05kA5pmeMa0X9X963Kgou7ufdbpOP9g==} '@vue/devtools-api@7.7.7': resolution: {integrity: sha512-lwOnNBH2e7x1fIIbVT7yF5D+YWhqELm55/4ZKf45R9T8r9dE2AIOy8HKjfqzGsoTHFbWbr337O4E0A0QADnjBg==} @@ -737,26 +757,31 @@ packages: '@vue/devtools-shared@7.7.7': resolution: {integrity: sha512-+udSj47aRl5aKb0memBvcUG9koarqnxNM5yjuREvqwK6T3ap4mn3Zqqc17QrBFTqSMjr3HK1cvStEZpMDpfdyw==} - '@vue/reactivity@3.5.17': - resolution: {integrity: sha512-l/rmw2STIscWi7SNJp708FK4Kofs97zc/5aEPQh4bOsReD/8ICuBcEmS7KGwDj5ODQLYWVN2lNibKJL1z5b+Lw==} + '@vue/reactivity@3.5.18': + resolution: {integrity: sha512-x0vPO5Imw+3sChLM5Y+B6G1zPjwdOri9e8V21NnTnlEvkxatHEH5B5KEAJcjuzQ7BsjGrKtfzuQ5eQwXh8HXBg==} - '@vue/runtime-core@3.5.17': - resolution: {integrity: sha512-QQLXa20dHg1R0ri4bjKeGFKEkJA7MMBxrKo2G+gJikmumRS7PTD4BOU9FKrDQWMKowz7frJJGqBffYMgQYS96Q==} + '@vue/runtime-core@3.5.18': + resolution: {integrity: sha512-DUpHa1HpeOQEt6+3nheUfqVXRog2kivkXHUhoqJiKR33SO4x+a5uNOMkV487WPerQkL0vUuRvq/7JhRgLW3S+w==} - '@vue/runtime-dom@3.5.17': - resolution: {integrity: sha512-8El0M60TcwZ1QMz4/os2MdlQECgGoVHPuLnQBU3m9h3gdNRW9xRmI8iLS4t/22OQlOE6aJvNNlBiCzPHur4H9g==} + '@vue/runtime-dom@3.5.18': + resolution: {integrity: sha512-YwDj71iV05j4RnzZnZtGaXwPoUWeRsqinblgVJwR8XTXYZ9D5PbahHQgsbmzUvCWNF6x7siQ89HgnX5eWkr3mw==} - '@vue/server-renderer@3.5.17': - resolution: {integrity: sha512-BOHhm8HalujY6lmC3DbqF6uXN/K00uWiEeF22LfEsm9Q93XeJ/plHTepGwf6tqFcF7GA5oGSSAAUock3VvzaCA==} + '@vue/server-renderer@3.5.18': + resolution: {integrity: sha512-PvIHLUoWgSbDG7zLHqSqaCoZvHi6NNmfVFOqO+OnwvqMz/tqQr3FuGWS8ufluNddk7ZLBJYMrjcw1c6XzR12mA==} peerDependencies: - vue: 3.5.17 + vue: 3.5.18 - '@vue/shared@3.5.17': - resolution: {integrity: sha512-CabR+UN630VnsJO/jHWYBC1YVXyMq94KKp6iF5MQgZJs5I8cmjw6oVMO1oDbtBkENSHSSn/UadWlW/OAgdmKrg==} + '@vue/shared@3.5.18': + resolution: {integrity: sha512-cZy8Dq+uuIXbxCZpuLd2GJdeSO/lIzIspC2WtkqIpje5QyFbvLaI5wZtdUjLHjGZrlVX6GilejatWwVYYRc8tA==} '@vueuse/core@12.8.2': resolution: {integrity: sha512-HbvCmZdzAu3VGi/pWYm5Ut+Kd9mn1ZHnn4L5G8kOQTPs/IwIAmJoBrmYk2ckLArgMXZj0AW3n5CAejLUO+PhdQ==} + '@vueuse/core@13.5.0': + resolution: {integrity: sha512-wV7z0eUpifKmvmN78UBZX8T7lMW53Nrk6JP5+6hbzrB9+cJ3jr//hUlhl9TZO/03bUkMK6gGkQpqOPWoabr72g==} + peerDependencies: + vue: ^3.5.0 + '@vueuse/integrations@12.8.2': resolution: {integrity: sha512-fbGYivgK5uBTRt7p5F3zy6VrETlV9RtZjBqd1/HxGdjdckBgBM4ugP8LHpjolqTj14TXTxSK1ZfgPbHYyGuH7g==} peerDependencies: @@ -801,9 +826,17 @@ packages: '@vueuse/metadata@12.8.2': resolution: {integrity: sha512-rAyLGEuoBJ/Il5AmFHiziCPdQzRt88VxR+Y/A/QhJ1EWtWqPBBAxTAFaSkviwEuOEZNtW8pvkPgoCZQ+HxqW1A==} + '@vueuse/metadata@13.5.0': + resolution: {integrity: sha512-euhItU3b0SqXxSy8u1XHxUCdQ8M++bsRs+TYhOLDU/OykS7KvJnyIFfep0XM5WjIFry9uAPlVSjmVHiqeshmkw==} + '@vueuse/shared@12.8.2': resolution: {integrity: sha512-dznP38YzxZoNloI0qpEfpkms8knDtaoQ6Y/sfS0L7Yki4zh40LFHEhur0odJC6xTHG5dxWVPiUWBXn+wCG2s5w==} + '@vueuse/shared@13.5.0': + resolution: {integrity: sha512-K7GrQIxJ/ANtucxIXbQlUHdB0TPA8c+q5i+zbrjxuhJCnJ9GtBg75sBSnvmLSxHKPg2Yo8w62PWksl9kwH0Q8g==} + peerDependencies: + vue: ^3.5.0 + acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -817,8 +850,8 @@ packages: ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - algoliasearch@5.34.0: - resolution: {integrity: sha512-wioVnf/8uuG8Bmywhk5qKIQ3wzCCtmdvicPRb0fa3kKYGGoewfgDqLEaET1MV2NbTc3WGpPv+AgauLVBp1nB9A==} + algoliasearch@5.34.1: + resolution: {integrity: sha512-s70HlfBgswgEdmCYkUJG8i/ULYhbkk8N9+N8JsWUwszcp7eauPEr5tIX4BY0qDGeKWQ/qZvmt4mxwTusYY23sg==} engines: {node: '>= 14.0.0'} ansi-regex@5.0.1: @@ -848,6 +881,10 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + aria-hidden@1.2.6: + resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==} + engines: {node: '>=10'} + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -894,6 +931,9 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} + change-case@5.4.4: + resolution: {integrity: sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==} + character-entities-html4@2.1.0: resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} @@ -907,10 +947,17 @@ packages: resolution: {integrity: sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ==} engines: {node: '>=8'} + class-variance-authority@0.7.1: + resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} + clean-regexp@1.0.0: resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} engines: {node: '>=4'} + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -968,6 +1015,9 @@ packages: deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + defu@6.1.4: + resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} @@ -978,8 +1028,8 @@ packages: eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - electron-to-chromium@1.5.189: - resolution: {integrity: sha512-y9D1ntS1ruO/pZ/V2FtLE+JXLQe28XoRpZ7QCCo0T8LdQladzdcOVQZH/IWLVJvCw12OGMb6hYOeOAjntCmJRQ==} + electron-to-chromium@1.5.190: + resolution: {integrity: sha512-k4McmnB2091YIsdCgkS0fMVMPOJgxl93ltFzaryXqwip1AaxeDqKCGLxkXODDA5Ab/D+tV5EL5+aTx76RvLRxw==} emoji-regex-xs@1.0.0: resolution: {integrity: sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==} @@ -1126,11 +1176,11 @@ packages: peerDependencies: eslint: '>=6.0.0' - eslint-plugin-unicorn@59.0.1: - resolution: {integrity: sha512-EtNXYuWPUmkgSU2E7Ttn57LbRREQesIP1BiLn7OZLKodopKfDXfBUkC/0j6mpw2JExwf43Uf3qLSvrSvppgy8Q==} - engines: {node: ^18.20.0 || ^20.10.0 || >=21.0.0} + eslint-plugin-unicorn@60.0.0: + resolution: {integrity: sha512-QUzTefvP8stfSXsqKQ+vBQSEsXIlAiCduS/V1Em+FKgL9c21U/IIm20/e3MFy1jyCf14tHAhqC1sX8OTy6VUCg==} + engines: {node: ^20.10.0 || >=21.0.0} peerDependencies: - eslint: '>=9.22.0' + eslint: '>=9.29.0' eslint-plugin-unused-imports@4.1.4: resolution: {integrity: sha512-YptD6IzQjDardkl0POxnnRBhU1OEePMV0nd6siHaRBbd+lyh6NAhFEobiznKU7kTsSsDeSD62Pe7kAM1b7dAZQ==} @@ -1445,12 +1495,20 @@ packages: resolution: {integrity: sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==} engines: {node: 20 || >=22} + lucide-vue-next@0.503.0: + resolution: {integrity: sha512-3MrtHIBdh4dPCUZDLxQnvmQ17UzUnBYgezUSIo87Laais8hOz6qIPllp0iG/uS/UIzk7bJxyZRzoZTW/gLSr4A==} + peerDependencies: + vue: '>=3.0.1' + magic-string@0.30.17: resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} mark.js@8.11.1: resolution: {integrity: sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==} + markdown-it-link-attributes@4.0.1: + resolution: {integrity: sha512-pg5OK0jPLg62H4k7M9mRJLT61gUp9nvG0XveKYHMOOluASo9OEF13WlXrpAp2aj35LbedAy3QOCgQCw0tkLKAQ==} + markdown-table@3.0.4: resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} @@ -1640,6 +1698,9 @@ packages: nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + ohash@2.0.11: + resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} + oniguruma-to-es@3.1.1: resolution: {integrity: sha512-bUH8SDvPkH3ho3dvwJwfonjlQ4R80vjyvrU8YpxuROddv55vAEJrTuCuCVUhhsHbtlD9tGGbaNApGQckXhS8iQ==} @@ -1775,6 +1836,11 @@ packages: resolution: {integrity: sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==} hasBin: true + reka-ui@2.4.0: + resolution: {integrity: sha512-5WHLEquWI5W67NnjH9F+RhpzRAcwjAEQHtHZMa5wYdhClcYDr59q0RAAcymcnfndFqv0MiBxyFfzbGSRyIZG5g==} + peerDependencies: + vue: '>= 3.2.0' + resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -1922,6 +1988,9 @@ packages: peerDependencies: typescript: '>=4.0.0' + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -1998,6 +2067,12 @@ packages: terser: optional: true + vitepress-openapi@0.1.4: + resolution: {integrity: sha512-eKVinlXa0z23P6LRWejvjnY6/rCy0zwJKeU5rw09bhg8uHbXOge8m17lLhnhAldKEnFS4upmpiGVQ9mYr6s/dg==} + peerDependencies: + vitepress: '>=1.0.0' + vue: ^3.0.0 + vitepress@1.6.3: resolution: {integrity: sha512-fCkfdOk8yRZT8GD9BFqusW3+GggWYZ/rYncOfmgcDtP3ualNHCAg+Robxp2/6xfH1WwPHtGpPwv7mbA3qomtBw==} hasBin: true @@ -2010,14 +2085,25 @@ packages: postcss: optional: true + vue-demi@0.14.10: + resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} + engines: {node: '>=12'} + hasBin: true + peerDependencies: + '@vue/composition-api': ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + vue-eslint-parser@10.2.0: resolution: {integrity: sha512-CydUvFOQKD928UzZhTp4pr2vWz1L+H99t7Pkln2QSPdvmURT0MoC4wUccfCnuEaihNsu9aYYyk+bep8rlfkUXw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - vue@3.5.17: - resolution: {integrity: sha512-LbHV3xPN9BeljML+Xctq4lbz2lVHCR6DtbpTf5XIO6gugpXUN49j2QQPcMj086r9+AkJ0FfUT8xjulKKBkkr9g==} + vue@3.5.18: + resolution: {integrity: sha512-7W4Y4ZbMiQ3SEo+m9lnoNpV9xG7QVMLa+/0RFwwiAVkeYoyGXqWE85jabU4pllJNUzqfLShJ5YLptewhCWUgNA==} peerDependencies: typescript: '*' peerDependenciesMeta: @@ -2063,118 +2149,118 @@ packages: snapshots: - '@algolia/autocomplete-core@1.17.7(@algolia/client-search@5.34.0)(algoliasearch@5.34.0)(search-insights@2.13.0)': + '@algolia/autocomplete-core@1.17.7(@algolia/client-search@5.34.1)(algoliasearch@5.34.1)(search-insights@2.13.0)': dependencies: - '@algolia/autocomplete-plugin-algolia-insights': 1.17.7(@algolia/client-search@5.34.0)(algoliasearch@5.34.0)(search-insights@2.13.0) - '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.34.0)(algoliasearch@5.34.0) + '@algolia/autocomplete-plugin-algolia-insights': 1.17.7(@algolia/client-search@5.34.1)(algoliasearch@5.34.1)(search-insights@2.13.0) + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.34.1)(algoliasearch@5.34.1) transitivePeerDependencies: - '@algolia/client-search' - algoliasearch - search-insights - '@algolia/autocomplete-plugin-algolia-insights@1.17.7(@algolia/client-search@5.34.0)(algoliasearch@5.34.0)(search-insights@2.13.0)': + '@algolia/autocomplete-plugin-algolia-insights@1.17.7(@algolia/client-search@5.34.1)(algoliasearch@5.34.1)(search-insights@2.13.0)': dependencies: - '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.34.0)(algoliasearch@5.34.0) + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.34.1)(algoliasearch@5.34.1) search-insights: 2.13.0 transitivePeerDependencies: - '@algolia/client-search' - algoliasearch - '@algolia/autocomplete-preset-algolia@1.17.7(@algolia/client-search@5.34.0)(algoliasearch@5.34.0)': + '@algolia/autocomplete-preset-algolia@1.17.7(@algolia/client-search@5.34.1)(algoliasearch@5.34.1)': dependencies: - '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.34.0)(algoliasearch@5.34.0) - '@algolia/client-search': 5.34.0 - algoliasearch: 5.34.0 + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.34.1)(algoliasearch@5.34.1) + '@algolia/client-search': 5.34.1 + algoliasearch: 5.34.1 - '@algolia/autocomplete-shared@1.17.7(@algolia/client-search@5.34.0)(algoliasearch@5.34.0)': + '@algolia/autocomplete-shared@1.17.7(@algolia/client-search@5.34.1)(algoliasearch@5.34.1)': dependencies: - '@algolia/client-search': 5.34.0 - algoliasearch: 5.34.0 + '@algolia/client-search': 5.34.1 + algoliasearch: 5.34.1 - '@algolia/client-abtesting@5.34.0': + '@algolia/client-abtesting@5.34.1': dependencies: - '@algolia/client-common': 5.34.0 - '@algolia/requester-browser-xhr': 5.34.0 - '@algolia/requester-fetch': 5.34.0 - '@algolia/requester-node-http': 5.34.0 + '@algolia/client-common': 5.34.1 + '@algolia/requester-browser-xhr': 5.34.1 + '@algolia/requester-fetch': 5.34.1 + '@algolia/requester-node-http': 5.34.1 - '@algolia/client-analytics@5.34.0': + '@algolia/client-analytics@5.34.1': dependencies: - '@algolia/client-common': 5.34.0 - '@algolia/requester-browser-xhr': 5.34.0 - '@algolia/requester-fetch': 5.34.0 - '@algolia/requester-node-http': 5.34.0 + '@algolia/client-common': 5.34.1 + '@algolia/requester-browser-xhr': 5.34.1 + '@algolia/requester-fetch': 5.34.1 + '@algolia/requester-node-http': 5.34.1 - '@algolia/client-common@5.34.0': {} + '@algolia/client-common@5.34.1': {} - '@algolia/client-insights@5.34.0': + '@algolia/client-insights@5.34.1': dependencies: - '@algolia/client-common': 5.34.0 - '@algolia/requester-browser-xhr': 5.34.0 - '@algolia/requester-fetch': 5.34.0 - '@algolia/requester-node-http': 5.34.0 + '@algolia/client-common': 5.34.1 + '@algolia/requester-browser-xhr': 5.34.1 + '@algolia/requester-fetch': 5.34.1 + '@algolia/requester-node-http': 5.34.1 - '@algolia/client-personalization@5.34.0': + '@algolia/client-personalization@5.34.1': dependencies: - '@algolia/client-common': 5.34.0 - '@algolia/requester-browser-xhr': 5.34.0 - '@algolia/requester-fetch': 5.34.0 - '@algolia/requester-node-http': 5.34.0 + '@algolia/client-common': 5.34.1 + '@algolia/requester-browser-xhr': 5.34.1 + '@algolia/requester-fetch': 5.34.1 + '@algolia/requester-node-http': 5.34.1 - '@algolia/client-query-suggestions@5.34.0': + '@algolia/client-query-suggestions@5.34.1': dependencies: - '@algolia/client-common': 5.34.0 - '@algolia/requester-browser-xhr': 5.34.0 - '@algolia/requester-fetch': 5.34.0 - '@algolia/requester-node-http': 5.34.0 + '@algolia/client-common': 5.34.1 + '@algolia/requester-browser-xhr': 5.34.1 + '@algolia/requester-fetch': 5.34.1 + '@algolia/requester-node-http': 5.34.1 - '@algolia/client-search@5.34.0': + '@algolia/client-search@5.34.1': dependencies: - '@algolia/client-common': 5.34.0 - '@algolia/requester-browser-xhr': 5.34.0 - '@algolia/requester-fetch': 5.34.0 - '@algolia/requester-node-http': 5.34.0 + '@algolia/client-common': 5.34.1 + '@algolia/requester-browser-xhr': 5.34.1 + '@algolia/requester-fetch': 5.34.1 + '@algolia/requester-node-http': 5.34.1 - '@algolia/ingestion@1.34.0': + '@algolia/ingestion@1.34.1': dependencies: - '@algolia/client-common': 5.34.0 - '@algolia/requester-browser-xhr': 5.34.0 - '@algolia/requester-fetch': 5.34.0 - '@algolia/requester-node-http': 5.34.0 + '@algolia/client-common': 5.34.1 + '@algolia/requester-browser-xhr': 5.34.1 + '@algolia/requester-fetch': 5.34.1 + '@algolia/requester-node-http': 5.34.1 - '@algolia/monitoring@1.34.0': + '@algolia/monitoring@1.34.1': dependencies: - '@algolia/client-common': 5.34.0 - '@algolia/requester-browser-xhr': 5.34.0 - '@algolia/requester-fetch': 5.34.0 - '@algolia/requester-node-http': 5.34.0 + '@algolia/client-common': 5.34.1 + '@algolia/requester-browser-xhr': 5.34.1 + '@algolia/requester-fetch': 5.34.1 + '@algolia/requester-node-http': 5.34.1 - '@algolia/recommend@5.34.0': + '@algolia/recommend@5.34.1': dependencies: - '@algolia/client-common': 5.34.0 - '@algolia/requester-browser-xhr': 5.34.0 - '@algolia/requester-fetch': 5.34.0 - '@algolia/requester-node-http': 5.34.0 + '@algolia/client-common': 5.34.1 + '@algolia/requester-browser-xhr': 5.34.1 + '@algolia/requester-fetch': 5.34.1 + '@algolia/requester-node-http': 5.34.1 - '@algolia/requester-browser-xhr@5.34.0': + '@algolia/requester-browser-xhr@5.34.1': dependencies: - '@algolia/client-common': 5.34.0 + '@algolia/client-common': 5.34.1 - '@algolia/requester-fetch@5.34.0': + '@algolia/requester-fetch@5.34.1': dependencies: - '@algolia/client-common': 5.34.0 + '@algolia/client-common': 5.34.1 - '@algolia/requester-node-http@5.34.0': + '@algolia/requester-node-http@5.34.1': dependencies: - '@algolia/client-common': 5.34.0 + '@algolia/client-common': 5.34.1 - '@antfu/eslint-config@4.17.0(@vue/compiler-sfc@3.5.17)(eslint@9.31.0)(typescript@5.4.5)': + '@antfu/eslint-config@4.18.0(@vue/compiler-sfc@3.5.18)(eslint@9.31.0)(typescript@5.4.5)': dependencies: '@antfu/install-pkg': 1.1.0 '@clack/prompts': 0.11.0 '@eslint-community/eslint-plugin-eslint-comments': 4.5.0(eslint@9.31.0) - '@eslint/markdown': 7.0.0 - '@stylistic/eslint-plugin': 5.2.1(eslint@9.31.0) + '@eslint/markdown': 7.1.0 + '@stylistic/eslint-plugin': 5.2.2(eslint@9.31.0) '@typescript-eslint/eslint-plugin': 8.38.0(@typescript-eslint/parser@8.38.0(eslint@9.31.0)(typescript@5.4.5))(eslint@9.31.0)(typescript@5.4.5) '@typescript-eslint/parser': 8.38.0(eslint@9.31.0)(typescript@5.4.5) '@vitest/eslint-plugin': 1.3.4(eslint@9.31.0)(typescript@5.4.5) @@ -2195,11 +2281,11 @@ snapshots: eslint-plugin-pnpm: 1.1.0(eslint@9.31.0) eslint-plugin-regexp: 2.9.0(eslint@9.31.0) eslint-plugin-toml: 0.12.0(eslint@9.31.0) - eslint-plugin-unicorn: 59.0.1(eslint@9.31.0) + eslint-plugin-unicorn: 60.0.0(eslint@9.31.0) eslint-plugin-unused-imports: 4.1.4(@typescript-eslint/eslint-plugin@8.38.0(@typescript-eslint/parser@8.38.0(eslint@9.31.0)(typescript@5.4.5))(eslint@9.31.0)(typescript@5.4.5))(eslint@9.31.0) eslint-plugin-vue: 10.3.0(@typescript-eslint/parser@8.38.0(eslint@9.31.0)(typescript@5.4.5))(eslint@9.31.0)(vue-eslint-parser@10.2.0(eslint@9.31.0)) eslint-plugin-yml: 1.18.0(eslint@9.31.0) - eslint-processor-vue-blocks: 2.0.0(@vue/compiler-sfc@3.5.17)(eslint@9.31.0) + eslint-processor-vue-blocks: 2.0.0(@vue/compiler-sfc@3.5.18)(eslint@9.31.0) globals: 16.3.0 jsonc-eslint-parser: 2.4.0 local-pkg: 1.1.1 @@ -2245,9 +2331,9 @@ snapshots: '@docsearch/css@3.8.2': {} - '@docsearch/js@3.8.2(@algolia/client-search@5.34.0)(search-insights@2.13.0)': + '@docsearch/js@3.8.2(@algolia/client-search@5.34.1)(search-insights@2.13.0)': dependencies: - '@docsearch/react': 3.8.2(@algolia/client-search@5.34.0)(search-insights@2.13.0) + '@docsearch/react': 3.8.2(@algolia/client-search@5.34.1)(search-insights@2.13.0) preact: 10.26.9 transitivePeerDependencies: - '@algolia/client-search' @@ -2256,12 +2342,12 @@ snapshots: - react-dom - search-insights - '@docsearch/react@3.8.2(@algolia/client-search@5.34.0)(search-insights@2.13.0)': + '@docsearch/react@3.8.2(@algolia/client-search@5.34.1)(search-insights@2.13.0)': dependencies: - '@algolia/autocomplete-core': 1.17.7(@algolia/client-search@5.34.0)(algoliasearch@5.34.0)(search-insights@2.13.0) - '@algolia/autocomplete-preset-algolia': 1.17.7(@algolia/client-search@5.34.0)(algoliasearch@5.34.0) + '@algolia/autocomplete-core': 1.17.7(@algolia/client-search@5.34.1)(algoliasearch@5.34.1)(search-insights@2.13.0) + '@algolia/autocomplete-preset-algolia': 1.17.7(@algolia/client-search@5.34.1)(algoliasearch@5.34.1) '@docsearch/css': 3.8.2 - algoliasearch: 5.34.0 + algoliasearch: 5.34.1 optionalDependencies: search-insights: 2.13.0 transitivePeerDependencies: @@ -2379,14 +2465,6 @@ snapshots: '@eslint/config-helpers@0.3.0': {} - '@eslint/core@0.13.0': - dependencies: - '@types/json-schema': 7.0.15 - - '@eslint/core@0.14.0': - dependencies: - '@types/json-schema': 7.0.15 - '@eslint/core@0.15.1': dependencies: '@types/json-schema': 7.0.15 @@ -2407,9 +2485,9 @@ snapshots: '@eslint/js@9.31.0': {} - '@eslint/markdown@7.0.0': + '@eslint/markdown@7.1.0': dependencies: - '@eslint/core': 0.14.0 + '@eslint/core': 0.15.1 '@eslint/plugin-kit': 0.3.4 github-slugger: 2.0.0 mdast-util-from-markdown: 2.0.2 @@ -2422,16 +2500,31 @@ snapshots: '@eslint/object-schema@2.1.6': {} - '@eslint/plugin-kit@0.2.8': - dependencies: - '@eslint/core': 0.13.0 - levn: 0.4.1 - '@eslint/plugin-kit@0.3.4': dependencies: '@eslint/core': 0.15.1 levn: 0.4.1 + '@floating-ui/core@1.7.2': + dependencies: + '@floating-ui/utils': 0.2.10 + + '@floating-ui/dom@1.7.2': + dependencies: + '@floating-ui/core': 1.7.2 + '@floating-ui/utils': 0.2.10 + + '@floating-ui/utils@0.2.10': {} + + '@floating-ui/vue@1.1.7(vue@3.5.18(typescript@5.4.5))': + dependencies: + '@floating-ui/dom': 1.7.2 + '@floating-ui/utils': 0.2.10 + vue-demi: 0.14.10(vue@3.5.18(typescript@5.4.5)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + '@humanfs/core@0.19.1': {} '@humanfs/node@0.16.6': @@ -2451,6 +2544,14 @@ snapshots: '@iconify/types@2.0.0': {} + '@internationalized/date@3.8.2': + dependencies: + '@swc/helpers': 0.5.17 + + '@internationalized/number@3.6.4': + dependencies: + '@swc/helpers': 0.5.17 + '@isaacs/balanced-match@4.0.1': {} '@isaacs/brace-expansion@5.0.0': @@ -2582,7 +2683,7 @@ snapshots: '@shikijs/vscode-textmate@10.0.2': {} - '@stylistic/eslint-plugin@5.2.1(eslint@9.31.0)': + '@stylistic/eslint-plugin@5.2.2(eslint@9.31.0)': dependencies: '@eslint-community/eslint-utils': 4.7.0(eslint@9.31.0) '@typescript-eslint/types': 8.38.0 @@ -2592,6 +2693,17 @@ snapshots: estraverse: 5.3.0 picomatch: 4.0.3 + '@swc/helpers@0.5.17': + dependencies: + tslib: 2.8.1 + + '@tanstack/virtual-core@3.13.12': {} + + '@tanstack/vue-virtual@3.13.12(vue@3.5.18(typescript@5.4.5))': + dependencies: + '@tanstack/virtual-core': 3.13.12 + vue: 3.5.18(typescript@5.4.5) + '@types/debug@4.1.12': dependencies: '@types/ms': 2.1.0 @@ -2718,10 +2830,10 @@ snapshots: '@ungap/structured-clone@1.3.0': {} - '@vitejs/plugin-vue@5.2.4(vite@5.4.19)(vue@3.5.17(typescript@5.4.5))': + '@vitejs/plugin-vue@5.2.4(vite@5.4.19)(vue@3.5.18(typescript@5.4.5))': dependencies: vite: 5.4.19 - vue: 3.5.17(typescript@5.4.5) + vue: 3.5.18(typescript@5.4.5) '@vitest/eslint-plugin@1.3.4(eslint@9.31.0)(typescript@5.4.5)': dependencies: @@ -2732,35 +2844,35 @@ snapshots: transitivePeerDependencies: - supports-color - '@vue/compiler-core@3.5.17': + '@vue/compiler-core@3.5.18': dependencies: '@babel/parser': 7.28.0 - '@vue/shared': 3.5.17 + '@vue/shared': 3.5.18 entities: 4.5.0 estree-walker: 2.0.2 source-map-js: 1.2.1 - '@vue/compiler-dom@3.5.17': + '@vue/compiler-dom@3.5.18': dependencies: - '@vue/compiler-core': 3.5.17 - '@vue/shared': 3.5.17 + '@vue/compiler-core': 3.5.18 + '@vue/shared': 3.5.18 - '@vue/compiler-sfc@3.5.17': + '@vue/compiler-sfc@3.5.18': dependencies: '@babel/parser': 7.28.0 - '@vue/compiler-core': 3.5.17 - '@vue/compiler-dom': 3.5.17 - '@vue/compiler-ssr': 3.5.17 - '@vue/shared': 3.5.17 + '@vue/compiler-core': 3.5.18 + '@vue/compiler-dom': 3.5.18 + '@vue/compiler-ssr': 3.5.18 + '@vue/shared': 3.5.18 estree-walker: 2.0.2 magic-string: 0.30.17 postcss: 8.5.6 source-map-js: 1.2.1 - '@vue/compiler-ssr@3.5.17': + '@vue/compiler-ssr@3.5.18': dependencies: - '@vue/compiler-dom': 3.5.17 - '@vue/shared': 3.5.17 + '@vue/compiler-dom': 3.5.18 + '@vue/shared': 3.5.18 '@vue/devtools-api@7.7.7': dependencies: @@ -2780,57 +2892,71 @@ snapshots: dependencies: rfdc: 1.4.1 - '@vue/reactivity@3.5.17': + '@vue/reactivity@3.5.18': dependencies: - '@vue/shared': 3.5.17 + '@vue/shared': 3.5.18 - '@vue/runtime-core@3.5.17': + '@vue/runtime-core@3.5.18': dependencies: - '@vue/reactivity': 3.5.17 - '@vue/shared': 3.5.17 + '@vue/reactivity': 3.5.18 + '@vue/shared': 3.5.18 - '@vue/runtime-dom@3.5.17': + '@vue/runtime-dom@3.5.18': dependencies: - '@vue/reactivity': 3.5.17 - '@vue/runtime-core': 3.5.17 - '@vue/shared': 3.5.17 + '@vue/reactivity': 3.5.18 + '@vue/runtime-core': 3.5.18 + '@vue/shared': 3.5.18 csstype: 3.1.3 - '@vue/server-renderer@3.5.17(vue@3.5.17(typescript@5.4.5))': + '@vue/server-renderer@3.5.18(vue@3.5.18(typescript@5.4.5))': dependencies: - '@vue/compiler-ssr': 3.5.17 - '@vue/shared': 3.5.17 - vue: 3.5.17(typescript@5.4.5) + '@vue/compiler-ssr': 3.5.18 + '@vue/shared': 3.5.18 + vue: 3.5.18(typescript@5.4.5) - '@vue/shared@3.5.17': {} + '@vue/shared@3.5.18': {} '@vueuse/core@12.8.2(typescript@5.4.5)': dependencies: '@types/web-bluetooth': 0.0.21 '@vueuse/metadata': 12.8.2 '@vueuse/shared': 12.8.2(typescript@5.4.5) - vue: 3.5.17(typescript@5.4.5) + vue: 3.5.18(typescript@5.4.5) transitivePeerDependencies: - typescript - '@vueuse/integrations@12.8.2(focus-trap@7.6.5)(typescript@5.4.5)': + '@vueuse/core@13.5.0(vue@3.5.18(typescript@5.4.5))': + dependencies: + '@types/web-bluetooth': 0.0.21 + '@vueuse/metadata': 13.5.0 + '@vueuse/shared': 13.5.0(vue@3.5.18(typescript@5.4.5)) + vue: 3.5.18(typescript@5.4.5) + + '@vueuse/integrations@12.8.2(change-case@5.4.4)(focus-trap@7.6.5)(typescript@5.4.5)': dependencies: '@vueuse/core': 12.8.2(typescript@5.4.5) '@vueuse/shared': 12.8.2(typescript@5.4.5) - vue: 3.5.17(typescript@5.4.5) + vue: 3.5.18(typescript@5.4.5) optionalDependencies: + change-case: 5.4.4 focus-trap: 7.6.5 transitivePeerDependencies: - typescript '@vueuse/metadata@12.8.2': {} + '@vueuse/metadata@13.5.0': {} + '@vueuse/shared@12.8.2(typescript@5.4.5)': dependencies: - vue: 3.5.17(typescript@5.4.5) + vue: 3.5.18(typescript@5.4.5) transitivePeerDependencies: - typescript + '@vueuse/shared@13.5.0(vue@3.5.18(typescript@5.4.5))': + dependencies: + vue: 3.5.18(typescript@5.4.5) + acorn-jsx@5.3.2(acorn@8.15.0): dependencies: acorn: 8.15.0 @@ -2844,21 +2970,21 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 - algoliasearch@5.34.0: - dependencies: - '@algolia/client-abtesting': 5.34.0 - '@algolia/client-analytics': 5.34.0 - '@algolia/client-common': 5.34.0 - '@algolia/client-insights': 5.34.0 - '@algolia/client-personalization': 5.34.0 - '@algolia/client-query-suggestions': 5.34.0 - '@algolia/client-search': 5.34.0 - '@algolia/ingestion': 1.34.0 - '@algolia/monitoring': 1.34.0 - '@algolia/recommend': 5.34.0 - '@algolia/requester-browser-xhr': 5.34.0 - '@algolia/requester-fetch': 5.34.0 - '@algolia/requester-node-http': 5.34.0 + algoliasearch@5.34.1: + dependencies: + '@algolia/client-abtesting': 5.34.1 + '@algolia/client-analytics': 5.34.1 + '@algolia/client-common': 5.34.1 + '@algolia/client-insights': 5.34.1 + '@algolia/client-personalization': 5.34.1 + '@algolia/client-query-suggestions': 5.34.1 + '@algolia/client-search': 5.34.1 + '@algolia/ingestion': 1.34.1 + '@algolia/monitoring': 1.34.1 + '@algolia/recommend': 5.34.1 + '@algolia/requester-browser-xhr': 5.34.1 + '@algolia/requester-fetch': 5.34.1 + '@algolia/requester-node-http': 5.34.1 ansi-regex@5.0.1: {} @@ -2876,6 +3002,10 @@ snapshots: argparse@2.0.1: {} + aria-hidden@1.2.6: + dependencies: + tslib: 2.8.1 + balanced-match@1.0.2: {} birpc@2.5.0: {} @@ -2898,7 +3028,7 @@ snapshots: browserslist@4.25.1: dependencies: caniuse-lite: 1.0.30001727 - electron-to-chromium: 1.5.189 + electron-to-chromium: 1.5.190 node-releases: 2.0.19 update-browserslist-db: 1.1.3(browserslist@4.25.1) @@ -2917,6 +3047,8 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 + change-case@5.4.4: {} + character-entities-html4@2.1.0: {} character-entities-legacy@3.0.0: {} @@ -2925,10 +3057,16 @@ snapshots: ci-info@4.3.0: {} + class-variance-authority@0.7.1: + dependencies: + clsx: 2.1.1 + clean-regexp@1.0.0: dependencies: escape-string-regexp: 1.0.5 + clsx@2.1.1: {} + color-convert@2.0.1: dependencies: color-name: 1.1.4 @@ -2973,6 +3111,8 @@ snapshots: deep-is@0.1.4: {} + defu@6.1.4: {} + dequal@2.0.3: {} devlop@1.1.0: @@ -2981,7 +3121,7 @@ snapshots: eastasianwidth@0.2.0: {} - electron-to-chromium@1.5.189: {} + electron-to-chromium@1.5.190: {} emoji-regex-xs@1.0.0: {} @@ -3171,11 +3311,12 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-unicorn@59.0.1(eslint@9.31.0): + eslint-plugin-unicorn@60.0.0(eslint@9.31.0): dependencies: '@babel/helper-validator-identifier': 7.27.1 '@eslint-community/eslint-utils': 4.7.0(eslint@9.31.0) - '@eslint/plugin-kit': 0.2.8 + '@eslint/plugin-kit': 0.3.4 + change-case: 5.4.4 ci-info: 4.3.0 clean-regexp: 1.0.0 core-js-compat: 3.44.0 @@ -3222,9 +3363,9 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-processor-vue-blocks@2.0.0(@vue/compiler-sfc@3.5.17)(eslint@9.31.0): + eslint-processor-vue-blocks@2.0.0(@vue/compiler-sfc@3.5.18)(eslint@9.31.0): dependencies: - '@vue/compiler-sfc': 3.5.17 + '@vue/compiler-sfc': 3.5.18 eslint: 9.31.0 eslint-scope@8.4.0: @@ -3508,12 +3649,18 @@ snapshots: lru-cache@11.1.0: {} + lucide-vue-next@0.503.0(vue@3.5.18(typescript@5.4.5)): + dependencies: + vue: 3.5.18(typescript@5.4.5) + magic-string@0.30.17: dependencies: '@jridgewell/sourcemap-codec': 1.5.4 mark.js@8.11.1: {} + markdown-it-link-attributes@4.0.1: {} + markdown-table@3.0.4: {} mdast-util-find-and-replace@3.0.2: @@ -3889,6 +4036,8 @@ snapshots: dependencies: boolbase: 1.0.0 + ohash@2.0.11: {} + oniguruma-to-es@3.1.1: dependencies: emoji-regex-xs: 1.0.0 @@ -4015,6 +4164,23 @@ snapshots: dependencies: jsesc: 3.0.2 + reka-ui@2.4.0(typescript@5.4.5)(vue@3.5.18(typescript@5.4.5)): + dependencies: + '@floating-ui/dom': 1.7.2 + '@floating-ui/vue': 1.1.7(vue@3.5.18(typescript@5.4.5)) + '@internationalized/date': 3.8.2 + '@internationalized/number': 3.6.4 + '@tanstack/vue-virtual': 3.13.12(vue@3.5.18(typescript@5.4.5)) + '@vueuse/core': 12.8.2(typescript@5.4.5) + '@vueuse/shared': 12.8.2(typescript@5.4.5) + aria-hidden: 1.2.6 + defu: 6.1.4 + ohash: 2.0.11 + vue: 3.5.18(typescript@5.4.5) + transitivePeerDependencies: + - '@vue/composition-api' + - typescript + resolve-from@4.0.0: {} resolve-pkg-maps@1.0.0: {} @@ -4172,6 +4338,8 @@ snapshots: picomatch: 4.0.3 typescript: 5.4.5 + tslib@2.8.1: {} + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 @@ -4233,26 +4401,40 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - vitepress@1.6.3(@algolia/client-search@5.34.0)(postcss@8.5.6)(search-insights@2.13.0)(typescript@5.4.5): + vitepress-openapi@0.1.4(typescript@5.4.5)(vitepress@1.6.3(@algolia/client-search@5.34.1)(change-case@5.4.4)(postcss@8.5.6)(search-insights@2.13.0)(typescript@5.4.5))(vue@3.5.18(typescript@5.4.5)): + dependencies: + '@vueuse/core': 13.5.0(vue@3.5.18(typescript@5.4.5)) + class-variance-authority: 0.7.1 + clsx: 2.1.1 + lucide-vue-next: 0.503.0(vue@3.5.18(typescript@5.4.5)) + markdown-it-link-attributes: 4.0.1 + reka-ui: 2.4.0(typescript@5.4.5)(vue@3.5.18(typescript@5.4.5)) + vitepress: 1.6.3(@algolia/client-search@5.34.1)(change-case@5.4.4)(postcss@8.5.6)(search-insights@2.13.0)(typescript@5.4.5) + vue: 3.5.18(typescript@5.4.5) + transitivePeerDependencies: + - '@vue/composition-api' + - typescript + + vitepress@1.6.3(@algolia/client-search@5.34.1)(change-case@5.4.4)(postcss@8.5.6)(search-insights@2.13.0)(typescript@5.4.5): dependencies: '@docsearch/css': 3.8.2 - '@docsearch/js': 3.8.2(@algolia/client-search@5.34.0)(search-insights@2.13.0) + '@docsearch/js': 3.8.2(@algolia/client-search@5.34.1)(search-insights@2.13.0) '@iconify-json/simple-icons': 1.2.44 '@shikijs/core': 2.5.0 '@shikijs/transformers': 2.5.0 '@shikijs/types': 2.5.0 '@types/markdown-it': 14.1.2 - '@vitejs/plugin-vue': 5.2.4(vite@5.4.19)(vue@3.5.17(typescript@5.4.5)) + '@vitejs/plugin-vue': 5.2.4(vite@5.4.19)(vue@3.5.18(typescript@5.4.5)) '@vue/devtools-api': 7.7.7 - '@vue/shared': 3.5.17 + '@vue/shared': 3.5.18 '@vueuse/core': 12.8.2(typescript@5.4.5) - '@vueuse/integrations': 12.8.2(focus-trap@7.6.5)(typescript@5.4.5) + '@vueuse/integrations': 12.8.2(change-case@5.4.4)(focus-trap@7.6.5)(typescript@5.4.5) focus-trap: 7.6.5 mark.js: 8.11.1 minisearch: 7.1.2 shiki: 2.5.0 vite: 5.4.19 - vue: 3.5.17(typescript@5.4.5) + vue: 3.5.18(typescript@5.4.5) optionalDependencies: postcss: 8.5.6 transitivePeerDependencies: @@ -4282,6 +4464,10 @@ snapshots: - typescript - universal-cookie + vue-demi@0.14.10(vue@3.5.18(typescript@5.4.5)): + dependencies: + vue: 3.5.18(typescript@5.4.5) + vue-eslint-parser@10.2.0(eslint@9.31.0): dependencies: debug: 4.4.1 @@ -4294,13 +4480,13 @@ snapshots: transitivePeerDependencies: - supports-color - vue@3.5.17(typescript@5.4.5): + vue@3.5.18(typescript@5.4.5): dependencies: - '@vue/compiler-dom': 3.5.17 - '@vue/compiler-sfc': 3.5.17 - '@vue/runtime-dom': 3.5.17 - '@vue/server-renderer': 3.5.17(vue@3.5.17(typescript@5.4.5)) - '@vue/shared': 3.5.17 + '@vue/compiler-dom': 3.5.18 + '@vue/compiler-sfc': 3.5.18 + '@vue/runtime-dom': 3.5.18 + '@vue/server-renderer': 3.5.18(vue@3.5.18(typescript@5.4.5)) + '@vue/shared': 3.5.18 optionalDependencies: typescript: 5.4.5