Добавлен вспомогательный скрипт для принудительной синхронизации суммирующих задач
This commit is contained in:
parent
afad88c057
commit
9d476a43fa
1 changed files with 135 additions and 0 deletions
135
tools/sync-root-issues.mjs
Normal file
135
tools/sync-root-issues.mjs
Normal file
|
|
@ -0,0 +1,135 @@
|
||||||
|
import { parse } from 'jsonc-parser';
|
||||||
|
import { readFileSync } from 'fs';
|
||||||
|
import { parseArgs } from 'util';
|
||||||
|
import { createInterface } from 'readline/promises';
|
||||||
|
|
||||||
|
const helpMsg = `
|
||||||
|
Синхронизация суммирующих задач
|
||||||
|
|
||||||
|
* --config=sync-root-issues.jsonc - конфигурационный файл для постановки задачи на выполнение синхронизации
|
||||||
|
* --yes - автоматически отвечать 'y'
|
||||||
|
|
||||||
|
Пример конфигурационного файла:
|
||||||
|
|
||||||
|
{
|
||||||
|
"redmineUrl": "http://redmine.my-company.local",
|
||||||
|
"redmineToken": "... ... ...",
|
||||||
|
"eventEmitterUrl": "http://localhost:3000",
|
||||||
|
|
||||||
|
"rootIds": [
|
||||||
|
123001,
|
||||||
|
130012
|
||||||
|
]
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
|
var args = parseArgs({
|
||||||
|
options: {
|
||||||
|
config: {
|
||||||
|
type: 'string',
|
||||||
|
},
|
||||||
|
yes: {
|
||||||
|
type: 'boolean',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!args?.values?.config) {
|
||||||
|
console.log(helpMsg);
|
||||||
|
process.exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
function readConfig(fileName) {
|
||||||
|
const rawData = readFileSync(fileName, { encoding: 'utf8' });
|
||||||
|
return parse(rawData);
|
||||||
|
}
|
||||||
|
|
||||||
|
var config = readConfig(args.values.config);
|
||||||
|
|
||||||
|
function getAllRootIssueIds(issues, res) {
|
||||||
|
for (let i = 0; i < issues.length; i++) {
|
||||||
|
const issue = issues[i];
|
||||||
|
if (issue.children && issue.children.length > 0) {
|
||||||
|
res.push(issue.id);
|
||||||
|
getAllRootIssueIds(issue.children, res);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function loadIssueFromRedmine(issueId) {
|
||||||
|
const token = config?.redmineToken || '';
|
||||||
|
const redmineUrl = config?.redmineUrl || '';
|
||||||
|
const url = `${redmineUrl}/issues/${issueId}.json?include=children`;
|
||||||
|
const resp = await fetch(url, {
|
||||||
|
headers: {
|
||||||
|
'X-Redmine-API-Key': token,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
const data = await resp.json();
|
||||||
|
return data?.issue || null;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function loadAllRootIssueIds() {
|
||||||
|
const rootIssueIds = config?.rootIds || [];
|
||||||
|
const rootIssues = [];
|
||||||
|
for (let i = 0; i < rootIssueIds.length; i++) {
|
||||||
|
const rootIssueId = rootIssueIds[i];
|
||||||
|
const issue = await loadIssueFromRedmine(rootIssueId);
|
||||||
|
if (issue) {
|
||||||
|
rootIssues.push(issue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const allRootIssueIds = getAllRootIssueIds(rootIssues, []);
|
||||||
|
return allRootIssueIds;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function questionYesOrNo(question, yesMsg, noMsg) {
|
||||||
|
const readline = createInterface({
|
||||||
|
input: process.stdin,
|
||||||
|
output: process.stdout,
|
||||||
|
});
|
||||||
|
const answer = await readline.question(`\n${question} (y/n)\n> `);
|
||||||
|
const res = answer == 'y';
|
||||||
|
readline.close();
|
||||||
|
console.log(res ? `\n${yesMsg}` : `\n${noMsg}`);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function main() {
|
||||||
|
console.log(
|
||||||
|
`Конфигурационный файл:\n${JSON.stringify(config, null, ' ')}\n`,
|
||||||
|
);
|
||||||
|
if (!args.values.yes) {
|
||||||
|
const res = await questionYesOrNo(
|
||||||
|
'Продолжаем?',
|
||||||
|
'Продолжаем...',
|
||||||
|
'Прервано',
|
||||||
|
);
|
||||||
|
if (!res) process.exit();
|
||||||
|
}
|
||||||
|
const rootIds = await loadAllRootIssueIds();
|
||||||
|
console.log(`Задачи для синхронизации - ${JSON.stringify(rootIds)}`);
|
||||||
|
if (!args.values.yes) {
|
||||||
|
const res = await questionYesOrNo(
|
||||||
|
'Продолжаем?',
|
||||||
|
'Продолжаем...',
|
||||||
|
'Прервано',
|
||||||
|
);
|
||||||
|
if (!res) process.exit();
|
||||||
|
}
|
||||||
|
console.log(`Отправка задач на синхронизацию...`);
|
||||||
|
await await fetch(
|
||||||
|
`${config.eventEmitterUrl}/redmine-event-emitter/append-issues`,
|
||||||
|
{
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
},
|
||||||
|
body: JSON.stringify(rootIds),
|
||||||
|
},
|
||||||
|
);
|
||||||
|
console.log(`Синхронизация запущена`);
|
||||||
|
}
|
||||||
|
|
||||||
|
await main();
|
||||||
Loading…
Reference in a new issue