Journals diff added
This commit is contained in:
parent
0b90ca7f8f
commit
70301e90e2
3 changed files with 53 additions and 5 deletions
|
|
@ -17,7 +17,7 @@ export class RedmineIssuesCacheWriterModule {
|
|||
useValue: params.issueDocumentScope,
|
||||
},
|
||||
],
|
||||
exports: [],
|
||||
exports: [RedmineIssuesCacheWriterService],
|
||||
};
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
7
libs/redmine-issues-cache-writer/src/save-response.ts
Normal file
7
libs/redmine-issues-cache-writer/src/save-response.ts
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
import { RedmineTypes } from 'libs/redmine-types';
|
||||
|
||||
export type SaveResponse = {
|
||||
prev: RedmineTypes.Issue | null;
|
||||
current: RedmineTypes.Issue;
|
||||
journalsDiff: RedmineTypes.Journal[];
|
||||
};
|
||||
Loading…
Reference in a new issue