Добавлен вспомогательный скрипт для принудительной синхронизации суммирующих задач
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