oa-jira
Version:
Octet Agile's JIRA connectivity project.
67 lines (58 loc) • 2.41 kB
JavaScript
const Changes = require('../classes/changes.class');
const IssueData = require('../classes/issue.data.class');
const IssueSnapshots = require('../classes/issue.snapshots.class');
const ChangesBuilder = require('./changes.builder');
class IssueSnapshotsBuilder {
#issues;
#currentIssueData;
#currentRawData;
#currentNext;
constructor(issueData, rawData) {
this.#issues = {};
this.#currentIssueData = issueData;
this.#currentRawData = rawData;
this.#currentNext = null;
}
static init(rawData) {
return IssueData.create(rawData)
.then(issueData => Promise.resolve(new IssueSnapshotsBuilder(issueData, rawData)))
.catch(error => Promise.reject(error));
}
initChangesBuilder = ({ time }) => new ChangesBuilder({ rawData: this.#currentRawData, time });
appendPrevious = ({ rawData, changes }) => {
return Promise.all([IssueData.create(rawData), Changes.resolve(changes)]).then(([data, changes]) => {
if (this.#currentNext) {
this.#issues[this.#currentNext.toISOString()].previous = data.getUpdated();
}
this.#issues[data.getUpdated().toISOString()] = {
data: this.#currentIssueData,
next: this.#currentNext,
time: data.getUpdated(),
changes
};
this.#currentIssueData = data;
this.#currentRawData = rawData;
this.#currentNext = data.getUpdated();
return Promise.resolve(this);
});
};
build = ({ created }) => {
if (this.#currentNext) {
this.#issues[this.#currentNext.toISOString()].previous = created;
}
const firstRawData = { ...this.#currentRawData };
const changesBuilder = new ChangesBuilder({ rawData: this.#currentRawData, time: created });
return Promise.all(Object.keys(this.#currentRawData).map(name => changesBuilder.append({ name })))
.then(_ => {
return Promise.all([changesBuilder.buildChanges(), IssueData.create(firstRawData)]);
})
.then(([changes, issueData]) => {
this.#issues[created.toISOString()] = { data: issueData, next: this.#currentNext, time: created, changes };
this.#currentIssueData = null;
this.#currentRawData = null;
this.#currentNext = null;
return IssueSnapshots.create({ snapshotsData: this.#issues });
});
};
}
module.exports = IssueSnapshotsBuilder;