@stackgenhq/backstage-plugin-stackgen-backend 0.3.6-beta.1 → 0.3.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/actions/core/assign_project_members_action.cjs.js +7 -18
- package/dist/actions/core/assign_project_members_action.cjs.js.map +1 -1
- package/dist/actions/core/create_appstack_action.cjs.js +22 -27
- package/dist/actions/core/create_appstack_action.cjs.js.map +1 -1
- package/dist/actions/core/create_project_action.cjs.js +6 -33
- package/dist/actions/core/create_project_action.cjs.js.map +1 -1
- package/dist/actions/core/download_iac_action.cjs.js +2 -9
- package/dist/actions/core/download_iac_action.cjs.js.map +1 -1
- package/dist/actions/core/set_environment_variable_values_action.cjs.js +1 -7
- package/dist/actions/core/set_environment_variable_values_action.cjs.js.map +1 -1
- package/dist/actions/core/set_state_backend_action.cjs.js +6 -16
- package/dist/actions/core/set_state_backend_action.cjs.js.map +1 -1
- package/dist/exporter/gitExporterConfigHttp.cjs.js +2 -16
- package/dist/exporter/gitExporterConfigHttp.cjs.js.map +1 -1
- package/dist/modules/stackgenUiProxiesModule.cjs.js +2 -12
- package/dist/modules/stackgenUiProxiesModule.cjs.js.map +1 -1
- package/dist/utils/api-objects.cjs.js +22 -41
- package/dist/utils/api-objects.cjs.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"download_iac_action.cjs.js","sources":["../../../src/actions/core/download_iac_action.ts"],"sourcesContent":["import { createTemplateAction } from \"@backstage/plugin-scaffolder-node\";\nimport { LoggerService } from \"@backstage/backend-plugin-api\";\nimport { Config } from \"@backstage/config\";\nimport { z } from \"zod\";\nimport path from \"path\";\nimport fs from \"fs/promises\";\nimport { resolveTopologyId } from '../../exporter/topologyResolve';\nimport {\n extractArchiveToDir,\n isPathInsideRoot,\n} from \"../../lib/extractArchive\";\nimport { getStackgenApiObjects, formatClientErrorMessage } from \"../../utils/api-objects\";\n\nexport const downloadIacInputSchema = z.object({\n teamId: z.string().min(1, \"teamId is required for IaC download\"),\n appstackName: z.string().optional(),\n appstackId: z.string().optional(),\n topologyId: z.string().optional(),\n extractedIaCPath: z.string().optional().default(\"./\"),\n}).refine(\n (data) => data.topologyId || data.appstackName || data.appstackId,\n { message: \"At least one of 'topologyId', 'appstackName', or 'appstackId' must be provided\" },\n);\n\nexport const downloadIacOutputSchema = z.object({\n extractedIacPath: z.string(),\n});\n\nasync function resolveTopologyIdForDownload(\n config: Config,\n teamId: string,\n appstackName: string | undefined,\n appstackId: string | undefined,\n logger: LoggerService,\n): Promise<string> {\n if (!appstackId && !appstackName) {\n throw new Error(\"Either topologyId, appstackId, or appstackName must be provided\");\n }\n\n logger.info(\n `Resolving topologyId from appstack ${appstackId ? `id ${appstackId}` : `name '${appstackName}'`}`,\n );\n return resolveTopologyId({\n config,\n teamId,\n appstackId,\n appstackName,\n logger,\n });\n}\n\nasync function fetchIacZipBuffer(\n stackgenApis: ReturnType<typeof getStackgenApiObjects>,\n topologyId: string,\n teamId: string,\n logger: LoggerService,\n): Promise<Buffer> {\n logger.info(\n `Downloading IaC ZIP via generated client (project=${teamId}, topology=${topologyId})`,\n );\n const blob = await stackgenApis.integrationsTopologyApiObj.v1ProjectExportTopologyIaC({\n projectId: teamId,\n topologyId,\n });\n return Buffer.from(await blob.arrayBuffer());\n}\n\nfunction validateTeamId(teamId: string, allowedTeams: string[]) {\n if (allowedTeams.length === 0) return;\n if (!allowedTeams.includes(teamId)) {\n throw new Error(`Team ID ${teamId} is not allowed.`);\n }\n}\n\nexport const downloadIaCAction = (config: Config, logger: LoggerService) => {\n return createTemplateAction({\n id: \"stackGen:downloadIaC\",\n description:\n \"Downloads the IaC from StackGen for an appstack topology\",\n schema: {\n // Backstage parseSchemas only accepts (z) => ZodType or per-field callbacks.\n input: () => downloadIacInputSchema,\n output: () => downloadIacOutputSchema,\n },\n async handler(ctx) {\n const { teamId, appstackName, appstackId, topologyId: inputTopologyId } = ctx.input;\n const stackgenApis = getStackgenApiObjects(config);\n\n try {\n const allowedTeams = config\n .getOptionalString(\"stackGen.allowedTeams\")\n ?.split(\",\")\n .map((id) => id.trim()) || [];\n\n validateTeamId(teamId, allowedTeams);\n\n // Resolve topologyId if not provided directly\n const topologyId =\n inputTopologyId ||\n (await resolveTopologyIdForDownload(\n config,\n teamId,\n appstackName,\n appstackId,\n logger,\n ));\n\n const zipBuffer = await fetchIacZipBuffer(\n stackgenApis,\n topologyId,\n teamId,\n logger,\n );\n\n // Save ZIP to workspace (basename so labels cannot escape via path segments)\n const fileLabel = path.basename(\n appstackName || appstackId || topologyId,\n );\n const zipPath = path.resolve(\n ctx.workspacePath,\n `${fileLabel}-iac.zip`,\n );\n if (!isPathInsideRoot(ctx.workspacePath, zipPath)) {\n throw new Error(\n `Refusing ZIP path outside workspace: ${zipPath}`,\n );\n }\n await fs.writeFile(zipPath, zipBuffer);\n logger.info(`Saved IaC ZIP to ${zipPath}`);\n\n ctx.input.extractedIaCPath = ctx.input.extractedIaCPath || \"./\";\n const extractedPath = path.resolve(\n ctx.workspacePath,\n ctx.input.extractedIaCPath,\n );\n if (!isPathInsideRoot(ctx.workspacePath, extractedPath)) {\n throw new Error(\n `Refusing extractedIaCPath outside workspace: ${ctx.input.extractedIaCPath}`,\n );\n }\n // Archives come from StackGen over TLS; still use a maintained extractor\n // with path containment checks (Zip Slip defense in depth).\n await extractArchiveToDir(zipPath, extractedPath);\n logger.info(`Extracted IaC to ${extractedPath}`);\n ctx.logger.info(`IaC files extracted to ${extractedPath}`);\n // Delete the ZIP after extraction\n await fs.unlink(zipPath);\n } catch (err: unknown) {\n if ((err as { response?: unknown })?.response) {\n const detail = await formatClientErrorMessage(err);\n logger.error(`Download IaC Error: ${detail}`);\n ctx.logger.error(`Download IaC Error: ${detail}`);\n throw new Error(`Download IaC Error: ${detail}`);\n }\n\n const detail =\n err instanceof Error ? err.message : String(err);\n logger.error(`Download IaC Error: ${detail}`);\n ctx.logger.error(`Download IaC Error: ${detail}`);\n throw err;\n }\n },\n });\n};\n"],"names":["z","resolveTopologyId","createTemplateAction","getStackgenApiObjects","path","isPathInsideRoot","fs","extractArchiveToDir","detail","formatClientErrorMessage"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"download_iac_action.cjs.js","sources":["../../../src/actions/core/download_iac_action.ts"],"sourcesContent":["import { createTemplateAction } from \"@backstage/plugin-scaffolder-node\";\nimport { LoggerService } from \"@backstage/backend-plugin-api\";\nimport { Config } from \"@backstage/config\";\nimport { z } from \"zod\";\nimport path from \"path\";\nimport fs from \"fs/promises\";\nimport { resolveTopologyId } from '../../exporter/topologyResolve';\nimport {\n extractArchiveToDir,\n isPathInsideRoot,\n} from \"../../lib/extractArchive\";\nimport { getStackgenApiObjects } from \"../../utils/api-objects\";\n\nexport const downloadIacInputSchema = z.object({\n teamId: z.string().min(1, \"teamId is required for IaC download\"),\n appstackName: z.string().optional(),\n appstackId: z.string().optional(),\n topologyId: z.string().optional(),\n extractedIaCPath: z.string().optional().default(\"./\"),\n}).refine(\n (data) => data.topologyId || data.appstackName || data.appstackId,\n { message: \"At least one of 'topologyId', 'appstackName', or 'appstackId' must be provided\" },\n);\n\nexport const downloadIacOutputSchema = z.object({\n extractedIacPath: z.string(),\n});\n\nasync function resolveTopologyIdForDownload(\n config: Config,\n teamId: string,\n appstackName: string | undefined,\n appstackId: string | undefined,\n logger: LoggerService,\n): Promise<string> {\n if (!appstackId && !appstackName) {\n throw new Error(\"Either topologyId, appstackId, or appstackName must be provided\");\n }\n\n logger.info(\n `Resolving topologyId from appstack ${appstackId ? `id ${appstackId}` : `name '${appstackName}'`}`,\n );\n return resolveTopologyId({\n config,\n teamId,\n appstackId,\n appstackName,\n logger,\n });\n}\n\nasync function fetchIacZipBuffer(\n stackgenApis: ReturnType<typeof getStackgenApiObjects>,\n topologyId: string,\n teamId: string,\n logger: LoggerService,\n): Promise<Buffer> {\n logger.info(\n `Downloading IaC ZIP via generated client (project=${teamId}, topology=${topologyId})`,\n );\n const blob = await stackgenApis.integrationsTopologyApiObj.v1ProjectExportTopologyIaC({\n projectId: teamId,\n topologyId,\n });\n return Buffer.from(await blob.arrayBuffer());\n}\n\nfunction validateTeamId(teamId: string, allowedTeams: string[]) {\n if (allowedTeams.length === 0) return;\n if (!allowedTeams.includes(teamId)) {\n throw new Error(`Team ID ${teamId} is not allowed.`);\n }\n}\n\nexport const downloadIaCAction = (config: Config, logger: LoggerService) => {\n return createTemplateAction({\n id: \"stackGen:downloadIaC\",\n description:\n \"Downloads the IaC from StackGen for an appstack topology\",\n schema: {\n // Backstage parseSchemas only accepts (z) => ZodType or per-field callbacks.\n input: () => downloadIacInputSchema,\n output: () => downloadIacOutputSchema,\n },\n async handler(ctx) {\n const { teamId, appstackName, appstackId, topologyId: inputTopologyId } = ctx.input;\n const stackgenApis = getStackgenApiObjects(config);\n\n try {\n const allowedTeams = config\n .getOptionalString(\"stackGen.allowedTeams\")\n ?.split(\",\")\n .map((id) => id.trim()) || [];\n\n validateTeamId(teamId, allowedTeams);\n\n // Resolve topologyId if not provided directly\n const topologyId =\n inputTopologyId ||\n (await resolveTopologyIdForDownload(\n config,\n teamId,\n appstackName,\n appstackId,\n logger,\n ));\n\n const zipBuffer = await fetchIacZipBuffer(\n stackgenApis,\n topologyId,\n teamId,\n logger,\n );\n\n // Save ZIP to workspace (basename so labels cannot escape via path segments)\n const fileLabel = path.basename(\n appstackName || appstackId || topologyId,\n );\n const zipPath = path.resolve(\n ctx.workspacePath,\n `${fileLabel}-iac.zip`,\n );\n if (!isPathInsideRoot(ctx.workspacePath, zipPath)) {\n throw new Error(\n `Refusing ZIP path outside workspace: ${zipPath}`,\n );\n }\n await fs.writeFile(zipPath, zipBuffer);\n logger.info(`Saved IaC ZIP to ${zipPath}`);\n\n ctx.input.extractedIaCPath = ctx.input.extractedIaCPath || \"./\";\n const extractedPath = path.resolve(\n ctx.workspacePath,\n ctx.input.extractedIaCPath,\n );\n if (!isPathInsideRoot(ctx.workspacePath, extractedPath)) {\n throw new Error(\n `Refusing extractedIaCPath outside workspace: ${ctx.input.extractedIaCPath}`,\n );\n }\n // Archives come from StackGen over TLS; still use a maintained extractor\n // with path containment checks (Zip Slip defense in depth).\n await extractArchiveToDir(zipPath, extractedPath);\n logger.info(`Extracted IaC to ${extractedPath}`);\n ctx.logger.info(`IaC files extracted to ${extractedPath}`);\n // Delete the ZIP after extraction\n await fs.unlink(zipPath);\n } catch (err: any) {\n logger.error(`Download IaC Error: ${err.message}`);\n ctx.logger.error(`Download IaC Error: ${err.message}`);\n throw err;\n }\n },\n });\n};\n"],"names":["z","resolveTopologyId","createTemplateAction","getStackgenApiObjects","path","isPathInsideRoot","fs","extractArchiveToDir"],"mappings":"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"}
|
|
@@ -93,14 +93,8 @@ const setEnvironmentVariableValuesAction = (config, logger) => {
|
|
|
93
93
|
updated.push(`${variableIdentifier} = ${pair.value}`);
|
|
94
94
|
} catch (error) {
|
|
95
95
|
const parsedError = await apiObjects.readClientError(error);
|
|
96
|
-
const detail = apiObjects.formatApiFailure(
|
|
97
|
-
parsedError.status,
|
|
98
|
-
parsedError.body,
|
|
99
|
-
parsedError.text,
|
|
100
|
-
parsedError.requestId
|
|
101
|
-
);
|
|
102
96
|
throw new Error(
|
|
103
|
-
`Failed to set ${variableIdentifier} on environment ${environmentId}: ${
|
|
97
|
+
`Failed to set ${variableIdentifier} on environment ${environmentId} (${parsedError.status}): ${(parsedError.text || String(error)).slice(0, 300)}`
|
|
104
98
|
);
|
|
105
99
|
}
|
|
106
100
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"set_environment_variable_values_action.cjs.js","sources":["../../../src/actions/core/set_environment_variable_values_action.ts"],"sourcesContent":["import { createTemplateAction } from \"@backstage/plugin-scaffolder-node\";\nimport { LoggerService } from \"@backstage/backend-plugin-api\";\nimport { Config } from \"@backstage/config\";\nimport { z } from \"zod\";\nimport { resolveTopologyId } from \"../../exporter/topologyResolve\";\nimport {
|
|
1
|
+
{"version":3,"file":"set_environment_variable_values_action.cjs.js","sources":["../../../src/actions/core/set_environment_variable_values_action.ts"],"sourcesContent":["import { createTemplateAction } from \"@backstage/plugin-scaffolder-node\";\nimport { LoggerService } from \"@backstage/backend-plugin-api\";\nimport { Config } from \"@backstage/config\";\nimport { z } from \"zod\";\nimport { resolveTopologyId } from \"../../exporter/topologyResolve\";\nimport { getStackgenApiObjects, readClientError } from \"../../utils/api-objects\";\n\nexport const setEnvironmentVariableValuesInputSchema = z\n .object({\n teamId: z.string().min(1, \"teamId is required\"),\n environmentId: z.string().min(1, \"environmentId is required\"),\n topologyId: z.string().optional(),\n appstackName: z.string().optional(),\n variableValues: z\n .array(\n z.object({\n name: z.string().min(1),\n value: z.string(),\n }),\n )\n .default([]),\n })\n .superRefine((value, ctx) => {\n if (!value.topologyId?.trim() && !value.appstackName?.trim()) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"topologyId or appstackName is required\",\n path: [\"topologyId\"],\n });\n }\n });\n\nexport const setEnvironmentVariableValuesOutputSchema = z.object({\n updatedCount: z.number(),\n updatedVariablesText: z.string(),\n environmentId: z.string(),\n topologyId: z.string(),\n});\n\nfunction parseVariableValue(raw: string): unknown {\n const trimmed = raw.trim();\n if (trimmed === \"\") {\n return \"\";\n }\n try {\n return JSON.parse(trimmed);\n } catch {\n return raw;\n }\n}\n\n/**\n * Applies VariableSelect values onto an existing environment profile\n * (consumption / override), matching appcd-ui TF env value updates.\n */\nexport const setEnvironmentVariableValuesAction = (\n config: Config,\n logger: LoggerService,\n) => {\n return createTemplateAction({\n id: \"stackGen:setEnvironmentVariableValues\",\n description:\n \"Sets Terraform variable values on an existing StackGen environment profile\",\n schema: {\n input: () => setEnvironmentVariableValuesInputSchema,\n output: () => setEnvironmentVariableValuesOutputSchema,\n },\n async handler(ctx) {\n const stackgenApis = getStackgenApiObjects(config);\n const teamId = ctx.input.teamId.trim();\n const environmentId = ctx.input.environmentId.trim();\n const variableValues = ctx.input.variableValues ?? [];\n\n let topologyId = ctx.input.topologyId?.trim() || \"\";\n if (!topologyId) {\n topologyId = await resolveTopologyId({\n config,\n teamId,\n appstackName: ctx.input.appstackName?.trim(),\n logger,\n });\n }\n\n if (variableValues.length === 0) {\n ctx.logger.info(\"No variable values provided; skipping updates\");\n ctx.output(\"updatedCount\", 0);\n ctx.output(\"updatedVariablesText\", \"No variables updated\");\n ctx.output(\"environmentId\", environmentId);\n ctx.output(\"topologyId\", topologyId);\n return;\n }\n\n const updated: string[] = [];\n for (const pair of variableValues) {\n const variableIdentifier = pair.name.trim();\n const value = parseVariableValue(pair.value);\n ctx.logger.info(\n `Setting ${variableIdentifier} on env ${environmentId} (topology=${topologyId})`,\n );\n try {\n await stackgenApis.v1TfBlocksApiObj.updateTFVariableEnvironmentProfileValue(\n {\n topologyId,\n orgId: teamId,\n variableIdentifier,\n envProfileId: environmentId,\n tFVariableEnvironmentProfileValue: {\n envProfileId: environmentId,\n value,\n } as never,\n },\n );\n updated.push(`${variableIdentifier} = ${pair.value}`);\n } catch (error) {\n const parsedError = await readClientError(error);\n throw new Error(\n `Failed to set ${variableIdentifier} on environment ${environmentId} (${parsedError.status}): ${(parsedError.text || String(error)).slice(0, 300)}`,\n );\n }\n }\n\n logger.info(\n `stackGen:setEnvironmentVariableValues updated=${updated.length} env=${environmentId}`,\n );\n ctx.output(\"updatedCount\", updated.length);\n ctx.output(\"updatedVariablesText\", updated.join(\"\\n\"));\n ctx.output(\"environmentId\", environmentId);\n ctx.output(\"topologyId\", topologyId);\n },\n });\n};\n"],"names":["z","createTemplateAction","getStackgenApiObjects","resolveTopologyId","readClientError"],"mappings":"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"}
|
|
@@ -68,17 +68,12 @@ async function ensureProjectMembership(stackgenApis, teamId, logger) {
|
|
|
68
68
|
});
|
|
69
69
|
} catch (error) {
|
|
70
70
|
const parsedError = await apiObjects.readClientError(error);
|
|
71
|
-
const
|
|
72
|
-
|
|
73
|
-
parsedError.body,
|
|
74
|
-
parsedError.text,
|
|
75
|
-
parsedError.requestId
|
|
76
|
-
);
|
|
77
|
-
if (detail.toLowerCase().includes("already") || parsedError.text.toLowerCase().includes("already") || parsedError.status === 409) {
|
|
71
|
+
const text = parsedError.text;
|
|
72
|
+
if (text.toLowerCase().includes("already") || parsedError.status === 409) {
|
|
78
73
|
logger.info(`PAT user ${userId} already a member of project ${teamId}`);
|
|
79
74
|
return { userId, wasAdded: false };
|
|
80
75
|
}
|
|
81
|
-
throw new Error(`Failed to add PAT user to project: ${
|
|
76
|
+
throw new Error(`Failed to add PAT user to project (${parsedError.status}): ${text.slice(0, 200)}`);
|
|
82
77
|
}
|
|
83
78
|
logger.info(`Added PAT user ${userId} to project ${teamId}`);
|
|
84
79
|
return { userId, wasAdded: true };
|
|
@@ -151,17 +146,12 @@ const setStateBackendAction = (config, logger) => {
|
|
|
151
146
|
ctx.output("environmentId", envId);
|
|
152
147
|
} catch (error) {
|
|
153
148
|
const parsedError = await apiObjects.readClientError(error);
|
|
154
|
-
const
|
|
155
|
-
parsedError.status,
|
|
156
|
-
parsedError.body,
|
|
157
|
-
parsedError.text,
|
|
158
|
-
parsedError.requestId
|
|
159
|
-
);
|
|
149
|
+
const errMsg = parsedError.text || String(error);
|
|
160
150
|
ctx.logger.error(
|
|
161
|
-
`Failed to create environment with state backend: ${
|
|
151
|
+
`Failed to create environment with state backend (${parsedError.status}): ${errMsg.slice(0, 300)}`
|
|
162
152
|
);
|
|
163
153
|
throw new Error(
|
|
164
|
-
`Failed to create environment '${environmentName}' with state backend: ${
|
|
154
|
+
`Failed to create environment '${environmentName}' with state backend (${parsedError.status}): ${errMsg.slice(0, 300)}`
|
|
165
155
|
);
|
|
166
156
|
}
|
|
167
157
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"set_state_backend_action.cjs.js","sources":["../../../src/actions/core/set_state_backend_action.ts"],"sourcesContent":["import { createTemplateAction } from \"@backstage/plugin-scaffolder-node\";\nimport { LoggerService } from \"@backstage/backend-plugin-api\";\nimport { Config } from \"@backstage/config\";\nimport { z } from \"zod\";\nimport { resolveTopologyId } from \"../../exporter/topologyResolve\";\nimport {\n formatApiFailure,\n getStackgenApiObjects,\n readClientError,\n} from \"../../utils/api-objects\";\n\n// --- Schemas ---\n\nconst stateBackendConfigSchema = z.record(z.string(), z.string());\n\nconst stateBackendSchema = z.object({\n type: z.enum([\"S3\", \"GCS\", \"AZURERM\", \"LOCAL\", \"POSTGRES\", \"REMOTE\", \"CLOUD\"]),\n config: stateBackendConfigSchema,\n});\n\nexport const setStateBackendInputSchema = z\n .object({\n teamId: z.string().min(1, \"teamId is required\"),\n topologyId: z.string().optional(),\n appstackName: z.string().optional(),\n environmentName: z.string().min(1, \"environmentName is required\"),\n color: z.string().optional().default(\"#000000\"),\n variables: z\n .array(\n z.object({\n name: z.string(),\n type: z.string().optional().default(\"string\"),\n defaultValueJson: z.string().optional(),\n description: z.string().optional(),\n }),\n )\n .optional()\n .default([]),\n /**\n * Convenience input from VariableSelect: [{ name, value }] → string variables.\n * Merged with `variables` when both are set.\n */\n variableValues: z\n .array(\n z.object({\n name: z.string(),\n value: z.string(),\n }),\n )\n .optional()\n .default([]),\n stateBackend: stateBackendSchema,\n })\n .superRefine((value, ctx) => {\n if (!value.topologyId?.trim() && !value.appstackName?.trim()) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"topologyId or appstackName is required\",\n path: [\"topologyId\"],\n });\n }\n });\n\nexport const setStateBackendOutputSchema = z.object({\n success: z.boolean(),\n environmentId: z.string().optional(),\n});\n\n// --- Helpers ---\n\nconst DEFAULT_PROJECT_MEMBER_ROLE_ID = \"00000000-0000-0000-0000-000000000002\";\n\n/**\n * Resolves the PAT user and ensures they are a member of the project,\n * matching the pattern used in createAppStackAction.\n */\nasync function ensureProjectMembership(\n stackgenApis: ReturnType<typeof getStackgenApiObjects>,\n teamId: string,\n logger: LoggerService,\n): Promise<{ userId: string; wasAdded: boolean }> {\n // Step 1: Resolve PAT user\n logger.info(\"Resolving PAT user via appcd auth API\");\n const meBody = await stackgenApis.authenticationApiObject.getMe();\n const userId = String(meBody?.userId || \"\").trim();\n if (!userId) {\n throw new Error(\"auth/me response did not include userId\");\n }\n logger.info(`Resolved PAT user: ${userId}`);\n\n // Step 2: Add user to project\n try {\n await stackgenApis.projectApiObject.assignUsersToOrg({\n orgId: teamId,\n assignUsersToOrgRequest: {\n userAssignments: [\n { userId, roleId: DEFAULT_PROJECT_MEMBER_ROLE_ID },\n ],\n } as never,\n });\n } catch (error) {\n const parsedError = await readClientError(error);\n const detail = formatApiFailure(\n parsedError.status,\n parsedError.body,\n parsedError.text,\n parsedError.requestId,\n );\n // \"already a member\" is fine\n if (\n detail.toLowerCase().includes(\"already\") ||\n parsedError.text.toLowerCase().includes(\"already\") ||\n parsedError.status === 409\n ) {\n logger.info(`PAT user ${userId} already a member of project ${teamId}`);\n return { userId, wasAdded: false };\n }\n throw new Error(`Failed to add PAT user to project: ${detail}`);\n }\n\n logger.info(`Added PAT user ${userId} to project ${teamId}`);\n return { userId, wasAdded: true };\n}\n\n// --- Action ---\n// Creates an environment profile on a topology with a state backend configuration.\n// Mirrors the functional test flow:\n// 1. Resolve PAT user & add to project (for iac-gen API access)\n// 2. POST /iac-gen/v1/environment-profile?orgId={teamId}\n// body: { profileName, color, topologyId, variables, stateBackend }\n\nexport const setStateBackendAction = (config: Config, logger: LoggerService) => {\n return createTemplateAction({\n id: \"stackGen:setStateBackend\",\n description:\n \"Creates an environment profile with a Terraform state backend (e.g. S3) on a StackGen topology\",\n schema: {\n // Backstage parseSchemas only accepts (z) => ZodType or per-field callbacks.\n input: () => setStateBackendInputSchema,\n output: () => setStateBackendOutputSchema,\n },\n async handler(ctx) {\n const stackgenApis = getStackgenApiObjects(config);\n\n const {\n teamId,\n topologyId: topologyIdInput,\n appstackName,\n environmentName,\n color,\n variables,\n variableValues,\n stateBackend,\n } = ctx.input;\n\n let topologyId = topologyIdInput?.trim() || \"\";\n if (!topologyId) {\n topologyId = await resolveTopologyId({\n config,\n teamId,\n appstackName: appstackName?.trim(),\n logger,\n });\n }\n\n const fromSelect = (variableValues || []).map((pair) => ({\n name: pair.name,\n type: \"string\",\n defaultValueJson: JSON.stringify(pair.value),\n description: `Set via VariableSelect (${pair.name})`,\n }));\n const mergedVariables = [...(variables || []), ...fromSelect];\n\n // Step 0: Ensure PAT user has access to project\n ctx.logger.info(`Ensuring PAT user has access to project ${teamId}`);\n await ensureProjectMembership(stackgenApis, teamId, logger);\n\n // Step 1: POST to create environment profile with state backend\n const payload = {\n profileName: environmentName,\n color,\n topologyId,\n variables: mergedVariables,\n stateBackend: {\n id: \"\",\n type: stateBackend.type,\n config: stateBackend.config,\n editorMode: false,\n },\n };\n\n ctx.logger.info(\n `Creating environment '${environmentName}' with ${stateBackend.type} state backend`,\n );\n logger.info(\n `stackGen:setStateBackend via generated client (env=${environmentName}, type=${stateBackend.type})`,\n );\n\n try {\n const body = (await stackgenApis.v1EnvironmentProfileApiObj.createEnvProfile({\n orgId: teamId,\n envProfileRequest: payload as never,\n })) as { id?: string; environmentId?: string };\n const envId = body?.id || body?.environmentId || \"\";\n ctx.logger.info(\n `✓ Environment '${environmentName}' created with ${stateBackend.type} state backend (ID: ${envId})`,\n );\n ctx.output(\"success\", true);\n ctx.output(\"environmentId\", envId);\n } catch (error) {\n const parsedError = await readClientError(error);\n const detail = formatApiFailure(\n parsedError.status,\n parsedError.body,\n parsedError.text,\n parsedError.requestId,\n );\n ctx.logger.error(\n `Failed to create environment with state backend: ${detail}`,\n );\n throw new Error(\n `Failed to create environment '${environmentName}' with state backend: ${detail}`,\n );\n }\n },\n });\n};\n"],"names":["z","readClientError","formatApiFailure","createTemplateAction","getStackgenApiObjects","resolveTopologyId"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"set_state_backend_action.cjs.js","sources":["../../../src/actions/core/set_state_backend_action.ts"],"sourcesContent":["import { createTemplateAction } from \"@backstage/plugin-scaffolder-node\";\nimport { LoggerService } from \"@backstage/backend-plugin-api\";\nimport { Config } from \"@backstage/config\";\nimport { z } from \"zod\";\nimport { resolveTopologyId } from \"../../exporter/topologyResolve\";\nimport { getStackgenApiObjects, readClientError } from \"../../utils/api-objects\";\n\n// --- Schemas ---\n\nconst stateBackendConfigSchema = z.record(z.string(), z.string());\n\nconst stateBackendSchema = z.object({\n type: z.enum([\"S3\", \"GCS\", \"AZURERM\", \"LOCAL\", \"POSTGRES\", \"REMOTE\", \"CLOUD\"]),\n config: stateBackendConfigSchema,\n});\n\nexport const setStateBackendInputSchema = z\n .object({\n teamId: z.string().min(1, \"teamId is required\"),\n topologyId: z.string().optional(),\n appstackName: z.string().optional(),\n environmentName: z.string().min(1, \"environmentName is required\"),\n color: z.string().optional().default(\"#000000\"),\n variables: z\n .array(\n z.object({\n name: z.string(),\n type: z.string().optional().default(\"string\"),\n defaultValueJson: z.string().optional(),\n description: z.string().optional(),\n }),\n )\n .optional()\n .default([]),\n /**\n * Convenience input from VariableSelect: [{ name, value }] → string variables.\n * Merged with `variables` when both are set.\n */\n variableValues: z\n .array(\n z.object({\n name: z.string(),\n value: z.string(),\n }),\n )\n .optional()\n .default([]),\n stateBackend: stateBackendSchema,\n })\n .superRefine((value, ctx) => {\n if (!value.topologyId?.trim() && !value.appstackName?.trim()) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"topologyId or appstackName is required\",\n path: [\"topologyId\"],\n });\n }\n });\n\nexport const setStateBackendOutputSchema = z.object({\n success: z.boolean(),\n environmentId: z.string().optional(),\n});\n\n// --- Helpers ---\n\nconst DEFAULT_PROJECT_MEMBER_ROLE_ID = \"00000000-0000-0000-0000-000000000002\";\n\n/**\n * Resolves the PAT user and ensures they are a member of the project,\n * matching the pattern used in createAppStackAction.\n */\nasync function ensureProjectMembership(\n stackgenApis: ReturnType<typeof getStackgenApiObjects>,\n teamId: string,\n logger: LoggerService,\n): Promise<{ userId: string; wasAdded: boolean }> {\n // Step 1: Resolve PAT user\n logger.info(\"Resolving PAT user via appcd auth API\");\n const meBody = await stackgenApis.authenticationApiObject.getMe();\n const userId = String(meBody?.userId || \"\").trim();\n if (!userId) {\n throw new Error(\"auth/me response did not include userId\");\n }\n logger.info(`Resolved PAT user: ${userId}`);\n\n // Step 2: Add user to project\n try {\n await stackgenApis.projectApiObject.assignUsersToOrg({\n orgId: teamId,\n assignUsersToOrgRequest: {\n userAssignments: [\n { userId, roleId: DEFAULT_PROJECT_MEMBER_ROLE_ID },\n ],\n } as never,\n });\n } catch (error) {\n const parsedError = await readClientError(error);\n const text = parsedError.text;\n // \"already a member\" is fine\n if (text.toLowerCase().includes(\"already\") || parsedError.status === 409) {\n logger.info(`PAT user ${userId} already a member of project ${teamId}`);\n return { userId, wasAdded: false };\n }\n throw new Error(`Failed to add PAT user to project (${parsedError.status}): ${text.slice(0, 200)}`);\n }\n\n logger.info(`Added PAT user ${userId} to project ${teamId}`);\n return { userId, wasAdded: true };\n}\n\n// --- Action ---\n// Creates an environment profile on a topology with a state backend configuration.\n// Mirrors the functional test flow:\n// 1. Resolve PAT user & add to project (for iac-gen API access)\n// 2. POST /iac-gen/v1/environment-profile?orgId={teamId}\n// body: { profileName, color, topologyId, variables, stateBackend }\n\nexport const setStateBackendAction = (config: Config, logger: LoggerService) => {\n return createTemplateAction({\n id: \"stackGen:setStateBackend\",\n description:\n \"Creates an environment profile with a Terraform state backend (e.g. S3) on a StackGen topology\",\n schema: {\n // Backstage parseSchemas only accepts (z) => ZodType or per-field callbacks.\n input: () => setStateBackendInputSchema,\n output: () => setStateBackendOutputSchema,\n },\n async handler(ctx) {\n const stackgenApis = getStackgenApiObjects(config);\n\n const {\n teamId,\n topologyId: topologyIdInput,\n appstackName,\n environmentName,\n color,\n variables,\n variableValues,\n stateBackend,\n } = ctx.input;\n\n let topologyId = topologyIdInput?.trim() || \"\";\n if (!topologyId) {\n topologyId = await resolveTopologyId({\n config,\n teamId,\n appstackName: appstackName?.trim(),\n logger,\n });\n }\n\n const fromSelect = (variableValues || []).map((pair) => ({\n name: pair.name,\n type: \"string\",\n defaultValueJson: JSON.stringify(pair.value),\n description: `Set via VariableSelect (${pair.name})`,\n }));\n const mergedVariables = [...(variables || []), ...fromSelect];\n\n // Step 0: Ensure PAT user has access to project\n ctx.logger.info(`Ensuring PAT user has access to project ${teamId}`);\n await ensureProjectMembership(stackgenApis, teamId, logger);\n\n // Step 1: POST to create environment profile with state backend\n const payload = {\n profileName: environmentName,\n color,\n topologyId,\n variables: mergedVariables,\n stateBackend: {\n id: \"\",\n type: stateBackend.type,\n config: stateBackend.config,\n editorMode: false,\n },\n };\n\n ctx.logger.info(\n `Creating environment '${environmentName}' with ${stateBackend.type} state backend`,\n );\n logger.info(\n `stackGen:setStateBackend via generated client (env=${environmentName}, type=${stateBackend.type})`,\n );\n\n try {\n const body = (await stackgenApis.v1EnvironmentProfileApiObj.createEnvProfile({\n orgId: teamId,\n envProfileRequest: payload as never,\n })) as { id?: string; environmentId?: string };\n const envId = body?.id || body?.environmentId || \"\";\n ctx.logger.info(\n `✓ Environment '${environmentName}' created with ${stateBackend.type} state backend (ID: ${envId})`,\n );\n ctx.output(\"success\", true);\n ctx.output(\"environmentId\", envId);\n } catch (error) {\n const parsedError = await readClientError(error);\n const errMsg = parsedError.text || String(error);\n ctx.logger.error(\n `Failed to create environment with state backend (${parsedError.status}): ${errMsg.slice(0, 300)}`,\n );\n throw new Error(\n `Failed to create environment '${environmentName}' with state backend (${parsedError.status}): ${errMsg.slice(0, 300)}`,\n );\n }\n },\n });\n};\n"],"names":["z","readClientError","createTemplateAction","getStackgenApiObjects","resolveTopologyId"],"mappings":";;;;;;;AASA,MAAM,wBAAA,GAA2BA,MAAE,MAAA,CAAOA,KAAA,CAAE,QAAO,EAAGA,KAAA,CAAE,QAAQ,CAAA;AAEhE,MAAM,kBAAA,GAAqBA,MAAE,MAAA,CAAO;AAAA,EAChC,IAAA,EAAMA,KAAA,CAAE,IAAA,CAAK,CAAC,IAAA,EAAM,KAAA,EAAO,SAAA,EAAW,OAAA,EAAS,UAAA,EAAY,QAAA,EAAU,OAAO,CAAC,CAAA;AAAA,EAC7E,MAAA,EAAQ;AACZ,CAAC,CAAA;AAEM,MAAM,0BAAA,GAA6BA,MACrC,MAAA,CAAO;AAAA,EACJ,QAAQA,KAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,GAAG,oBAAoB,CAAA;AAAA,EAC9C,UAAA,EAAYA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAChC,YAAA,EAAcA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAClC,iBAAiBA,KAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,GAAG,6BAA6B,CAAA;AAAA,EAChE,OAAOA,KAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,QAAQ,SAAS,CAAA;AAAA,EAC9C,WAAWA,KAAA,CACN,KAAA;AAAA,IACGA,MAAE,MAAA,CAAO;AAAA,MACL,IAAA,EAAMA,MAAE,MAAA,EAAO;AAAA,MACf,MAAMA,KAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,QAAQ,QAAQ,CAAA;AAAA,MAC5C,gBAAA,EAAkBA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,MACtC,WAAA,EAAaA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS,KACpC;AAAA,GACL,CACC,QAAA,EAAS,CACT,OAAA,CAAQ,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKf,gBAAgBA,KAAA,CACX,KAAA;AAAA,IACGA,MAAE,MAAA,CAAO;AAAA,MACL,IAAA,EAAMA,MAAE,MAAA,EAAO;AAAA,MACf,KAAA,EAAOA,MAAE,MAAA;AAAO,KACnB;AAAA,GACL,CACC,QAAA,EAAS,CACT,OAAA,CAAQ,EAAE,CAAA;AAAA,EACf,YAAA,EAAc;AAClB,CAAC,CAAA,CACA,WAAA,CAAY,CAAC,KAAA,EAAO,GAAA,KAAQ;AACzB,EAAA,IAAI,CAAC,MAAM,UAAA,EAAY,IAAA,MAAU,CAAC,KAAA,CAAM,YAAA,EAAc,IAAA,EAAK,EAAG;AAC1D,IAAA,GAAA,CAAI,QAAA,CAAS;AAAA,MACT,IAAA,EAAMA,MAAE,YAAA,CAAa,MAAA;AAAA,MACrB,OAAA,EAAS,wCAAA;AAAA,MACT,IAAA,EAAM,CAAC,YAAY;AAAA,KACtB,CAAA;AAAA,EACL;AACJ,CAAC;AAEE,MAAM,2BAAA,GAA8BA,MAAE,MAAA,CAAO;AAAA,EAChD,OAAA,EAASA,MAAE,OAAA,EAAQ;AAAA,EACnB,aAAA,EAAeA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAC9B,CAAC;AAID,MAAM,8BAAA,GAAiC,sCAAA;AAMvC,eAAe,uBAAA,CACX,YAAA,EACA,MAAA,EACA,MAAA,EAC8C;AAE9C,EAAA,MAAA,CAAO,KAAK,uCAAuC,CAAA;AACnD,EAAA,MAAM,MAAA,GAAS,MAAM,YAAA,CAAa,uBAAA,CAAwB,KAAA,EAAM;AAChE,EAAA,MAAM,SAAS,MAAA,CAAO,MAAA,EAAQ,MAAA,IAAU,EAAE,EAAE,IAAA,EAAK;AACjD,EAAA,IAAI,CAAC,MAAA,EAAQ;AACT,IAAA,MAAM,IAAI,MAAM,yCAAyC,CAAA;AAAA,EAC7D;AACA,EAAA,MAAA,CAAO,IAAA,CAAK,CAAA,mBAAA,EAAsB,MAAM,CAAA,CAAE,CAAA;AAG1C,EAAA,IAAI;AACA,IAAA,MAAM,YAAA,CAAa,iBAAiB,gBAAA,CAAiB;AAAA,MACjD,KAAA,EAAO,MAAA;AAAA,MACP,uBAAA,EAAyB;AAAA,QACrB,eAAA,EAAiB;AAAA,UACb,EAAE,MAAA,EAAQ,MAAA,EAAQ,8BAAA;AAA+B;AACrD;AACJ,KACH,CAAA;AAAA,EACL,SAAS,KAAA,EAAO;AACZ,IAAA,MAAM,WAAA,GAAc,MAAMC,0BAAA,CAAgB,KAAK,CAAA;AAC/C,IAAA,MAAM,OAAO,WAAA,CAAY,IAAA;AAEzB,IAAA,IAAI,IAAA,CAAK,aAAY,CAAE,QAAA,CAAS,SAAS,CAAA,IAAK,WAAA,CAAY,WAAW,GAAA,EAAK;AACtE,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,SAAA,EAAY,MAAM,CAAA,6BAAA,EAAgC,MAAM,CAAA,CAAE,CAAA;AACtE,MAAA,OAAO,EAAE,MAAA,EAAQ,QAAA,EAAU,KAAA,EAAM;AAAA,IACrC;AACA,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,mCAAA,EAAsC,WAAA,CAAY,MAAM,CAAA,GAAA,EAAM,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC,CAAA,CAAE,CAAA;AAAA,EACtG;AAEA,EAAA,MAAA,CAAO,IAAA,CAAK,CAAA,eAAA,EAAkB,MAAM,CAAA,YAAA,EAAe,MAAM,CAAA,CAAE,CAAA;AAC3D,EAAA,OAAO,EAAE,MAAA,EAAQ,QAAA,EAAU,IAAA,EAAK;AACpC;AASO,MAAM,qBAAA,GAAwB,CAAC,MAAA,EAAgB,MAAA,KAA0B;AAC5E,EAAA,OAAOC,yCAAA,CAAqB;AAAA,IACxB,EAAA,EAAI,0BAAA;AAAA,IACJ,WAAA,EACI,gGAAA;AAAA,IACJ,MAAA,EAAQ;AAAA;AAAA,MAEJ,OAAO,MAAM,0BAAA;AAAA,MACb,QAAQ,MAAM;AAAA,KAClB;AAAA,IACA,MAAM,QAAQ,GAAA,EAAK;AACf,MAAA,MAAM,YAAA,GAAeC,iCAAsB,MAAM,CAAA;AAEjD,MAAA,MAAM;AAAA,QACF,MAAA;AAAA,QACA,UAAA,EAAY,eAAA;AAAA,QACZ,YAAA;AAAA,QACA,eAAA;AAAA,QACA,KAAA;AAAA,QACA,SAAA;AAAA,QACA,cAAA;AAAA,QACA;AAAA,UACA,GAAA,CAAI,KAAA;AAER,MAAA,IAAI,UAAA,GAAa,eAAA,EAAiB,IAAA,EAAK,IAAK,EAAA;AAC5C,MAAA,IAAI,CAAC,UAAA,EAAY;AACb,QAAA,UAAA,GAAa,MAAMC,iCAAA,CAAkB;AAAA,UACjC,MAAA;AAAA,UACA,MAAA;AAAA,UACA,YAAA,EAAc,cAAc,IAAA,EAEhC,CAAC,CAAA;AAAA,MACL;AAEA,MAAA,MAAM,cAAc,cAAA,IAAkB,EAAC,EAAG,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,QACrD,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,IAAA,EAAM,QAAA;AAAA,QACN,gBAAA,EAAkB,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,KAAK,CAAA;AAAA,QAC3C,WAAA,EAAa,CAAA,wBAAA,EAA2B,IAAA,CAAK,IAAI,CAAA,CAAA;AAAA,OACrD,CAAE,CAAA;AACF,MAAA,MAAM,kBAAkB,CAAC,GAAI,aAAa,EAAC,EAAI,GAAG,UAAU,CAAA;AAG5D,MAAA,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,CAAA,wCAAA,EAA2C,MAAM,CAAA,CAAE,CAAA;AACnE,MAAA,MAAM,uBAAA,CAAwB,YAAA,EAAc,MAAA,EAAQ,MAAM,CAAA;AAG1D,MAAA,MAAM,OAAA,GAAU;AAAA,QACZ,WAAA,EAAa,eAAA;AAAA,QACb,KAAA;AAAA,QACA,UAAA;AAAA,QACA,SAAA,EAAW,eAAA;AAAA,QACX,YAAA,EAAc;AAAA,UACV,EAAA,EAAI,EAAA;AAAA,UACJ,MAAM,YAAA,CAAa,IAAA;AAAA,UACnB,QAAQ,YAAA,CAAa,MAAA;AAAA,UACrB,UAAA,EAAY;AAAA;AAChB,OACJ;AAEA,MAAA,GAAA,CAAI,MAAA,CAAO,IAAA;AAAA,QACP,CAAA,sBAAA,EAAyB,eAAe,CAAA,OAAA,EAAU,YAAA,CAAa,IAAI,CAAA,cAAA;AAAA,OACvE;AACA,MAAA,MAAA,CAAO,IAAA;AAAA,QACH,CAAA,mDAAA,EAAsD,eAAe,CAAA,OAAA,EAAU,YAAA,CAAa,IAAI,CAAA,CAAA;AAAA,OACpG;AAEA,MAAA,IAAI;AACA,QAAA,MAAM,IAAA,GAAQ,MAAM,YAAA,CAAa,0BAAA,CAA2B,gBAAA,CAAiB;AAAA,UACzE,KAAA,EAAO,MAAA;AAAA,UACP,iBAAA,EAAmB;AAAA,SACtB,CAAA;AACD,QAAA,MAAM,KAAA,GAAQ,IAAA,EAAM,EAAA,IAAM,IAAA,EAAM,aAAA,IAAiB,EAAA;AACjD,QAAA,GAAA,CAAI,MAAA,CAAO,IAAA;AAAA,UACP,uBAAkB,eAAe,CAAA,eAAA,EAAkB,YAAA,CAAa,IAAI,uBAAuB,KAAK,CAAA,CAAA;AAAA,SACpG;AACA,QAAA,GAAA,CAAI,MAAA,CAAO,WAAW,IAAI,CAAA;AAC1B,QAAA,GAAA,CAAI,MAAA,CAAO,iBAAiB,KAAK,CAAA;AAAA,MACrC,SAAS,KAAA,EAAO;AACZ,QAAA,MAAM,WAAA,GAAc,MAAMH,0BAAA,CAAgB,KAAK,CAAA;AAC/C,QAAA,MAAM,MAAA,GAAS,WAAA,CAAY,IAAA,IAAQ,MAAA,CAAO,KAAK,CAAA;AAC/C,QAAA,GAAA,CAAI,MAAA,CAAO,KAAA;AAAA,UACP,CAAA,iDAAA,EAAoD,YAAY,MAAM,CAAA,GAAA,EAAM,OAAO,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC,CAAA;AAAA,SACpG;AACA,QAAA,MAAM,IAAI,KAAA;AAAA,UACN,CAAA,8BAAA,EAAiC,eAAe,CAAA,sBAAA,EAAyB,WAAA,CAAY,MAAM,MAAM,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC,CAAA;AAAA,SACzH;AAAA,MACJ;AAAA,IACJ;AAAA,GACH,CAAA;AACL;;;;;;"}
|
|
@@ -32,14 +32,7 @@ async function listGitExporterConfigs(rootConfig, params, logger) {
|
|
|
32
32
|
list = Array.isArray(response) ? response : [];
|
|
33
33
|
} catch (error) {
|
|
34
34
|
const parsedError = await apiObjects.readClientError(error);
|
|
35
|
-
throw new Error(
|
|
36
|
-
`getConfigs failed: ${apiObjects.formatApiFailure(
|
|
37
|
-
parsedError.status,
|
|
38
|
-
parsedError.body,
|
|
39
|
-
parsedError.text,
|
|
40
|
-
parsedError.requestId
|
|
41
|
-
)}`
|
|
42
|
-
);
|
|
35
|
+
throw new Error(`getConfigs failed: ${parsedError.status} ${parsedError.text}`);
|
|
43
36
|
}
|
|
44
37
|
return filterConfigsByAppstackId(list, params.appstackId).map(toListItem);
|
|
45
38
|
}
|
|
@@ -82,14 +75,7 @@ async function createGitExporterConfiguration(rootConfig, params, logger) {
|
|
|
82
75
|
});
|
|
83
76
|
} catch (error) {
|
|
84
77
|
const parsedError = await apiObjects.readClientError(error);
|
|
85
|
-
throw new Error(
|
|
86
|
-
`createConfig failed: ${apiObjects.formatApiFailure(
|
|
87
|
-
parsedError.status,
|
|
88
|
-
parsedError.body,
|
|
89
|
-
parsedError.text,
|
|
90
|
-
parsedError.requestId
|
|
91
|
-
)}`
|
|
92
|
-
);
|
|
78
|
+
throw new Error(`createConfig failed: ${parsedError.status} ${parsedError.text}`);
|
|
93
79
|
}
|
|
94
80
|
const id = payload?.id;
|
|
95
81
|
if (!id) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gitExporterConfigHttp.cjs.js","sources":["../../src/exporter/gitExporterConfigHttp.ts"],"sourcesContent":["import type { LoggerService } from '@backstage/backend-plugin-api';\nimport type { Config } from '@backstage/config';\nimport {
|
|
1
|
+
{"version":3,"file":"gitExporterConfigHttp.cjs.js","sources":["../../src/exporter/gitExporterConfigHttp.ts"],"sourcesContent":["import type { LoggerService } from '@backstage/backend-plugin-api';\nimport type { Config } from '@backstage/config';\nimport { getStackgenApiObjects, readClientError } from '../utils/api-objects';\n\nexport type ExporterGitConfigListItem = {\n id?: string;\n name?: string;\n type?: string;\n default?: boolean;\n appstackId?: string;\n};\n\ntype GeneratedExporterConfig = ExporterGitConfigListItem;\n\n/** Filters generated-client Config rows to a single appstack (client-side; see listGitExporterConfigs). */\nexport function filterConfigsByAppstackId<T extends { appstackId?: string }>(\n configs: T[],\n appstackId?: string,\n): T[] {\n const id = appstackId?.trim();\n if (!id) {\n return configs;\n }\n return configs.filter(c => String(c.appstackId ?? '').trim() === id);\n}\n\nfunction toListItem(config: GeneratedExporterConfig): ExporterGitConfigListItem {\n return {\n id: config.id,\n name: config.name,\n type: config.type,\n default: config.default,\n appstackId: config.appstackId,\n };\n}\n\n/**\n * Lists git exporter configs via the generated ConfigApi client.\n * Note: `getConfigs` must receive a response the client can parse as Config[] (a JSON array).\n * When `appstackId` is set we list git configs for the org and filter by `appstackId` on the\n * typed client models — passing `appstack_id` on GET /config returns a non-array body that\n * breaks the generated deserializer.\n */\nexport async function listGitExporterConfigs(\n rootConfig: Config,\n params: { orgId: string; appstackId?: string; type?: 'git' | 'blobstore' },\n logger: LoggerService,\n): Promise<ExporterGitConfigListItem[]> {\n const stackgenApis = getStackgenApiObjects(rootConfig);\n logger.info(\n `stack-exporter list configs (generated client) orgId=${params.orgId}${\n params.appstackId ? ` filter appstackId=${params.appstackId}` : ''\n }`,\n );\n\n let list: GeneratedExporterConfig[];\n try {\n const response = await stackgenApis.exporterConfigApiObj.getConfigs({\n orgId: params.orgId,\n type: params.type ?? 'git',\n });\n list = Array.isArray(response) ? response : [];\n } catch (error) {\n const parsedError = await readClientError(error);\n throw new Error(`getConfigs failed: ${parsedError.status} ${parsedError.text}`);\n }\n\n return filterConfigsByAppstackId(list, params.appstackId).map(toListItem);\n}\n\nexport type GitExporterSecrets = {\n token?: string;\n token_ref?: string;\n};\n\nexport type CreateGitExporterConfigParams = {\n orgId: string | undefined;\n name: string;\n appstackId?: string;\n scmType: string;\n repoUrl: string;\n targetBranch: string;\n path: string;\n stackgenIgnoreFile?: string;\n secrets: GitExporterSecrets;\n};\n\n/** Maps createProject-style SCM enums to stack-exporter createConfig `scm_type` values. */\nexport function normalizeScmForExporter(t: string): string {\n const m: Record<string, string> = {\n GITHUB: 'github',\n GITLAB: 'gitlab',\n BITBUCKET: 'bitbucket',\n // stack-exporter GitExporter expects `azuredev` (see azureDevSCMType), not `azuredevops`.\n AZUREDEV: 'azuredev',\n };\n return m[t] ?? t.toLowerCase();\n}\n\nexport async function createGitExporterConfiguration(\n rootConfig: Config,\n params: CreateGitExporterConfigParams,\n logger: LoggerService,\n): Promise<string> {\n const stackgenApis = getStackgenApiObjects(rootConfig);\n\n const bodyParams: Record<string, string> = {\n scm_type: normalizeScmForExporter(params.scmType),\n repo_url: params.repoUrl,\n target_branch: params.targetBranch || 'main',\n path: params.path || '/',\n };\n if (params.stackgenIgnoreFile) {\n bodyParams.stackgen_ignore_file = params.stackgenIgnoreFile;\n }\n\n const body = {\n name: params.name,\n type: 'git',\n parameters: bodyParams,\n secrets: params.secrets,\n ...(params.appstackId ? { appstackId: params.appstackId } : {}),\n };\n\n logger.info(\n `stack-exporter create config (generated client)${\n params.appstackId ? ` appstackId=${params.appstackId}` : ' (no appstackId)'\n }`,\n );\n let payload;\n try {\n payload = await stackgenApis.exporterConfigApiObj.createConfig({\n config: body as never,\n orgId: params.orgId,\n });\n } catch (error) {\n const parsedError = await readClientError(error);\n throw new Error(`createConfig failed: ${parsedError.status} ${parsedError.text}`);\n }\n const id = payload?.id;\n if (!id) {\n throw new Error('createConfig response missing id');\n }\n return id;\n}\n"],"names":["getStackgenApiObjects","readClientError"],"mappings":"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"}
|
|
@@ -17,20 +17,10 @@ async function proxyStackgenClientCall(res, logger, operation, call) {
|
|
|
17
17
|
} catch (error) {
|
|
18
18
|
const parsedError = await apiObjects.readClientError(error);
|
|
19
19
|
if (parsedError.status === 500 && parsedError.text === String(error)) {
|
|
20
|
-
logger.error(
|
|
21
|
-
`${operation} failed: ${apiObjects.formatApiFailure(
|
|
22
|
-
parsedError.status,
|
|
23
|
-
parsedError.body,
|
|
24
|
-
parsedError.text,
|
|
25
|
-
parsedError.requestId
|
|
26
|
-
)}`
|
|
27
|
-
);
|
|
20
|
+
logger.error(`${operation} failed: ${String(error)}`);
|
|
28
21
|
res.status(502).json({ message: `${operation} failed` });
|
|
29
22
|
return;
|
|
30
23
|
}
|
|
31
|
-
if (parsedError.requestId) {
|
|
32
|
-
res.setHeader("x-request-id", parsedError.requestId);
|
|
33
|
-
}
|
|
34
24
|
const payload = parsedError.body && typeof parsedError.body === "object" ? parsedError.body : { message: parsedError.text || `${operation} failed` };
|
|
35
25
|
res.status(parsedError.status).json(payload);
|
|
36
26
|
}
|
|
@@ -143,7 +133,7 @@ const stackgenUiProxiesModule = backendPluginApi.createBackendModule({
|
|
|
143
133
|
});
|
|
144
134
|
} catch (error) {
|
|
145
135
|
logger.warn(
|
|
146
|
-
`Could not resolve exporter appstackId: ${
|
|
136
|
+
`Could not resolve exporter appstackId: ${String(error)}`
|
|
147
137
|
);
|
|
148
138
|
filterAppstackId = void 0;
|
|
149
139
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stackgenUiProxiesModule.cjs.js","sources":["../../src/modules/stackgenUiProxiesModule.ts"],"sourcesContent":["import {\n coreServices,\n createBackendModule,\n LoggerService,\n} from '@backstage/backend-plugin-api';\nimport express, { Request, Response } from 'express';\nimport { listGitExporterConfigs } from '../exporter/gitExporterConfigHttp';\nimport {\n resolveExporterAppstackId,\n resolveTopologyId,\n} from '../exporter/topologyResolve';\nimport {\n formatApiFailure,\n formatClientErrorMessage,\n getStackgenApiObjects,\n readClientError,\n} from '../utils/api-objects';\n\nasync function proxyStackgenClientCall(\n res: Response,\n logger: LoggerService,\n operation: string,\n call: () => Promise<unknown>,\n): Promise<void> {\n try {\n const body = await call();\n res.status(200).json(body);\n } catch (error) {\n const parsedError = await readClientError(error);\n if (parsedError.status === 500 && parsedError.text === String(error)) {\n logger.error(\n `${operation} failed: ${formatApiFailure(\n parsedError.status,\n parsedError.body,\n parsedError.text,\n parsedError.requestId,\n )}`,\n );\n res.status(502).json({ message: `${operation} failed` });\n return;\n }\n\n if (parsedError.requestId) {\n res.setHeader('x-request-id', parsedError.requestId);\n }\n\n const payload =\n parsedError.body && typeof parsedError.body === 'object'\n ? parsedError.body\n : { message: parsedError.text || `${operation} failed` };\n res.status(parsedError.status).json(payload);\n }\n}\n\n/**\n * Proxies StackGen HTTP APIs used by scaffolder custom fields\n * (`/vault-secrets`, `/environment-profiles`, `/users`, `/user-groups`,\n * `/modules`, `/variables`, `/exporter-git-configs`, `/export-history`).\n * Mounted on the stackgen backend plugin HTTP router.\n */\nexport const stackgenUiProxiesModule = createBackendModule({\n pluginId: 'stackgen',\n moduleId: 'stackgen-ui-proxies',\n register(env) {\n env.registerInit({\n deps: {\n httpRouter: coreServices.httpRouter,\n config: coreServices.rootConfig,\n logger: coreServices.logger,\n httpAuth: coreServices.httpAuth,\n },\n async init({ httpRouter, config, logger, httpAuth }) {\n const router = express.Router();\n router.use(express.json());\n\n router.get('/vault-secrets', async (req: Request, res: Response) => {\n try {\n await httpAuth.credentials(req, { allow: ['user'] });\n } catch {\n res.status(401).json({ message: 'Unauthorized' });\n return;\n }\n\n const orgId =\n typeof req.query.orgId === 'string' ? req.query.orgId.trim() : '';\n\n const stackgenApis = getStackgenApiObjects(config);\n logger.info('Vault secrets proxy via generated client');\n await proxyStackgenClientCall(res, logger, 'Vault secrets proxy', () =>\n stackgenApis.vaultSecretApiObj.getSecrets({\n orgId: orgId || undefined,\n category:\n typeof req.query.category === 'string'\n ? req.query.category\n : undefined,\n subcategory:\n typeof req.query.subcategory === 'string'\n ? (req.query.subcategory as never)\n : undefined,\n name:\n typeof req.query.name === 'string' ? req.query.name : undefined,\n }),\n );\n });\n\n router.get(\n '/exporter-git-configs/:id',\n async (req: Request, res: Response) => {\n try {\n await httpAuth.credentials(req, { allow: ['user'] });\n } catch {\n res.status(401).json({ message: 'Unauthorized' });\n return;\n }\n\n const orgId =\n typeof req.query.orgId === 'string' ? req.query.orgId.trim() : '';\n if (!orgId) {\n res\n .status(400)\n .json({ message: 'orgId query parameter is required' });\n return;\n }\n\n const configId =\n typeof req.params.id === 'string' ? req.params.id.trim() : '';\n if (!configId) {\n res.status(400).json({ message: 'config id is required' });\n return;\n }\n\n const stackgenApis = getStackgenApiObjects(config);\n await proxyStackgenClientCall(\n res,\n logger,\n 'Exporter config detail proxy',\n async () => {\n const body = await stackgenApis.exporterConfigApiObj.getConfig({\n id: configId,\n orgId,\n });\n const parameters =\n body?.parameters && typeof body.parameters === 'object'\n ? body.parameters\n : {};\n return {\n id: body?.id ?? configId,\n name: body?.name,\n parameters,\n };\n },\n );\n },\n );\n\n router.get(\n '/exporter-git-configs',\n async (req: Request, res: Response) => {\n try {\n await httpAuth.credentials(req, { allow: ['user'] });\n } catch {\n res.status(401).json({ message: 'Unauthorized' });\n return;\n }\n\n const orgId =\n typeof req.query.orgId === 'string' ? req.query.orgId : '';\n if (!orgId.trim()) {\n res\n .status(400)\n .json({ message: 'orgId query parameter is required' });\n return;\n }\n\n const appstackId =\n typeof req.query.appstackId === 'string'\n ? req.query.appstackId.trim()\n : '';\n const appstackName =\n typeof req.query.appstackName === 'string'\n ? req.query.appstackName.trim()\n : '';\n\n await proxyStackgenClientCall(\n res,\n logger,\n 'Exporter configs proxy',\n async () => {\n // Configs bind to appcd appstackId. Resolve from name/id via getAppStacks.\n let filterAppstackId = appstackId || undefined;\n if (appstackName || appstackId) {\n try {\n filterAppstackId = await resolveExporterAppstackId({\n config,\n teamId: orgId.trim(),\n appstackId: appstackId || undefined,\n appstackName: appstackName || undefined,\n logger,\n });\n } catch (error) {\n logger.warn(\n `Could not resolve exporter appstackId: ${await formatClientErrorMessage(error)}`,\n );\n filterAppstackId = undefined;\n }\n }\n\n return listGitExporterConfigs(\n config,\n {\n orgId: orgId.trim(),\n type: 'git',\n appstackId: filterAppstackId,\n },\n logger,\n );\n },\n );\n },\n );\n\n router.get('/export-history', async (req: Request, res: Response) => {\n try {\n await httpAuth.credentials(req, { allow: ['user'] });\n } catch {\n res.status(401).json({ message: 'Unauthorized' });\n return;\n }\n\n const orgId =\n typeof req.query.orgId === 'string' ? req.query.orgId.trim() : '';\n const appstackName =\n typeof req.query.appstackName === 'string'\n ? req.query.appstackName.trim()\n : '';\n if (!orgId) {\n res\n .status(400)\n .json({ message: 'orgId query parameter is required' });\n return;\n }\n if (!appstackName) {\n res\n .status(400)\n .json({ message: 'appstackName query parameter is required' });\n return;\n }\n\n const limitRaw =\n typeof req.query.limit === 'string' ? Number(req.query.limit) : 1;\n const limit =\n Number.isFinite(limitRaw) && limitRaw > 0\n ? Math.min(Math.floor(limitRaw), 50)\n : 1;\n\n const stackgenApis = getStackgenApiObjects(config);\n await proxyStackgenClientCall(\n res,\n logger,\n 'Export history proxy',\n async () => {\n const topologyId = await resolveTopologyId({\n config,\n teamId: orgId,\n appstackName,\n logger,\n });\n const history =\n await stackgenApis.exporterApiObj.getExportHistory({\n orgId,\n topologyIds: [topologyId],\n limit,\n });\n const first = Array.isArray(history?.records)\n ? history.records[0]\n : undefined;\n const head =\n typeof first?.metadata?.head === 'string'\n ? first.metadata.head.trim()\n : '';\n return {\n topologyId,\n ...(head ? { head } : {}),\n };\n },\n );\n });\n\n /**\n * Proxies used by scaffolder custom field extensions\n * (EnvironmentSelect, UserGroupSelect, ModuleSelect, VariableSelect).\n */\n router.get(\n '/environment-profiles',\n async (req: Request, res: Response) => {\n try {\n await httpAuth.credentials(req, { allow: ['user'] });\n } catch {\n res.status(401).json({ message: 'Unauthorized' });\n return;\n }\n\n const orgId =\n typeof req.query.orgId === 'string' ? req.query.orgId.trim() : '';\n let topologyId =\n typeof req.query.topologyId === 'string'\n ? req.query.topologyId.trim()\n : '';\n const appstackName =\n typeof req.query.appstackName === 'string'\n ? req.query.appstackName.trim()\n : '';\n\n await proxyStackgenClientCall(\n res,\n logger,\n 'Environment profiles proxy',\n async () => {\n if (!topologyId && orgId && appstackName) {\n topologyId = await resolveTopologyId({\n config,\n teamId: orgId,\n appstackName,\n logger,\n });\n }\n const stackgenApis = getStackgenApiObjects(config);\n return stackgenApis.v1EnvironmentProfileApiObj.getAllEnvProfiles(\n {\n orgId: orgId || undefined,\n topologyID: topologyId || undefined,\n },\n );\n },\n );\n },\n );\n\n router.get('/users', async (req: Request, res: Response) => {\n try {\n await httpAuth.credentials(req, { allow: ['user'] });\n } catch {\n res.status(401).json({ message: 'Unauthorized' });\n return;\n }\n\n const orgId =\n typeof req.query.orgId === 'string' ? req.query.orgId.trim() : '';\n const stackgenApis = getStackgenApiObjects(config);\n await proxyStackgenClientCall(res, logger, 'Users proxy', () =>\n stackgenApis.usersApiObj.listUsers({\n orgID: orgId || undefined,\n }),\n );\n });\n\n router.get('/me', async (req: Request, res: Response) => {\n try {\n await httpAuth.credentials(req, { allow: ['user'] });\n } catch {\n res.status(401).json({ message: 'Unauthorized' });\n return;\n }\n\n const stackgenApis = getStackgenApiObjects(config);\n await proxyStackgenClientCall(res, logger, 'Current user proxy', () =>\n stackgenApis.authenticationApiObject.getMe(),\n );\n });\n\n router.get('/user-groups', async (req: Request, res: Response) => {\n try {\n await httpAuth.credentials(req, { allow: ['user'] });\n } catch {\n res.status(401).json({ message: 'Unauthorized' });\n return;\n }\n\n const includeMembers =\n typeof req.query.includeMembers === 'string'\n ? req.query.includeMembers === 'true'\n : true;\n const stackgenApis = getStackgenApiObjects(config);\n await proxyStackgenClientCall(res, logger, 'User groups proxy', () =>\n stackgenApis.userGroupApiObj.listUserGroups({\n includeMembers,\n }),\n );\n });\n\n router.get('/modules', async (req: Request, res: Response) => {\n try {\n await httpAuth.credentials(req, { allow: ['user'] });\n } catch {\n res.status(401).json({ message: 'Unauthorized' });\n return;\n }\n\n const orgId =\n typeof req.query.orgId === 'string' ? req.query.orgId.trim() : '';\n const pageRaw =\n typeof req.query.page === 'string' ? Number(req.query.page) : 1;\n const perPageRaw =\n typeof req.query.perPage === 'string'\n ? Number(req.query.perPage)\n : 100;\n const page =\n Number.isFinite(pageRaw) && pageRaw > 0 ? Math.floor(pageRaw) : 1;\n const perPage =\n Number.isFinite(perPageRaw) && perPageRaw > 0\n ? Math.min(Math.floor(perPageRaw), 100)\n : 100;\n\n const stackgenApis = getStackgenApiObjects(config);\n await proxyStackgenClientCall(res, logger, 'Modules proxy', () =>\n stackgenApis.v1CustomResourceTemplateApiObj.getAccessibleCustomResourceTemplates(\n {\n orgId: orgId || undefined,\n page,\n perPage,\n },\n ),\n );\n });\n\n router.get('/variables', async (req: Request, res: Response) => {\n try {\n await httpAuth.credentials(req, { allow: ['user'] });\n } catch {\n res.status(401).json({ message: 'Unauthorized' });\n return;\n }\n\n let topologyId =\n typeof req.query.topologyId === 'string'\n ? req.query.topologyId.trim()\n : '';\n const orgId =\n typeof req.query.orgId === 'string' ? req.query.orgId.trim() : '';\n const appstackName =\n typeof req.query.appstackName === 'string'\n ? req.query.appstackName.trim()\n : '';\n\n if (!topologyId && (!orgId || !appstackName)) {\n res.status(400).json({\n message:\n 'topologyId or both orgId and appstackName query parameters are required',\n });\n return;\n }\n\n await proxyStackgenClientCall(\n res,\n logger,\n 'Variables proxy',\n async () => {\n if (!topologyId) {\n topologyId = await resolveTopologyId({\n config,\n teamId: orgId,\n appstackName,\n logger,\n });\n }\n const stackgenApis = getStackgenApiObjects(config);\n return stackgenApis.v1TfBlocksApiObj.getTFVariables({\n topologyId,\n orgId: orgId || undefined,\n });\n },\n );\n });\n\n httpRouter.use(router);\n },\n });\n },\n});\n"],"names":["readClientError","formatApiFailure","createBackendModule","coreServices","express","getStackgenApiObjects","resolveExporterAppstackId","formatClientErrorMessage","listGitExporterConfigs","resolveTopologyId"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"stackgenUiProxiesModule.cjs.js","sources":["../../src/modules/stackgenUiProxiesModule.ts"],"sourcesContent":["import {\n coreServices,\n createBackendModule,\n LoggerService,\n} from '@backstage/backend-plugin-api';\nimport express, { Request, Response } from 'express';\nimport { listGitExporterConfigs } from '../exporter/gitExporterConfigHttp';\nimport {\n resolveExporterAppstackId,\n resolveTopologyId,\n} from '../exporter/topologyResolve';\nimport { getStackgenApiObjects, readClientError } from '../utils/api-objects';\n\nasync function proxyStackgenClientCall(\n res: Response,\n logger: LoggerService,\n operation: string,\n call: () => Promise<unknown>,\n): Promise<void> {\n try {\n const body = await call();\n res.status(200).json(body);\n } catch (error) {\n const parsedError = await readClientError(error);\n if (parsedError.status === 500 && parsedError.text === String(error)) {\n logger.error(`${operation} failed: ${String(error)}`);\n res.status(502).json({ message: `${operation} failed` });\n return;\n }\n\n const payload =\n parsedError.body && typeof parsedError.body === 'object'\n ? parsedError.body\n : { message: parsedError.text || `${operation} failed` };\n res.status(parsedError.status).json(payload);\n }\n}\n\n/**\n * Proxies StackGen HTTP APIs used by scaffolder custom fields\n * (`/vault-secrets`, `/environment-profiles`, `/users`, `/user-groups`,\n * `/modules`, `/variables`, `/exporter-git-configs`, `/export-history`).\n * Mounted on the stackgen backend plugin HTTP router.\n */\nexport const stackgenUiProxiesModule = createBackendModule({\n pluginId: 'stackgen',\n moduleId: 'stackgen-ui-proxies',\n register(env) {\n env.registerInit({\n deps: {\n httpRouter: coreServices.httpRouter,\n config: coreServices.rootConfig,\n logger: coreServices.logger,\n httpAuth: coreServices.httpAuth,\n },\n async init({ httpRouter, config, logger, httpAuth }) {\n const router = express.Router();\n router.use(express.json());\n\n router.get('/vault-secrets', async (req: Request, res: Response) => {\n try {\n await httpAuth.credentials(req, { allow: ['user'] });\n } catch {\n res.status(401).json({ message: 'Unauthorized' });\n return;\n }\n\n const orgId =\n typeof req.query.orgId === 'string' ? req.query.orgId.trim() : '';\n\n const stackgenApis = getStackgenApiObjects(config);\n logger.info('Vault secrets proxy via generated client');\n await proxyStackgenClientCall(res, logger, 'Vault secrets proxy', () =>\n stackgenApis.vaultSecretApiObj.getSecrets({\n orgId: orgId || undefined,\n category:\n typeof req.query.category === 'string'\n ? req.query.category\n : undefined,\n subcategory:\n typeof req.query.subcategory === 'string'\n ? (req.query.subcategory as never)\n : undefined,\n name:\n typeof req.query.name === 'string' ? req.query.name : undefined,\n }),\n );\n });\n\n router.get(\n '/exporter-git-configs/:id',\n async (req: Request, res: Response) => {\n try {\n await httpAuth.credentials(req, { allow: ['user'] });\n } catch {\n res.status(401).json({ message: 'Unauthorized' });\n return;\n }\n\n const orgId =\n typeof req.query.orgId === 'string' ? req.query.orgId.trim() : '';\n if (!orgId) {\n res\n .status(400)\n .json({ message: 'orgId query parameter is required' });\n return;\n }\n\n const configId =\n typeof req.params.id === 'string' ? req.params.id.trim() : '';\n if (!configId) {\n res.status(400).json({ message: 'config id is required' });\n return;\n }\n\n const stackgenApis = getStackgenApiObjects(config);\n await proxyStackgenClientCall(\n res,\n logger,\n 'Exporter config detail proxy',\n async () => {\n const body = await stackgenApis.exporterConfigApiObj.getConfig({\n id: configId,\n orgId,\n });\n const parameters =\n body?.parameters && typeof body.parameters === 'object'\n ? body.parameters\n : {};\n return {\n id: body?.id ?? configId,\n name: body?.name,\n parameters,\n };\n },\n );\n },\n );\n\n router.get(\n '/exporter-git-configs',\n async (req: Request, res: Response) => {\n try {\n await httpAuth.credentials(req, { allow: ['user'] });\n } catch {\n res.status(401).json({ message: 'Unauthorized' });\n return;\n }\n\n const orgId =\n typeof req.query.orgId === 'string' ? req.query.orgId : '';\n if (!orgId.trim()) {\n res\n .status(400)\n .json({ message: 'orgId query parameter is required' });\n return;\n }\n\n const appstackId =\n typeof req.query.appstackId === 'string'\n ? req.query.appstackId.trim()\n : '';\n const appstackName =\n typeof req.query.appstackName === 'string'\n ? req.query.appstackName.trim()\n : '';\n\n await proxyStackgenClientCall(\n res,\n logger,\n 'Exporter configs proxy',\n async () => {\n // Configs bind to appcd appstackId. Resolve from name/id via getAppStacks.\n let filterAppstackId = appstackId || undefined;\n if (appstackName || appstackId) {\n try {\n filterAppstackId = await resolveExporterAppstackId({\n config,\n teamId: orgId.trim(),\n appstackId: appstackId || undefined,\n appstackName: appstackName || undefined,\n logger,\n });\n } catch (error) {\n logger.warn(\n `Could not resolve exporter appstackId: ${String(error)}`,\n );\n filterAppstackId = undefined;\n }\n }\n\n return listGitExporterConfigs(\n config,\n {\n orgId: orgId.trim(),\n type: 'git',\n appstackId: filterAppstackId,\n },\n logger,\n );\n },\n );\n },\n );\n\n router.get('/export-history', async (req: Request, res: Response) => {\n try {\n await httpAuth.credentials(req, { allow: ['user'] });\n } catch {\n res.status(401).json({ message: 'Unauthorized' });\n return;\n }\n\n const orgId =\n typeof req.query.orgId === 'string' ? req.query.orgId.trim() : '';\n const appstackName =\n typeof req.query.appstackName === 'string'\n ? req.query.appstackName.trim()\n : '';\n if (!orgId) {\n res\n .status(400)\n .json({ message: 'orgId query parameter is required' });\n return;\n }\n if (!appstackName) {\n res\n .status(400)\n .json({ message: 'appstackName query parameter is required' });\n return;\n }\n\n const limitRaw =\n typeof req.query.limit === 'string' ? Number(req.query.limit) : 1;\n const limit =\n Number.isFinite(limitRaw) && limitRaw > 0\n ? Math.min(Math.floor(limitRaw), 50)\n : 1;\n\n const stackgenApis = getStackgenApiObjects(config);\n await proxyStackgenClientCall(\n res,\n logger,\n 'Export history proxy',\n async () => {\n const topologyId = await resolveTopologyId({\n config,\n teamId: orgId,\n appstackName,\n logger,\n });\n const history =\n await stackgenApis.exporterApiObj.getExportHistory({\n orgId,\n topologyIds: [topologyId],\n limit,\n });\n const first = Array.isArray(history?.records)\n ? history.records[0]\n : undefined;\n const head =\n typeof first?.metadata?.head === 'string'\n ? first.metadata.head.trim()\n : '';\n return {\n topologyId,\n ...(head ? { head } : {}),\n };\n },\n );\n });\n\n /**\n * Proxies used by scaffolder custom field extensions\n * (EnvironmentSelect, UserGroupSelect, ModuleSelect, VariableSelect).\n */\n router.get(\n '/environment-profiles',\n async (req: Request, res: Response) => {\n try {\n await httpAuth.credentials(req, { allow: ['user'] });\n } catch {\n res.status(401).json({ message: 'Unauthorized' });\n return;\n }\n\n const orgId =\n typeof req.query.orgId === 'string' ? req.query.orgId.trim() : '';\n let topologyId =\n typeof req.query.topologyId === 'string'\n ? req.query.topologyId.trim()\n : '';\n const appstackName =\n typeof req.query.appstackName === 'string'\n ? req.query.appstackName.trim()\n : '';\n\n await proxyStackgenClientCall(\n res,\n logger,\n 'Environment profiles proxy',\n async () => {\n if (!topologyId && orgId && appstackName) {\n topologyId = await resolveTopologyId({\n config,\n teamId: orgId,\n appstackName,\n logger,\n });\n }\n const stackgenApis = getStackgenApiObjects(config);\n return stackgenApis.v1EnvironmentProfileApiObj.getAllEnvProfiles(\n {\n orgId: orgId || undefined,\n topologyID: topologyId || undefined,\n },\n );\n },\n );\n },\n );\n\n router.get('/users', async (req: Request, res: Response) => {\n try {\n await httpAuth.credentials(req, { allow: ['user'] });\n } catch {\n res.status(401).json({ message: 'Unauthorized' });\n return;\n }\n\n const orgId =\n typeof req.query.orgId === 'string' ? req.query.orgId.trim() : '';\n const stackgenApis = getStackgenApiObjects(config);\n await proxyStackgenClientCall(res, logger, 'Users proxy', () =>\n stackgenApis.usersApiObj.listUsers({\n orgID: orgId || undefined,\n }),\n );\n });\n\n router.get('/me', async (req: Request, res: Response) => {\n try {\n await httpAuth.credentials(req, { allow: ['user'] });\n } catch {\n res.status(401).json({ message: 'Unauthorized' });\n return;\n }\n\n const stackgenApis = getStackgenApiObjects(config);\n await proxyStackgenClientCall(res, logger, 'Current user proxy', () =>\n stackgenApis.authenticationApiObject.getMe(),\n );\n });\n\n router.get('/user-groups', async (req: Request, res: Response) => {\n try {\n await httpAuth.credentials(req, { allow: ['user'] });\n } catch {\n res.status(401).json({ message: 'Unauthorized' });\n return;\n }\n\n const includeMembers =\n typeof req.query.includeMembers === 'string'\n ? req.query.includeMembers === 'true'\n : true;\n const stackgenApis = getStackgenApiObjects(config);\n await proxyStackgenClientCall(res, logger, 'User groups proxy', () =>\n stackgenApis.userGroupApiObj.listUserGroups({\n includeMembers,\n }),\n );\n });\n\n router.get('/modules', async (req: Request, res: Response) => {\n try {\n await httpAuth.credentials(req, { allow: ['user'] });\n } catch {\n res.status(401).json({ message: 'Unauthorized' });\n return;\n }\n\n const orgId =\n typeof req.query.orgId === 'string' ? req.query.orgId.trim() : '';\n const pageRaw =\n typeof req.query.page === 'string' ? Number(req.query.page) : 1;\n const perPageRaw =\n typeof req.query.perPage === 'string'\n ? Number(req.query.perPage)\n : 100;\n const page =\n Number.isFinite(pageRaw) && pageRaw > 0 ? Math.floor(pageRaw) : 1;\n const perPage =\n Number.isFinite(perPageRaw) && perPageRaw > 0\n ? Math.min(Math.floor(perPageRaw), 100)\n : 100;\n\n const stackgenApis = getStackgenApiObjects(config);\n await proxyStackgenClientCall(res, logger, 'Modules proxy', () =>\n stackgenApis.v1CustomResourceTemplateApiObj.getAccessibleCustomResourceTemplates(\n {\n orgId: orgId || undefined,\n page,\n perPage,\n },\n ),\n );\n });\n\n router.get('/variables', async (req: Request, res: Response) => {\n try {\n await httpAuth.credentials(req, { allow: ['user'] });\n } catch {\n res.status(401).json({ message: 'Unauthorized' });\n return;\n }\n\n let topologyId =\n typeof req.query.topologyId === 'string'\n ? req.query.topologyId.trim()\n : '';\n const orgId =\n typeof req.query.orgId === 'string' ? req.query.orgId.trim() : '';\n const appstackName =\n typeof req.query.appstackName === 'string'\n ? req.query.appstackName.trim()\n : '';\n\n if (!topologyId && (!orgId || !appstackName)) {\n res.status(400).json({\n message:\n 'topologyId or both orgId and appstackName query parameters are required',\n });\n return;\n }\n\n await proxyStackgenClientCall(\n res,\n logger,\n 'Variables proxy',\n async () => {\n if (!topologyId) {\n topologyId = await resolveTopologyId({\n config,\n teamId: orgId,\n appstackName,\n logger,\n });\n }\n const stackgenApis = getStackgenApiObjects(config);\n return stackgenApis.v1TfBlocksApiObj.getTFVariables({\n topologyId,\n orgId: orgId || undefined,\n });\n },\n );\n });\n\n httpRouter.use(router);\n },\n });\n },\n});\n"],"names":["readClientError","createBackendModule","coreServices","express","getStackgenApiObjects","resolveExporterAppstackId","listGitExporterConfigs","resolveTopologyId"],"mappings":"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"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var index = require('../vendor/stackgen-api-client/index.cjs.js');
|
|
4
|
-
var http = require('../exporter/http.cjs.js');
|
|
5
4
|
var paths = require('../exporter/paths.cjs.js');
|
|
6
5
|
|
|
7
6
|
function getFetchApi(token) {
|
|
@@ -73,10 +72,6 @@ function getStackgenApiObjects(config) {
|
|
|
73
72
|
apiObjectsCache.set(config, objects);
|
|
74
73
|
return objects;
|
|
75
74
|
}
|
|
76
|
-
function requestIdFromResponse(response) {
|
|
77
|
-
const id = response.headers.get("x-request-id")?.trim();
|
|
78
|
-
return id || void 0;
|
|
79
|
-
}
|
|
80
75
|
async function readClientError(error) {
|
|
81
76
|
const response = error?.response;
|
|
82
77
|
if (!response) {
|
|
@@ -86,58 +81,46 @@ async function readClientError(error) {
|
|
|
86
81
|
text: String(error)
|
|
87
82
|
};
|
|
88
83
|
}
|
|
89
|
-
const requestId = requestIdFromResponse(response);
|
|
90
84
|
const text = await response.text().catch(() => "");
|
|
91
85
|
if (!text.trim()) {
|
|
92
|
-
return { status: response.status, body: {}, text
|
|
86
|
+
return { status: response.status, body: {}, text };
|
|
93
87
|
}
|
|
94
88
|
try {
|
|
95
89
|
return {
|
|
96
90
|
status: response.status,
|
|
97
91
|
body: JSON.parse(text),
|
|
98
|
-
text
|
|
99
|
-
requestId
|
|
92
|
+
text
|
|
100
93
|
};
|
|
101
94
|
} catch {
|
|
102
95
|
return {
|
|
103
96
|
status: response.status,
|
|
104
97
|
body: { message: text },
|
|
105
|
-
text
|
|
106
|
-
requestId
|
|
98
|
+
text
|
|
107
99
|
};
|
|
108
100
|
}
|
|
109
101
|
}
|
|
110
|
-
function
|
|
111
|
-
const
|
|
112
|
-
const
|
|
113
|
-
const
|
|
114
|
-
const
|
|
115
|
-
if (status >= 400 && status < 600) {
|
|
116
|
-
|
|
117
|
-
}
|
|
118
|
-
if (requestId) {
|
|
119
|
-
parts.push(`Request ID: ${requestId}`);
|
|
120
|
-
}
|
|
121
|
-
if (parts.length === 0) {
|
|
122
|
-
return detail;
|
|
102
|
+
async function formatClientErrorMessage(error) {
|
|
103
|
+
const parsed = await readClientError(error);
|
|
104
|
+
const fromBody = messageFromErrorBody(parsed.body);
|
|
105
|
+
const raw = fromBody || (parsed.text.trim() && parsed.text !== String(error) ? parsed.text.trim() : "") || (error instanceof Error ? error.message : String(error));
|
|
106
|
+
const detail = collapseOpaqueResponseError(raw, parsed.status);
|
|
107
|
+
if (parsed.status >= 400 && parsed.status < 600) {
|
|
108
|
+
return `${detail} (HTTP ${parsed.status})`;
|
|
123
109
|
}
|
|
124
|
-
return
|
|
110
|
+
return detail;
|
|
125
111
|
}
|
|
126
|
-
|
|
127
|
-
if (!
|
|
128
|
-
|
|
129
|
-
|
|
112
|
+
function messageFromErrorBody(body) {
|
|
113
|
+
if (!body || typeof body !== "object") {
|
|
114
|
+
return typeof body === "string" ? body.trim() : "";
|
|
115
|
+
}
|
|
116
|
+
const o = body;
|
|
117
|
+
for (const key of ["msg", "message", "error", "detail", "title"]) {
|
|
118
|
+
const value = o[key];
|
|
119
|
+
if (typeof value === "string" && value.trim()) {
|
|
120
|
+
return value.trim();
|
|
130
121
|
}
|
|
131
|
-
return String(error);
|
|
132
122
|
}
|
|
133
|
-
|
|
134
|
-
const textFallback = parsed.text.trim() || (error instanceof Error ? error.message : String(error));
|
|
135
|
-
return formatApiFailure(
|
|
136
|
-
parsed.status,
|
|
137
|
-
parsed.body,
|
|
138
|
-
textFallback,
|
|
139
|
-
parsed.requestId
|
|
140
|
-
);
|
|
123
|
+
return "";
|
|
141
124
|
}
|
|
142
125
|
function collapseOpaqueResponseError(message, status) {
|
|
143
126
|
const trimmed = message.trim();
|
|
@@ -190,15 +173,13 @@ async function executeApiRequest(request, successStatus = 200) {
|
|
|
190
173
|
ok: false,
|
|
191
174
|
status: parsedError.status,
|
|
192
175
|
parsed: parsedError.body,
|
|
193
|
-
text: parsedError.text
|
|
194
|
-
requestId: parsedError.requestId
|
|
176
|
+
text: parsedError.text
|
|
195
177
|
};
|
|
196
178
|
}
|
|
197
179
|
}
|
|
198
180
|
|
|
199
181
|
exports.executeApiRequest = executeApiRequest;
|
|
200
182
|
exports.executeFetchRequest = executeFetchRequest;
|
|
201
|
-
exports.formatApiFailure = formatApiFailure;
|
|
202
183
|
exports.formatClientErrorMessage = formatClientErrorMessage;
|
|
203
184
|
exports.getStackgenApiObjects = getStackgenApiObjects;
|
|
204
185
|
exports.readClientError = readClientError;
|