diff --git a/libs/redmine-issues-cache-writer/src/redmine-issues-cache-writer.module.ts b/libs/redmine-issues-cache-writer/src/redmine-issues-cache-writer.module.ts index 3eb879c..9268694 100644 --- a/libs/redmine-issues-cache-writer/src/redmine-issues-cache-writer.module.ts +++ b/libs/redmine-issues-cache-writer/src/redmine-issues-cache-writer.module.ts @@ -17,7 +17,7 @@ export class RedmineIssuesCacheWriterModule { useValue: params.issueDocumentScope, }, ], - exports: [], + exports: [RedmineIssuesCacheWriterService], }; } } diff --git a/libs/redmine-issues-cache-writer/src/redmine-issues-cache-writer.service.ts b/libs/redmine-issues-cache-writer/src/redmine-issues-cache-writer.service.ts index 82cf6fd..943a847 100644 --- a/libs/redmine-issues-cache-writer/src/redmine-issues-cache-writer.service.ts +++ b/libs/redmine-issues-cache-writer/src/redmine-issues-cache-writer.service.ts @@ -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, ) {} - async saveIssue(issue: any): Promise { + async saveIssue(issue: any): Promise { 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; } } diff --git a/libs/redmine-issues-cache-writer/src/save-response.ts b/libs/redmine-issues-cache-writer/src/save-response.ts new file mode 100644 index 0000000..fedc9c4 --- /dev/null +++ b/libs/redmine-issues-cache-writer/src/save-response.ts @@ -0,0 +1,7 @@ +import { RedmineTypes } from 'libs/redmine-types'; + +export type SaveResponse = { + prev: RedmineTypes.Issue | null; + current: RedmineTypes.Issue; + journalsDiff: RedmineTypes.Journal[]; +};