oa-jira
Version:
Octet Agile's JIRA connectivity project.
62 lines (50 loc) • 1.97 kB
JavaScript
const commons = require('../../commons');
const IssueSnapshot = require('./issue.snapshot.class');
const getSprintsFromSnapshot = (snapshot, sprints = {}) => {
if (!snapshot) return Promise.resolve(Object.values(sprints));
const sprint = snapshot.getData().getSprint();
if (sprint) sprints[sprint.getId()] = sprint;
return getSprintsFromSnapshot(snapshot.getPrevious(), sprints);
};
class IssueSnapshots {
#first;
#snapshots;
#last;
constructor({ snapshotsData } = {}) {
this.#first;
this.#last;
this.#snapshots = {};
if (snapshotsData) {
for (const snapshotData of Object.values(snapshotsData)) {
this.#first = commons.date.min(this.#first, snapshotData.time);
this.#last = commons.date.max(this.#last, snapshotData.time);
const snapshot = new IssueSnapshot(this, snapshotData);
this.#snapshots[snapshot.getTime().toISOString()] = snapshot;
}
}
}
get = time => this.#snapshots[time];
getFirst = () => (this.#first ? this.get(this.#first.toISOString()) : null);
getLast = () => (this.#last ? this.get(this.#last.toISOString()) : null);
getSprints = () => getSprintsFromSnapshot(this.getLast());
static check(snapshots) {
return commons.object.check(snapshots, { name: 'snapshots', className: 'Snapshots', _class: IssueSnapshots });
}
static create({ snapshotsData } = {}) {
try {
return Promise.resolve(new IssueSnapshots({ snapshotsData }));
} catch (error) {
return Promise.reject(error);
}
}
toJSON = () => {
const json = { snapshots: {} };
if (this.#first) json.first = this.#first.toISOString();
if (this.#last) json.last = this.#last.toISOString();
for (const snapshot of Object.values(this.#snapshots)) {
json.snapshots[snapshot.getTime().toISOString()] = snapshot.toJSON();
}
return json;
};
}
module.exports = IssueSnapshots;