@secustor/backstage-plugin-renovate-backend 0.12.0 → 0.13.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/CHANGELOG.md +18 -0
- package/dist/config/index.cjs.js +43 -0
- package/dist/config/index.cjs.js.map +1 -0
- package/dist/index.cjs.js +4 -1408
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/plugin.cjs.js +68 -0
- package/dist/plugin.cjs.js.map +1 -0
- package/dist/queue/factory.cjs.js +15 -0
- package/dist/queue/factory.cjs.js.map +1 -0
- package/dist/schema/openapi.generated.cjs.js +636 -0
- package/dist/schema/openapi.generated.cjs.js.map +1 -0
- package/dist/service/cleanupTask.cjs.js +39 -0
- package/dist/service/cleanupTask.cjs.js.map +1 -0
- package/dist/service/databaseHandler.cjs.js +255 -0
- package/dist/service/databaseHandler.cjs.js.map +1 -0
- package/dist/service/jobSync.cjs.js +45 -0
- package/dist/service/jobSync.cjs.js.map +1 -0
- package/dist/service/router.cjs.js +127 -0
- package/dist/service/router.cjs.js.map +1 -0
- package/dist/service/schema.cjs.js +13 -0
- package/dist/service/schema.cjs.js.map +1 -0
- package/dist/service/types.cjs.js +14 -0
- package/dist/service/types.cjs.js.map +1 -0
- package/dist/wrapper/platforms/github.cjs.js +13 -0
- package/dist/wrapper/platforms/github.cjs.js.map +1 -0
- package/dist/wrapper/platforms/index.cjs.js +80 -0
- package/dist/wrapper/platforms/index.cjs.js.map +1 -0
- package/dist/wrapper/renovateRunner.cjs.js +119 -0
- package/dist/wrapper/renovateRunner.cjs.js.map +1 -0
- package/dist/wrapper/utils.cjs.js +62 -0
- package/dist/wrapper/utils.cjs.js.map +1 -0
- package/package.json +12 -12
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var index = require('../config/index.cjs.js');
|
|
4
|
+
|
|
5
|
+
async function scheduleCleanupTask(routerOptions) {
|
|
6
|
+
const { scheduler, rootConfig, databaseHandler, logger } = routerOptions;
|
|
7
|
+
const pluginConfig = index.getPluginConfig(rootConfig);
|
|
8
|
+
const schedule = index.getScheduleDefinition(pluginConfig, "cleanup");
|
|
9
|
+
if (!schedule.enabled) {
|
|
10
|
+
return Promise.resolve();
|
|
11
|
+
}
|
|
12
|
+
const reportsToKeep = pluginConfig.getOptionalNumber("cleanup.minimumReports") ?? -1;
|
|
13
|
+
const dependencyHistoryKeep = pluginConfig.getOptionalNumber("cleanup.dependencyHistory") ?? -1;
|
|
14
|
+
return scheduler.scheduleTask({
|
|
15
|
+
id: `renovate_report_cleanup`,
|
|
16
|
+
...schedule,
|
|
17
|
+
fn: async () => {
|
|
18
|
+
if (reportsToKeep >= 0) {
|
|
19
|
+
logger.debug("Running report cleanup");
|
|
20
|
+
const modified = await databaseHandler.deleteReports({
|
|
21
|
+
keepLatest: reportsToKeep
|
|
22
|
+
});
|
|
23
|
+
logger.debug(`Report cleanup completed. ${modified} reports deleted`);
|
|
24
|
+
}
|
|
25
|
+
if (dependencyHistoryKeep >= 0) {
|
|
26
|
+
logger.debug("Running dependency history cleanup");
|
|
27
|
+
const modified = await databaseHandler.deleteDependencies({
|
|
28
|
+
keepLatest: dependencyHistoryKeep
|
|
29
|
+
});
|
|
30
|
+
logger.debug(
|
|
31
|
+
`Dependency history cleanup completed. ${modified} dependencies deleted`
|
|
32
|
+
);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
exports.scheduleCleanupTask = scheduleCleanupTask;
|
|
39
|
+
//# sourceMappingURL=cleanupTask.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cleanupTask.cjs.js","sources":["../../src/service/cleanupTask.ts"],"sourcesContent":["import { RouterOptions } from './types';\nimport { getPluginConfig, getScheduleDefinition } from '../config';\n\nexport async function scheduleCleanupTask(routerOptions: RouterOptions) {\n const { scheduler, rootConfig, databaseHandler, logger } = routerOptions;\n const pluginConfig = getPluginConfig(rootConfig);\n const schedule = getScheduleDefinition(pluginConfig, 'cleanup');\n if (!schedule.enabled) {\n return Promise.resolve();\n }\n\n const reportsToKeep =\n pluginConfig.getOptionalNumber('cleanup.minimumReports') ?? -1;\n\n const dependencyHistoryKeep =\n pluginConfig.getOptionalNumber('cleanup.dependencyHistory') ?? -1;\n\n return scheduler.scheduleTask({\n id: `renovate_report_cleanup`,\n ...schedule,\n fn: async () => {\n if (reportsToKeep >= 0) {\n logger.debug('Running report cleanup');\n const modified = await databaseHandler.deleteReports({\n keepLatest: reportsToKeep,\n });\n logger.debug(`Report cleanup completed. ${modified} reports deleted`);\n }\n if (dependencyHistoryKeep >= 0) {\n logger.debug('Running dependency history cleanup');\n const modified = await databaseHandler.deleteDependencies({\n keepLatest: dependencyHistoryKeep,\n });\n logger.debug(\n `Dependency history cleanup completed. ${modified} dependencies deleted`,\n );\n }\n },\n });\n}\n"],"names":["getPluginConfig","getScheduleDefinition"],"mappings":";;;;AAGA,eAAsB,oBAAoB,aAA8B,EAAA;AACtE,EAAA,MAAM,EAAE,SAAA,EAAW,UAAY,EAAA,eAAA,EAAiB,QAAW,GAAA,aAAA,CAAA;AAC3D,EAAM,MAAA,YAAA,GAAeA,sBAAgB,UAAU,CAAA,CAAA;AAC/C,EAAM,MAAA,QAAA,GAAWC,2BAAsB,CAAA,YAAA,EAAc,SAAS,CAAA,CAAA;AAC9D,EAAI,IAAA,CAAC,SAAS,OAAS,EAAA;AACrB,IAAA,OAAO,QAAQ,OAAQ,EAAA,CAAA;AAAA,GACzB;AAEA,EAAA,MAAM,aACJ,GAAA,YAAA,CAAa,iBAAkB,CAAA,wBAAwB,CAAK,IAAA,CAAA,CAAA,CAAA;AAE9D,EAAA,MAAM,qBACJ,GAAA,YAAA,CAAa,iBAAkB,CAAA,2BAA2B,CAAK,IAAA,CAAA,CAAA,CAAA;AAEjE,EAAA,OAAO,UAAU,YAAa,CAAA;AAAA,IAC5B,EAAI,EAAA,CAAA,uBAAA,CAAA;AAAA,IACJ,GAAG,QAAA;AAAA,IACH,IAAI,YAAY;AACd,MAAA,IAAI,iBAAiB,CAAG,EAAA;AACtB,QAAA,MAAA,CAAO,MAAM,wBAAwB,CAAA,CAAA;AACrC,QAAM,MAAA,QAAA,GAAW,MAAM,eAAA,CAAgB,aAAc,CAAA;AAAA,UACnD,UAAY,EAAA,aAAA;AAAA,SACb,CAAA,CAAA;AACD,QAAO,MAAA,CAAA,KAAA,CAAM,CAA6B,0BAAA,EAAA,QAAQ,CAAkB,gBAAA,CAAA,CAAA,CAAA;AAAA,OACtE;AACA,MAAA,IAAI,yBAAyB,CAAG,EAAA;AAC9B,QAAA,MAAA,CAAO,MAAM,oCAAoC,CAAA,CAAA;AACjD,QAAM,MAAA,QAAA,GAAW,MAAM,eAAA,CAAgB,kBAAmB,CAAA;AAAA,UACxD,UAAY,EAAA,qBAAA;AAAA,SACb,CAAA,CAAA;AACD,QAAO,MAAA,CAAA,KAAA;AAAA,UACL,yCAAyC,QAAQ,CAAA,qBAAA,CAAA;AAAA,SACnD,CAAA;AAAA,OACF;AAAA,KACF;AAAA,GACD,CAAA,CAAA;AACH;;;;"}
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var backendPluginApi = require('@backstage/backend-plugin-api');
|
|
4
|
+
var types = require('./types.cjs.js');
|
|
5
|
+
var is = require('@sindresorhus/is');
|
|
6
|
+
|
|
7
|
+
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
|
|
8
|
+
|
|
9
|
+
var is__default = /*#__PURE__*/_interopDefaultCompat(is);
|
|
10
|
+
|
|
11
|
+
const migrationsDir = backendPluginApi.resolvePackagePath(
|
|
12
|
+
"@secustor/backstage-plugin-renovate-backend",
|
|
13
|
+
"migrations"
|
|
14
|
+
);
|
|
15
|
+
class DatabaseHandler {
|
|
16
|
+
constructor(client, logger) {
|
|
17
|
+
this.client = client;
|
|
18
|
+
this.logger = logger;
|
|
19
|
+
}
|
|
20
|
+
static async create(options) {
|
|
21
|
+
const { database, logger } = options;
|
|
22
|
+
const client = await database.getClient();
|
|
23
|
+
if (!database.migrations?.skip) {
|
|
24
|
+
await client.migrate.latest({
|
|
25
|
+
directory: migrationsDir
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
return new DatabaseHandler(client, logger);
|
|
29
|
+
}
|
|
30
|
+
async addReport(options) {
|
|
31
|
+
const { runID, taskID, report, target } = options;
|
|
32
|
+
const logger = options.logger ?? this.logger;
|
|
33
|
+
const timestamp = /* @__PURE__ */ new Date();
|
|
34
|
+
const inserts = [];
|
|
35
|
+
for (const [repository, value] of Object.entries(report.repositories)) {
|
|
36
|
+
inserts.push({
|
|
37
|
+
run_id: runID,
|
|
38
|
+
task_id: taskID,
|
|
39
|
+
timestamp,
|
|
40
|
+
host: target.host,
|
|
41
|
+
repository,
|
|
42
|
+
report: value
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
await this.client("reports").insert(inserts).catch((reason) => logger.error("Failed insert data", reason));
|
|
46
|
+
await this.updateDependencies(timestamp, options);
|
|
47
|
+
}
|
|
48
|
+
async getReports(query) {
|
|
49
|
+
const builder = this.client.select();
|
|
50
|
+
if (query) {
|
|
51
|
+
builder.where(query);
|
|
52
|
+
}
|
|
53
|
+
const rows = await builder.from("reports");
|
|
54
|
+
return rows.map((row) => {
|
|
55
|
+
return {
|
|
56
|
+
runID: row.run_id,
|
|
57
|
+
taskID: row.task_id,
|
|
58
|
+
timestamp: row.timestamp.toISOString(),
|
|
59
|
+
host: row.host,
|
|
60
|
+
repository: row.repository,
|
|
61
|
+
// if the JSON field has not been auto-parsed do it manually
|
|
62
|
+
report: is__default.default.string(row.report) ? JSON.parse(row.report) : row.report
|
|
63
|
+
};
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
async getTargets(table = "reports") {
|
|
67
|
+
return this.client.select().distinct("host", "repository").from(table);
|
|
68
|
+
}
|
|
69
|
+
async deleteReportsByTarget({ host, repository }, options) {
|
|
70
|
+
const offset = getOffset(options);
|
|
71
|
+
const toBeDeletedIDs = this.client("reports").select("run_id").where("host", host).andWhere("repository", repository).orderBy("timestamp", "DESC").offset(offset);
|
|
72
|
+
return this.client("reports").delete().whereIn("run_id", [toBeDeletedIDs]);
|
|
73
|
+
}
|
|
74
|
+
async deleteReports(options) {
|
|
75
|
+
const targets = await this.getTargets();
|
|
76
|
+
const modified = await Promise.all(
|
|
77
|
+
targets.map((target) => this.deleteReportsByTarget(target, options))
|
|
78
|
+
);
|
|
79
|
+
return modified.reduce((a, b) => a + b, 0);
|
|
80
|
+
}
|
|
81
|
+
async updateDependencies(timestamp, options) {
|
|
82
|
+
const { runID, report, target } = options;
|
|
83
|
+
const dependencies = [];
|
|
84
|
+
for (const [repository, repositoryContent] of Object.entries(
|
|
85
|
+
report.repositories
|
|
86
|
+
)) {
|
|
87
|
+
for (const [manager, packageFiles] of Object.entries(
|
|
88
|
+
repositoryContent.packageFiles
|
|
89
|
+
)) {
|
|
90
|
+
for (const packageFile of packageFiles) {
|
|
91
|
+
const packageFilePath = packageFile.packageFile;
|
|
92
|
+
for (const dependency of packageFile.deps) {
|
|
93
|
+
const {
|
|
94
|
+
packageName,
|
|
95
|
+
depName,
|
|
96
|
+
depType,
|
|
97
|
+
datasource,
|
|
98
|
+
currentValue,
|
|
99
|
+
currentVersion,
|
|
100
|
+
skipReason,
|
|
101
|
+
registryUrl,
|
|
102
|
+
sourceUrl,
|
|
103
|
+
currentVersionTimestamp
|
|
104
|
+
} = dependency;
|
|
105
|
+
const massagedDepName = depName ?? packageName;
|
|
106
|
+
if (!massagedDepName) {
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
dependencies.push({
|
|
110
|
+
run_id: runID,
|
|
111
|
+
host: target.host,
|
|
112
|
+
extractionTimestamp: timestamp,
|
|
113
|
+
repository,
|
|
114
|
+
manager,
|
|
115
|
+
datasource: datasource ?? packageFile.datasource ?? "no-datasource",
|
|
116
|
+
depName: massagedDepName,
|
|
117
|
+
packageName,
|
|
118
|
+
packageFile: packageFilePath,
|
|
119
|
+
depType,
|
|
120
|
+
currentValue,
|
|
121
|
+
currentVersion,
|
|
122
|
+
currentVersionTimestamp,
|
|
123
|
+
skipReason,
|
|
124
|
+
registryUrl,
|
|
125
|
+
sourceUrl
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
await this.client("dependencies").insert(dependencies);
|
|
132
|
+
}
|
|
133
|
+
async getDependencies(filters, pagination) {
|
|
134
|
+
const page = pagination?.page ?? 0;
|
|
135
|
+
const pageSize = pagination?.pageSize ?? 500;
|
|
136
|
+
const builder = this.client("dependencies").select();
|
|
137
|
+
this.applyDependencyFilters(builder, filters);
|
|
138
|
+
const total = await this.getDependenciesCount(filters);
|
|
139
|
+
const offset = page * pageSize;
|
|
140
|
+
return {
|
|
141
|
+
result: await builder.offset(offset).limit(pageSize),
|
|
142
|
+
total,
|
|
143
|
+
page,
|
|
144
|
+
pageSize,
|
|
145
|
+
pageCount: Math.ceil(total / pageSize)
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
async getDependenciesCount(filters) {
|
|
149
|
+
const builder = this.client("dependencies").count({ count: "*" });
|
|
150
|
+
this.applyDependencyFilters(builder, filters);
|
|
151
|
+
const count = await builder.first().then((result) => result?.count);
|
|
152
|
+
if (is__default.default.string(count)) {
|
|
153
|
+
return Number.parseInt(count, 10);
|
|
154
|
+
}
|
|
155
|
+
return count ?? 0;
|
|
156
|
+
}
|
|
157
|
+
applyDependencyFilters(builder, filters) {
|
|
158
|
+
if (filters.host) {
|
|
159
|
+
builder.whereIn("host", filters.host);
|
|
160
|
+
}
|
|
161
|
+
if (filters.repository) {
|
|
162
|
+
builder.whereIn("repository", filters.repository);
|
|
163
|
+
}
|
|
164
|
+
if (filters.manager) {
|
|
165
|
+
builder.whereIn("manager", filters.manager);
|
|
166
|
+
}
|
|
167
|
+
if (filters.datasource) {
|
|
168
|
+
builder.whereIn("datasource", filters.datasource);
|
|
169
|
+
}
|
|
170
|
+
if (filters.depName) {
|
|
171
|
+
builder.whereIn("depName", filters.depName);
|
|
172
|
+
}
|
|
173
|
+
if (filters.depType) {
|
|
174
|
+
builder.whereIn("depType", filters.depType);
|
|
175
|
+
}
|
|
176
|
+
if (filters.latestOnly) {
|
|
177
|
+
const runIDs = this.client("dependencies").select("d.run_id").from("dependencies as d").join(
|
|
178
|
+
this.client("dependencies").select("host", "repository").max("extractionTimestamp as max_timestamp").groupBy("host", "repository").as("max_d"),
|
|
179
|
+
// eslint-disable-next-line func-names
|
|
180
|
+
function() {
|
|
181
|
+
this.on("d.host", "=", "max_d.host").andOn("d.repository", "=", "max_d.repository").andOn("d.extractionTimestamp", "=", "max_d.max_timestamp");
|
|
182
|
+
}
|
|
183
|
+
).distinct();
|
|
184
|
+
builder.whereIn("run_id", runIDs);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Gets the available values for the dependencies stored in the database.
|
|
189
|
+
* If filters are supplied, OTHER values are filtered accordingly, if a filter is supplied, all values are returned
|
|
190
|
+
* @param filters
|
|
191
|
+
*/
|
|
192
|
+
async getDependenciesValues(filters) {
|
|
193
|
+
const baseBuilder = this.client(
|
|
194
|
+
"dependencies"
|
|
195
|
+
);
|
|
196
|
+
const limitedValuesBuilder = baseBuilder.clone();
|
|
197
|
+
const allValuesKeys = [];
|
|
198
|
+
const limitedValuesKeys = [];
|
|
199
|
+
for (const filterKey of types.DependencyValueFiltersKeys) {
|
|
200
|
+
const suppliedFilter = filters?.[filterKey];
|
|
201
|
+
if (suppliedFilter) {
|
|
202
|
+
limitedValuesBuilder.whereIn(filterKey, suppliedFilter);
|
|
203
|
+
limitedValuesKeys.push(filterKey);
|
|
204
|
+
continue;
|
|
205
|
+
}
|
|
206
|
+
allValuesKeys.push(filterKey);
|
|
207
|
+
}
|
|
208
|
+
const result = {
|
|
209
|
+
datasource: [],
|
|
210
|
+
manager: [],
|
|
211
|
+
depType: [],
|
|
212
|
+
depName: [],
|
|
213
|
+
host: [],
|
|
214
|
+
packageFile: [],
|
|
215
|
+
repository: []
|
|
216
|
+
};
|
|
217
|
+
const allValues = allValuesKeys.map(
|
|
218
|
+
async (filterKey) => {
|
|
219
|
+
const values = await limitedValuesBuilder.clone().select(filterKey).distinct().pluck(filterKey);
|
|
220
|
+
result[filterKey] = values.filter(is__default.default.string);
|
|
221
|
+
}
|
|
222
|
+
);
|
|
223
|
+
const limitedValues = limitedValuesKeys.map(async (filterKey) => {
|
|
224
|
+
const values = await baseBuilder.clone().select(filterKey).distinct().pluck(filterKey);
|
|
225
|
+
result[filterKey] = values.filter(is__default.default.string);
|
|
226
|
+
});
|
|
227
|
+
await Promise.all([...allValues, ...limitedValues]);
|
|
228
|
+
return result;
|
|
229
|
+
}
|
|
230
|
+
async deleteDependencies(options) {
|
|
231
|
+
const targets = await this.getTargets("dependencies");
|
|
232
|
+
const modified = await Promise.all(
|
|
233
|
+
targets.map((target) => this.deleteDependenciesByTarget(target, options))
|
|
234
|
+
);
|
|
235
|
+
return modified.reduce((a, b) => a + b, 0);
|
|
236
|
+
}
|
|
237
|
+
async deleteDependenciesByTarget({ host, repository }, options) {
|
|
238
|
+
const offset = getOffset(options);
|
|
239
|
+
const dependencies = this.client("dependencies").select("run_id", "extractionTimestamp").distinct("host", "repository").where("host", host).andWhere("repository", repository);
|
|
240
|
+
const toBeDeletedIDs = this.client(dependencies).select("run_id").orderBy("extractionTimestamp", "DESC").offset(offset);
|
|
241
|
+
return this.client("dependencies").delete().whereIn("run_id", [toBeDeletedIDs]);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
function getOffset(options) {
|
|
245
|
+
let offset = 0;
|
|
246
|
+
if (is__default.default.nullOrUndefined(options?.keepLatest) || is__default.default.boolean(options?.keepLatest)) {
|
|
247
|
+
offset = options?.keepLatest ? 1 : 0;
|
|
248
|
+
} else {
|
|
249
|
+
offset = options.keepLatest;
|
|
250
|
+
}
|
|
251
|
+
return offset;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
exports.DatabaseHandler = DatabaseHandler;
|
|
255
|
+
//# sourceMappingURL=databaseHandler.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"databaseHandler.cjs.js","sources":["../../src/service/databaseHandler.ts"],"sourcesContent":["import {\n LoggerService,\n resolvePackagePath,\n} from '@backstage/backend-plugin-api';\nimport { Knex } from 'knex';\nimport {\n AddReportParameters,\n DatabaseCreationParameters,\n DeleteOptions,\n DependenciesFilter,\n DependencyRow,\n DependencyValueFilters,\n DependencyValueFiltersKey,\n DependencyValueFiltersKeys,\n DependencyValues,\n Pagination,\n PaginationOptions,\n ReportQueryParameters,\n ReportsRow,\n ReportTargetQuery,\n} from './types';\nimport is from '@sindresorhus/is';\nimport { RepositoryReportResponse } from '@secustor/backstage-plugin-renovate-common';\n\nconst migrationsDir = resolvePackagePath(\n '@secustor/backstage-plugin-renovate-backend',\n 'migrations',\n);\n\nexport class DatabaseHandler {\n static async create(\n options: DatabaseCreationParameters,\n ): Promise<DatabaseHandler> {\n const { database, logger } = options;\n const client = await database.getClient();\n\n if (!database.migrations?.skip) {\n await client.migrate.latest({\n directory: migrationsDir,\n });\n }\n\n return new DatabaseHandler(client, logger);\n }\n\n private constructor(\n private client: Knex,\n private logger: LoggerService,\n ) {}\n\n async addReport(options: AddReportParameters): Promise<void> {\n const { runID, taskID, report, target } = options;\n const logger = options.logger ?? this.logger;\n\n const timestamp = new Date();\n\n const inserts: ReportsRow[] = [];\n for (const [repository, value] of Object.entries(report.repositories)) {\n inserts.push({\n run_id: runID,\n task_id: taskID,\n timestamp,\n host: target.host,\n repository,\n report: value,\n });\n }\n // this.client.batchInsert<ReportsRow>('reports', inserts);\n await this.client('reports')\n .insert(inserts)\n .catch(reason => logger.error('Failed insert data', reason));\n\n await this.updateDependencies(timestamp, options);\n }\n\n async getReports(\n query?: ReportQueryParameters,\n ): Promise<RepositoryReportResponse> {\n const builder = this.client.select<ReportsRow[]>();\n if (query) {\n builder.where(query);\n }\n const rows = await builder.from<ReportsRow[]>('reports');\n return rows.map(row => {\n return {\n runID: row.run_id,\n taskID: row.task_id,\n timestamp: row.timestamp.toISOString(),\n host: row.host,\n repository: row.repository,\n // if the JSON field has not been auto-parsed do it manually\n report: is.string(row.report) ? JSON.parse(row.report) : row.report,\n };\n });\n }\n\n async getTargets(\n table: 'reports' | 'dependencies' = 'reports',\n ): Promise<ReportTargetQuery[]> {\n return this.client\n .select()\n .distinct<ReportsRow[]>('host', 'repository')\n .from(table);\n }\n\n async deleteReportsByTarget(\n { host, repository }: ReportTargetQuery,\n options?: DeleteOptions,\n ): Promise<number> {\n const offset = getOffset(options);\n\n const toBeDeletedIDs = this.client('reports')\n .select('run_id')\n .where('host', host)\n .andWhere('repository', repository)\n .orderBy('timestamp', 'DESC')\n .offset(offset);\n\n return this.client('reports').delete().whereIn('run_id', [toBeDeletedIDs]);\n }\n\n async deleteReports(options?: DeleteOptions): Promise<number> {\n const targets = await this.getTargets();\n const modified = await Promise.all(\n targets.map(target => this.deleteReportsByTarget(target, options)),\n );\n // sum up\n return modified.reduce((a, b) => a + b, 0);\n }\n\n private async updateDependencies(\n timestamp: Date,\n options: AddReportParameters,\n ): Promise<void> {\n const { runID, report, target } = options;\n const dependencies: DependencyRow[] = [];\n for (const [repository, repositoryContent] of Object.entries(\n report.repositories,\n )) {\n for (const [manager, packageFiles] of Object.entries(\n repositoryContent.packageFiles,\n )) {\n for (const packageFile of packageFiles) {\n const packageFilePath = packageFile.packageFile;\n for (const dependency of packageFile.deps) {\n const {\n packageName,\n depName,\n depType,\n datasource,\n currentValue,\n currentVersion,\n skipReason,\n registryUrl,\n sourceUrl,\n currentVersionTimestamp,\n } = dependency;\n\n // TODO remove this once Renovate enforces packageName\n const massagedDepName = depName ?? packageName;\n if (!massagedDepName) {\n continue;\n }\n\n dependencies.push({\n run_id: runID,\n host: target.host,\n extractionTimestamp: timestamp,\n repository,\n manager,\n datasource:\n datasource ?? packageFile.datasource ?? 'no-datasource',\n depName: massagedDepName,\n packageName,\n packageFile: packageFilePath,\n depType,\n currentValue,\n currentVersion,\n currentVersionTimestamp,\n skipReason,\n registryUrl,\n sourceUrl,\n });\n }\n }\n }\n }\n await this.client('dependencies').insert(dependencies);\n }\n\n async getDependencies(\n filters: DependenciesFilter,\n pagination?: PaginationOptions,\n ): Promise<Pagination<DependencyRow[]>> {\n const page = pagination?.page ?? 0;\n const pageSize = pagination?.pageSize ?? 500;\n const builder = this.client('dependencies').select<DependencyRow[]>();\n\n this.applyDependencyFilters(builder, filters);\n\n const total = await this.getDependenciesCount(filters);\n\n const offset = page * pageSize;\n return {\n result: await builder.offset(offset).limit(pageSize),\n total,\n page,\n pageSize,\n pageCount: Math.ceil(total / pageSize),\n };\n }\n\n async getDependenciesCount(filters: DependenciesFilter): Promise<number> {\n const builder = this.client('dependencies').count({ count: '*' });\n\n this.applyDependencyFilters(builder, filters);\n\n const count = await builder.first().then(result => result?.count);\n if (is.string(count)) {\n return Number.parseInt(count, 10);\n }\n return count ?? 0;\n }\n\n private applyDependencyFilters(\n builder: Knex.QueryBuilder,\n filters: DependenciesFilter,\n ): void {\n if (filters.host) {\n builder.whereIn('host', filters.host);\n }\n if (filters.repository) {\n builder.whereIn('repository', filters.repository);\n }\n if (filters.manager) {\n builder.whereIn('manager', filters.manager);\n }\n if (filters.datasource) {\n builder.whereIn('datasource', filters.datasource);\n }\n if (filters.depName) {\n builder.whereIn('depName', filters.depName);\n }\n if (filters.depType) {\n builder.whereIn('depType', filters.depType);\n }\n\n if (filters.latestOnly) {\n const runIDs = this.client('dependencies')\n .select('d.run_id')\n .from('dependencies as d')\n .join(\n this.client('dependencies')\n .select('host', 'repository')\n .max('extractionTimestamp as max_timestamp')\n .groupBy('host', 'repository')\n .as('max_d'),\n // eslint-disable-next-line func-names\n function () {\n this.on('d.host', '=', 'max_d.host')\n .andOn('d.repository', '=', 'max_d.repository')\n .andOn('d.extractionTimestamp', '=', 'max_d.max_timestamp');\n },\n )\n .distinct();\n\n builder.whereIn('run_id', runIDs);\n }\n }\n\n /**\n * Gets the available values for the dependencies stored in the database.\n * If filters are supplied, OTHER values are filtered accordingly, if a filter is supplied, all values are returned\n * @param filters\n */\n async getDependenciesValues(\n filters?: DependencyValueFilters,\n ): Promise<DependencyValues> {\n const baseBuilder = this.client<DependencyRow, DependencyValueFilters>(\n 'dependencies',\n );\n const limitedValuesBuilder = baseBuilder.clone();\n\n const allValuesKeys: DependencyValueFiltersKey[] = [];\n const limitedValuesKeys: DependencyValueFiltersKey[] = [];\n for (const filterKey of DependencyValueFiltersKeys) {\n const suppliedFilter = filters?.[filterKey];\n // if no filter is supplied, return all values\n if (suppliedFilter) {\n limitedValuesBuilder.whereIn(filterKey, suppliedFilter);\n limitedValuesKeys.push(filterKey);\n continue;\n }\n\n allValuesKeys.push(filterKey);\n }\n\n const result: DependencyValues = {\n datasource: [],\n manager: [],\n depType: [],\n depName: [],\n host: [],\n packageFile: [],\n repository: [],\n };\n\n const allValues = allValuesKeys.map(\n async (filterKey: DependencyValueFiltersKey) => {\n // get all unique values for the column and do not return as object but list\n const values = await limitedValuesBuilder\n .clone()\n .select(filterKey)\n .distinct()\n .pluck(filterKey);\n result[filterKey] = values.filter(is.string);\n },\n );\n const limitedValues = limitedValuesKeys.map(async filterKey => {\n const values = await baseBuilder\n .clone()\n .select(filterKey)\n .distinct()\n .pluck(filterKey);\n\n result[filterKey] = values.filter(is.string);\n });\n await Promise.all([...allValues, ...limitedValues]);\n return result;\n }\n\n async deleteDependencies(options: DeleteOptions): Promise<number> {\n const targets = await this.getTargets('dependencies');\n const modified = await Promise.all(\n targets.map(target => this.deleteDependenciesByTarget(target, options)),\n );\n // sum up\n return modified.reduce((a, b) => a + b, 0);\n }\n\n async deleteDependenciesByTarget(\n { host, repository }: ReportTargetQuery,\n options?: DeleteOptions,\n ): Promise<number> {\n const offset = getOffset(options);\n\n const dependencies = this.client('dependencies')\n .select('run_id', 'extractionTimestamp')\n .distinct('host', 'repository')\n .where('host', host)\n .andWhere('repository', repository);\n\n const toBeDeletedIDs = this.client(dependencies)\n .select('run_id')\n .orderBy('extractionTimestamp', 'DESC')\n .offset(offset);\n\n return this.client('dependencies')\n .delete()\n .whereIn('run_id', [toBeDeletedIDs]);\n }\n}\n\nfunction getOffset(options?: DeleteOptions): number {\n let offset = 0;\n if (\n is.nullOrUndefined(options?.keepLatest) ||\n is.boolean(options?.keepLatest)\n ) {\n offset = options?.keepLatest ? 1 : 0;\n } else {\n offset = options.keepLatest;\n }\n return offset;\n}\n"],"names":["resolvePackagePath","is","DependencyValueFiltersKeys"],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var catalogClient = require('@backstage/catalog-client');
|
|
4
|
+
var catalogModel = require('@backstage/catalog-model');
|
|
5
|
+
var index = require('../config/index.cjs.js');
|
|
6
|
+
|
|
7
|
+
async function scheduleJobSync(renovateRunner, routerOptions) {
|
|
8
|
+
const { scheduler, auth, rootConfig, discovery } = routerOptions;
|
|
9
|
+
const client = new catalogClient.CatalogClient({ discoveryApi: discovery });
|
|
10
|
+
const pluginConfig = index.getPluginConfig(rootConfig);
|
|
11
|
+
const schedule = index.getScheduleDefinition(pluginConfig, "renovation");
|
|
12
|
+
if (!schedule.enabled) {
|
|
13
|
+
return Promise.resolve();
|
|
14
|
+
}
|
|
15
|
+
return scheduler.scheduleTask({
|
|
16
|
+
id: `renovate_scheduled_runs`,
|
|
17
|
+
...schedule,
|
|
18
|
+
fn: async () => {
|
|
19
|
+
const { token } = await auth.getPluginRequestToken({
|
|
20
|
+
onBehalfOf: await auth.getOwnServiceCredentials(),
|
|
21
|
+
targetPluginId: "catalog"
|
|
22
|
+
});
|
|
23
|
+
const { items: entities } = await client.getEntities(
|
|
24
|
+
{
|
|
25
|
+
filter: {
|
|
26
|
+
[`metadata.annotations.${index.RENOVATE_ANNOTATION_KEEP_UPDATED}`]: catalogClient.CATALOG_FILTER_EXISTS,
|
|
27
|
+
[`metadata.annotations.${catalogModel.ANNOTATION_SOURCE_LOCATION}`]: catalogClient.CATALOG_FILTER_EXISTS
|
|
28
|
+
},
|
|
29
|
+
fields: [
|
|
30
|
+
"kind",
|
|
31
|
+
"metadata.annotations",
|
|
32
|
+
"metadata.name",
|
|
33
|
+
"metadata.namespace",
|
|
34
|
+
"metadata.title"
|
|
35
|
+
]
|
|
36
|
+
},
|
|
37
|
+
{ token }
|
|
38
|
+
);
|
|
39
|
+
await renovateRunner.addToQueue(...entities);
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
exports.scheduleJobSync = scheduleJobSync;
|
|
45
|
+
//# sourceMappingURL=jobSync.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jobSync.cjs.js","sources":["../../src/service/jobSync.ts"],"sourcesContent":["import {\n CATALOG_FILTER_EXISTS,\n CatalogClient,\n} from '@backstage/catalog-client';\nimport { ANNOTATION_SOURCE_LOCATION } from '@backstage/catalog-model';\nimport { RouterOptions } from './types';\nimport {\n getPluginConfig,\n getScheduleDefinition,\n RENOVATE_ANNOTATION_KEEP_UPDATED,\n} from '../config';\nimport { RenovateRunner } from '../wrapper';\n\nexport async function scheduleJobSync(\n renovateRunner: RenovateRunner,\n routerOptions: RouterOptions,\n): Promise<void> {\n const { scheduler, auth, rootConfig, discovery } = routerOptions;\n\n const client = new CatalogClient({ discoveryApi: discovery });\n\n const pluginConfig = getPluginConfig(rootConfig);\n const schedule = getScheduleDefinition(pluginConfig, 'renovation');\n if (!schedule.enabled) {\n return Promise.resolve();\n }\n\n return scheduler.scheduleTask({\n id: `renovate_scheduled_runs`,\n ...schedule,\n\n fn: async () => {\n const { token } = await auth.getPluginRequestToken({\n onBehalfOf: await auth.getOwnServiceCredentials(),\n targetPluginId: 'catalog',\n });\n const { items: entities } = await client.getEntities(\n {\n filter: {\n [`metadata.annotations.${RENOVATE_ANNOTATION_KEEP_UPDATED}`]:\n CATALOG_FILTER_EXISTS,\n [`metadata.annotations.${ANNOTATION_SOURCE_LOCATION}`]:\n CATALOG_FILTER_EXISTS,\n },\n fields: [\n 'kind',\n 'metadata.annotations',\n 'metadata.name',\n 'metadata.namespace',\n 'metadata.title',\n ],\n },\n { token },\n );\n\n await renovateRunner.addToQueue(...entities);\n },\n });\n}\n"],"names":["CatalogClient","getPluginConfig","getScheduleDefinition","RENOVATE_ANNOTATION_KEEP_UPDATED","CATALOG_FILTER_EXISTS","ANNOTATION_SOURCE_LOCATION"],"mappings":";;;;;;AAasB,eAAA,eAAA,CACpB,gBACA,aACe,EAAA;AACf,EAAA,MAAM,EAAE,SAAA,EAAW,IAAM,EAAA,UAAA,EAAY,WAAc,GAAA,aAAA,CAAA;AAEnD,EAAA,MAAM,SAAS,IAAIA,2BAAA,CAAc,EAAE,YAAA,EAAc,WAAW,CAAA,CAAA;AAE5D,EAAM,MAAA,YAAA,GAAeC,sBAAgB,UAAU,CAAA,CAAA;AAC/C,EAAM,MAAA,QAAA,GAAWC,2BAAsB,CAAA,YAAA,EAAc,YAAY,CAAA,CAAA;AACjE,EAAI,IAAA,CAAC,SAAS,OAAS,EAAA;AACrB,IAAA,OAAO,QAAQ,OAAQ,EAAA,CAAA;AAAA,GACzB;AAEA,EAAA,OAAO,UAAU,YAAa,CAAA;AAAA,IAC5B,EAAI,EAAA,CAAA,uBAAA,CAAA;AAAA,IACJ,GAAG,QAAA;AAAA,IAEH,IAAI,YAAY;AACd,MAAA,MAAM,EAAE,KAAA,EAAU,GAAA,MAAM,KAAK,qBAAsB,CAAA;AAAA,QACjD,UAAA,EAAY,MAAM,IAAA,CAAK,wBAAyB,EAAA;AAAA,QAChD,cAAgB,EAAA,SAAA;AAAA,OACjB,CAAA,CAAA;AACD,MAAA,MAAM,EAAE,KAAA,EAAO,QAAS,EAAA,GAAI,MAAM,MAAO,CAAA,WAAA;AAAA,QACvC;AAAA,UACE,MAAQ,EAAA;AAAA,YACN,CAAC,CAAA,qBAAA,EAAwBC,sCAAgC,CAAA,CAAE,GACzDC,mCAAA;AAAA,YACF,CAAC,CAAA,qBAAA,EAAwBC,uCAA0B,CAAA,CAAE,GACnDD,mCAAA;AAAA,WACJ;AAAA,UACA,MAAQ,EAAA;AAAA,YACN,MAAA;AAAA,YACA,sBAAA;AAAA,YACA,eAAA;AAAA,YACA,oBAAA;AAAA,YACA,gBAAA;AAAA,WACF;AAAA,SACF;AAAA,QACA,EAAE,KAAM,EAAA;AAAA,OACV,CAAA;AAEA,MAAM,MAAA,cAAA,CAAe,UAAW,CAAA,GAAG,QAAQ,CAAA,CAAA;AAAA,KAC7C;AAAA,GACD,CAAA,CAAA;AACH;;;;"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var rootHttpRouter = require('@backstage/backend-defaults/rootHttpRouter');
|
|
4
|
+
var express = require('express');
|
|
5
|
+
var openapi_generated = require('../schema/openapi.generated.cjs.js');
|
|
6
|
+
var schema = require('./schema.cjs.js');
|
|
7
|
+
var backstagePluginRenovateCommon = require('@secustor/backstage-plugin-renovate-common');
|
|
8
|
+
var catalogClient = require('@backstage/catalog-client');
|
|
9
|
+
var is = require('@sindresorhus/is');
|
|
10
|
+
var index = require('../wrapper/platforms/index.cjs.js');
|
|
11
|
+
|
|
12
|
+
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
|
|
13
|
+
|
|
14
|
+
var express__default = /*#__PURE__*/_interopDefaultCompat(express);
|
|
15
|
+
var is__default = /*#__PURE__*/_interopDefaultCompat(is);
|
|
16
|
+
|
|
17
|
+
async function createRouter(runner, options) {
|
|
18
|
+
const {
|
|
19
|
+
auth,
|
|
20
|
+
rootConfig: config,
|
|
21
|
+
logger,
|
|
22
|
+
databaseHandler,
|
|
23
|
+
discovery
|
|
24
|
+
} = options;
|
|
25
|
+
const middlewareFactory = rootHttpRouter.MiddlewareFactory.create({ logger, config });
|
|
26
|
+
const client = new catalogClient.CatalogClient({ discoveryApi: discovery });
|
|
27
|
+
const router = await openapi_generated.createOpenApiRouter();
|
|
28
|
+
router.use(express__default.default.json());
|
|
29
|
+
router.get("/health", (_, response) => {
|
|
30
|
+
logger.debug("healthcheck request");
|
|
31
|
+
response.json("ok");
|
|
32
|
+
});
|
|
33
|
+
router.get("/reports", async (_request, response) => {
|
|
34
|
+
const reports = await databaseHandler.getReports();
|
|
35
|
+
response.status(200).json(reports);
|
|
36
|
+
});
|
|
37
|
+
router.delete("/reports", async (request, response) => {
|
|
38
|
+
const modified = await databaseHandler.deleteReports({
|
|
39
|
+
keepLatest: request.query.keepLatest
|
|
40
|
+
});
|
|
41
|
+
response.status(200).json({ modified });
|
|
42
|
+
});
|
|
43
|
+
router.get("/reports/:host", async (request, response) => {
|
|
44
|
+
const reports = await databaseHandler.getReports({
|
|
45
|
+
...request.params
|
|
46
|
+
});
|
|
47
|
+
response.status(200).json(reports);
|
|
48
|
+
});
|
|
49
|
+
router.delete("/reports/:host", async (request, response) => {
|
|
50
|
+
const modified = await databaseHandler.deleteReportsByTarget(
|
|
51
|
+
request.params,
|
|
52
|
+
{ keepLatest: request.query.keepLatest }
|
|
53
|
+
);
|
|
54
|
+
response.status(200).json({ modified });
|
|
55
|
+
});
|
|
56
|
+
router.get("/reports/:host/:repository", async (request, response) => {
|
|
57
|
+
const reports = await databaseHandler.getReports({
|
|
58
|
+
...request.params
|
|
59
|
+
});
|
|
60
|
+
response.status(200).json(reports);
|
|
61
|
+
});
|
|
62
|
+
router.delete("/reports/:host/:repository", async (request, response) => {
|
|
63
|
+
const modified = await databaseHandler.deleteReportsByTarget(
|
|
64
|
+
request.params,
|
|
65
|
+
{ keepLatest: request.query.keepLatest }
|
|
66
|
+
);
|
|
67
|
+
response.status(200).json({ modified });
|
|
68
|
+
});
|
|
69
|
+
router.get("/dependencies", async (request, response) => {
|
|
70
|
+
const filter = request.query;
|
|
71
|
+
const { result, total, pageCount, page, pageSize } = await databaseHandler.getDependencies(filter, filter);
|
|
72
|
+
const massaged = result.map((dep) => {
|
|
73
|
+
return {
|
|
74
|
+
...dep,
|
|
75
|
+
id: dep.id,
|
|
76
|
+
runID: dep.run_id,
|
|
77
|
+
extractionTimestamp: dep.extractionTimestamp?.toISOString(),
|
|
78
|
+
currentVersionTimestamp: dep.currentVersionTimestamp?.toISOString(),
|
|
79
|
+
packageFileUrl: index.getFileUrl(dep) ?? void 0
|
|
80
|
+
};
|
|
81
|
+
});
|
|
82
|
+
let availableValues;
|
|
83
|
+
if (request.query.availableValues) {
|
|
84
|
+
availableValues = await databaseHandler.getDependenciesValues(filter);
|
|
85
|
+
}
|
|
86
|
+
response.setHeader("X-Total-Count", total);
|
|
87
|
+
response.setHeader("X-Page-Count", pageCount);
|
|
88
|
+
response.setHeader("X-Page", page);
|
|
89
|
+
response.setHeader("X-Page-Size", pageSize);
|
|
90
|
+
response.json({
|
|
91
|
+
dependencies: massaged,
|
|
92
|
+
availableValues
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
router.post("/runs", async (request, response) => {
|
|
96
|
+
const body = schema.runRequestBody.safeParse(request.body);
|
|
97
|
+
if (!body.success) {
|
|
98
|
+
response.status(400).json({ error: body.error.toString() });
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
let target = body.data.target;
|
|
102
|
+
if (is__default.default.string(target) && backstagePluginRenovateCommon.isEntityRef(target)) {
|
|
103
|
+
const { token } = await auth.getPluginRequestToken({
|
|
104
|
+
onBehalfOf: await auth.getOwnServiceCredentials(),
|
|
105
|
+
targetPluginId: "catalog"
|
|
106
|
+
});
|
|
107
|
+
const result2 = await client.getEntityByRef(target, { token });
|
|
108
|
+
if (result2) {
|
|
109
|
+
target = result2;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
const targetRepo = backstagePluginRenovateCommon.getTargetRepo(target);
|
|
113
|
+
const id = backstagePluginRenovateCommon.getTaskID(targetRepo);
|
|
114
|
+
const result = await runner.runNext(targetRepo);
|
|
115
|
+
if (result.status === "already-running") {
|
|
116
|
+
logger.debug("Task already running", { taskID: id });
|
|
117
|
+
response.status(423).json({ error: "Task is already running" });
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
response.status(202).json({ taskID: id });
|
|
121
|
+
});
|
|
122
|
+
router.use(middlewareFactory.error());
|
|
123
|
+
return router;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
exports.createRouter = createRouter;
|
|
127
|
+
//# sourceMappingURL=router.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"router.cjs.js","sources":["../../src/service/router.ts"],"sourcesContent":["import { MiddlewareFactory } from '@backstage/backend-defaults/rootHttpRouter';\nimport express from 'express';\nimport { createOpenApiRouter } from '../schema/openapi.generated';\nimport { runRequestBody } from './schema';\nimport { RouterOptions } from './types';\nimport {\n getTargetRepo,\n getTaskID,\n isEntityRef,\n TargetRepo,\n} from '@secustor/backstage-plugin-renovate-common';\nimport { RenovateRunner } from '../wrapper';\nimport { CatalogClient } from '@backstage/catalog-client';\nimport type { Entity } from '@backstage/catalog-model';\nimport is from '@sindresorhus/is';\nimport { getFileUrl } from '../wrapper/platforms';\n\nexport async function createRouter(\n runner: RenovateRunner,\n options: RouterOptions,\n): Promise<express.Router> {\n const {\n auth,\n rootConfig: config,\n logger,\n databaseHandler,\n discovery,\n } = options;\n\n const middlewareFactory = MiddlewareFactory.create({ logger, config });\n\n const client = new CatalogClient({ discoveryApi: discovery });\n\n const router = await createOpenApiRouter();\n router.use(express.json());\n\n router.get('/health', (_, response) => {\n logger.debug('healthcheck request');\n response.json('ok');\n });\n\n router.get('/reports', async (_request, response) => {\n const reports = await databaseHandler.getReports();\n response.status(200).json(reports);\n });\n\n router.delete('/reports', async (request, response) => {\n const modified = await databaseHandler.deleteReports({\n keepLatest: request.query.keepLatest,\n });\n response.status(200).json({ modified });\n });\n\n router.get('/reports/:host', async (request, response) => {\n const reports = await databaseHandler.getReports({\n ...request.params,\n });\n response.status(200).json(reports);\n });\n\n router.delete('/reports/:host', async (request, response) => {\n const modified = await databaseHandler.deleteReportsByTarget(\n request.params,\n { keepLatest: request.query.keepLatest },\n );\n response.status(200).json({ modified });\n });\n\n router.get('/reports/:host/:repository', async (request, response) => {\n const reports = await databaseHandler.getReports({\n ...request.params,\n });\n response.status(200).json(reports);\n });\n\n router.delete('/reports/:host/:repository', async (request, response) => {\n const modified = await databaseHandler.deleteReportsByTarget(\n request.params,\n { keepLatest: request.query.keepLatest },\n );\n response.status(200).json({ modified });\n });\n\n router.get('/dependencies', async (request, response) => {\n const filter = request.query;\n const { result, total, pageCount, page, pageSize } =\n await databaseHandler.getDependencies(filter, filter);\n\n const massaged = result.map(dep => {\n return {\n ...dep,\n id: dep.id!,\n runID: dep.run_id,\n extractionTimestamp: dep.extractionTimestamp?.toISOString(),\n currentVersionTimestamp: dep.currentVersionTimestamp?.toISOString(),\n packageFileUrl: getFileUrl(dep) ?? undefined,\n };\n });\n\n let availableValues: Record<string, string[]> | undefined;\n if (request.query.availableValues) {\n availableValues = await databaseHandler.getDependenciesValues(filter);\n }\n\n response.setHeader('X-Total-Count', total);\n response.setHeader('X-Page-Count', pageCount);\n response.setHeader('X-Page', page);\n response.setHeader('X-Page-Size', pageSize);\n // openapi gen expects an empty array\n response.json({\n dependencies: massaged,\n availableValues,\n });\n });\n\n router.post('/runs', async (request, response) => {\n const body = runRequestBody.safeParse(request.body);\n if (!body.success) {\n response.status(400).json({ error: body.error.toString() });\n return;\n }\n let target: string | TargetRepo | Entity = body.data.target;\n\n // check if we got an entity ref and if yes get the entity\n if (is.string(target) && isEntityRef(target)) {\n const { token } = await auth.getPluginRequestToken({\n onBehalfOf: await auth.getOwnServiceCredentials(),\n targetPluginId: 'catalog',\n });\n const result = await client.getEntityByRef(target, { token });\n if (result) {\n target = result;\n }\n }\n\n // trigger Renovate run\n const targetRepo = getTargetRepo(target);\n const id = getTaskID(targetRepo);\n const result = await runner.runNext(targetRepo);\n if (result.status === 'already-running') {\n logger.debug('Task already running', { taskID: id });\n response.status(423).json({ error: 'Task is already running' });\n return;\n }\n response.status(202).json({ taskID: id });\n });\n router.use(middlewareFactory.error());\n return router;\n}\n"],"names":["MiddlewareFactory","CatalogClient","createOpenApiRouter","express","getFileUrl","runRequestBody","is","isEntityRef","result","getTargetRepo","getTaskID"],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var zod = require('zod');
|
|
4
|
+
var backstagePluginRenovateCommon = require('@secustor/backstage-plugin-renovate-common');
|
|
5
|
+
|
|
6
|
+
const target = zod.z.string().or(backstagePluginRenovateCommon.targetRepo);
|
|
7
|
+
const runRequestBody = zod.z.object({
|
|
8
|
+
target
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
exports.runRequestBody = runRequestBody;
|
|
12
|
+
exports.target = target;
|
|
13
|
+
//# sourceMappingURL=schema.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.cjs.js","sources":["../../src/service/schema.ts"],"sourcesContent":["import { z } from 'zod';\nimport { targetRepo } from '@secustor/backstage-plugin-renovate-common';\n\nexport const target = z.string().or(targetRepo);\n\nexport const runRequestBody = z.object({\n target,\n});\n"],"names":["z","targetRepo"],"mappings":";;;;;AAGO,MAAM,MAAS,GAAAA,KAAA,CAAE,MAAO,EAAA,CAAE,GAAGC,wCAAU,EAAA;AAEjC,MAAA,cAAA,GAAiBD,MAAE,MAAO,CAAA;AAAA,EACrC,MAAA;AACF,CAAC;;;;;"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const DependencyValueFiltersKeys = [
|
|
4
|
+
"datasource",
|
|
5
|
+
"depName",
|
|
6
|
+
"depType",
|
|
7
|
+
"host",
|
|
8
|
+
"manager",
|
|
9
|
+
"packageFile",
|
|
10
|
+
"repository"
|
|
11
|
+
];
|
|
12
|
+
|
|
13
|
+
exports.DependencyValueFiltersKeys = DependencyValueFiltersKeys;
|
|
14
|
+
//# sourceMappingURL=types.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.cjs.js","sources":["../../src/service/types.ts"],"sourcesContent":["import { Config } from '@backstage/config';\nimport {\n AuthService,\n DatabaseService,\n DiscoveryService,\n LoggerService,\n SchedulerService,\n} from '@backstage/backend-plugin-api';\nimport {\n RenovateReport,\n RenovateWrapper,\n RepositoryReport,\n TargetRepo,\n} from '@secustor/backstage-plugin-renovate-common';\nimport { DatabaseHandler } from './databaseHandler';\nimport {\n QueueFactory,\n RunOptions,\n} from '@secustor/backstage-plugin-renovate-node';\n\nexport interface RouterOptions {\n auth: AuthService;\n rootConfig: Config;\n logger: LoggerService;\n databaseHandler: DatabaseHandler;\n runtimes: Map<string, RenovateWrapper>;\n queueFactories: Map<string, QueueFactory<RunOptions>>;\n scheduler: SchedulerService;\n discovery: DiscoveryService;\n}\n\nexport interface ReportsRow {\n run_id: string;\n task_id: string;\n timestamp: Date;\n host: string;\n repository: string;\n report: RepositoryReport;\n}\n\nexport interface DependencyRow {\n id?: string;\n run_id: string;\n host: string;\n repository: string;\n extractionTimestamp: Date;\n manager: string;\n datasource: string;\n packageFile: string;\n depName: string;\n packageName?: string;\n depType?: string;\n currentValue?: string;\n currentVersion?: string;\n currentVersionTimestamp?: Date;\n skipReason?: string;\n registryUrl?: string;\n sourceUrl?: string;\n currentVersionReleased?: Date;\n}\n\nexport interface ReportTargetQuery {\n host?: string;\n repository?: string;\n}\n\nexport interface DeleteOptions {\n /**\n * If falsely (0, false or undefined) delete all reports\n * If keepLatest is a number keep this number of records.\n * In case it is boolean true, the behaviour is identical to 1\n */\n keepLatest?: boolean | number;\n}\n\nexport interface DatabaseCreationParameters {\n database: DatabaseService;\n logger: LoggerService;\n}\n\nexport interface ReportQueryParameters {\n host?: string;\n repository?: string;\n}\n\nexport interface AddReportParameters {\n runID: string;\n taskID: string;\n report: RenovateReport;\n target: TargetRepo;\n logger?: LoggerService;\n}\n\nexport interface DependenciesFilter extends DependencyValueFilters {\n latestOnly?: boolean;\n}\n\nexport const DependencyValueFiltersKeys = [\n 'datasource',\n 'depName',\n 'depType',\n 'host',\n 'manager',\n 'packageFile',\n 'repository',\n] as const;\nexport type DependencyValueFiltersKey =\n (typeof DependencyValueFiltersKeys)[number];\n\nexport type DependencyValueFilters = Record<\n DependencyValueFiltersKey,\n string[]\n>;\n\nexport type DependencyValues = Record<DependencyValueFiltersKey, string[]>;\n\nexport interface PaginationOptions {\n page: number;\n pageSize: number;\n}\n\nexport interface Pagination<T> {\n result: T;\n page: number;\n pageSize: number;\n pageCount: number;\n total: number;\n}\n"],"names":[],"mappings":";;AAiGO,MAAM,0BAA6B,GAAA;AAAA,EACxC,YAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,aAAA;AAAA,EACA,YAAA;AACF;;;;"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var integration = require('@backstage/integration');
|
|
4
|
+
|
|
5
|
+
async function getGithubToken(integrations, url) {
|
|
6
|
+
const cred = await integration.DefaultGithubCredentialsProvider.fromIntegrations(
|
|
7
|
+
integrations
|
|
8
|
+
).getCredentials({ url });
|
|
9
|
+
return cred.token;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
exports.getGithubToken = getGithubToken;
|
|
13
|
+
//# sourceMappingURL=github.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github.cjs.js","sources":["../../../src/wrapper/platforms/github.ts"],"sourcesContent":["import {\n DefaultGithubCredentialsProvider,\n ScmIntegrations,\n} from '@backstage/integration';\n\nexport async function getGithubToken(\n integrations: ScmIntegrations,\n url: string,\n): Promise<string | undefined> {\n const cred = await DefaultGithubCredentialsProvider.fromIntegrations(\n integrations,\n ).getCredentials({ url });\n return cred.token;\n}\n"],"names":["DefaultGithubCredentialsProvider"],"mappings":";;;;AAKsB,eAAA,cAAA,CACpB,cACA,GAC6B,EAAA;AAC7B,EAAM,MAAA,IAAA,GAAO,MAAMA,4CAAiC,CAAA,gBAAA;AAAA,IAClD,YAAA;AAAA,GACA,CAAA,cAAA,CAAe,EAAE,GAAA,EAAK,CAAA,CAAA;AACxB,EAAA,OAAO,IAAK,CAAA,KAAA,CAAA;AACd;;;;"}
|