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,
|
useValue: params.issueDocumentScope,
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
exports: [],
|
exports: [RedmineIssuesCacheWriterService],
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
import { Inject, Injectable } from '@nestjs/common';
|
import { Inject, Injectable } from '@nestjs/common';
|
||||||
import { RedmineTypes } from 'libs/redmine-types';
|
import { RedmineTypes } from 'libs/redmine-types';
|
||||||
import nano from 'nano';
|
import nano from 'nano';
|
||||||
|
import { SaveResponse } from './save-response';
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class RedmineIssuesCacheWriterService {
|
export class RedmineIssuesCacheWriterService {
|
||||||
|
|
@ -9,21 +10,61 @@ export class RedmineIssuesCacheWriterService {
|
||||||
private issueDb: nano.DocumentScope<RedmineTypes.Issue>,
|
private issueDb: nano.DocumentScope<RedmineTypes.Issue>,
|
||||||
) {}
|
) {}
|
||||||
|
|
||||||
async saveIssue(issue: any): Promise<void> {
|
async saveIssue(issue: any): Promise<SaveResponse> {
|
||||||
const id = Number(issue['id']);
|
const id = Number(issue['id']);
|
||||||
let prevIssue;
|
let prevIssue: (nano.DocumentGetResponse & RedmineTypes.Issue) | null;
|
||||||
try {
|
try {
|
||||||
prevIssue = await this.issueDb.get(String(id));
|
prevIssue = await this.issueDb.get(String(id));
|
||||||
} catch (ex) {
|
} catch (ex) {
|
||||||
prevIssue = null;
|
prevIssue = null;
|
||||||
}
|
}
|
||||||
|
let newIssue: nano.DocumentGetResponse & RedmineTypes.Issue;
|
||||||
if (!prevIssue) {
|
if (!prevIssue) {
|
||||||
await this.issueDb.insert({ _id: String(id), ...issue });
|
newIssue = { ...issue };
|
||||||
|
newIssue._id = String(id);
|
||||||
|
await this.issueDb.insert(newIssue);
|
||||||
} else {
|
} else {
|
||||||
const newIssue = issue;
|
const newIssue = { ...issue };
|
||||||
newIssue._id = String(id);
|
newIssue._id = String(id);
|
||||||
newIssue._rev = prevIssue._rev;
|
newIssue._rev = prevIssue._rev;
|
||||||
await this.issueDb.insert(newIssue);
|
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