@stackgenhq/backstage-plugin-stackgen-backend 0.3.6-beta.1
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 +485 -0
- package/config.d.ts +39 -0
- package/dist/actions/core/assign_project_members_action.cjs.js +227 -0
- package/dist/actions/core/assign_project_members_action.cjs.js.map +1 -0
- package/dist/actions/core/create_appstack_action.cjs.js +953 -0
- package/dist/actions/core/create_appstack_action.cjs.js.map +1 -0
- package/dist/actions/core/create_project_action.cjs.js +243 -0
- package/dist/actions/core/create_project_action.cjs.js.map +1 -0
- package/dist/actions/core/download_iac_action.cjs.js +133 -0
- package/dist/actions/core/download_iac_action.cjs.js.map +1 -0
- package/dist/actions/core/set_environment_variable_values_action.cjs.js +121 -0
- package/dist/actions/core/set_environment_variable_values_action.cjs.js.map +1 -0
- package/dist/actions/core/set_state_backend_action.cjs.js +174 -0
- package/dist/actions/core/set_state_backend_action.cjs.js.map +1 -0
- package/dist/actions/exporter/export_iac_to_git_action.cjs.js +290 -0
- package/dist/actions/exporter/export_iac_to_git_action.cjs.js.map +1 -0
- package/dist/actions/exporter/list_vault_secrets_action.cjs.js +39 -0
- package/dist/actions/exporter/list_vault_secrets_action.cjs.js.map +1 -0
- package/dist/config/constants.cjs.js +23 -0
- package/dist/config/constants.cjs.js.map +1 -0
- package/dist/exporter/exportOverrides.cjs.js +27 -0
- package/dist/exporter/exportOverrides.cjs.js.map +1 -0
- package/dist/exporter/gitExporterConfigHttp.cjs.js +105 -0
- package/dist/exporter/gitExporterConfigHttp.cjs.js.map +1 -0
- package/dist/exporter/http.cjs.js +14 -0
- package/dist/exporter/http.cjs.js.map +1 -0
- package/dist/exporter/paths.cjs.js +25 -0
- package/dist/exporter/paths.cjs.js.map +1 -0
- package/dist/exporter/projectGitExporterTemplate.cjs.js +62 -0
- package/dist/exporter/projectGitExporterTemplate.cjs.js.map +1 -0
- package/dist/exporter/topologyResolve.cjs.js +71 -0
- package/dist/exporter/topologyResolve.cjs.js.map +1 -0
- package/dist/index.cjs.js +31 -0
- package/dist/index.cjs.js.map +1 -0
- package/dist/index.d.ts +224 -0
- package/dist/lib/extractArchive.cjs.js +62 -0
- package/dist/lib/extractArchive.cjs.js.map +1 -0
- package/dist/modules/stackgenExporterScaffolderModule.cjs.js +29 -0
- package/dist/modules/stackgenExporterScaffolderModule.cjs.js.map +1 -0
- package/dist/modules/stackgenUiProxiesModule.cjs.js +366 -0
- package/dist/modules/stackgenUiProxiesModule.cjs.js.map +1 -0
- package/dist/plugin/plugin.cjs.js +136 -0
- package/dist/plugin/plugin.cjs.js.map +1 -0
- package/dist/plugin/router.cjs.js +341 -0
- package/dist/plugin/router.cjs.js.map +1 -0
- package/dist/services/MappingsService/mappingsService.cjs.js +149 -0
- package/dist/services/MappingsService/mappingsService.cjs.js.map +1 -0
- package/dist/services/StackgenService/stackgenService.cjs.js +267 -0
- package/dist/services/StackgenService/stackgenService.cjs.js.map +1 -0
- package/dist/utils/api-objects.cjs.js +205 -0
- package/dist/utils/api-objects.cjs.js.map +1 -0
- package/dist/vendor/stackgen-api-client/index.cjs.js +47681 -0
- package/dist/vendor/stackgen-api-client/index.cjs.js.map +1 -0
- package/migrations/20250131055302_init.js +24 -0
- package/migrations/20250305123456_alter_type_associations.js +23 -0
- package/package.json +86 -0
- package/templates/appstack-configure-environment.yaml +81 -0
- package/templates/appstack-from-template.yaml +76 -0
- package/templates/appstack-with-modules.yaml +69 -0
- package/templates/appstack-with-resources.yaml +81 -0
- package/templates/export-iac.yaml +97 -0
- package/templates/full-infra-setup.yaml +156 -0
- package/templates/git_export_exporter_multi_scm.yaml +123 -0
- package/templates/project-advanced.yaml +77 -0
- package/templates/project-basic.yaml +39 -0
- package/templates/project-with-members.yaml +86 -0
|
@@ -0,0 +1,341 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var zod = require('zod');
|
|
4
|
+
var express = require('express');
|
|
5
|
+
var Router = require('express-promise-router');
|
|
6
|
+
var constants = require('../config/constants.cjs.js');
|
|
7
|
+
|
|
8
|
+
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
|
|
9
|
+
|
|
10
|
+
var express__default = /*#__PURE__*/_interopDefaultCompat(express);
|
|
11
|
+
var Router__default = /*#__PURE__*/_interopDefaultCompat(Router);
|
|
12
|
+
|
|
13
|
+
async function createRouter({
|
|
14
|
+
httpAuth,
|
|
15
|
+
mappingService,
|
|
16
|
+
stackgenService
|
|
17
|
+
}) {
|
|
18
|
+
const router = Router__default.default();
|
|
19
|
+
router.use(express__default.default.json());
|
|
20
|
+
const typeAssociationSchema = zod.z.object({
|
|
21
|
+
backstageType: zod.z.string(),
|
|
22
|
+
stackGenType: zod.z.string()
|
|
23
|
+
});
|
|
24
|
+
const mappingSchema = zod.z.object({
|
|
25
|
+
name: zod.z.string(),
|
|
26
|
+
cloudProvider: zod.z.string(),
|
|
27
|
+
typeAssociations: zod.z.array(typeAssociationSchema)
|
|
28
|
+
});
|
|
29
|
+
const handleValidationError = (error) => {
|
|
30
|
+
const firstError = error.errors[0];
|
|
31
|
+
return {
|
|
32
|
+
message: firstError ? firstError.message : "Validation failed"
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
router.post("/mappings", async (req, res) => {
|
|
36
|
+
const parsed = mappingSchema.safeParse(req.body);
|
|
37
|
+
if (!parsed.success) {
|
|
38
|
+
return res.status(400).json(handleValidationError(parsed.error));
|
|
39
|
+
}
|
|
40
|
+
if (!parsed.data.name || parsed.data.name.trim().length === 0) {
|
|
41
|
+
return res.status(400).json({ message: "Name is required." });
|
|
42
|
+
}
|
|
43
|
+
if (parsed.data.name.length > 40) {
|
|
44
|
+
return res.status(400).json({
|
|
45
|
+
message: "Name exceeds the maximum length of 40 characters."
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
if (!parsed.data.cloudProvider || parsed.data.cloudProvider.trim().length === 0) {
|
|
49
|
+
return res.status(400).json({ message: "Cloud Provider is required." });
|
|
50
|
+
}
|
|
51
|
+
if (!constants.IsValidCloudProvider(parsed.data.cloudProvider)) {
|
|
52
|
+
return res.status(400).json({ message: "Invalid Cloud Provider" });
|
|
53
|
+
}
|
|
54
|
+
try {
|
|
55
|
+
const result = await mappingService.createMapping(parsed.data, {
|
|
56
|
+
credentials: await httpAuth.credentials(req, { allow: ["user"] })
|
|
57
|
+
});
|
|
58
|
+
return res.status(201).json(result);
|
|
59
|
+
} catch (error) {
|
|
60
|
+
return res.status(500).json({
|
|
61
|
+
message: error instanceof Error ? error.message : "Internal server error"
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
router.get("/mappings", async (_req, res) => {
|
|
66
|
+
try {
|
|
67
|
+
res.json(await mappingService.listMappings());
|
|
68
|
+
} catch (error) {
|
|
69
|
+
res.status(500).json({
|
|
70
|
+
message: error instanceof Error ? error.message : "Internal server error"
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
router.get("/mappings/:id", async (req, res) => {
|
|
75
|
+
try {
|
|
76
|
+
res.json(await mappingService.getMapping({ id: req.params.id }));
|
|
77
|
+
} catch (error) {
|
|
78
|
+
res.status(404).json({
|
|
79
|
+
message: error instanceof Error ? error.message : "Mapping not found"
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
router.delete("/mappings/:id", async (req, res) => {
|
|
84
|
+
try {
|
|
85
|
+
await mappingService.deleteMapping({ id: req.params.id });
|
|
86
|
+
res.status(204).send();
|
|
87
|
+
} catch (error) {
|
|
88
|
+
res.status(500).json({
|
|
89
|
+
message: error instanceof Error ? error.message : "Could not delete mapping"
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
router.patch("/mappings/:id", async (req, res) => {
|
|
94
|
+
const parsed = mappingSchema.partial().safeParse(req.body);
|
|
95
|
+
if (!parsed.success) {
|
|
96
|
+
return res.status(400).json(handleValidationError(parsed.error));
|
|
97
|
+
}
|
|
98
|
+
try {
|
|
99
|
+
const result = await mappingService.updateMapping(
|
|
100
|
+
req.params.id,
|
|
101
|
+
parsed.data
|
|
102
|
+
);
|
|
103
|
+
return res.json(result);
|
|
104
|
+
} catch (error) {
|
|
105
|
+
return res.status(500).json({
|
|
106
|
+
message: error instanceof Error ? error.message : "Could not update mapping"
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
const entitySchema = zod.z.object({
|
|
111
|
+
apiVersion: zod.z.string(),
|
|
112
|
+
kind: zod.z.string(),
|
|
113
|
+
metadata: zod.z.object({
|
|
114
|
+
name: zod.z.string(),
|
|
115
|
+
namespace: zod.z.string().optional(),
|
|
116
|
+
annotations: zod.z.record(zod.z.string()).optional()
|
|
117
|
+
}),
|
|
118
|
+
spec: zod.z.record(zod.z.any()).optional(),
|
|
119
|
+
relations: zod.z.array(
|
|
120
|
+
zod.z.object({
|
|
121
|
+
type: zod.z.string(),
|
|
122
|
+
targetRef: zod.z.string()
|
|
123
|
+
})
|
|
124
|
+
).optional()
|
|
125
|
+
});
|
|
126
|
+
const createOrUpdateAppstackSchema = zod.z.object({
|
|
127
|
+
appstackName: zod.z.string(),
|
|
128
|
+
cloudProvider: zod.z.string(),
|
|
129
|
+
appstackTeamId: zod.z.string(),
|
|
130
|
+
appstackId: zod.z.string().optional(),
|
|
131
|
+
components: zod.z.array(entitySchema).optional(),
|
|
132
|
+
resources: zod.z.array(entitySchema).optional(),
|
|
133
|
+
mapping: zod.z.record(zod.z.string(), zod.z.string()).optional()
|
|
134
|
+
});
|
|
135
|
+
const gitConfigParametersSchema = zod.z.object({
|
|
136
|
+
scmType: zod.z.enum(["GITHUB", "GITLAB", "BITBUCKET", "AZUREDEV"]).optional(),
|
|
137
|
+
repoUrl: zod.z.string().optional(),
|
|
138
|
+
targetBranch: zod.z.string().optional(),
|
|
139
|
+
path: zod.z.string().optional()
|
|
140
|
+
});
|
|
141
|
+
const gitConfigTemplateSchema = zod.z.object({
|
|
142
|
+
name: zod.z.string().optional(),
|
|
143
|
+
type: zod.z.string().optional(),
|
|
144
|
+
parameters: gitConfigParametersSchema.optional(),
|
|
145
|
+
vaultReference: zod.z.string().uuid().optional(),
|
|
146
|
+
default: zod.z.boolean().optional()
|
|
147
|
+
});
|
|
148
|
+
const stateBackendTemplateInputSchema = zod.z.object({
|
|
149
|
+
type: zod.z.enum(["S3", "GCS", "AZURERM", "LOCAL", "POSTGRES", "REMOTE", "CLOUD"]).optional(),
|
|
150
|
+
configJson: zod.z.string().optional(),
|
|
151
|
+
hcl: zod.z.string().optional(),
|
|
152
|
+
editorMode: zod.z.boolean().optional()
|
|
153
|
+
});
|
|
154
|
+
const environmentTemplateInputSchema = zod.z.object({
|
|
155
|
+
name: zod.z.string().optional(),
|
|
156
|
+
color: zod.z.string().optional(),
|
|
157
|
+
stateBackendTemplate: stateBackendTemplateInputSchema.optional()
|
|
158
|
+
});
|
|
159
|
+
const environmentConfigVariableInputSchema = zod.z.object({
|
|
160
|
+
name: zod.z.string().optional(),
|
|
161
|
+
type: zod.z.string().optional(),
|
|
162
|
+
defaultValueJson: zod.z.string().optional(),
|
|
163
|
+
description: zod.z.string().optional()
|
|
164
|
+
});
|
|
165
|
+
const environmentConfigVariableOverrideInputSchema = zod.z.object({
|
|
166
|
+
variableName: zod.z.string().optional(),
|
|
167
|
+
environmentTemplateName: zod.z.string().optional(),
|
|
168
|
+
valueJson: zod.z.string().optional()
|
|
169
|
+
});
|
|
170
|
+
const environmentConfigInputSchema = zod.z.object({
|
|
171
|
+
name: zod.z.string().optional(),
|
|
172
|
+
environmentTemplates: zod.z.array(environmentTemplateInputSchema).optional(),
|
|
173
|
+
variables: zod.z.array(environmentConfigVariableInputSchema).optional(),
|
|
174
|
+
variableOverrides: zod.z.array(environmentConfigVariableOverrideInputSchema).optional()
|
|
175
|
+
});
|
|
176
|
+
const createProjectSchema = zod.z.object({
|
|
177
|
+
name: zod.z.string(),
|
|
178
|
+
description: zod.z.string(),
|
|
179
|
+
gitConfig: gitConfigTemplateSchema.optional(),
|
|
180
|
+
environmentConfig: environmentConfigInputSchema.optional()
|
|
181
|
+
});
|
|
182
|
+
router.post("/v1/appstacks", async (req, res) => {
|
|
183
|
+
try {
|
|
184
|
+
const credentials = await httpAuth.credentials(req, { allow: ["user"] });
|
|
185
|
+
const parsed = createOrUpdateAppstackSchema.safeParse(req.body);
|
|
186
|
+
if (!parsed.success) {
|
|
187
|
+
return res.status(400).json(handleValidationError(parsed.error));
|
|
188
|
+
}
|
|
189
|
+
const response = await stackgenService.createOrUpdateAppstack(
|
|
190
|
+
parsed.data,
|
|
191
|
+
{ credentials }
|
|
192
|
+
);
|
|
193
|
+
Object.entries(response.headers).forEach(([key, value]) => {
|
|
194
|
+
if (!["transfer-encoding", "connection"].includes(key.toLowerCase())) {
|
|
195
|
+
res.setHeader(key, value);
|
|
196
|
+
}
|
|
197
|
+
});
|
|
198
|
+
return res.status(response.status).send(response.data);
|
|
199
|
+
} catch (error) {
|
|
200
|
+
if (error instanceof Error) {
|
|
201
|
+
if (error.message.includes("Unauthorized")) {
|
|
202
|
+
return res.status(401).json({ message: error.message });
|
|
203
|
+
}
|
|
204
|
+
return res.status(500).json({ error: error.message });
|
|
205
|
+
}
|
|
206
|
+
return res.status(500).json({ error: "Unknown error" });
|
|
207
|
+
}
|
|
208
|
+
});
|
|
209
|
+
router.post("/v1/projects", async (req, res) => {
|
|
210
|
+
try {
|
|
211
|
+
const credentials = await httpAuth.credentials(req, { allow: ["user"] });
|
|
212
|
+
const parsed = createProjectSchema.safeParse(req.body);
|
|
213
|
+
if (!parsed.success) {
|
|
214
|
+
return res.status(400).json(handleValidationError(parsed.error));
|
|
215
|
+
}
|
|
216
|
+
const response = await stackgenService.createProject(parsed.data, { credentials });
|
|
217
|
+
Object.entries(response.headers).forEach(([key, value]) => {
|
|
218
|
+
if (!["transfer-encoding", "connection"].includes(key.toLowerCase())) {
|
|
219
|
+
res.setHeader(key, value);
|
|
220
|
+
}
|
|
221
|
+
});
|
|
222
|
+
return res.status(response.status).send(response.data);
|
|
223
|
+
} catch (error) {
|
|
224
|
+
if (error instanceof Error) {
|
|
225
|
+
return res.status(500).json({ error: error.message });
|
|
226
|
+
}
|
|
227
|
+
return res.status(500).json({ error: "Unknown error" });
|
|
228
|
+
}
|
|
229
|
+
});
|
|
230
|
+
router.get("/v1/appstacks", async (req, res) => {
|
|
231
|
+
const credentials = await httpAuth.credentials(req, { allow: ["user"] });
|
|
232
|
+
const response = await stackgenService.getAppStacks({ credentials });
|
|
233
|
+
Object.entries(response.headers).forEach(([key, value]) => {
|
|
234
|
+
if (!["transfer-encoding", "connection"].includes(key.toLowerCase())) {
|
|
235
|
+
res.setHeader(key, value);
|
|
236
|
+
}
|
|
237
|
+
});
|
|
238
|
+
res.status(response.status).send(response.data);
|
|
239
|
+
});
|
|
240
|
+
router.get("/backstage/v1/appstack-teams", async (req, res) => {
|
|
241
|
+
const credentials = await httpAuth.credentials(req, { allow: ["user"] });
|
|
242
|
+
const response = await stackgenService.listTeams({ credentials });
|
|
243
|
+
Object.entries(response.headers).forEach(([key, value]) => {
|
|
244
|
+
if (!["transfer-encoding", "connection"].includes(key.toLowerCase())) {
|
|
245
|
+
res.setHeader(key, value);
|
|
246
|
+
}
|
|
247
|
+
});
|
|
248
|
+
res.status(response.status).send(response.data);
|
|
249
|
+
});
|
|
250
|
+
router.get("/v1/appstacks/:teamID", async (req, res) => {
|
|
251
|
+
const credentials = await httpAuth.credentials(req, { allow: ["user"] });
|
|
252
|
+
const response = await stackgenService.listAppstacksByTeamsID(
|
|
253
|
+
req.params.teamID,
|
|
254
|
+
{ credentials }
|
|
255
|
+
);
|
|
256
|
+
Object.entries(response.headers).forEach(([key, value]) => {
|
|
257
|
+
if (!["transfer-encoding", "connection"].includes(key.toLowerCase())) {
|
|
258
|
+
res.setHeader(key, value);
|
|
259
|
+
}
|
|
260
|
+
});
|
|
261
|
+
res.status(response.status).send(response.data);
|
|
262
|
+
});
|
|
263
|
+
router.get("/v1/allowed-teams", async (_req, res) => {
|
|
264
|
+
try {
|
|
265
|
+
const credentials = await httpAuth.credentials(_req, { allow: ["user"] });
|
|
266
|
+
const allowedTeams = await stackgenService.getAllowedTeams({
|
|
267
|
+
credentials
|
|
268
|
+
});
|
|
269
|
+
res.json({ allowedTeams });
|
|
270
|
+
} catch (error) {
|
|
271
|
+
if (error instanceof Error) {
|
|
272
|
+
if (error.message.includes("Unauthorized")) {
|
|
273
|
+
res.status(401).json({ message: error.message });
|
|
274
|
+
}
|
|
275
|
+
res.status(500).json({ message: error.message });
|
|
276
|
+
} else {
|
|
277
|
+
res.status(500).json({ message: "Unknown error" });
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
});
|
|
281
|
+
router.get("/v1/template-appstacks", async (req, res) => {
|
|
282
|
+
try {
|
|
283
|
+
const credentials = await httpAuth.credentials(req, { allow: ["user"] });
|
|
284
|
+
const response = await stackgenService.listTemplateAppstacks({
|
|
285
|
+
credentials
|
|
286
|
+
});
|
|
287
|
+
res.status(response.status).send(response.data);
|
|
288
|
+
} catch (error) {
|
|
289
|
+
if (error instanceof Error) {
|
|
290
|
+
if (error.message.includes("Unauthorized")) {
|
|
291
|
+
res.status(401).json({ message: error.message });
|
|
292
|
+
} else {
|
|
293
|
+
res.status(500).json({ message: error.message });
|
|
294
|
+
}
|
|
295
|
+
} else {
|
|
296
|
+
res.status(500).json({ message: "Unknown error" });
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
});
|
|
300
|
+
router.get("/v1/resources", async (_req, res) => {
|
|
301
|
+
try {
|
|
302
|
+
const response = await stackgenService.getStackgenResourceTypes({
|
|
303
|
+
credentials: await httpAuth.credentials(_req, { allow: ["user"] })
|
|
304
|
+
});
|
|
305
|
+
res.json(response.data);
|
|
306
|
+
} catch (error) {
|
|
307
|
+
if (error instanceof Error) {
|
|
308
|
+
if (error.message.includes("Unauthorized")) {
|
|
309
|
+
res.status(401).json({ message: error.message });
|
|
310
|
+
}
|
|
311
|
+
res.status(500).json({ message: error.message });
|
|
312
|
+
} else {
|
|
313
|
+
res.status(500).json({ error: "Unknown error" });
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
});
|
|
317
|
+
router.get("/v1/projects/:teamId/resources", async (req, res) => {
|
|
318
|
+
try {
|
|
319
|
+
const response = await stackgenService.getStackgenResourceTypesByTeamID(
|
|
320
|
+
req.params.teamId,
|
|
321
|
+
{
|
|
322
|
+
credentials: await httpAuth.credentials(req, { allow: ["user"] })
|
|
323
|
+
}
|
|
324
|
+
);
|
|
325
|
+
res.json(response.data);
|
|
326
|
+
} catch (error) {
|
|
327
|
+
if (error instanceof Error) {
|
|
328
|
+
if (error.message.includes("Unauthorized")) {
|
|
329
|
+
res.status(401).json({ message: error.message });
|
|
330
|
+
}
|
|
331
|
+
res.status(500).json({ message: error.message });
|
|
332
|
+
} else {
|
|
333
|
+
res.status(500).json({ error: "Unknown error" });
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
});
|
|
337
|
+
return router;
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
exports.createRouter = createRouter;
|
|
341
|
+
//# sourceMappingURL=router.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"router.cjs.js","sources":["../../src/plugin/router.ts"],"sourcesContent":["import { HttpAuthService } from \"@backstage/backend-plugin-api\";\nimport { z } from \"zod\";\nimport express from \"express\";\nimport Router from \"express-promise-router\";\nimport { MappingsService } from \"../services/MappingsService/types\";\nimport { StackgenAPI } from \"../services/StackgenService/types\";\nimport { IsValidCloudProvider } from \"../config/constants\";\n\nexport async function createRouter({\n httpAuth,\n mappingService,\n stackgenService,\n}: {\n httpAuth: HttpAuthService;\n mappingService: MappingsService;\n stackgenService: StackgenAPI;\n}): Promise<express.Router> {\n const router = Router();\n router.use(express.json());\n\n const typeAssociationSchema = z.object({\n backstageType: z.string(),\n stackGenType: z.string(),\n });\n\n const mappingSchema = z.object({\n name: z.string(),\n cloudProvider: z.string(),\n typeAssociations: z.array(typeAssociationSchema),\n });\n\n // Helper function to handle validation errors\n const handleValidationError = (error: z.ZodError) => {\n const firstError = error.errors[0];\n return {\n message: firstError ? firstError.message : \"Validation failed\",\n };\n };\n\n router.post(\"/mappings\", async (req, res) => {\n const parsed = mappingSchema.safeParse(req.body);\n if (!parsed.success) {\n return res.status(400).json(handleValidationError(parsed.error));\n }\n\n if (!parsed.data.name || parsed.data.name.trim().length === 0) {\n return res.status(400).json({ message: \"Name is required.\" });\n }\n\n if (parsed.data.name.length > 40) {\n return res.status(400).json({\n message: \"Name exceeds the maximum length of 40 characters.\",\n });\n }\n\n if (\n !parsed.data.cloudProvider ||\n parsed.data.cloudProvider.trim().length === 0\n ) {\n return res.status(400).json({ message: \"Cloud Provider is required.\" });\n }\n\n if (!IsValidCloudProvider(parsed.data.cloudProvider)) {\n return res.status(400).json({ message: \"Invalid Cloud Provider\" });\n }\n\n try {\n const result = await mappingService.createMapping(parsed.data, {\n credentials: await httpAuth.credentials(req, { allow: [\"user\"] }),\n });\n\n return res.status(201).json(result);\n } catch (error) {\n return res.status(500).json({\n message:\n error instanceof Error ? error.message : \"Internal server error\",\n });\n }\n });\n\n router.get(\"/mappings\", async (_req, res) => {\n try {\n res.json(await mappingService.listMappings());\n } catch (error) {\n res.status(500).json({\n message:\n error instanceof Error ? error.message : \"Internal server error\",\n });\n }\n });\n\n router.get(\"/mappings/:id\", async (req, res) => {\n try {\n res.json(await mappingService.getMapping({ id: req.params.id }));\n } catch (error) {\n res.status(404).json({\n message: error instanceof Error ? error.message : \"Mapping not found\",\n });\n }\n });\n\n router.delete(\"/mappings/:id\", async (req, res) => {\n try {\n await mappingService.deleteMapping({ id: req.params.id });\n res.status(204).send();\n } catch (error) {\n res.status(500).json({\n message:\n error instanceof Error ? error.message : \"Could not delete mapping\",\n });\n }\n });\n\n router.patch(\"/mappings/:id\", async (req, res) => {\n const parsed = mappingSchema.partial().safeParse(req.body);\n if (!parsed.success) {\n return res.status(400).json(handleValidationError(parsed.error));\n }\n\n try {\n const result = await mappingService.updateMapping(\n req.params.id,\n parsed.data\n );\n return res.json(result);\n } catch (error) {\n return res.status(500).json({\n message:\n error instanceof Error ? error.message : \"Could not update mapping\",\n });\n }\n });\n\n const entitySchema = z.object({\n apiVersion: z.string(),\n kind: z.string(),\n metadata: z.object({\n name: z.string(),\n namespace: z.string().optional(),\n annotations: z.record(z.string()).optional(),\n }),\n spec: z.record(z.any()).optional(),\n relations: z\n .array(\n z.object({\n type: z.string(),\n targetRef: z.string(),\n })\n )\n .optional(),\n });\n\n const createOrUpdateAppstackSchema = z.object({\n appstackName: z.string(),\n cloudProvider: z.string(),\n appstackTeamId: z.string(),\n appstackId: z.string().optional(),\n components: z.array(entitySchema).optional(),\n resources: z.array(entitySchema).optional(),\n mapping: z.record(z.string(), z.string()).optional(),\n });\n\n // Create project schemas\n const gitConfigParametersSchema = z.object({\n scmType: z.enum(['GITHUB', 'GITLAB', 'BITBUCKET', 'AZUREDEV']).optional(),\n repoUrl: z.string().optional(),\n targetBranch: z.string().optional(),\n path: z.string().optional(),\n });\n\n const gitConfigTemplateSchema = z.object({\n name: z.string().optional(),\n type: z.string().optional(),\n parameters: gitConfigParametersSchema.optional(),\n vaultReference: z.string().uuid().optional(),\n default: z.boolean().optional(),\n });\n\n const stateBackendTemplateInputSchema = z.object({\n type: z.enum(['S3', 'GCS', 'AZURERM', 'LOCAL', 'POSTGRES', 'REMOTE', 'CLOUD']).optional(),\n configJson: z.string().optional(),\n hcl: z.string().optional(),\n editorMode: z.boolean().optional(),\n });\n\n const environmentTemplateInputSchema = z.object({\n name: z.string().optional(),\n color: z.string().optional(),\n stateBackendTemplate: stateBackendTemplateInputSchema.optional(),\n });\n\n const environmentConfigVariableInputSchema = z.object({\n name: z.string().optional(),\n type: z.string().optional(),\n defaultValueJson: z.string().optional(),\n description: z.string().optional(),\n });\n\n const environmentConfigVariableOverrideInputSchema = z.object({\n variableName: z.string().optional(),\n environmentTemplateName: z.string().optional(),\n valueJson: z.string().optional(),\n });\n\n const environmentConfigInputSchema = z.object({\n name: z.string().optional(),\n environmentTemplates: z.array(environmentTemplateInputSchema).optional(),\n variables: z.array(environmentConfigVariableInputSchema).optional(),\n variableOverrides: z.array(environmentConfigVariableOverrideInputSchema).optional(),\n });\n\n const createProjectSchema = z.object({\n name: z.string(),\n description: z.string(),\n gitConfig: gitConfigTemplateSchema.optional(),\n environmentConfig: environmentConfigInputSchema.optional(),\n });\n\n router.post(\"/v1/appstacks\", async (req, res) => {\n try {\n const credentials = await httpAuth.credentials(req, { allow: [\"user\"] });\n\n const parsed = createOrUpdateAppstackSchema.safeParse(req.body);\n if (!parsed.success) {\n return res.status(400).json(handleValidationError(parsed.error));\n }\n\n const response = await stackgenService.createOrUpdateAppstack(\n parsed.data,\n { credentials }\n );\n\n Object.entries(response.headers).forEach(([key, value]) => {\n if (![\"transfer-encoding\", \"connection\"].includes(key.toLowerCase())) {\n res.setHeader(key, value);\n }\n });\n\n return res.status(response.status).send(response.data);\n } catch (error) {\n if (error instanceof Error) {\n if (error.message.includes(\"Unauthorized\")) {\n return res.status(401).json({ message: error.message });\n }\n return res.status(500).json({ error: error.message });\n }\n return res.status(500).json({ error: \"Unknown error\" });\n }\n });\n\n router.post(\"/v1/projects\", async (req, res) => {\n try {\n const credentials = await httpAuth.credentials(req, { allow: [\"user\"] });\n\n const parsed = createProjectSchema.safeParse(req.body);\n if (!parsed.success) {\n return res.status(400).json(handleValidationError(parsed.error));\n }\n\n const response = await stackgenService.createProject(parsed.data, { credentials });\n\n Object.entries(response.headers).forEach(([key, value]) => {\n if (![\"transfer-encoding\", \"connection\"].includes(key.toLowerCase())) {\n res.setHeader(key, value);\n }\n });\n\n return res.status(response.status).send(response.data);\n } catch (error) {\n if (error instanceof Error) {\n return res.status(500).json({ error: error.message });\n }\n return res.status(500).json({ error: \"Unknown error\" });\n }\n });\n\n router.get(\"/v1/appstacks\", async (req, res) => {\n const credentials = await httpAuth.credentials(req, { allow: [\"user\"] });\n const response = await stackgenService.getAppStacks({ credentials });\n\n Object.entries(response.headers).forEach(([key, value]) => {\n if (![\"transfer-encoding\", \"connection\"].includes(key.toLowerCase())) {\n res.setHeader(key, value);\n }\n });\n\n res.status(response.status).send(response.data);\n });\n\n router.get(\"/backstage/v1/appstack-teams\", async (req, res) => {\n const credentials = await httpAuth.credentials(req, { allow: [\"user\"] });\n const response = await stackgenService.listTeams({ credentials });\n Object.entries(response.headers).forEach(([key, value]) => {\n if (![\"transfer-encoding\", \"connection\"].includes(key.toLowerCase())) {\n res.setHeader(key, value);\n }\n });\n\n res.status(response.status).send(response.data);\n });\n\n router.get(\"/v1/appstacks/:teamID\", async (req, res) => {\n const credentials = await httpAuth.credentials(req, { allow: [\"user\"] });\n const response = await stackgenService.listAppstacksByTeamsID(\n req.params.teamID,\n { credentials }\n );\n\n Object.entries(response.headers).forEach(([key, value]) => {\n if (![\"transfer-encoding\", \"connection\"].includes(key.toLowerCase())) {\n res.setHeader(key, value);\n }\n });\n\n res.status(response.status).send(response.data);\n });\n\n router.get(\"/v1/allowed-teams\", async (_req, res) => {\n try {\n const credentials = await httpAuth.credentials(_req, { allow: [\"user\"] });\n const allowedTeams = await stackgenService.getAllowedTeams({\n credentials,\n });\n res.json({ allowedTeams });\n } catch (error) {\n if (error instanceof Error) {\n if (error.message.includes(\"Unauthorized\")) {\n res.status(401).json({ message: error.message });\n }\n res.status(500).json({ message: error.message });\n } else {\n res.status(500).json({ message: \"Unknown error\" });\n }\n }\n });\n\n router.get(\"/v1/template-appstacks\", async (req, res) => {\n try {\n const credentials = await httpAuth.credentials(req, { allow: [\"user\"] });\n const response = await stackgenService.listTemplateAppstacks({\n credentials,\n });\n res.status(response.status).send(response.data);\n } catch (error) {\n if (error instanceof Error) {\n if (error.message.includes(\"Unauthorized\")) {\n res.status(401).json({ message: error.message });\n } else {\n res.status(500).json({ message: error.message });\n }\n } else {\n res.status(500).json({ message: \"Unknown error\" });\n }\n }\n });\n\n router.get(\"/v1/resources\", async (_req, res) => {\n try {\n const response = await stackgenService.getStackgenResourceTypes({\n credentials: await httpAuth.credentials(_req, { allow: [\"user\"] }),\n });\n res.json(response.data);\n } catch (error) {\n if (error instanceof Error) {\n if (error.message.includes(\"Unauthorized\")) {\n res.status(401).json({ message: error.message });\n }\n res.status(500).json({ message: error.message });\n } else {\n res.status(500).json({ error: \"Unknown error\" });\n }\n }\n });\n\n router.get(\"/v1/projects/:teamId/resources\", async (req, res) => {\n try {\n const response = await stackgenService.getStackgenResourceTypesByTeamID(\n req.params.teamId,\n {\n credentials: await httpAuth.credentials(req, { allow: [\"user\"] }),\n }\n );\n res.json(response.data);\n } catch (error) {\n if (error instanceof Error) {\n if (error.message.includes(\"Unauthorized\")) {\n res.status(401).json({ message: error.message });\n }\n res.status(500).json({ message: error.message });\n } else {\n res.status(500).json({ error: \"Unknown error\" });\n }\n }\n });\n\n return router;\n}\n"],"names":["Router","express","z","IsValidCloudProvider"],"mappings":"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"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var errors = require('@backstage/errors');
|
|
4
|
+
var crypto = require('node:crypto');
|
|
5
|
+
|
|
6
|
+
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
|
|
7
|
+
|
|
8
|
+
var crypto__default = /*#__PURE__*/_interopDefaultCompat(crypto);
|
|
9
|
+
|
|
10
|
+
async function mappingsService({
|
|
11
|
+
logger,
|
|
12
|
+
database
|
|
13
|
+
}) {
|
|
14
|
+
logger.info("Initializing MappingsService");
|
|
15
|
+
const knex = await database.getClient();
|
|
16
|
+
return {
|
|
17
|
+
async createMapping(input, options) {
|
|
18
|
+
try {
|
|
19
|
+
const id = crypto__default.default.randomUUID();
|
|
20
|
+
const createdBy = options.credentials.principal.userEntityRef;
|
|
21
|
+
const timestamp = (/* @__PURE__ */ new Date()).toISOString();
|
|
22
|
+
const mapping = {
|
|
23
|
+
id,
|
|
24
|
+
name: input.name,
|
|
25
|
+
cloudProvider: input.cloudProvider,
|
|
26
|
+
typeAssociations: input.typeAssociations,
|
|
27
|
+
createdBy,
|
|
28
|
+
createdAt: timestamp,
|
|
29
|
+
updatedAt: timestamp
|
|
30
|
+
};
|
|
31
|
+
await knex("mappings").insert({
|
|
32
|
+
id: mapping.id,
|
|
33
|
+
name: mapping.name,
|
|
34
|
+
cloud_provider: mapping.cloudProvider,
|
|
35
|
+
type_associations: JSON.stringify(mapping.typeAssociations),
|
|
36
|
+
created_by: mapping.createdBy,
|
|
37
|
+
created_at: mapping.createdAt,
|
|
38
|
+
updated_at: mapping.updatedAt
|
|
39
|
+
});
|
|
40
|
+
logger.info(`Created new mapping with ID: ${id}`);
|
|
41
|
+
return mapping;
|
|
42
|
+
} catch (error) {
|
|
43
|
+
const errMessage = String(error);
|
|
44
|
+
if (errMessage.toLowerCase().includes("unique")) {
|
|
45
|
+
throw new Error(`mapping with ${input.name} already exist`);
|
|
46
|
+
}
|
|
47
|
+
logger.error(
|
|
48
|
+
"Error creating mapping:",
|
|
49
|
+
error instanceof Error ? error : new Error(String(error))
|
|
50
|
+
);
|
|
51
|
+
throw new Error("Failed to create mapping");
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
async listMappings() {
|
|
55
|
+
try {
|
|
56
|
+
const results = await knex("mappings").select();
|
|
57
|
+
return {
|
|
58
|
+
items: results.map((r) => ({
|
|
59
|
+
id: r.id,
|
|
60
|
+
name: r.name,
|
|
61
|
+
cloudProvider: r.cloud_provider,
|
|
62
|
+
typeAssociations: typeof r.type_associations === "string" ? JSON.parse(r.type_associations) : r.type_associations,
|
|
63
|
+
createdBy: r.created_by,
|
|
64
|
+
createdAt: r.created_at,
|
|
65
|
+
updatedAt: r.updated_at
|
|
66
|
+
}))
|
|
67
|
+
};
|
|
68
|
+
} catch (error) {
|
|
69
|
+
logger.error(
|
|
70
|
+
"Error fetching mappings:",
|
|
71
|
+
error instanceof Error ? error : new Error(String(error))
|
|
72
|
+
);
|
|
73
|
+
throw new Error("Failed to retrieve mappings");
|
|
74
|
+
}
|
|
75
|
+
},
|
|
76
|
+
async getMapping({ id }) {
|
|
77
|
+
try {
|
|
78
|
+
const result = await knex("mappings").where({ id }).first();
|
|
79
|
+
if (!result) {
|
|
80
|
+
throw new errors.NotFoundError(`No mapping found with id '${id}'`);
|
|
81
|
+
}
|
|
82
|
+
return {
|
|
83
|
+
id: result.id,
|
|
84
|
+
name: result.name,
|
|
85
|
+
cloudProvider: result.cloud_provider,
|
|
86
|
+
typeAssociations: typeof result.type_associations === "string" ? JSON.parse(result.type_associations) : result.type_associations,
|
|
87
|
+
createdBy: result.created_by,
|
|
88
|
+
createdAt: result.created_at,
|
|
89
|
+
updatedAt: result.updated_at
|
|
90
|
+
};
|
|
91
|
+
} catch (error) {
|
|
92
|
+
logger.error(
|
|
93
|
+
`Error retrieving mapping with ID ${id}:`,
|
|
94
|
+
error instanceof Error ? error : new Error(String(error))
|
|
95
|
+
);
|
|
96
|
+
throw new Error("Failed to retrieve mapping");
|
|
97
|
+
}
|
|
98
|
+
},
|
|
99
|
+
async deleteMapping({ id }) {
|
|
100
|
+
try {
|
|
101
|
+
const count = await knex("mappings").where({ id }).delete();
|
|
102
|
+
if (count === 0) {
|
|
103
|
+
throw new errors.NotFoundError(`No mapping found with id '${id}'`);
|
|
104
|
+
}
|
|
105
|
+
logger.info(`Deleted mapping with ID: ${id}`);
|
|
106
|
+
} catch (error) {
|
|
107
|
+
logger.error(
|
|
108
|
+
`Error deleting mapping with ID ${id}:`,
|
|
109
|
+
error instanceof Error ? error : new Error(String(error))
|
|
110
|
+
);
|
|
111
|
+
throw new Error("Failed to delete mapping");
|
|
112
|
+
}
|
|
113
|
+
},
|
|
114
|
+
async updateMapping(id, updates) {
|
|
115
|
+
try {
|
|
116
|
+
const existing = await knex("mappings").where({ id }).first();
|
|
117
|
+
if (!existing) {
|
|
118
|
+
throw new errors.NotFoundError(`No mapping found with id '${id}'`);
|
|
119
|
+
}
|
|
120
|
+
const updatedMapping = {
|
|
121
|
+
id: existing.id,
|
|
122
|
+
name: existing.name,
|
|
123
|
+
cloudProvider: existing.cloud_provider,
|
|
124
|
+
typeAssociations: updates.typeAssociations ? updates.typeAssociations : JSON.parse(existing.type_associations),
|
|
125
|
+
createdBy: existing.created_by,
|
|
126
|
+
createdAt: existing.created_at,
|
|
127
|
+
updatedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
128
|
+
};
|
|
129
|
+
await knex("mappings").where({ id }).update({
|
|
130
|
+
name: updatedMapping.name,
|
|
131
|
+
cloud_provider: updatedMapping.cloudProvider,
|
|
132
|
+
type_associations: JSON.stringify(updatedMapping.typeAssociations),
|
|
133
|
+
updated_at: updatedMapping.updatedAt
|
|
134
|
+
});
|
|
135
|
+
logger.info(`Updated mapping with ID: ${id}`);
|
|
136
|
+
return updatedMapping;
|
|
137
|
+
} catch (error) {
|
|
138
|
+
logger.error(
|
|
139
|
+
`Error updating mapping with ID ${id}:`,
|
|
140
|
+
error instanceof Error ? error : new Error(String(error))
|
|
141
|
+
);
|
|
142
|
+
throw new Error("Failed to update mapping");
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
exports.mappingsService = mappingsService;
|
|
149
|
+
//# sourceMappingURL=mappingsService.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mappingsService.cjs.js","sources":["../../../src/services/MappingsService/mappingsService.ts"],"sourcesContent":["import { LoggerService, DatabaseService } from \"@backstage/backend-plugin-api\";\nimport { NotFoundError } from \"@backstage/errors\";\nimport crypto from \"node:crypto\";\nimport { MappingsService } from \"./types\";\n\nexport async function mappingsService({\n logger,\n database,\n}: {\n logger: LoggerService;\n database: DatabaseService;\n}): Promise<MappingsService> {\n logger.info(\"Initializing MappingsService\");\n\n const knex = await database.getClient();\n\n return {\n async createMapping(input, options) {\n try {\n const id = crypto.randomUUID();\n const createdBy = options.credentials.principal.userEntityRef;\n const timestamp = new Date().toISOString();\n\n const mapping = {\n id,\n name: input.name,\n cloudProvider: input.cloudProvider,\n typeAssociations: input.typeAssociations,\n createdBy,\n createdAt: timestamp,\n updatedAt: timestamp,\n };\n\n await knex(\"mappings\").insert({\n id: mapping.id,\n name: mapping.name,\n cloud_provider: mapping.cloudProvider,\n type_associations: JSON.stringify(mapping.typeAssociations),\n created_by: mapping.createdBy,\n created_at: mapping.createdAt,\n updated_at: mapping.updatedAt,\n });\n\n logger.info(`Created new mapping with ID: ${id}`);\n return mapping;\n } catch (error) {\n const errMessage = String(error);\n if (errMessage.toLowerCase().includes(\"unique\")) {\n throw new Error(`mapping with ${input.name} already exist`);\n }\n logger.error(\n \"Error creating mapping:\",\n error instanceof Error ? error : new Error(String(error))\n );\n throw new Error(\"Failed to create mapping\");\n }\n },\n\n async listMappings() {\n try {\n const results = await knex(\"mappings\").select();\n\n return {\n items: results.map((r) => ({\n id: r.id,\n name: r.name,\n cloudProvider: r.cloud_provider,\n typeAssociations:\n typeof r.type_associations === \"string\"\n ? JSON.parse(r.type_associations)\n : r.type_associations,\n createdBy: r.created_by,\n createdAt: r.created_at,\n updatedAt: r.updated_at,\n })),\n };\n } catch (error) {\n logger.error(\n \"Error fetching mappings:\",\n error instanceof Error ? error : new Error(String(error))\n );\n throw new Error(\"Failed to retrieve mappings\");\n }\n },\n\n async getMapping({ id }) {\n try {\n const result = await knex(\"mappings\").where({ id }).first();\n\n if (!result) {\n throw new NotFoundError(`No mapping found with id '${id}'`);\n }\n\n return {\n id: result.id,\n name: result.name,\n cloudProvider: result.cloud_provider,\n typeAssociations:\n typeof result.type_associations === \"string\"\n ? JSON.parse(result.type_associations)\n : result.type_associations,\n createdBy: result.created_by,\n createdAt: result.created_at,\n updatedAt: result.updated_at,\n };\n } catch (error) {\n logger.error(\n `Error retrieving mapping with ID ${id}:`,\n error instanceof Error ? error : new Error(String(error))\n );\n throw new Error(\"Failed to retrieve mapping\");\n }\n },\n\n async deleteMapping({ id }) {\n try {\n const count = await knex(\"mappings\").where({ id }).delete();\n\n if (count === 0) {\n throw new NotFoundError(`No mapping found with id '${id}'`);\n }\n logger.info(`Deleted mapping with ID: ${id}`);\n } catch (error) {\n logger.error(\n `Error deleting mapping with ID ${id}:`,\n error instanceof Error ? error : new Error(String(error))\n );\n throw new Error(\"Failed to delete mapping\");\n }\n },\n\n async updateMapping(id, updates) {\n try {\n const existing = await knex(\"mappings\").where({ id }).first();\n\n if (!existing) {\n throw new NotFoundError(`No mapping found with id '${id}'`);\n }\n\n const updatedMapping = {\n id: existing.id,\n name: existing.name,\n cloudProvider: existing.cloud_provider,\n typeAssociations: updates.typeAssociations\n ? updates.typeAssociations\n : JSON.parse(existing.type_associations),\n createdBy: existing.created_by,\n createdAt: existing.created_at,\n updatedAt: new Date().toISOString(),\n };\n\n await knex(\"mappings\")\n .where({ id })\n .update({\n name: updatedMapping.name,\n cloud_provider: updatedMapping.cloudProvider,\n type_associations: JSON.stringify(updatedMapping.typeAssociations),\n updated_at: updatedMapping.updatedAt,\n });\n\n logger.info(`Updated mapping with ID: ${id}`);\n return updatedMapping;\n } catch (error) {\n logger.error(\n `Error updating mapping with ID ${id}:`,\n error instanceof Error ? error : new Error(String(error))\n );\n throw new Error(\"Failed to update mapping\");\n }\n },\n };\n}\n"],"names":["crypto","NotFoundError"],"mappings":"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"}
|