diff --git a/libs/event-emitter/src/couchdb-datasources/issues.ts b/libs/event-emitter/src/couchdb-datasources/issues.ts
index 745131c..178be20 100644
--- a/libs/event-emitter/src/couchdb-datasources/issues.ts
+++ b/libs/event-emitter/src/couchdb-datasources/issues.ts
@@ -1,4 +1,4 @@
-import { RedmineTypes } from '@app/redmine-types/index';
+import { RedmineTypes } from '../models/redmine-types';
import { Injectable, Logger } from '@nestjs/common';
import configuration from '../configs/main-config';
import nano = require('nano');
diff --git a/libs/event-emitter/src/couchdb-datasources/users.ts b/libs/event-emitter/src/couchdb-datasources/users.ts
index 1fad236..51d97c7 100644
--- a/libs/event-emitter/src/couchdb-datasources/users.ts
+++ b/libs/event-emitter/src/couchdb-datasources/users.ts
@@ -1,4 +1,4 @@
-import { RedmineTypes } from '@app/redmine-types/index';
+import { RedmineTypes } from '../models/redmine-types';
import { Injectable, Logger } from '@nestjs/common';
import nano from 'nano';
import { CouchDb } from './couchdb';
diff --git a/libs/event-emitter/src/event-emitter.module.ts b/libs/event-emitter/src/event-emitter.module.ts
index fbdef49..51f022b 100644
--- a/libs/event-emitter/src/event-emitter.module.ts
+++ b/libs/event-emitter/src/event-emitter.module.ts
@@ -12,8 +12,10 @@ import { RedmineIssuesCacheWriterService } from './issue-cache-writer/redmine-is
import { CouchDb } from './couchdb-datasources/couchdb';
import { Users } from './couchdb-datasources/users';
import { Issues } from './couchdb-datasources/issues';
-import { RedmineTypes } from '@app/redmine-types/index';
import { RedmineUserCacheWriterService } from './user-cache-writer/user-cache-writer.service';
+import { UsersController } from './users/users.controller';
+import { RedmineTypes } from './models/redmine-types';
+import { UsersService } from './users/users.service';
@Module({})
export class EventEmitterModule implements OnModuleInit {
@@ -35,6 +37,7 @@ export class EventEmitterModule implements OnModuleInit {
Users,
Issues,
RedmineUserCacheWriterService,
+ UsersService,
],
exports: [
EventEmitterService,
@@ -45,8 +48,9 @@ export class EventEmitterModule implements OnModuleInit {
Users,
Issues,
RedmineUserCacheWriterService,
+ UsersService,
],
- controllers: [MainController],
+ controllers: [MainController, UsersController],
};
}
diff --git a/libs/event-emitter/src/issues/issues.service.ts b/libs/event-emitter/src/issues/issues.service.ts
index c442bbb..9fe48f6 100644
--- a/libs/event-emitter/src/issues/issues.service.ts
+++ b/libs/event-emitter/src/issues/issues.service.ts
@@ -1,4 +1,4 @@
-import { RedmineTypes } from '@app/redmine-types/index';
+import { RedmineTypes } from '../models/redmine-types';
import { Injectable } from '@nestjs/common';
import { Issues } from '../couchdb-datasources/issues';
import { RedmineEventsGateway } from '../events/redmine-events.gateway';
diff --git a/libs/event-emitter/src/models/redmine-types/index.d.ts b/libs/event-emitter/src/models/redmine-types/index.d.ts
new file mode 100644
index 0000000..a904d28
--- /dev/null
+++ b/libs/event-emitter/src/models/redmine-types/index.d.ts
@@ -0,0 +1,99 @@
+///
+
+// eslint-disable-next-line @typescript-eslint/prefer-namespace-keyword
+export module RedmineTypes {
+ export type IdAndName = {
+ id: number;
+ name: string;
+ };
+
+ export type CustomField = {
+ id: number;
+ name: string;
+ value: string;
+ };
+
+ export type JournalDetail = {
+ property: string;
+ name: string;
+ old_value?: string;
+ new_value?: string;
+ };
+
+ export type Journal = {
+ id: number;
+ user: IdAndName;
+ notes?: string;
+ created_on: string;
+ details?: JournalDetail[];
+ };
+
+ export type Issue = {
+ id: number;
+ project: IdAndName;
+ tracker: IdAndName;
+ status: IdAndName;
+ priority: IdAndName;
+ author: IdAndName;
+ category: IdAndName;
+ fixed_version: IdAndName;
+ subject: string;
+ description: string;
+ start_date: string;
+ done_ratio: number;
+ spent_hours: number;
+ total_spent_hours: number;
+ custom_fields: CustomField[];
+ created_on: string;
+ updated_on?: string;
+ closed_on?: string;
+ relations?: Record[];
+ journals?: Journal[];
+ };
+
+ // eslint-disable-next-line @typescript-eslint/prefer-namespace-keyword
+ export module Unknown {
+ export const num = -1;
+ export const str = '';
+ export const idAndName: IdAndName = {
+ id: -1,
+ name: str,
+ };
+ export const unknownName = 'Unknown';
+ export const subject = 'Unknown';
+ export const date = '1970-01-01T00:00:00Z';
+ export const issue: Issue = {
+ id: num,
+ project: idAndName,
+ tracker: idAndName,
+ status: idAndName,
+ priority: idAndName,
+ author: idAndName,
+ category: idAndName,
+ fixed_version: idAndName,
+ subject: subject,
+ description: str,
+ start_date: date,
+ done_ratio: num,
+ spent_hours: num,
+ total_spent_hours: num,
+ custom_fields: [],
+ created_on: date,
+ };
+
+ export const user: User = {
+ id: num,
+ firstname: unknownName,
+ lastname: unknownName,
+ mail: str,
+ };
+ }
+
+ export type User = {
+ id: number;
+ login: string;
+ firstname: string;
+ lastname: string;
+ mail: string;
+ };
+}
diff --git a/libs/event-emitter/src/models/redmine-types/index.js b/libs/event-emitter/src/models/redmine-types/index.js
new file mode 100644
index 0000000..e69de29
diff --git a/libs/event-emitter/src/models/redmine-types/package.json b/libs/event-emitter/src/models/redmine-types/package.json
new file mode 100644
index 0000000..4df9704
--- /dev/null
+++ b/libs/event-emitter/src/models/redmine-types/package.json
@@ -0,0 +1,12 @@
+{
+ "name": "redmine-types",
+ "version": "0.1.0",
+ "description": "",
+ "main": "index.js",
+ "types": "index.d.ts",
+ "scripts": {
+ "test": "echo \"Error: no test specified\" && exit 1"
+ },
+ "author": "Pavel Gnedov",
+ "license": "MIT"
+}
diff --git a/libs/event-emitter/src/redmine-data-loader/redmine-data-loader.ts b/libs/event-emitter/src/redmine-data-loader/redmine-data-loader.ts
index 5805dd6..dcbca96 100644
--- a/libs/event-emitter/src/redmine-data-loader/redmine-data-loader.ts
+++ b/libs/event-emitter/src/redmine-data-loader/redmine-data-loader.ts
@@ -1,7 +1,7 @@
import axios from 'axios';
import { Injectable, Logger } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
-import { RedmineTypes } from '@app/redmine-types/index';
+import { RedmineTypes } from '../models/redmine-types';
@Injectable()
export class RedmineDataLoader {
diff --git a/libs/event-emitter/src/rsslistener/rsslistener-params.ts b/libs/event-emitter/src/rsslistener/rsslistener-params.ts
index 0bbdf4c..20837c1 100644
--- a/libs/event-emitter/src/rsslistener/rsslistener-params.ts
+++ b/libs/event-emitter/src/rsslistener/rsslistener-params.ts
@@ -10,5 +10,5 @@ export type RssListenerParams = {
export const RssListenerDefaultParams: RssListenerParams = {
subscriptions: [],
- updateInterval: 300000 // 5min
-}
\ No newline at end of file
+ updateInterval: 300000, // 5min
+};
diff --git a/libs/event-emitter/src/rsslistener/rsslistener.ts b/libs/event-emitter/src/rsslistener/rsslistener.ts
index c8a74fd..2d3aa23 100644
--- a/libs/event-emitter/src/rsslistener/rsslistener.ts
+++ b/libs/event-emitter/src/rsslistener/rsslistener.ts
@@ -1,8 +1,12 @@
-import { Injectable } from "@nestjs/common";
-import { RssListenerDefaultParams, RssListenerParams, RssListenerSubscriptionParams } from "./rsslistener-params";
-import { BehaviorSubject } from "rxjs";
-import { CreateSubjectsParserByRegExp } from "../subjects-parser/subjects-parser";
-import { EventsListener } from "../events/events-listener";
+import { Injectable } from '@nestjs/common';
+import {
+ RssListenerDefaultParams,
+ RssListenerParams,
+ RssListenerSubscriptionParams,
+} from './rsslistener-params';
+import { BehaviorSubject } from 'rxjs';
+import { CreateSubjectsParserByRegExp } from '../subjects-parser/subjects-parser';
+import { EventsListener } from '../events/events-listener';
// eslint-disable-next-line @typescript-eslint/no-var-requires
const Parser = require('rss-parser');
@@ -10,14 +14,14 @@ const parser = new Parser();
@Injectable()
export class RssListener implements EventsListener {
-
- issues = new BehaviorSubject([])
+ issues = new BehaviorSubject([]);
private updateTimeout;
private lastTimeUpdate: Date | null = null;
constructor(private config: RssListenerParams = RssListenerDefaultParams) {
+ this.lastTimeUpdate = new Date();
}
start(): void {
@@ -38,23 +42,27 @@ export class RssListener implements EventsListener {
}
private async getIssues(): Promise {
- const promises = this.config.subscriptions.map(sub => this.createSubscriptionPromise(sub));
+ const promises = this.config.subscriptions.map((sub) =>
+ this.createSubscriptionPromise(sub),
+ );
const issues = await Promise.all(promises);
this.lastTimeUpdate = new Date();
return this.getFlatIssueNumbers(issues);
}
- private async createSubscriptionPromise(subscription: RssListenerSubscriptionParams): Promise {
+ private async createSubscriptionPromise(
+ subscription: RssListenerSubscriptionParams,
+ ): Promise {
const url = subscription.url;
const regexp = new RegExp(subscription.issueNumberParser);
const subjectParser = CreateSubjectsParserByRegExp(regexp);
const feed = await parser.parseURL(url);
const issueNumbers: number[] = feed.items
- .filter(item => {
+ .filter((item) => {
const itemDate = new Date(item.pubDate);
return itemDate >= this.lastTimeUpdate;
})
- .map(item => {
+ .map((item) => {
const issueNumber = subjectParser.getIssueNumber(item.title);
return issueNumber;
});
@@ -63,8 +71,8 @@ export class RssListener implements EventsListener {
private getFlatIssueNumbers(issues: number[][]): number[] {
const res: number[] = [];
- issues.forEach(issueNumbers => {
- issueNumbers.forEach(num => {
+ issues.forEach((issueNumbers) => {
+ issueNumbers.forEach((num) => {
if (res.indexOf(num) < 0) {
res.push(num);
}
@@ -72,5 +80,4 @@ export class RssListener implements EventsListener {
});
return res;
}
-
-}
\ No newline at end of file
+}
diff --git a/libs/event-emitter/src/user-cache-writer/user-cache-writer.service.ts b/libs/event-emitter/src/user-cache-writer/user-cache-writer.service.ts
index 93f2793..14157d7 100644
--- a/libs/event-emitter/src/user-cache-writer/user-cache-writer.service.ts
+++ b/libs/event-emitter/src/user-cache-writer/user-cache-writer.service.ts
@@ -1,4 +1,4 @@
-import { RedmineTypes } from '@app/redmine-types/index';
+import { RedmineTypes } from '../models/redmine-types';
import { Injectable, Logger } from '@nestjs/common';
import { Users } from '../couchdb-datasources/users';
import nano from 'nano';
diff --git a/libs/event-emitter/src/users/users.controller.ts b/libs/event-emitter/src/users/users.controller.ts
index 0451415..2367d43 100644
--- a/libs/event-emitter/src/users/users.controller.ts
+++ b/libs/event-emitter/src/users/users.controller.ts
@@ -1,4 +1,4 @@
-import { RedmineTypes } from '@app/redmine-types/index';
+import { RedmineTypes } from '../models/redmine-types';
import { Controller, Get, Param } from '@nestjs/common';
import { UsersService } from './users.service';
diff --git a/libs/event-emitter/src/users/users.service.ts b/libs/event-emitter/src/users/users.service.ts
index 85203cc..40b543e 100644
--- a/libs/event-emitter/src/users/users.service.ts
+++ b/libs/event-emitter/src/users/users.service.ts
@@ -1,5 +1,5 @@
import { Injectable } from '@nestjs/common';
-import { RedmineTypes } from '@app/redmine-types/index';
+import { RedmineTypes } from '../models/redmine-types';
import { Timestamped } from '../models/timestamped';
import { Users } from '../couchdb-datasources/users';
import { RedmineDataLoader } from '../redmine-data-loader/redmine-data-loader';
diff --git a/tsconfig.json b/tsconfig.json
index 721f1db..85879f4 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -23,9 +23,6 @@
],
"@app/event-emitter/*": [
"libs/event-emitter/src/*"
- ],
- "@app/redmine-types/*": [
- "libs/redmine-types/*"
]
}
}