Серверный скрипт для импорта задач из gitlab в SDLC SimpleOne

Серверный скрипт для импорта задач из gitlab в SDLC SimpleOne

//Нужно создать запиcи с данными названиями в таблице sys_property, и поставить ваши value
let token = ss.getProperty('gitlab_token');//Корректный токен к проекту gitlab
let project_id = ss.getProperty('project_id');// Запись в таблице pda_project
let release_id = ss.getProperty('release_id');//Запись в таблице pda_release
let product_id = ss.getProperty('product_id');//Запись в таблице pda_product

let groupId = 'dev'; // Нужно название группы из gitlab
let currentPage = 1; // Начать парсить с первой страницы, можно поставить 10, 20 и тд, чтобы данных было меньше
let issues = [];

while (true) {
    let request = sws.restRequestV1();
    request.setRequestUrl(`https://example.com/api/v4/groups/${groupId}/issues?page=${currentPage}`);
    request.setRequestMethod('GET');
    request.setRequestHeader('Authorization', 'Bearer ' + token);

    const response = request.execute();
    let dataJson = JSON.parse(response.getBody());

    if (dataJson.length === 0) {
        // No more issues to fetch, exit the loop
        break;
    }

    issues.push(...dataJson); // Append the fetched issues to the issues array
    currentPage++; // Move to the next page
}
issues.forEach(issue => {
    let issueFields = {
        summary: issue.title || '',
        assignee: (issue.assignees && issue.assignees.length > 0) ? issue.assignees[0].username : '',
        status: issue.state || '',
        description: issue.description || '',
        creator: issue.author.username || '',
        created: issue.created_at || '',
        updated: issue.updated_at || '',
        blocked: issue.blocked,
        //blocked_by_assignee: (issue.assignee && issue.assignee.locked !== null) ? issue.assignee.locked : '',
        //blocked_by_author: issue.author.locked || '',
        issue_id: issue.id || '',
        url: issue.web_url || '',
        due_date: issue.due_date,
        milestone: issue.milestone,
        labels: issue.labels //(issue.labels && typeof issue.labels === 'object') ? Object.keys(issue.labels) : []
    };

    createTask(issue.iid, issueFields); // Passing issue number `iid` and issue details to createTask function
});


//Функция создания таски в таблице  pda_task
function createTask(issueNumber, issueFields) {
    const issue_table = new SimpleRecord("pda_task");
    issue_table.subject = issueFields.summary;
    issue_table.description = issueFields.description;
    issue_table.assigned_user = getAssigneeByLogin(issueFields.assignee);
    issue_table.caller = getCreatorByLogin(issueFields.creator);
    issue_table.opened_at = formatDate(issueFields.updated);
    issue_table.state = setState(issueFields.status,issueFields.labels);
    issue_table.pda_project_id = project_id;
    issue_table.pda_rank = 10;
    issue_table.pda_release_id = release_id
    issue_table.comments = issueFields.url;
    issue_table.pda_product_id = product_id
    if (issueFields.blocked === true) {
        issue_table.pda_need_action = true;
    } else {
        issue_table.pda_need_action = false;
    }

  if (issueFields.due_date != null) {
    issue_table.due_date = formatDate(issueFields.due_date);
    issue_table.work_notes += `
    Due Date:
    \n${issueFields.due_date}\n`;
 }

if (issueFields.milestone != null) {
    // Assuming milestone has a title property, you can display the title
    issue_table.work_notes += `
    Milestone:
    \n${issueFields.milestone.title || 'No milestone title'}\n`;
 }

if (issueFields.labels != null) {
    issue_table.work_notes += `
    Labels:
    \n${issueFields.labels}\n`;
}
     issue_table.work_notes += `
    URL:
   \n${issueFields.url}\n
    Issue ID:
   \n${issueFields.issue_id}\n
     Creator:
   \n${issueFields.creator}\n
     Created:
   \n${issueFields.created}\n
     Updated:
   \n${issueFields.updated}\n`;

    const insertedRecordId = issue_table.insert();
    if (insertedRecordId == 0) {
        ss.info(issue_table.getErrors());
    }

}
//Функция поиска и вставки создателя таски
function getCreatorByLogin(login) {
    const employee = new SimpleRecord('employee');
    employee.addEncodedQuery(`(username=${login})`);
    employee.setLimit(1);
    employee.query();

    if (employee.next()) {
        return employee.sys_id;
    }

    else return ''; // Можно подставить другого пользователя например id админа
}



function getAssigneeByLogin(login) {
     if (login === "") {
       return ""
     }
    const employee = new SimpleRecord('employee');
    employee.addEncodedQuery(`(username=${login})`);
    employee.setLimit(10);
    employee.query();

    if (employee.next()) {
        return employee.sys_id;
    }

    else return ''; 
}


function setState(status, labels) {
    // Define the mapping of labels to states
    const labelStateMap = {
        'Backlog': 'new',
        'Doing': 'development',
        'InProgress': 'development',
        'To Do': 'backlog',
        'FreezeBox': 'new'
        // Add more label-state mappings as needed
    };

    if (status === 'opened') {
        for (let label of labels) {
            if (label in labelStateMap) {
                return labelStateMap[label]; // Return the corresponding state based on the label
            }
        }
        return 'new'; // Default state if no matching label is found
    } else if (status === 'closed') {
        return 'released';
    }

    return 'new';
}


//Функция форматирования даты в формат симпла
function formatDate(inputDate) {
    const date = new Date(inputDate);
    const year = date.getFullYear();
    const month = String(date.getMonth() + 1).padStart(2, '0');
    const day = String(date.getDate()).padStart(2, '0');
    const hours = String(date.getHours()).padStart(2, '0');
    const minutes = String(date.getMinutes()).padStart(2, '0');
    const seconds = String(date.getSeconds()).padStart(2, '0');

    const formattedDate = `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;

    return formattedDate;
}