Journals diff added

This commit is contained in:
Pavel Gnedov 2022-05-17 18:57:35 +07:00
parent 0b90ca7f8f
commit 70301e90e2
3 changed files with 53 additions and 5 deletions

View file

@ -17,7 +17,7 @@ export class RedmineIssuesCacheWriterModule {
useValue: params.issueDocumentScope,
},
],
exports: [],
exports: [RedmineIssuesCacheWriterService],
};
}
}

View file

@ -1,6 +1,7 @@
import { Inject, Injectable } from '@nestjs/common';
import { RedmineTypes } from 'libs/redmine-types';
import nano from 'nano';
import { SaveResponse } from './save-response';
@Injectable()
export class RedmineIssuesCacheWriterService {
@ -9,21 +10,61 @@ export class RedmineIssuesCacheWriterService {
private issueDb: nano.DocumentScope<RedmineTypes.Issue>,
) {}
async saveIssue(issue: any): Promise<void> {
async saveIssue(issue: any): Promise<SaveResponse> {
const id = Number(issue['id']);
let prevIssue;
let prevIssue: (nano.DocumentGetResponse & RedmineTypes.Issue) | null;
try {
prevIssue = await this.issueDb.get(String(id));
} catch (ex) {
prevIssue = null;
}
let newIssue: nano.DocumentGetResponse & RedmineTypes.Issue;
if (!prevIssue) {
await this.issueDb.insert({ _id: String(id), ...issue });
newIssue = { ...issue };
newIssue._id = String(id);
await this.issueDb.insert(newIssue);
} else {
const newIssue = issue;
const newIssue = { ...issue };
newIssue._id = String(id);
newIssue._rev = prevIssue._rev;
await this.issueDb.insert(newIssue);
}
return {
prev: prevIssue,
current: newIssue,
journalsDiff: this.getJournalsDiff(prevIssue, newIssue),
};
}
getJournalsDiff(
prev: (nano.DocumentGetResponse & RedmineTypes.Issue) | null,
current: nano.DocumentGetResponse & RedmineTypes.Issue,
): RedmineTypes.Journal[] {
if (
(!prev || !prev.journals || prev.journals.length === 0) &&
current.journals
) {
return current.journals;
} else if (prev.journals && current.journals) {
return this.calcJournalsDiff(prev.journals, current.journals);
}
return [];
}
private calcJournalsDiff(
prev: RedmineTypes.Journal[],
current: RedmineTypes.Journal[],
): RedmineTypes.Journal[] {
const res: RedmineTypes.Journal[] = [];
const prevIds = prev.map((item) => item.id);
for (let i = 0; i < current.length; i++) {
const currentItem = current[i];
if (!prevIds.includes(currentItem.id)) {
res.push(currentItem);
}
}
return res;
}
}

View file

@ -0,0 +1,7 @@
import { RedmineTypes } from 'libs/redmine-types';
export type SaveResponse = {
prev: RedmineTypes.Issue | null;
current: RedmineTypes.Issue;
journalsDiff: RedmineTypes.Journal[];
};