You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
156 lines
6.0 KiB
156 lines
6.0 KiB
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.testRuleset = exports.updateOrCreateRelease = exports.updateRelease = exports.createRelease = exports.createRuleset = exports.deleteRuleset = exports.getRulesetId = exports.listAllRulesets = exports.listRulesets = exports.getRulesetContent = exports.listAllReleases = exports.listReleases = exports.getLatestRulesetName = void 0;
|
|
const api_1 = require("../api");
|
|
const apiv2_1 = require("../apiv2");
|
|
const logger_1 = require("../logger");
|
|
const utils = require("../utils");
|
|
const API_VERSION = "v1";
|
|
const apiClient = new apiv2_1.Client({ urlPrefix: api_1.rulesOrigin, apiVersion: API_VERSION });
|
|
function _handleErrorResponse(response) {
|
|
if (response.body && response.body.error) {
|
|
return utils.reject(response.body.error, { code: 2 });
|
|
}
|
|
logger_1.logger.debug("[rules] error:", response.status, response.body);
|
|
return utils.reject("Unexpected error encountered with rules.", {
|
|
code: 2,
|
|
});
|
|
}
|
|
async function getLatestRulesetName(projectId, service) {
|
|
const releases = await listAllReleases(projectId);
|
|
const prefix = `projects/${projectId}/releases/${service}`;
|
|
const release = releases.find((r) => r.name.startsWith(prefix));
|
|
if (!release) {
|
|
return null;
|
|
}
|
|
return release.rulesetName;
|
|
}
|
|
exports.getLatestRulesetName = getLatestRulesetName;
|
|
const MAX_RELEASES_PAGE_SIZE = 10;
|
|
async function listReleases(projectId, pageToken = "") {
|
|
const response = await apiClient.get(`/projects/${projectId}/releases`, {
|
|
queryParams: {
|
|
pageSize: MAX_RELEASES_PAGE_SIZE,
|
|
pageToken,
|
|
},
|
|
});
|
|
if (response.status === 200) {
|
|
return response.body;
|
|
}
|
|
return _handleErrorResponse(response);
|
|
}
|
|
exports.listReleases = listReleases;
|
|
async function listAllReleases(projectId) {
|
|
let pageToken;
|
|
let releases = [];
|
|
do {
|
|
const response = await listReleases(projectId, pageToken);
|
|
if (response.releases && response.releases.length > 0) {
|
|
releases = releases.concat(response.releases);
|
|
}
|
|
pageToken = response.nextPageToken;
|
|
} while (pageToken);
|
|
return releases.sort((a, b) => b.createTime.localeCompare(a.createTime));
|
|
}
|
|
exports.listAllReleases = listAllReleases;
|
|
async function getRulesetContent(name) {
|
|
const response = await apiClient.get(`/${name}`, {
|
|
skipLog: { resBody: true },
|
|
});
|
|
if (response.status === 200) {
|
|
const source = response.body.source;
|
|
return source.files;
|
|
}
|
|
return _handleErrorResponse(response);
|
|
}
|
|
exports.getRulesetContent = getRulesetContent;
|
|
const MAX_RULESET_PAGE_SIZE = 100;
|
|
async function listRulesets(projectId, pageToken = "") {
|
|
const response = await apiClient.get(`/projects/${projectId}/rulesets`, {
|
|
queryParams: {
|
|
pageSize: MAX_RULESET_PAGE_SIZE,
|
|
pageToken,
|
|
},
|
|
skipLog: { resBody: true },
|
|
});
|
|
if (response.status === 200) {
|
|
return response.body;
|
|
}
|
|
return _handleErrorResponse(response);
|
|
}
|
|
exports.listRulesets = listRulesets;
|
|
async function listAllRulesets(projectId) {
|
|
let pageToken;
|
|
let rulesets = [];
|
|
do {
|
|
const response = await listRulesets(projectId, pageToken);
|
|
if (response.rulesets) {
|
|
rulesets = rulesets.concat(response.rulesets);
|
|
}
|
|
pageToken = response.nextPageToken;
|
|
} while (pageToken);
|
|
return rulesets.sort((a, b) => b.createTime.localeCompare(a.createTime));
|
|
}
|
|
exports.listAllRulesets = listAllRulesets;
|
|
function getRulesetId(ruleset) {
|
|
return ruleset.name.split("/").pop();
|
|
}
|
|
exports.getRulesetId = getRulesetId;
|
|
async function deleteRuleset(projectId, id) {
|
|
const response = await apiClient.delete(`/projects/${projectId}/rulesets/${id}`);
|
|
if (response.status === 200) {
|
|
return;
|
|
}
|
|
return _handleErrorResponse(response);
|
|
}
|
|
exports.deleteRuleset = deleteRuleset;
|
|
async function createRuleset(projectId, files) {
|
|
const payload = { source: { files } };
|
|
const response = await apiClient.post(`/projects/${projectId}/rulesets`, payload, { skipLog: { body: true } });
|
|
if (response.status === 200) {
|
|
logger_1.logger.debug("[rules] created ruleset", response.body.name);
|
|
return response.body.name;
|
|
}
|
|
return _handleErrorResponse(response);
|
|
}
|
|
exports.createRuleset = createRuleset;
|
|
async function createRelease(projectId, rulesetName, releaseName) {
|
|
const payload = {
|
|
name: `projects/${projectId}/releases/${releaseName}`,
|
|
rulesetName,
|
|
};
|
|
const response = await apiClient.post(`/projects/${projectId}/releases`, payload);
|
|
if (response.status === 200) {
|
|
logger_1.logger.debug("[rules] created release", response.body.name);
|
|
return response.body.name;
|
|
}
|
|
return _handleErrorResponse(response);
|
|
}
|
|
exports.createRelease = createRelease;
|
|
async function updateRelease(projectId, rulesetName, releaseName) {
|
|
const payload = {
|
|
release: {
|
|
name: `projects/${projectId}/releases/${releaseName}`,
|
|
rulesetName,
|
|
},
|
|
};
|
|
const response = await apiClient.patch(`/projects/${projectId}/releases/${releaseName}`, payload);
|
|
if (response.status === 200) {
|
|
logger_1.logger.debug("[rules] updated release", response.body.name);
|
|
return response.body.name;
|
|
}
|
|
return _handleErrorResponse(response);
|
|
}
|
|
exports.updateRelease = updateRelease;
|
|
async function updateOrCreateRelease(projectId, rulesetName, releaseName) {
|
|
logger_1.logger.debug("[rules] releasing", releaseName, "with ruleset", rulesetName);
|
|
return updateRelease(projectId, rulesetName, releaseName).catch(() => {
|
|
logger_1.logger.debug("[rules] ruleset update failed, attempting to create instead");
|
|
return createRelease(projectId, rulesetName, releaseName);
|
|
});
|
|
}
|
|
exports.updateOrCreateRelease = updateOrCreateRelease;
|
|
function testRuleset(projectId, files) {
|
|
return apiClient.post(`/projects/${encodeURIComponent(projectId)}:test`, { source: { files } }, { skipLog: { body: true } });
|
|
}
|
|
exports.testRuleset = testRuleset;
|