oa-jira
Version:
Octet Agile's JIRA connectivity project.
120 lines (99 loc) • 4.58 kB
JavaScript
const Cache = require('../../cache/classes/cache.class');
const IssueSnapshotsBuilder = require('../builders/issue.snapshots.builder');
const utils = require('../utils');
const resolutionServices = require('../services/resolutions.services');
const typeServices = require('../services/types.services');
const sprintServices = require('../services/sprints.services');
const statusesServices = require('../services/statuses.services');
const versionsServices = require('../services/versions.services');
const commons = require('../../commons');
const handleSummary = ({ builder, item }) => {
builder.append({ name: 'summary', source: item.fromString });
return Promise.resolve(builder);
};
const handleComplexity = ({ builder, item }) => {
const source = item.fromString ? Number.parseInt(item.fromString) : null;
builder.append({ name: 'complexity', source });
return Promise.resolve(builder);
};
const handleSprints = ({ connection, cache, builder, item }) => {
return utils.histories
.parseSprintIds(item.from)
.then(ids => sprintServices.getLastByIds({ connection, ids, cache }))
.then(source => builder.append({ name: 'sprint', source }))
.catch(error => Promise.reject(error));
};
const handleStatus = ({ connection, cache, builder, item }) => {
return statusesServices
.getById({ connection, id: item.from, cache })
.then(source => builder.append({ name: 'status', source }))
.catch(error => Promise.reject(error));
};
const handleType = ({ connection, cache, builder, item }) => {
return typeServices
.getById({ connection, id: item.from, cache })
.then(source => builder.append({ name: 'type', source }))
.catch(error => Promise.reject(error));
};
const handleResolution = ({ connection, cache, builder, item }) => {
if (!item.from) return builder.append({ name: 'resolution' });
return resolutionServices
.getById({ connection, id: item.from, cache })
.then(source => builder.append({ name: 'resolution', source }))
.catch(error => Promise.reject(error));
};
const handleVersion = ({ connection, cache, builder, item }) => {
const id = item.to ? item.to : item.from;
return versionsServices
.getById({ connection, id, cache })
.then(version => (item.to ? builder.removeVersion({ version }) : builder.appendVersion({ version })))
.catch(error => Promise.reject(error));
};
const mapHandlers = new Map([
['customfield_10016', handleComplexity],
['customfield_10020', handleSprints],
['issuetype', handleType],
['resolution', handleResolution],
['status', handleStatus],
['summary', handleSummary],
['fixVersions', handleVersion]
]);
const parseItem = ({ connection, cache, builder, items }) => {
if (items.length === 0) return Promise.resolve(builder);
const item = items.pop();
const handler = mapHandlers.get(item.fieldId);
if (!handler) return parseItem({ connection, cache, builder, items });
return handler({ connection, cache, builder, item })
.then(builder => parseItem({ connection, cache, builder, items }))
.catch(error => Promise.reject(error));
};
const parseItems = ({ connection, cache, builder, history }) => {
const changesBuilder = builder.initChangesBuilder({ time: new Date(history.created) });
return parseItem({ connection, cache, builder: changesBuilder, items: history.items })
.then(changesBuilder => {
if (changesBuilder.isEmpty()) return Promise.resolve(builder);
return Promise.all([changesBuilder.buildChanges(), changesBuilder.buildRawData()]).then(([changes, rawData]) =>
builder.appendPrevious({ rawData, changes })
);
})
.catch(error => Promise.reject(error));
};
/**
* @param {*} histories The fields.
* @param {Cache} cache A jira cache.
* @param {IssueSnapshotsBuilder} builder A snapshots builder.
*/
const parseHistories = ({ connection, cache, builder, histories }) => {
if (commons.array.isEmpty(histories)) return Promise.resolve(builder);
return parseItems({ connection, cache, builder, history: histories.shift() })
.then(builder => parseHistories({ connection, cache, builder, histories }))
.catch(error => Promise.reject(error));
};
/**
* @param {*} histories The fields.
* @param {Cache} cache A jira cache.
* @param {IssueSnapshotsBuilder} builder A snapshots builder.
*/
exports.parse = ({ connection, cache, builder, histories }) => {
return parseHistories({ connection, cache, builder, histories });
};