UNPKG

oa-jira

Version:

Octet Agile's JIRA connectivity project.

120 lines (99 loc) 4.58 kB
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 }); };